itd-api 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +72 -27
  2. package/dist/events/index.cjs +53 -0
  3. package/dist/events/index.d.cts +3 -0
  4. package/dist/events/index.d.ts +3 -0
  5. package/dist/events/index.js +5 -0
  6. package/dist/index.cjs +234 -200
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +70 -64
  9. package/dist/index.d.ts +70 -64
  10. package/dist/index.js +202 -179
  11. package/dist/index.js.map +1 -1
  12. package/dist/node/index.cjs +6 -5
  13. package/dist/node/index.cjs.map +1 -1
  14. package/dist/node/index.d.cts +2 -2
  15. package/dist/node/index.d.ts +2 -2
  16. package/dist/node/index.js +5 -4
  17. package/dist/node/index.js.map +1 -1
  18. package/dist/rest/index.cjs +32 -26
  19. package/dist/rest/index.cjs.map +1 -1
  20. package/dist/rest/index.d.cts +9 -7
  21. package/dist/rest/index.d.ts +9 -7
  22. package/dist/rest/index.js +19 -21
  23. package/dist/rest/index.js.map +1 -1
  24. package/dist/shared/{errors-DfU8M5eS.cjs → errors-BmP3TKoW.cjs} +3 -3
  25. package/dist/shared/{errors-DfU8M5eS.cjs.map → errors-BmP3TKoW.cjs.map} +1 -1
  26. package/dist/shared/{errors-Bhrd2fJd.js → errors-GI10kZxk.js} +3 -3
  27. package/dist/shared/{errors-Bhrd2fJd.js.map → errors-GI10kZxk.js.map} +1 -1
  28. package/dist/shared/{websocket-BLR8eVJV.js → events-C5wnTXPT.js} +770 -490
  29. package/dist/shared/events-C5wnTXPT.js.map +1 -0
  30. package/dist/shared/events-CqtkP65d.d.ts +698 -0
  31. package/dist/shared/events-DGAWlCaI.d.cts +698 -0
  32. package/dist/shared/{websocket-C_eI4H2o.cjs → events-FZfnEez0.cjs} +834 -518
  33. package/dist/shared/events-FZfnEez0.cjs.map +1 -0
  34. package/dist/shared/{storage-BPJR_k4-.cjs → key-value-store-B5GYVEYZ.cjs} +2 -86
  35. package/dist/shared/key-value-store-B5GYVEYZ.cjs.map +1 -0
  36. package/dist/shared/{storage-D86edNCB.js → key-value-store-Bt2PSMxY.js} +3 -69
  37. package/dist/shared/key-value-store-Bt2PSMxY.js.map +1 -0
  38. package/dist/shared/key-value-store-COZaNHZS.d.cts +69 -0
  39. package/dist/shared/key-value-store-COZaNHZS.d.ts +69 -0
  40. package/dist/shared/{multi-storage-DccjD7Ww.d.ts → multi-storage-BEL7tcKn.d.cts} +3 -2
  41. package/dist/shared/{multi-storage--yTEqiod.cjs → multi-storage-CDKLa956.cjs} +11 -10
  42. package/dist/shared/{multi-storage--yTEqiod.cjs.map → multi-storage-CDKLa956.cjs.map} +1 -1
  43. package/dist/shared/{multi-storage-CjAPB5Kq.d.cts → multi-storage-LkljOSzA.d.ts} +3 -2
  44. package/dist/shared/{multi-storage-CkvTUC5m.js → multi-storage-SoW05uzO.js} +5 -4
  45. package/dist/shared/{multi-storage-CkvTUC5m.js.map → multi-storage-SoW05uzO.js.map} +1 -1
  46. package/dist/shared/{options-Dg5N3r1V.cjs → options-DOJYtoti.cjs} +8 -6
  47. package/dist/shared/options-DOJYtoti.cjs.map +1 -0
  48. package/dist/shared/{options-DtATYdLr.js → options-DhgGg7Ms.js} +8 -6
  49. package/dist/shared/options-DhgGg7Ms.js.map +1 -0
  50. package/dist/shared/{cookies-DZwFq6kr.cjs → redact-BP00URmQ.cjs} +312 -2
  51. package/dist/shared/redact-BP00URmQ.cjs.map +1 -0
  52. package/dist/shared/{cookies-tX2sNwxb.js → redact-Ba5iSVYZ.js} +235 -3
  53. package/dist/shared/redact-Ba5iSVYZ.js.map +1 -0
  54. package/dist/shared/{render-CgwKdOzu.d.ts → render-B4qis7Sb.d.ts} +775 -313
  55. package/dist/shared/{render-DO0F5YSm.d.cts → render-DDwy2Ame.d.cts} +775 -313
  56. package/dist/shared/{render-mcuELiYi.cjs → render-Dqi8Owqk.cjs} +1464 -662
  57. package/dist/shared/render-Dqi8Owqk.cjs.map +1 -0
  58. package/dist/shared/{render-C6HRPs10.js → render-hiWFh2s4.js} +1366 -618
  59. package/dist/shared/render-hiWFh2s4.js.map +1 -0
  60. package/dist/shared/storage-BQrtKon9.d.cts +86 -0
  61. package/dist/shared/storage-CTRGT5wF.d.ts +86 -0
  62. package/dist/shared/storage-CfHKzVHf.js +71 -0
  63. package/dist/shared/storage-CfHKzVHf.js.map +1 -0
  64. package/dist/shared/storage-QNVxzpDB.cjs +88 -0
  65. package/dist/shared/storage-QNVxzpDB.cjs.map +1 -0
  66. package/dist/shared/{url-BaMCQpYH.cjs → url-Bsb3xE5U.cjs} +577 -466
  67. package/dist/shared/url-Bsb3xE5U.cjs.map +1 -0
  68. package/dist/shared/{url-IU0xN9wX.js → url-DP33mp3s.js} +508 -409
  69. package/dist/shared/url-DP33mp3s.js.map +1 -0
  70. package/dist/shared/{url-DTfZ2toq.d.ts → url-XBsMdAcv.d.cts} +1313 -1200
  71. package/dist/shared/{url-DTfZ2toq.d.cts → url-XBsMdAcv.d.ts} +1313 -1200
  72. package/dist/web/index.cjs +5 -4
  73. package/dist/web/index.cjs.map +1 -1
  74. package/dist/web/index.d.cts +1 -1
  75. package/dist/web/index.d.ts +1 -1
  76. package/dist/web/index.js +3 -2
  77. package/dist/web/index.js.map +1 -1
  78. package/package.json +16 -15
  79. package/dist/realtime/index.cjs +0 -165
  80. package/dist/realtime/index.cjs.map +0 -1
  81. package/dist/realtime/index.d.cts +0 -51
  82. package/dist/realtime/index.d.ts +0 -51
  83. package/dist/realtime/index.js +0 -120
  84. package/dist/realtime/index.js.map +0 -1
  85. package/dist/shared/auth-provider-CG8oCQ9F.cjs +0 -108
  86. package/dist/shared/auth-provider-CG8oCQ9F.cjs.map +0 -1
  87. package/dist/shared/auth-provider-mYqxsSVa.js +0 -91
  88. package/dist/shared/auth-provider-mYqxsSVa.js.map +0 -1
  89. package/dist/shared/cookies-DZwFq6kr.cjs.map +0 -1
  90. package/dist/shared/cookies-tX2sNwxb.js.map +0 -1
  91. package/dist/shared/options-Dg5N3r1V.cjs.map +0 -1
  92. package/dist/shared/options-DtATYdLr.js.map +0 -1
  93. package/dist/shared/render-C6HRPs10.js.map +0 -1
  94. package/dist/shared/render-mcuELiYi.cjs.map +0 -1
  95. package/dist/shared/storage-BPJR_k4-.cjs.map +0 -1
  96. package/dist/shared/storage-C_eICCep.d.cts +0 -152
  97. package/dist/shared/storage-C_eICCep.d.ts +0 -152
  98. package/dist/shared/storage-D86edNCB.js.map +0 -1
  99. package/dist/shared/url-BaMCQpYH.cjs.map +0 -1
  100. package/dist/shared/url-IU0xN9wX.js.map +0 -1
  101. package/dist/shared/websocket-BLR8eVJV.js.map +0 -1
  102. package/dist/shared/websocket-C_eI4H2o.cjs.map +0 -1
  103. package/dist/shared/websocket-DF7XIMiX.d.cts +0 -562
  104. package/dist/shared/websocket-DYKBr8HF.d.ts +0 -562
@@ -1,562 +0,0 @@
1
- import { B as Notification, Ft as Logger, Mt as Unsubscribe, R as NotificationEvent, St as RealtimeStatus, Xt as QueryParams, et as AuthIdentity, jt as Listener, rn as BuiltInOperationId, tn as ItdClock, xt as NotificationType } from "./url-DTfZ2toq.js";
2
- //#region src/realtime/transports/transport.d.ts
3
- /** Запрос транспорта к конвейеру клиента. */
4
- interface RealtimeRequestInput {
5
- operationId: BuiltInOperationId;
6
- path: string;
7
- query?: QueryParams | undefined;
8
- /**
9
- * Отмена запроса. Опрос передаёт сигнал своего соединения; разовое чтение счётчика
10
- * непрочитанных отменять нечем — оно живёт вне цикла соединения.
11
- */
12
- signal?: AbortSignal | undefined;
13
- }
14
- /**
15
- * Порт к конвейеру клиента: очередь, авторизация, повторы, плагины и хуки.
16
- *
17
- * Ответ приходит уже разобранным и без обёртки `{ data: … }`, а неудача — типизированной
18
- * ошибкой библиотеки.
19
- */
20
- type RealtimeRequest = (input: RealtimeRequestInput) => Promise<unknown>;
21
- /** Событие, пришедшее по каналу реального времени. */
22
- interface TransportEvent {
23
- /** Имя события: `notification`, `unread_count` и другие. */
24
- name: string;
25
- /** Полезная нагрузка, уже разобранная из JSON. */
26
- data: unknown;
27
- }
28
- /** Что транспорт получает от клиента при подключении. */
29
- interface TransportContext {
30
- /** Базовый URL API. */
31
- baseUrl: string;
32
- /** Разрешено ли передавать токен этому сервису. */
33
- authorize: boolean;
34
- /** Реализация `fetch`. */
35
- fetch: typeof fetch;
36
- /**
37
- * Выполнение обычных HTTP-запросов транспорта через конвейер клиента.
38
- *
39
- * Есть только у потока, созданного клиентом: конвейер принадлежит ему.
40
- */
41
- request?: RealtimeRequest | undefined;
42
- /**
43
- * Общие заголовки клиента: `User-Agent`, `X-Device-Id`, заголовки конфигурации
44
- * и cookie для указанного адреса.
45
- */
46
- baseHeaders: (url: string) => Promise<Headers>;
47
- /** Текущий токен доступа. */
48
- getToken: () => Promise<string | null>;
49
- /** Отмена подключения. */
50
- signal: AbortSignal;
51
- /** Сообщает о полученном событии. */
52
- onEvent: (event: TransportEvent) => void;
53
- /** Сообщает о разобранном, но некорректном сообщении. Соединение при этом живёт. */
54
- onParseError: (error: unknown, raw: string) => void;
55
- /** Вызывается, когда соединение установлено. */
56
- onOpen: () => void;
57
- }
58
- /** Канал получения исходных событий в реальном времени. */
59
- interface RealtimeTransport {
60
- /** Понятное имя для логов и диагностики. */
61
- readonly name: string;
62
- /**
63
- * Держит соединение, пока оно живо.
64
- *
65
- * Должен завершиться, когда поток закрылся, и бросить исключение при ошибке.
66
- * Отмена через `context.signal` должна приводить к `AbortError`.
67
- */
68
- connect(context: TransportContext): Promise<void>;
69
- }
70
- /** Ошибка, по которой видно, что сервер отверг авторизацию потока. */
71
- declare class UnauthorizedStreamError extends Error {
72
- constructor();
73
- }
74
- //#endregion
75
- //#region src/realtime/updates.d.ts
76
- /** Типы нормализованных обновлений потока. */
77
- declare const RealtimeUpdateType: Readonly<{
78
- readonly Notification: "notification";
79
- readonly UnreadCount: "unreadCount";
80
- readonly Unknown: "unknown";
81
- }>;
82
- /** Источники нормализованных обновлений потока. */
83
- declare const RealtimeUpdateOrigin: Readonly<{
84
- readonly Stream: "stream";
85
- readonly Sync: "sync";
86
- }>;
87
- type RealtimeUpdateOrigin = (typeof RealtimeUpdateOrigin)[keyof typeof RealtimeUpdateOrigin];
88
- /** Уведомление с типом, суженным фильтром потока. */
89
- type NotificationOfType<T extends NotificationType> = Omit<Notification, 'type'> & {
90
- type: T;
91
- };
92
- /** Конверт уведомления с типом, суженным фильтром потока. */
93
- type NotificationEventOfType<T extends NotificationType> = Omit<NotificationEvent, 'notification'> & {
94
- notification: NotificationOfType<T>;
95
- };
96
- /** Нормализованное уведомление из потока. */
97
- interface RealtimeNotificationUpdate<T extends NotificationType = NotificationType> {
98
- readonly type: typeof RealtimeUpdateType.Notification;
99
- readonly data: NotificationEventOfType<T>;
100
- }
101
- /** Актуальное число непрочитанных уведомлений. */
102
- interface RealtimeUnreadCountUpdate {
103
- readonly type: typeof RealtimeUpdateType.UnreadCount;
104
- readonly data: number;
105
- }
106
- /** Неизвестное библиотеке событие потока. */
107
- interface RealtimeUnknownUpdate {
108
- readonly type: typeof RealtimeUpdateType.Unknown;
109
- readonly name: string;
110
- readonly data: unknown;
111
- }
112
- /** Данные, проходящие через промежуточные обработчики потока. */
113
- type RealtimeUpdate = RealtimeNotificationUpdate | RealtimeUnreadCountUpdate | RealtimeUnknownUpdate;
114
- /** Тип нормализованного обновления потока. */
115
- type RealtimeUpdateType = RealtimeUpdate['type'];
116
- /** Обновление потока указанного типа. */
117
- type RealtimeUpdateOfType<T extends RealtimeUpdateType> = Extract<RealtimeUpdate, {
118
- type: T;
119
- }>;
120
- /**
121
- * Общая форма контекста обработки: то, что есть у любого потока независимо от домена.
122
- *
123
- * Контекст — обычный объектный литерал, а не класс с геттерами и не `Object.freeze`:
124
- * плагины-флейворы присваивают в него свои поля (`ctx.session = …`), а `@itd-api/hydrate`
125
- * подменяет `update` и `stream` через `Object.defineProperty`.
126
- *
127
- * @typeParam U нормализованное обновление домена
128
- * @typeParam S поток, который его получил
129
- */
130
- interface RealtimeContextBase<U = unknown, S = unknown> {
131
- /** Нормализованные данные обновления. */
132
- readonly update: U;
133
- /** Поток, который получил обновление. */
134
- readonly stream: S;
135
- /** Исходный кадр транспорта. Для начальной REST-синхронизации равен `undefined`. */
136
- readonly raw: TransportEvent | undefined;
137
- /** Откуда получены данные. */
138
- readonly origin: RealtimeUpdateOrigin;
139
- }
140
- /** Контекст обработки одного обновления потока уведомлений. */
141
- type RealtimeContext<U extends RealtimeUpdate = RealtimeUpdate> = RealtimeContextBase<U, ItdRealtime>;
142
- /** Контекст уведомления с типом, суженным фильтром. */
143
- type RealtimeNotificationContext<T extends NotificationType = NotificationType> = RealtimeContext<RealtimeNotificationUpdate<T>>;
144
- /** Условия отбора уведомлений. Все указанные поля объединяются через логическое И. */
145
- interface RealtimeNotificationFilter<T extends NotificationType = NotificationType> {
146
- /** Один или несколько канонических типов уведомления. */
147
- type?: T | readonly T[];
148
- /** Идентификатор хотя бы одного участника уведомления. */
149
- actorId?: string;
150
- /** Идентификатор объекта события. */
151
- entityId?: string | null;
152
- /** Идентификатор родительского объекта. */
153
- parentEntityId?: string | null;
154
- /** Дополнительная проверка после сопоставления полей. */
155
- predicate?: (context: RealtimeNotificationContext<T>) => boolean;
156
- }
157
- /** Краткая или объектная форма фильтра уведомлений. */
158
- type RealtimeNotificationSelector<T extends NotificationType = NotificationType> = T | readonly T[] | RealtimeNotificationFilter<T>;
159
- //#endregion
160
- //#region src/realtime/middleware.d.ts
161
- /** Продолжает цепочку промежуточных обработчиков потока. */
162
- type RealtimeNext = () => Promise<void>;
163
- /** Обрабатывает обновление потока до его передачи подписчикам. */
164
- type RealtimeMiddleware<C extends RealtimeContextBase = RealtimeContext> = (context: C, next: RealtimeNext) => void | Promise<void>;
165
- /** Объект, предоставляющий снимок промежуточного обработчика потока. */
166
- interface RealtimeMiddlewareObj<C extends RealtimeContextBase = RealtimeContext> {
167
- middleware(): RealtimeMiddleware<C>;
168
- }
169
- /** Асинхронный обработчик нормализованного обновления потока. */
170
- type RealtimeHandler<C extends RealtimeContextBase = RealtimeContext> = (context: C) => unknown | Promise<unknown>;
171
- /** Условие отбора контекста потока. */
172
- type RealtimePredicate<C extends RealtimeContextBase = RealtimeContext> = (context: C) => boolean;
173
- /** Проверка, сужающая тип контекста потока. */
174
- type RealtimeTypeGuard<C extends B, B extends RealtimeContextBase = RealtimeContext> = (context: B) => context is C;
175
- /** Ключи, по которым обновления нельзя обрабатывать одновременно. */
176
- type RealtimeSequentializer<C extends RealtimeContextBase = RealtimeContext> = (context: C) => PropertyKey | readonly PropertyKey[] | undefined;
177
- /** Выполняет промежуточные обработчики по порядку и запрещает повторный вызов `next()`. */
178
- declare function runRealtimeMiddleware<C extends RealtimeContextBase>(middleware: readonly RealtimeMiddleware<C>[], context: C, terminal: RealtimeNext): Promise<void>;
179
- //#endregion
180
- //#region src/realtime/reconnect.d.ts
181
- /** Настройки переподключения. */
182
- interface ReconnectOptions {
183
- /** Таблица пауз. Последнее значение действует для всех дальнейших попыток. */
184
- backoff?: readonly number[];
185
- /** Доля разброса, 0…1. */
186
- jitter?: number;
187
- /** Предел числа попыток. */
188
- maxAttempts?: number;
189
- }
190
- //#endregion
191
- //#region src/realtime/engine.d.ts
192
- /**
193
- * События, которые движок рассылает сам.
194
- *
195
- * Ни одно из них не зависит от домена, поэтому они одинаковы у любого потока.
196
- * Домен расширяет эту карту своими событиями.
197
- */
198
- interface RealtimeEngineEvents<C extends RealtimeContextBase = RealtimeContextBase> {
199
- /** Изменилось состояние соединения. */
200
- status: RealtimeStatus;
201
- /** Соединение оборвалось; будет предпринята попытка переподключения. */
202
- error: {
203
- error: unknown;
204
- willReconnect: boolean;
205
- };
206
- /** Сообщение не удалось разобрать. Соединение при этом продолжает работать. */
207
- parseError: {
208
- error: unknown;
209
- raw: string;
210
- };
211
- /** Запланировано переподключение. */
212
- reconnect: {
213
- attempt: number;
214
- delay: number;
215
- };
216
- /** Попытки исчерпаны — соединение восстановится только ручным `connect()`. */
217
- giveup: undefined;
218
- /** Любой исходный кадр транспорта. Отправляется до нормализации и обработчиков. */
219
- message: TransportEvent;
220
- /** Промежуточный обработчик потока завершился исключением. */
221
- middlewareError: {
222
- error: unknown;
223
- context: C;
224
- };
225
- /** Обработчик обновления завершился исключением. */
226
- handlerError: {
227
- error: unknown;
228
- context: C;
229
- };
230
- }
231
- //#endregion
232
- //#region src/realtime/stream.d.ts
233
- /**
234
- * События потока уведомлений.
235
- *
236
- * Общая часть — {@link RealtimeEngineEvents}: статусы, ошибки и переподключение одинаковы
237
- * у любого потока. Ниже — то, что есть только у уведомлений.
238
- */
239
- interface RealtimeEvents<C extends RealtimeContext = RealtimeContext> extends RealtimeEngineEvents<C> {
240
- /** Пришло новое уведомление. */
241
- notification: NotificationEvent;
242
- /**
243
- * Сервер подтвердил подключение и назвал получателя событий.
244
- *
245
- * Приходит первым кадром сразу после установки соединения.
246
- */
247
- ready: {
248
- userId: string | undefined;
249
- };
250
- /**
251
- * Получено актуальное число непрочитанных.
252
- *
253
- * При подключении клиент может запросить начальное значение через REST. Затем событие
254
- * возникает, только если счётчик пришёл в потоке. В остальных случаях обновляйте его
255
- * в приложении либо запрашивайте `itd.notifications.count()`.
256
- */
257
- unreadCount: number;
258
- }
259
- /** Способ получения событий. */
260
- declare const RealtimeTransportKind: Readonly<{
261
- /** Поток событий, если среда умеет читать тело по частям, иначе опрос. */
262
- readonly Auto: "auto";
263
- /** Поток `text/event-stream`. */
264
- readonly Sse: "sse";
265
- /** Периодический опрос REST. */
266
- readonly Poll: "poll";
267
- }>;
268
- type RealtimeTransportKind = (typeof RealtimeTransportKind)[keyof typeof RealtimeTransportKind];
269
- /** Настройки потока уведомлений. */
270
- interface RealtimeOptions<C extends RealtimeContext = RealtimeContext> extends ReconnectOptions {
271
- /**
272
- * Транспорт. По умолчанию `auto`: поток событий, если среда умеет читать тело ответа
273
- * по частям, иначе опрос.
274
- *
275
- * Можно передать и свою реализацию {@link RealtimeTransport} — это пригодится, если
276
- * у платформы появится WebSocket либо нужен нестандартный способ доставки.
277
- */
278
- transport?: RealtimeTransportKind | RealtimeTransport;
279
- /**
280
- * Молчание сервера, после которого соединение считается мёртвым, мс. По умолчанию 90 000.
281
- *
282
- * Сервер не присылает keep-alive, поэтому без этой проверки оборванное соединение
283
- * может незаметно «зависнуть».
284
- */
285
- idleTimeout?: number;
286
- /**
287
- * Сколько ждать ответа на запрос потока, прежде чем оборвать попытку, мс. По умолчанию
288
- * 20 000. Защищает от зависания на установке соединения, когда {@link idleTimeout} ещё
289
- * не действует. `0` отключает проверку. Только для потокового транспорта.
290
- */
291
- handshakeTimeout?: number;
292
- /** Как часто опрашивать сервер, если используется запасной транспорт. */
293
- pollInterval?: number;
294
- /**
295
- * Запрашивать число непрочитанных при подключении. По умолчанию `true`.
296
- *
297
- * Так поступает сайт итд.com: поток присылает только новые события, а начальное
298
- * значение счётчика нужно получить отдельно.
299
- */
300
- syncCount?: boolean;
301
- /**
302
- * Переподключаться, когда вкладка снова становится видимой. По умолчанию `true`.
303
- *
304
- * Только в браузере. У сайта итд.com такой обработки нет, из-за чего вкладка,
305
- * пролежавшая в фоне, может остаться без соединения.
306
- */
307
- reconnectOnVisible?: boolean;
308
- /** Переподключаться при восстановлении сети. По умолчанию `true`. Только в браузере. */
309
- reconnectOnOnline?: boolean;
310
- /** Максимальное число одновременно обрабатываемых обновлений. По умолчанию 1. */
311
- concurrency?: number;
312
- /** Возвращает ключи обновлений, которые нельзя обрабатывать одновременно. */
313
- sequentialize?: RealtimeSequentializer<C>;
314
- }
315
- /** Что поток получает от клиента. */
316
- interface RealtimeDeps {
317
- baseUrl: string;
318
- /** Разрешено ли транспорту передавать токен этому сервису. */
319
- authorize?: boolean | undefined;
320
- fetch: typeof fetch;
321
- /** Конвейер клиента — см. {@link TransportContext.request}. */
322
- request?: RealtimeRequest | undefined;
323
- clock?: ItdClock;
324
- /** Общие заголовки клиента для адреса — см. {@link TransportContext.baseHeaders}. */
325
- baseHeaders: (url: string) => Promise<Headers>;
326
- /** Идентификаторы аккаунта и сессии создавшего поток клиента. */
327
- getAuthIdentity?: (() => AuthIdentity) | undefined;
328
- /** Непрозрачная область авторизации создавшего поток клиента. */
329
- getAuthScope?: (() => string) | undefined;
330
- getToken: () => Promise<string | null>;
331
- /** Обновляет токен после отказа авторизации. Возвращает `true`, если удалось. */
332
- refresh: () => Promise<boolean>;
333
- /** Загружает начальное число непрочитанных. */
334
- fetchUnreadCount: () => Promise<number>;
335
- /** Вызывается при явном закрытии потока. */
336
- onClose?: (() => void) | undefined;
337
- /** Вызывается при запуске ранее закрытого потока. */
338
- onConnect?: (() => void) | undefined;
339
- logger?: Logger | undefined;
340
- }
341
- /**
342
- * Поток уведомлений в реальном времени.
343
- *
344
- * Получается вызовом `itd.realtime()`. Соединение поднимается методом {@link connect}
345
- * и держится само: обрывы, обновление токена и повторные попытки библиотека берёт на себя.
346
- *
347
- * Параметр типа задаёт форму контекста: плагин может расширить её своими полями
348
- * (`ItdRealtime<RealtimeContext & SessionFlavor<S>>`) и типизировать обработчики.
349
- *
350
- * @example
351
- * ```ts
352
- * import { NotificationType } from 'itd-api';
353
- *
354
- * const stream = itd.realtime();
355
- *
356
- * stream.onNotification(NotificationType.PostComment, async ({ update }) => {
357
- * await saveCommentNotification(update.data.notification);
358
- * });
359
- * stream.on('status', (status) => console.log('соединение:', status));
360
- *
361
- * await stream.connect();
362
- * // …позже
363
- * stream.disconnect();
364
- * await stream.drain();
365
- * ```
366
- */
367
- declare class ItdRealtime<C extends RealtimeContext = RealtimeContext> {
368
- #private;
369
- constructor(deps: RealtimeDeps, options?: RealtimeOptions<C>);
370
- /** Текущее состояние соединения. */
371
- get status(): RealtimeStatus;
372
- /** Имя используемого транспорта. */
373
- get transport(): string;
374
- /** Базовый URL клиента, создавшего поток. @internal */
375
- get baseUrl(): string;
376
- /** Идентификаторы аккаунта и сессии клиента, создавшего поток. @internal */
377
- getAuthIdentity(): AuthIdentity | undefined;
378
- /** Непрозрачная область авторизации создавшего поток клиента. @internal */
379
- getAuthScope(): string | undefined;
380
- /** Подписывается на событие потока. @returns функция отписки */
381
- on<K extends keyof RealtimeEvents<C>>(event: K, listener: Listener<RealtimeEvents<C>[K]>): Unsubscribe;
382
- /** Подписывается на одно срабатывание. */
383
- once<K extends keyof RealtimeEvents<C>>(event: K, listener: Listener<RealtimeEvents<C>[K]>): Unsubscribe;
384
- /**
385
- * Добавляет промежуточный обработчик или объект, предоставляющий его через `middleware()`.
386
- *
387
- * Обработчики выполняются в порядке регистрации. Если `next()` не вызван, обновление не
388
- * передаётся дальше по цепочке, асинхронным обработчикам и слушателям событий.
389
- *
390
- * @returns функция удаления обработчика
391
- */
392
- use(middleware: RealtimeMiddleware<C> | RealtimeMiddlewareObj<C>): Unsubscribe;
393
- /** Подписывает асинхронный обработчик на все нормализованные обновления. */
394
- onUpdate(handler: RealtimeHandler<C>): Unsubscribe;
395
- /** Подписывает асинхронный обработчик на обновление указанного типа. */
396
- onUpdate<T extends RealtimeUpdateType>(type: T, handler: RealtimeHandler<C & RealtimeContext<RealtimeUpdateOfType<T>>>): Unsubscribe;
397
- /** Подписывает асинхронный обработчик по функции сужения типа. */
398
- onUpdate<N extends C>(guard: RealtimeTypeGuard<N, C>, handler: RealtimeHandler<N>): Unsubscribe;
399
- /** Подписывает асинхронный обработчик по пользовательскому условию. */
400
- onUpdate(predicate: RealtimePredicate<C>, handler: RealtimeHandler<C>): Unsubscribe;
401
- /** Подписывает асинхронный обработчик на уведомления, подходящие под фильтр. */
402
- onNotification<T extends NotificationType>(selector: RealtimeNotificationSelector<T>, handler: RealtimeHandler<C & RealtimeNotificationContext<T>>): Unsubscribe;
403
- /** Подписывает асинхронный обработчик по функции сужения типа уведомления. */
404
- onNotification<N extends C & RealtimeNotificationContext>(guard: (context: C & RealtimeNotificationContext) => context is N, handler: RealtimeHandler<N>): Unsubscribe;
405
- /** Подписывает асинхронный обработчик по пользовательскому условию. */
406
- onNotification(predicate: (context: C & RealtimeNotificationContext) => boolean, handler: RealtimeHandler<C & RealtimeNotificationContext>): Unsubscribe;
407
- /**
408
- * Поднимает соединение.
409
- *
410
- * Повторный вызов при уже живом соединении ничего не делает — это защита от двойного
411
- * подключения при перерисовке интерфейса.
412
- *
413
- * Возвращает управление сразу после запуска: соединение живёт в фоне.
414
- *
415
- * @throws если создавший поток клиент уже освобождён
416
- */
417
- connect(): Promise<void>;
418
- /** Закрывает соединение и отменяет запланированные попытки. */
419
- disconnect(): void;
420
- /** Ждёт завершения всех принятых обновлений. */
421
- drain(): Promise<void>;
422
- /** Снимает подписки `on()` и `once()`. Остальные обработчики остаются. */
423
- removeAllListeners(): void;
424
- }
425
- //#endregion
426
- //#region src/realtime/router.d.ts
427
- /** Выбирает маршрут обновления. `undefined` и `null` означают отсутствие маршрута. */
428
- type RealtimeRouteSelector<K extends PropertyKey, C extends RealtimeContextBase = RealtimeContext> = (context: C) => K | null | undefined | Promise<K | null | undefined>;
429
- /**
430
- * Направляет обновления потока в именованные цепочки промежуточных обработчиков.
431
- *
432
- * @example
433
- * ```ts
434
- * import { RealtimeRouter, RealtimeUpdateType } from 'itd-api';
435
- *
436
- * const router = new RealtimeRouter((context) => context.update.type);
437
- * router.route(RealtimeUpdateType.Notification, async (context, next) => {
438
- * if (context.update.type === RealtimeUpdateType.Notification) {
439
- * await handleNotification(context.update.data.notification);
440
- * }
441
- * await next();
442
- * });
443
- * stream.use(router);
444
- * ```
445
- */
446
- declare class RealtimeRouter<K extends PropertyKey = PropertyKey, C extends RealtimeContextBase = RealtimeContext> implements RealtimeMiddlewareObj<C> {
447
- #private;
448
- constructor(selector: RealtimeRouteSelector<K, C>);
449
- /** Добавляет промежуточные обработчики к маршруту и возвращает функцию их удаления. */
450
- route(key: K, ...middleware: readonly RealtimeMiddleware<C>[]): Unsubscribe;
451
- /** Добавляет промежуточные обработчики для обновлений без зарегистрированного маршрута. */
452
- otherwise(...middleware: readonly RealtimeMiddleware<C>[]): Unsubscribe;
453
- /** Возвращает снимок маршрутов для `stream.use(router)` или ручной композиции. */
454
- middleware(): RealtimeMiddleware<C>;
455
- }
456
- //#endregion
457
- //#region src/realtime/composer.d.ts
458
- /** Функция или объектный middleware, который можно добавить в {@link RealtimeComposer}. */
459
- type RealtimeMiddlewareLike<C extends RealtimeContextBase = RealtimeContext> = RealtimeMiddleware<C> | RealtimeMiddlewareObj<C>;
460
- /** Один middleware или последовательность middleware для ветки composer. */
461
- type RealtimeMiddlewareGroup<C extends RealtimeContextBase = RealtimeContext> = RealtimeMiddlewareLike<C> | readonly RealtimeMiddlewareLike<C>[];
462
- /** Синхронное или асинхронное условие ветвления composer. */
463
- type RealtimeFilter<C extends RealtimeContextBase = RealtimeContext> = (context: C) => boolean | Promise<boolean>;
464
- /** Ошибка локальной realtime-ветки вместе с контекстом обрабатываемого обновления. */
465
- interface RealtimeErrorContext<C extends RealtimeContextBase = RealtimeContext> {
466
- /** Исходное исключение middleware. */
467
- readonly error: unknown;
468
- /** Контекст обновления, на котором завершилась ветка. */
469
- readonly context: C;
470
- }
471
- /** Обработчик локальной границы ошибок composer. */
472
- type RealtimeErrorBoundary<C extends RealtimeContextBase = RealtimeContext> = (failure: RealtimeErrorContext<C>, next: RealtimeNext) => unknown | Promise<unknown>;
473
- /** Именованные ветки для {@link RealtimeComposer.route}. */
474
- type RealtimeRouteTable<K extends string | symbol, C extends RealtimeContextBase = RealtimeContext> = Partial<Record<K, RealtimeMiddlewareGroup<C>>>;
475
- /**
476
- * Собирает переиспользуемый feature-модуль из realtime middleware.
477
- *
478
- * Composer не открывает соединение и не планирует конкурентность: готовый объект подключается
479
- * через `stream.use(composer)`, а выполнение остаётся обязанностью существующего dispatcher.
480
- * Для каждого принятого update используется снимок всей вложенной структуры composer.
481
- *
482
- * @example
483
- * ```ts
484
- * const feature = new RealtimeComposer<AppRealtimeContext>();
485
- * const safe = feature.errorBoundary(reportFeatureError);
486
- * safe.filter(isPostUpdate).use(handlePost);
487
- * stream.use(feature);
488
- * ```
489
- */
490
- declare class RealtimeComposer<C extends RealtimeContextBase = RealtimeContext> implements RealtimeMiddlewareObj<C> {
491
- #private;
492
- constructor(...middleware: readonly RealtimeMiddlewareLike<C>[]);
493
- /** Добавляет middleware в конец текущей onion-цепочки. */
494
- use(...middleware: readonly RealtimeMiddlewareLike<C>[]): this;
495
- /** Создаёт дочернюю ветку, выполняемую только когда type guard принимает контекст. */
496
- filter<N extends C>(predicate: RealtimeTypeGuard<N, C>, ...middleware: readonly RealtimeMiddlewareLike<N>[]): RealtimeComposer<N>;
497
- /** Создаёт дочернюю ветку по синхронному или асинхронному условию. */
498
- filter(predicate: RealtimeFilter<C>, ...middleware: readonly RealtimeMiddlewareLike<C>[]): RealtimeComposer<C>;
499
- /**
500
- * Направляет контекст в одну именованную ветку.
501
- *
502
- * Неизвестный ключ без fallback пропускает update следующему внешнему middleware. Для
503
- * динамической регистрации и числовых ключей используйте {@link RealtimeRouter} напрямую.
504
- */
505
- route<K extends string | symbol>(selector: RealtimeRouteSelector<K, C>, routes: RealtimeRouteTable<K, C>, fallback?: RealtimeMiddlewareGroup<C>): this;
506
- /**
507
- * Создаёт дочернюю ветку с локальной границей ошибок.
508
- *
509
- * Граница защищает только переданные и затем добавленные в возвращённый composer middleware.
510
- * Ошибки внешней цепочки намеренно не перехватываются. Обработчик может вызвать `next()`,
511
- * чтобы после ошибки продолжить внешнюю цепочку, либо повторно выбросить исключение. Внешняя
512
- * цепочка начинается после полного завершения защищённой ветки, а не входит в её onion-вызов.
513
- */
514
- errorBoundary(handler: RealtimeErrorBoundary<C>, ...middleware: readonly RealtimeMiddlewareLike<C>[]): RealtimeComposer<C>;
515
- /** Возвращает snapshot-aware middleware для `stream.use()` или вложенного composer. */
516
- middleware(): RealtimeMiddleware<C>;
517
- }
518
- //#endregion
519
- //#region src/realtime/transports/websocket.d.ts
520
- /** Дополнительные параметры конструктора, поддерживаемые Node-реализациями вроде `ws`. */
521
- interface WebSocketImplementationOptions {
522
- headers?: Record<string, string> | undefined;
523
- handshakeTimeout?: number | undefined;
524
- }
525
- /** Конструктор WebSocket, который можно передать вместо глобальной реализации. */
526
- interface WebSocketLike {
527
- new (url: string | URL, protocols?: string | string[], options?: WebSocketImplementationOptions): unknown;
528
- }
529
- /** Определяет, был ли отказ до открытия сокета вызван недействительным токеном. */
530
- type WebSocketOpenFailureClassifier = (error: unknown, signal: AbortSignal) => boolean | Promise<boolean>;
531
- /** Настройки WebSocket-транспорта. */
532
- interface WebSocketTransportOptions {
533
- /** Путь апгрейда. По умолчанию `/api/ws`. */
534
- path?: string | undefined;
535
- /** Реализация WebSocket для сред без глобальной либо для передачи заголовков апгрейда. */
536
- webSocketImpl?: WebSocketLike | undefined;
537
- /** Способ передачи токена. `auto` выбирает заголовок при инъекции и query иначе. */
538
- auth?: 'query' | 'header' | 'auto' | undefined;
539
- /** Молчание открытого соединения до переподключения, мс. По умолчанию 90 000. */
540
- idleTimeout?: number | undefined;
541
- /** Период текстового `ping`, мс. По умолчанию 30 000. */
542
- keepAlive?: number | undefined;
543
- /** Максимальное время установки соединения, мс. По умолчанию 20 000. */
544
- handshakeTimeout?: number | undefined;
545
- /**
546
- * Проверяет отказ до `open`, когда среда скрыла HTTP-статус WebSocket-upgrade.
547
- * `true` преобразует отказ в {@link UnauthorizedStreamError}.
548
- */
549
- classifyOpenFailure?: WebSocketOpenFailureClassifier | undefined;
550
- /** Часы транспорта. Обычно подменяются только в тестах. */
551
- clock?: ItdClock | undefined;
552
- }
553
- /** Транспорт исходных realtime-событий поверх стандартного WebSocket. */
554
- declare class WebSocketTransport implements RealtimeTransport {
555
- #private;
556
- readonly name = "ws";
557
- constructor(options?: WebSocketTransportOptions);
558
- connect(context: TransportContext): Promise<void>;
559
- }
560
- //#endregion
561
- export { NotificationOfType as A, RealtimeUpdateOfType as B, RealtimeMiddlewareObj as C, RealtimeTypeGuard as D, RealtimeSequentializer as E, RealtimeNotificationSelector as F, RealtimeTransport as G, RealtimeUpdateType as H, RealtimeNotificationUpdate as I, UnauthorizedStreamError as J, TransportContext as K, RealtimeUnknownUpdate as L, RealtimeContextBase as M, RealtimeNotificationContext as N, runRealtimeMiddleware as O, RealtimeNotificationFilter as P, RealtimeUnreadCountUpdate as R, RealtimeMiddleware as S, RealtimePredicate as T, RealtimeRequest as U, RealtimeUpdateOrigin as V, RealtimeRequestInput as W, RealtimeOptions as _, WebSocketTransportOptions as a, ReconnectOptions as b, RealtimeErrorContext as c, RealtimeMiddlewareLike as d, RealtimeRouteTable as f, RealtimeEvents as g, ItdRealtime as h, WebSocketTransport as i, RealtimeContext as j, NotificationEventOfType as k, RealtimeFilter as l, RealtimeRouter as m, WebSocketLike as n, RealtimeComposer as o, RealtimeRouteSelector as p, TransportEvent as q, WebSocketOpenFailureClassifier as r, RealtimeErrorBoundary as s, WebSocketImplementationOptions as t, RealtimeMiddlewareGroup as u, RealtimeTransportKind as v, RealtimeNext as w, RealtimeHandler as x, RealtimeEngineEvents as y, RealtimeUpdate as z };
562
- //# sourceMappingURL=websocket-DYKBr8HF.d.ts.map