v0.6.0
Предсказуемое освобождение клиента, единый сетевой путь и ограниченные очереди
Жизненный цикл клиента
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