Перейти к основному содержимому
Версия: 4.x

Обновление до 4.0

Все пакеты имеют общую версию. DarkWS 4.0 меняет протокол передачи и не умеет откатываться на формат 3.x, поэтому обновляйте сервер и все клиенты одновременно и при необходимости так же одновременно откатывайте их. Сохранённых данных для миграции нет. Полный список изменений — в changelog.

Протокол передачи​

3.x4.0
Аргументы запросаПоле payloadПоле data: { "id", "action", "data"? }
РассылкиВложенный конвертПлоский конверт: { "id": "@", "action", "data"? }
АутентификацияJSON-запрос darkws:authenticate; на текстовую аутентификацию приходило JSON-сообщение @authТекстовая auth:<token>, ответ — текст auth:success или auth:failed
LogoutJSON-запрос darkws:logoutТекстовая logout, ответ — текст logout:success

Конверты ответов и ошибок, текстовый heartbeat ping/pong и конверт Redis backplane не изменились. darkws:authenticate и darkws:logout больше не являются системными командами, а сервер больше не отправляет ответы @auth. @auth остаётся зарезервированным id запроса. См. Протокол.

Серверный код​

  • В changelog не указано изменений исходного кода для обработчиков, аутентификаторов, middleware или рассылок.
  • InputMessage.Payload и параметры payload в методах SDK сохраняют свои имена; при передаче они соответствуют полю data.
  • DarkWsOptions.AuthenticationFailedError по-прежнему компилируется, но ни на что не влияет: отклонённая текстовая аутентификация всегда отвечает auth:failed.

Браузерный клиент​

  • Обновляйте пакет darkws вместе с сервером.

  • Событие message получает полный плоский конверт рассылки. Читайте из него action и data:

    import DarkWs from "darkws";

    const client = new DarkWs({ secure: location.protocol === "https:", path: "/ws" });
    client.on("message", message => {
    const { action, data } = message as { id: "@"; action: string; data?: unknown };
    console.log(action, data);
    });
  • authenticate(token) отправляет auth:<token> и завершается успешно при auth:success; auth:failed отклоняет вызов с ErrorResponse и очищает серверную сессию. logout() отправляет logout и завершается успешно при logout:success.

  • Аутентификация и logout выполняются по одной. Если ответ не пришёл в пределах requestTimeout, клиент закрывает сокет и отклоняет команды в очереди, чтобы запоздавший ответ не подтвердил более позднюю команду.

  • Событие send сообщает об этих командах локальными метаданными без токена.

.NET-клиент​

В 4.0 появились DarkWS.Client — самостоятельный .NET-клиент — и DarkWS.Client.DependencyInjection для необязательной регистрации в DI. Оба говорят только на протоколе 4.0. См. .NET-клиент.

Собственные клиенты​

  • Переименуйте поле запроса payload в data.
  • Читайте action и data рассылки на верхнем уровне сообщения.
  • Замените JSON-запросы аутентификации и logout текстовыми командами auth:<token> и logout и не ждите JSON-ответа @auth.
  • Отправляйте не более одной команды auth:/logout за раз. Если ответ на неё не пришёл вовремя, закройте сокет вместо отправки следующей команды.

Переход с 2.x​

Выполните также миграцию на 3.0:

  • Объявите параметры payload nullable там, где отсутствующий или null-ввод допустим намеренно. Некорректный payload возвращает darkws:error:invalid-request; ошибочные регистрации и недопустимые параметры приводят к ошибке при запуске.
  • Удалите [Authorize] и атрибуты политик с обработчиков и действий; теперь они приводят к ошибке регистрации. Проверяйте доменные права в обработчиках.
  • Вызывайте AddDarkWs() один раз; повторный вызов выбрасывает InvalidOperationException.
  • Пересмотрите лимиты соединений: 16 одновременных запросов на соединение, таймаут отправки 30 секунд, дедлайны keep-alive и pong по 30 секунд на .NET 9/10 и таймаут простоя приёма 2 минуты на .NET 8. Простаивающие клиенты на .NET 8 должны отправлять прикладной трафик, например ping.
  • После изменения групп соединения вне аутентификации вызовите ConnectionStorage.Add(connection), чтобы обновить индексы.
  • Статические классы Configuration и RedisConfiguration по-прежнему работают, но устарели. Используйте вместо них методы расширения services.AddDarkWs(), endpoints.MapDarkWs() и services.AddDarkWsRedis(channel).
  • Начиная с 2.1.0 входящие сообщения ограничены 1 MiB, а более крупные закрывают соединение с кодом 1009. Задайте MaxMessageSizeBytes, если нужно больше.