Добавлены закреплённые сообщения, сохранение истории и авто-переподключение

- Закрепление/открепление сообщений (сервер + клиент)
- Сохранение истории сообщений в localStorage (до 50)
- Сохранение логина/пароля в localStorage и авто-вход
- Авто-переподключение при разрыве соединения WebSocket
This commit is contained in:
Комаров Данил Анатольевич 6
2026-05-29 15:57:18 +03:00
parent 63bf73d2c4
commit 5a6f92ede6
9 changed files with 234 additions and 16 deletions
+20 -1
View File
@@ -6,6 +6,8 @@ const { createJsonSender, createClientHandlers, validateFile, broadcast } = requ
const server = new WebSocketServer({ port: config.port });
console.log(`WebSocket server running on ws://0.0.0.0:${config.port}`);
let pinnedMessage = null;
server.on('connection', (ws, req) => {
const clientIp = req.socket.remoteAddress;
console.log(`Connection from ${clientIp}`);
@@ -17,11 +19,28 @@ server.on('connection', (ws, req) => {
case 'auth': {
const user = authenticate(parsed.login, parsed.password);
if (user) {
return client.handleAuth(user.login);
const sysMsg = client.handleAuth(user.login);
if (pinnedMessage) {
send({ type: 'pinned', message: pinnedMessage.message, pinnedBy: pinnedMessage.from });
}
return sysMsg;
}
client.handleAuthFail('Invalid login or password');
return null;
}
case 'pin': {
pinnedMessage = {
type: 'pinned', from: client.getLogin(), timestamp: Date.now(),
message: parsed.message,
};
console.log(`${client.getLogin()} pinned a message`);
return pinnedMessage;
}
case 'unpin': {
pinnedMessage = null;
console.log(`${client.getLogin()} unpinned the message`);
return { type: 'unpinned', from: client.getLogin(), timestamp: Date.now() };
}
case 'text': {
if (!parsed.text || typeof parsed.text !== 'string') {
send({ type: 'error', message: 'Invalid text message' });