Chat WS — Socket.IO Playground

Интерактивная документация и песочница для WebSocket API анонимного чата

Server URL: Скопировано!

Обзор

Протокол
Socket.IO v4
Поверх WebSocket с fallback на polling
Аутентификация
Анонимная
Ввод имени + UUID из localStorage
Rate Limit
30 событий / 10 сек
На один сокет. При превышении — ошибка
Очистка
Каждый час
Комнаты без активности 2 недели удаляются
Как это работает
1. Подключитесь к серверу через Socket.IO
2. Отправьте user:join с именем — получите userId
3. Создайте комнату (room:create) или войдите по инвайт-коду (room:join)
4. Отправляйте сообщения (message:send), получайте через message:new
5. Сообщения хранятся в PostgreSQL, доступна история через room:history

Подключение

Отключён
Подключитесь к серверу. После подключения автоматически отправится user:join с указанным именем.

Типы данных

MessagePayload Объект сообщения
{ id: string // UUID сообщения content: string // Текст (пусто если удалено) roomId: string // Комната senderId: string // UUID отправителя senderName: string // Имя отправителя status: "SENT" | "DELIVERED" | "READ" isDeleted: boolean // true если мягко удалено createdAt: string // ISO 8601 updatedAt: string // ISO 8601 (отличается если редактировано) }
RoomPayload Объект комнаты
{ id: string // UUID комнаты type: "DIRECT" | "GROUP" name: string | null // Название inviteCode: string // 10-символьный nanoid createdAt: string // ISO 8601 memberCount: number // Число участников }
Статусы сообщений SENT / DELIVERED / READ
"SENT" // Сохранено, получателей онлайн нет "DELIVERED" // Хотя бы один получатель был онлайн "READ" // Все участники (кроме автора) прочитали

Лимиты и безопасность

ПараметрЗначениеОписание
Rate limit30 / 10 секМаксимум событий на один сокет за 10 секунд
Имя1-50 символовTrim + валидация длины
Сообщение1-5000 символовTrim + валидация длины
История1-100 / запросПараметр limit, по умолчанию 50
DIRECT комнатамакс 2 участникаТретий получит ошибку
ЧленствопроверяетсяНельзя писать/читать чужие комнаты
АвторствопроверяетсяРедактировать/удалять может только автор
Очисткакаждый часКомнаты без сообщений 2 недели — удаляются
УдалениемягкоеisDeleted=true, контент очищается

Клиент → Сервер

user:join callbackEMIT

Аутентификация. Отправьте сразу после подключения. Сервер создаёт нового пользователя или находит существующего по userId. При переподключении автоматически возвращает во все комнаты.

ПараметрТипОписание
namestringобязательно Имя, 1-50 символов
userIdstringнеобязательно UUID из прошлой сессии
Ответ:
{ userId: string } // или { error: string }

Вызывается автоматически при нажатии "Подключиться".

room:create callbackEMIT

Создать комнату. Вы становитесь первым участником. Возвращает inviteCode для приглашения.

ПараметрТипОписание
type"DIRECT" | "GROUP"обязательно
namestringнеобязательно
Ответ:
{ room: RoomPayload } // или { error: string }

room:join callbackEMIT

Войти в комнату по инвайт-коду. Если уже участник — вернёт комнату без дублирования. Остальные получат room:joined.

ПараметрТипОписание
inviteCodestringобязательно 10-символьный код
Ответ:
{ room: RoomPayload } // или { error: string }

room:list callbackEMIT

Список ваших комнат. Без параметров.

Ответ:
RoomPayload[]

room:history callbackEMIT

История сообщений с курсорной пагинацией. Хронологический порядок (старые сначала). Только для участников.

ПараметрТипОписание
roomIdstringобязательно
cursorstringнеобязательно ISO-дата из предыдущего ответа
limitnumberнеобязательно 1-100, по умолчанию 50
Ответ:
{ messages: MessagePayload[], nextCursor: string | null }

message:send callbackEMIT

Отправить сообщение. Только для участников комнаты. Статус: DELIVERED если есть онлайн-получатели, иначе SENT. Сообщение прилетит всем участникам комнаты (включая отправителя и его другие вкладки) через message:new.

ПараметрТипОписание
roomIdstringобязательно
contentstringобязательно 1-5000 символов
Ответ (ack):
{ ok: true, id: string } // или { error: string }

message:edit callbackEMIT

Редактировать своё сообщение. Нельзя редактировать удалённые. Все участники комнаты (включая отправителя) получат message:updated.

ПараметрТипОписание
messageIdstringобязательно
contentstringобязательно 1-5000 символов
Ответ (ack):
{ ok: true } // или { error: string }

message:delete callbackEMIT

Мягкое удаление своего сообщения. Все участники комнаты (включая отправителя) получат message:deleted.

ПараметрТипОписание
messageIdstringобязательно
Ответ (ack):
{ ok: true } // или { error: string }

message:read fire & forgetEMIT

Отметить сообщение как прочитанное. Без callback. Когда все участники прочитали — статус меняется на READ и все получают message:status. Игнорируется для своих сообщений.

ПараметрТипОписание
messageIdstringобязательно

typing:start / typing:stop fire & forgetEMIT

Индикатор набора. Сервер автоматически отправит typing:stop через 3 секунды. Остальные получат события с вашим именем.

ПараметрТипОписание
roomIdstringобязательно

push:subscribe callbackEMIT

Подписка на Web Push уведомления. Работает если на сервере настроены VAPID-ключи. Публичный ключ: GET /push/vapid-key.

ПараметрТипОписание
endpointstringобязательно Push endpoint
p256dhstringобязательно Ключ шифрования
authstringобязательно Секрет
Ответ:
{ success: boolean }

Сервер → Клиент

Приходят автоматически. Отображаются в журнале справа.

message:new LISTEN

Новое сообщение в комнате. Приходит всем участникам включая отправителя — добавляйте сообщение в UI прямо отсюда. Ack события message:send возвращает только { ok, id }, без payload.

MessagePayload
message:updated LISTEN

Сообщение отредактировано. Приходит всем включая автора. Замените по id. Если updatedAt !== createdAt — покажите "изменено".

MessagePayload
message:deleted LISTEN

Сообщение удалено. Приходит всем включая автора. Покажите заглушку "Сообщение удалено", не удаляйте из списка.

{ messageId: string, roomId: string }
message:status LISTEN

Статус доставки изменился. Обновите статус сообщения в UI.

{ messageId: string, roomId: string, status: "SENT" | "DELIVERED" | "READ" }
typing:start LISTEN

Кто-то печатает. Покажите "имя печатает...". Автостоп через 3 сек.

{ roomId: string, userId: string, userName: string }
typing:stop LISTEN

Перестал печатать. Уберите из индикатора.

{ roomId: string, userId: string }
room:joined LISTEN

Кто-то присоединился к вашей комнате. Обновите memberCount.

{ room: RoomPayload, userId: string, userName: string }
error LISTEN

Ошибка сервера. Приходит при rate limit, внутренних ошибках и т.д.

{ message: string }

REST-эндпоинты

МетодПутьОписание
GET/healthСтатус сервера и БД. Ответ: { status, push }
GET/push/vapid-keyПубличный VAPID-ключ для Web Push
GET/docsЭта страница

Журнал событий

Подключитесь чтобы начать...