Обновление до 4.0
Все пакеты имеют общую версию. DarkWS 4.0 меняет протокол передачи и не умеет откатываться на формат 3.x, поэтому обновляйте сервер и все клиенты одновременно и при необходимости так же одновременно откатывайте их. Сохранённых данных для миграции нет. Полный список изменений — в changelog.
Протокол передачи
| 3.x | 4.0 | |
|---|---|---|
| Аргументы запроса | Поле payload | Поле data: { "id", "action", "data"? } |
| Рассылки | Вложенный конверт | Плоский конверт: { "id": "@", "action", "data"? } |
| Аутентификация | JSON-запрос darkws:authenticate; на текстовую аутентификацию приходило JSON-сообщение @auth | Текстовая auth:<token>, ответ — текст auth:success или auth:failed |
| Logout | JSON-запрос 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, если нужно больше.