Skip to content

v0.6.0

Choose a tag to compare

@KiowDev KiowDev released this 05 Aug 19:26
· 4 commits to main since this release
Immutable release. Only release title and notes can be modified.

Предсказуемое освобождение клиента, единый сетевой путь и ограниченные очереди

Жизненный цикл клиента

  • dispose() отменяет незавершённые запросы. Runtime владеет одним сигналом времени жизни, и транспорт объединяет его с сигналом запроса: после await itd.dispose() внутри клиента не остаётся ни активных сетевых операций, ни таймеров переподключения. Отменённый запрос получает ItdAbortError с
    причиной отмены.
  • Ожидание чужого кода ограничено новой опцией shutdownTimeout (по умолчанию 10 000 мс). Срок общий на обработчики realtime-потока и на операции, вошедшие в обёртки плагинов. По его истечении ресурсы всё равно освобождаются, включая teardown плагина, а метод отклоняется ItdStateError с именем
    плагина или транспорта потока. shutdownTimeout: 0 возвращает ожидание без срока.
  • Порядок терминальной очистки закреплён: потоки, накопленная телеметрия, отмена запросов, teardown плагинов.
  • Поток, исчерпавший попытки переподключения, покидает клиент так же, как после disconnect(): close() и dispose() его больше не касаются, а повторный connect() возвращает поток клиенту.

Плагины

  • next() у operation transformer стал одноразовым. Повторный вызов завершает операцию ItdConfigError с именем плагина — так же, как это уже работало у attempt interceptor. Раньше плагин мог породить вторую логическую операцию, а для posts.create это вторая публикация.

Realtime

  • Опрос уведомлений идёт через общий конвейер клиента. В каталог добавлены операции realtime.poll.updates и realtime.poll.unread: опрос занимает слот очереди, виден плагинам и хукам, обновляет токен при 401 вместо разрыва потока и отменяется вместе с ним. Из транспорта ушли собственное получение
    токена, заголовок Authorization, распознавание 401 и снятие обёртки { data: … }.
  • TransportContext получил необязательный порт request к конвейеру клиента. SSE по-прежнему работает через fetch: у соединения другой жизненный цикл.
  • Очередь обновлений ограничена. Счётчик непрочитанного коалесцируется — ожидающее значение заменяется новым, и обработчик получает последнее; уведомления не коалесцируются. При переполнении поток закрывает соединение, дожидается разбора очереди и переподключается с обычной синхронизацией.

Хранилища

  • Запись в record-хранилище стала транзакционной. Изменение видно чтениям только после подтверждения источником: неудачная запись не расходится с backend и больше не отравляет get() и keys() собственной ошибкой. Черновик строится внутри очереди записей, поэтому параллельные записи разных ключей не
    теряют друг друга.
  • Нечитаемый ключ больше не ломает перечисление аккаунтов. accounts() пропускает запись, ключ которой не декодируется, с предупреждением — вместо URIError на весь список и пустого результата restore().

Full Changelog: v0.5.0...v0.6.0