WebSocket

WebSocket API

Этот API даёт realtime-стрим новых сообщений в комнате и (в текущей реализации) принимает отправку сообщений через WebSocket.

Подключение

Endpoint: /ws/rooms/{room_id}

Сервер делает accept() сразу после подключения, иначе нельзя send/receive.

Входящее сообщение (client -> server)

Сейчас сервер ожидает JSON такого вида:

{
  "author": "alice",
  "body": "hello"
}

После получения сервер создаёт запись в БД и рассылает событие всем подписчикам комнаты.

Событие message.new (server -> clients)

Сервер рассылает JSON с типом message.new и объектом message.

{
  "type": "message.new",
  "message": {
    "id": 123,
    "room_id": 1,
    "author": "alice",
    "body": "hello",
    "created_at": "2026-01-01T00:00:00+00:00"
  }
}

Поведение подключения

  • Один клиент может быть подключен к одной комнате по одному сокету.

  • Сервер хранит набор активных сокетов на комнату и делает broadcast всем, кто жив.

  • При ошибке отправки соединение удаляется из комнаты.

Идемпотентность (цель)

В текущем коде WebSocket-ветка создаёт Message напрямую и не использует общий сервис идемпотентности.

Целевое поведение:

  • WS и HTTP должны проходить через одну и ту же функцию создания сообщения с поддержкой nonce + enforce_nonce, чтобы WS не обходил дедупликацию.

Идемпотентность (цель)

Сейчас отправка сообщений по WebSocket может создавать дубли при ретраях: клиент повторяет отправку, а сервер каждый раз создаёт новую запись.

Целевое поведение такое же, как у HTTP:

  • Клиент может передать nonce и флаг enforce_nonce.

  • Если enforce_nonce=true, повтор с тем же nonce в коротком окне времени не должен создавать новое сообщение.

  • Вместо этого сервер возвращает (и/или рассылает) уже созданное сообщение.

Чтобы это гарантировать, и HTTP, и WebSocket должны вызывать одну и ту же бизнес‑функцию создания сообщения (общий сервис), а не иметь две независимые реализации.

Последнее обновление