itd-api 0.7.1 → 0.8.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.
- package/README.md +14 -14
- package/dist/events/index.cjs +53 -0
- package/dist/events/index.d.cts +3 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.js +5 -0
- package/dist/index.cjs +269 -175
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +77 -56
- package/dist/index.d.ts +77 -56
- package/dist/index.js +251 -160
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +4 -4
- package/dist/node/index.d.cts +1 -1
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.js +4 -4
- package/dist/rest/index.cjs +72 -14
- package/dist/rest/index.cjs.map +1 -1
- package/dist/rest/index.d.cts +11 -3
- package/dist/rest/index.d.ts +11 -3
- package/dist/rest/index.js +66 -8
- package/dist/rest/index.js.map +1 -1
- package/dist/shared/{errors-DfU8M5eS.cjs → errors-BmP3TKoW.cjs} +3 -3
- package/dist/shared/{errors-DfU8M5eS.cjs.map → errors-BmP3TKoW.cjs.map} +1 -1
- package/dist/shared/{errors-Bhrd2fJd.js → errors-GI10kZxk.js} +3 -3
- package/dist/shared/{errors-Bhrd2fJd.js.map → errors-GI10kZxk.js.map} +1 -1
- package/dist/shared/events-Br2r7coi.d.cts +698 -0
- package/dist/shared/events-QyhQZrnC.d.ts +698 -0
- package/dist/shared/{websocket-CbzB1Leq.js → events-TfhKh26b.js} +770 -490
- package/dist/shared/events-TfhKh26b.js.map +1 -0
- package/dist/shared/{websocket-sYlynrr0.cjs → events-iTteVsd_.cjs} +834 -518
- package/dist/shared/events-iTteVsd_.cjs.map +1 -0
- package/dist/shared/{multi-storage-CkvTUC5m.js → multi-storage-1AEZTczk.js} +4 -4
- package/dist/shared/{multi-storage-CkvTUC5m.js.map → multi-storage-1AEZTczk.js.map} +1 -1
- package/dist/shared/{multi-storage--yTEqiod.cjs → multi-storage-CCUgkqvI.cjs} +6 -6
- package/dist/shared/{multi-storage--yTEqiod.cjs.map → multi-storage-CCUgkqvI.cjs.map} +1 -1
- package/dist/shared/{options-DtATYdLr.js → options-BNP633A5.js} +8 -6
- package/dist/shared/options-BNP633A5.js.map +1 -0
- package/dist/shared/{options-Dg5N3r1V.cjs → options-BUfoHE9G.cjs} +8 -6
- package/dist/shared/options-BUfoHE9G.cjs.map +1 -0
- package/dist/shared/{cookies-DZwFq6kr.cjs → redact-DB9EMGJx.cjs} +301 -2
- package/dist/shared/redact-DB9EMGJx.cjs.map +1 -0
- package/dist/shared/{cookies-tX2sNwxb.js → redact-FNK29Fv-.js} +224 -3
- package/dist/shared/redact-FNK29Fv-.js.map +1 -0
- package/dist/shared/{render-DMp_3Nzk.d.cts → render-BszcKF7S.d.cts} +432 -254
- package/dist/shared/{render-vtLixIiU.js → render-CiL1VS0b.js} +1261 -621
- package/dist/shared/render-CiL1VS0b.js.map +1 -0
- package/dist/shared/{render-DyeHJNBw.cjs → render-DNTESBSl.cjs} +1335 -671
- package/dist/shared/render-DNTESBSl.cjs.map +1 -0
- package/dist/shared/{render-DZrxhC5_.d.ts → render-DVB7T8pm.d.ts} +432 -254
- package/dist/shared/{storage-BPJR_k4-.cjs → storage-BLmXmzKF.cjs} +2 -2
- package/dist/shared/{storage-BPJR_k4-.cjs.map → storage-BLmXmzKF.cjs.map} +1 -1
- package/dist/shared/{storage-D86edNCB.js → storage-CCxn0Kkv.js} +2 -2
- package/dist/shared/{storage-D86edNCB.js.map → storage-CCxn0Kkv.js.map} +1 -1
- package/dist/shared/{url-CYXgxqGx.js → url-B3ocFlHj.js} +491 -425
- package/dist/shared/url-B3ocFlHj.js.map +1 -0
- package/dist/shared/{url-B6-bXHKt.d.ts → url-Be9jlWRv.d.cts} +1233 -1195
- package/dist/shared/{url-B6-bXHKt.d.cts → url-Be9jlWRv.d.ts} +1233 -1195
- package/dist/shared/{url-yjl2c8Ie.cjs → url-CFN1sT9S.cjs} +562 -478
- package/dist/shared/url-CFN1sT9S.cjs.map +1 -0
- package/dist/web/index.cjs +2 -2
- package/dist/web/index.js +2 -2
- package/package.json +16 -15
- package/dist/realtime/index.cjs +0 -165
- package/dist/realtime/index.cjs.map +0 -1
- package/dist/realtime/index.d.cts +0 -51
- package/dist/realtime/index.d.ts +0 -51
- package/dist/realtime/index.js +0 -120
- package/dist/realtime/index.js.map +0 -1
- package/dist/shared/auth-provider-BfogACAb.js +0 -91
- package/dist/shared/auth-provider-BfogACAb.js.map +0 -1
- package/dist/shared/auth-provider-CTJkKfgy.cjs +0 -108
- package/dist/shared/auth-provider-CTJkKfgy.cjs.map +0 -1
- package/dist/shared/cookies-DZwFq6kr.cjs.map +0 -1
- package/dist/shared/cookies-tX2sNwxb.js.map +0 -1
- package/dist/shared/options-Dg5N3r1V.cjs.map +0 -1
- package/dist/shared/options-DtATYdLr.js.map +0 -1
- package/dist/shared/render-DyeHJNBw.cjs.map +0 -1
- package/dist/shared/render-vtLixIiU.js.map +0 -1
- package/dist/shared/url-CYXgxqGx.js.map +0 -1
- package/dist/shared/url-yjl2c8Ie.cjs.map +0 -1
- package/dist/shared/websocket-BMtihD56.d.ts +0 -562
- package/dist/shared/websocket-CbzB1Leq.js.map +0 -1
- package/dist/shared/websocket-D1p32SB2.d.cts +0 -562
- package/dist/shared/websocket-sYlynrr0.cjs.map +0 -1
|
@@ -1,92 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Bt as ItdClock, Et as RawRequestOptions, Ft as QueryParams, Ht as BuiltInOperationId, Kt as OperationId, Lt as ServiceDefinition, St as PaginationOptions, _ as Profile, _n as ServiceState, _t as RetrySafety, an as AttachmentType, b as UserSummary, bn as ViewSource, bt as Logger, c as NotificationSettings, cn as FeedTab, ct as Unsubscribe, d as Author, en as IsoDate, et as ClientConnection, f as FollowResult, g as PrivacySettings, gn as ReportTargetType, gt as OperationMethod, h as PinsResult, hn as ReportReason, ht as OperationMetadata, kt as RequestOptions, ln as IncidentKind, mt as OperationContract, nn as UserId, on as CommentSort, p as MyProfile, pn as Loose, pt as OperationAnnotations, rn as UserRef, s as Notification, tn as Span, tt as AuthIdentity, un as InteractionType, v as PublicProfile, wt as RateLimitBucketOverride, xt as OperationRequestOptions, yn as ViewReason } from "./url-Be9jlWRv.cjs";
|
|
2
2
|
import { c as LazyFile, d as UrlFileOptions, i as FileStreamContent, l as StreamFile, n as FileContext, o as FileTransferMode, r as FileInput, s as FromStreamOptions } from "./contracts-BoT7msmq.cjs";
|
|
3
|
-
//#region src/core/catalog.d.ts
|
|
4
|
-
/**
|
|
5
|
-
* Всё, что ядро знает о предметной области.
|
|
6
|
-
*
|
|
7
|
-
* Ядро исполняет операцию, не зная, что такое пост, комментарий или профиль: оно спрашивает
|
|
8
|
-
* каталог о повторяемости, методе и счётчике частоты, а таблицы конкретного API живут
|
|
9
|
-
* в доменном слое. Именно эта граница позволяет позже вынести retry и планировщик очереди
|
|
10
|
-
* в отдельные слоты executor, не таща за ними каталог эндпоинтов.
|
|
11
|
-
*
|
|
12
|
-
* @internal
|
|
13
|
-
*/
|
|
14
|
-
interface OperationCatalog {
|
|
15
|
-
/** Безопасность повтора операции. `undefined` — операция каталогу неизвестна. */
|
|
16
|
-
retrySafetyOf(id: string): RetrySafety | undefined;
|
|
17
|
-
/** HTTP-метод операции. `undefined` — операция каталогу неизвестна. */
|
|
18
|
-
methodOf(id: string): OperationMethod | undefined;
|
|
19
|
-
/** Счётчик частоты операции. Для неизвестной возвращает {@link defaultBucket}. */
|
|
20
|
-
bucketOf(id: string): string;
|
|
21
|
-
/** Известно ли каталогу имя бакета. */
|
|
22
|
-
isKnownBucket(name: string): boolean;
|
|
23
|
-
/** Ёмкость бакетов до первого ответа сервера, запросов в минуту. */
|
|
24
|
-
readonly bucketLimits: Readonly<Record<string, number>>;
|
|
25
|
-
/** Встроенные поправки бакетов, например предел одновременности загрузки файлов. */
|
|
26
|
-
readonly bucketOverrides: Readonly<Record<string, RateLimitBucketOverride>>;
|
|
27
|
-
/** Счётчик, из которого списывается путь без собственного правила на сервере. */
|
|
28
|
-
readonly defaultBucket: string;
|
|
29
|
-
}
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region src/core/execution/pipeline.d.ts
|
|
32
|
-
/** Тело, заново подготовленное для одной транспортной попытки. */
|
|
33
|
-
interface PreparedRequestBody {
|
|
34
|
-
body: BodyInit;
|
|
35
|
-
/** Заголовки тела, например multipart boundary. Пользовательские заголовки важнее. */
|
|
36
|
-
headers?: Record<string, string> | undefined;
|
|
37
|
-
/** Освобождает открытый файл или входящий HTTP-поток. */
|
|
38
|
-
cleanup?: (() => void | Promise<void>) | undefined;
|
|
39
|
-
}
|
|
40
|
-
/** Контекст подготовки повторяемого тела. */
|
|
41
|
-
interface RequestBodyContext {
|
|
42
|
-
signal: AbortSignal;
|
|
43
|
-
attempt: number;
|
|
44
|
-
}
|
|
45
|
-
/** Создаёт новое тело для каждой транспортной попытки. */
|
|
46
|
-
type RequestBodyFactory = (context: RequestBodyContext) => PreparedRequestBody | Promise<PreparedRequestBody>;
|
|
47
|
-
/**
|
|
48
|
-
* Описание запроса внутри конвейера.
|
|
49
|
-
*
|
|
50
|
-
* Отличается от публичного {@link RawRequestOptions} одним служебным полем: слои конвейера
|
|
51
|
-
* должны уметь дописать заголовки так, чтобы пользовательские `headers` всё равно остались
|
|
52
|
-
* важнее. Смешивать их в одном объекте нельзя — тогда слой авторизации перебивал бы
|
|
53
|
-
* `Authorization`, заданный вызывающим кодом вручную.
|
|
54
|
-
*/
|
|
55
|
-
interface PipelineRequest extends OperationRequestOptions {
|
|
56
|
-
/** Повторяемое тело. Используется внутренними ресурсами вместо `body`. @internal */
|
|
57
|
-
bodyFactory?: RequestBodyFactory | undefined;
|
|
58
|
-
/**
|
|
59
|
-
* Заголовки, добавленные слоями конвейера.
|
|
60
|
-
*
|
|
61
|
-
* Ставятся до пользовательских `headers` и потому могут быть ими переопределены.
|
|
62
|
-
*
|
|
63
|
-
* @internal
|
|
64
|
-
*/
|
|
65
|
-
layerHeaders?: Record<string, string> | undefined;
|
|
66
|
-
/**
|
|
67
|
-
* Номер фактически начатой транспортной попытки, начиная с 1. Проставляет attempt layer.
|
|
68
|
-
*
|
|
69
|
-
* @internal
|
|
70
|
-
*/
|
|
71
|
-
attempt?: number | undefined;
|
|
72
|
-
}
|
|
73
|
-
/** Запрос на внешней границе pipeline. Низкоуровневый вызов без ID считается `raw`. */
|
|
74
|
-
type PipelineRequestInput = Omit<PipelineRequest, 'operationId'> & {
|
|
75
|
-
operationId?: OperationId | undefined;
|
|
76
|
-
};
|
|
77
|
-
/** Обработчик запроса. Самый внутренний в цепочке — транспорт. */
|
|
78
|
-
type RequestHandler = (request: PipelineRequest) => Promise<unknown>;
|
|
79
|
-
//#endregion
|
|
80
3
|
//#region src/core/plugins/contracts.d.ts
|
|
81
4
|
/**
|
|
82
5
|
* Обёртка одной логической операции.
|
|
83
6
|
*
|
|
84
|
-
* Вызывается
|
|
85
|
-
*
|
|
7
|
+
* Вызывается один раз независимо от повторов и обновления авторизации. Может изменить
|
|
8
|
+
* параметры запроса, обработать публичный результат метода или завершить операцию локально.
|
|
9
|
+
* `operationId`, HTTP-метод и безопасность повтора задаются операцией.
|
|
86
10
|
*
|
|
87
11
|
* @param request описание логической операции; не изменяйте сам объект — передайте копию в `next`
|
|
88
12
|
* @param next следующая обёртка либо выполнение операции
|
|
89
|
-
*
|
|
13
|
+
* `next()` возвращает результат публичного метода. Если обёртка не вызывает `next`, её
|
|
14
|
+
* собственный результат считается готовым и повторно не нормализуется.
|
|
15
|
+
*
|
|
16
|
+
* @returns результат в том виде, в котором его получит вызывающий код
|
|
90
17
|
*
|
|
91
18
|
* @example Дописать заголовок ко всем операциям
|
|
92
19
|
* ```ts
|
|
@@ -97,51 +24,48 @@ type RequestHandler = (request: PipelineRequest) => Promise<unknown>;
|
|
|
97
24
|
type OperationTransformer = (request: OperationRequestOptions, next: (request: OperationRequestOptions) => Promise<unknown>) => Promise<unknown>;
|
|
98
25
|
/** Финальные данные одной транспортной попытки. */
|
|
99
26
|
interface AttemptContext {
|
|
100
|
-
/**
|
|
27
|
+
/** Постоянный идентификатор операции. */
|
|
101
28
|
readonly operationId: OperationId;
|
|
102
29
|
/** Нормализованный HTTP-метод. */
|
|
103
30
|
readonly method: string;
|
|
104
|
-
/** Исходный путь операции до
|
|
31
|
+
/** Исходный путь операции до выбора сервиса или `baseUrl`. */
|
|
105
32
|
readonly path: string;
|
|
106
|
-
/**
|
|
33
|
+
/** Полный URL со строкой запроса. */
|
|
107
34
|
readonly url: string;
|
|
108
|
-
/** Итоговые заголовки.
|
|
35
|
+
/** Итоговые изменяемые заголовки. */
|
|
109
36
|
readonly headers: Headers;
|
|
110
|
-
/** Номер
|
|
37
|
+
/** Номер сетевой попытки, начиная с 1. */
|
|
111
38
|
readonly attempt: number;
|
|
112
|
-
/**
|
|
39
|
+
/** Подготовленное тело запроса. Поток нельзя читать заранее. */
|
|
113
40
|
readonly body: BodyInit | undefined;
|
|
114
41
|
/** Общий сигнал отмены и таймаута этой попытки. */
|
|
115
42
|
readonly signal: AbortSignal;
|
|
116
43
|
}
|
|
117
44
|
/**
|
|
118
|
-
* Продолжение
|
|
119
|
-
*
|
|
120
|
-
* В рамках одного interceptor его можно вызвать только один раз. Возвращает сырой ответ:
|
|
121
|
-
* transport ещё не проверял status и не читал body.
|
|
45
|
+
* Продолжение цепочки перехватчиков. Можно вызвать только один раз.
|
|
122
46
|
*/
|
|
123
47
|
type AttemptNext = () => Promise<Response>;
|
|
124
48
|
/**
|
|
125
49
|
* Обёртка одной транспортной попытки.
|
|
126
50
|
*
|
|
127
51
|
* Получает уже разрешённый URL, итоговые заголовки, подготовленное тело и номер попытки.
|
|
128
|
-
* Может
|
|
129
|
-
*
|
|
52
|
+
* Может изменить заголовки, измерить задержку, обработать сырой `Response` или вернуть
|
|
53
|
+
* созданный вручную `Response`.
|
|
130
54
|
*
|
|
131
|
-
* Вызывается
|
|
132
|
-
*
|
|
133
|
-
* цепочки разбирает transport. Исключение interceptor остаётся пользовательской ошибкой и не
|
|
134
|
-
* классифицируется как сетевой сбой для автоматического retry.
|
|
55
|
+
* Вызывается для каждой сетевой попытки. Если перехватчик читает тело ответа, используйте
|
|
56
|
+
* `response.clone()`: исходный ответ дальше обрабатывает транспорт.
|
|
135
57
|
*
|
|
136
58
|
* @param context окончательные данные текущей транспортной попытки
|
|
137
|
-
* @param next следующий
|
|
59
|
+
* @param next следующий перехватчик либо вызов `fetch`
|
|
138
60
|
* @returns исходный или синтетический сырой `Response`
|
|
139
61
|
*/
|
|
140
62
|
type AttemptInterceptor = (context: AttemptContext, next: AttemptNext) => Promise<Response>;
|
|
141
63
|
/** Регистрация расширений логической операции. */
|
|
142
64
|
interface OperationExtensions {
|
|
65
|
+
/** Возвращает неизменяемые метаданные зарегистрированной операции. */
|
|
66
|
+
get(operationId: OperationId): OperationMetadata | undefined;
|
|
143
67
|
/**
|
|
144
|
-
* Подключает
|
|
68
|
+
* Подключает обёртку операции.
|
|
145
69
|
*
|
|
146
70
|
* Зарегистрированные раньше оборачивают зарегистрированные позже. Возвращённая функция
|
|
147
71
|
* идемпотентна и снимает только эту регистрацию.
|
|
@@ -151,7 +75,7 @@ interface OperationExtensions {
|
|
|
151
75
|
/** Регистрация расширений транспортной попытки. */
|
|
152
76
|
interface AttemptExtensions {
|
|
153
77
|
/**
|
|
154
|
-
* Подключает
|
|
78
|
+
* Подключает перехватчик попытки.
|
|
155
79
|
*
|
|
156
80
|
* Зарегистрированные раньше оборачивают зарегистрированные позже. Возвращённая функция
|
|
157
81
|
* идемпотентна и снимает только эту регистрацию.
|
|
@@ -159,34 +83,27 @@ interface AttemptExtensions {
|
|
|
159
83
|
use(interceptor: AttemptInterceptor): Unsubscribe;
|
|
160
84
|
}
|
|
161
85
|
/**
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* Вызывается после завершения логических операций, уже вошедших в расширения плагина,
|
|
165
|
-
* поэтому может безопасно закрывать используемые ими соединения и хранилища.
|
|
86
|
+
* Функция освобождения ресурсов плагина.
|
|
166
87
|
*/
|
|
167
88
|
type PluginTeardown = () => void | Promise<void>;
|
|
168
89
|
/** API, доступный плагину при подключении. */
|
|
169
90
|
interface PluginApi {
|
|
170
91
|
/** Базовый URL клиента — например чтобы разобрать абсолютные ссылки из ответа. */
|
|
171
92
|
baseUrl: string;
|
|
172
|
-
/**
|
|
93
|
+
/** Логгер клиента, если он включён. */
|
|
173
94
|
logger: Logger | undefined;
|
|
174
|
-
/**
|
|
95
|
+
/** Обёртки логической операции. */
|
|
175
96
|
operations: OperationExtensions;
|
|
176
|
-
/**
|
|
97
|
+
/** Перехватчики сетевой попытки. */
|
|
177
98
|
attempts: AttemptExtensions;
|
|
178
99
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* Нужна плагинам, которые обязаны безопасно изолировать непрозрачный токен. Для объединения
|
|
182
|
-
* состояния копий одного аккаунта используйте {@link getAuthIdentity}.
|
|
100
|
+
* Внутренний идентификатор текущей авторизации.
|
|
183
101
|
*/
|
|
184
102
|
getAuthScope?: (() => string) | undefined;
|
|
185
103
|
/**
|
|
186
104
|
* Загружает сессию и возвращает идентификаторы аккаунта и конкретной сессии из JWT.
|
|
187
105
|
*
|
|
188
|
-
*
|
|
189
|
-
* несколькими экземплярами клиента одного аккаунта.
|
|
106
|
+
* Используйте для общего состояния нескольких клиентов одного аккаунта.
|
|
190
107
|
*/
|
|
191
108
|
getAuthIdentity?: (() => Promise<AuthIdentity>) | undefined;
|
|
192
109
|
}
|
|
@@ -195,12 +112,11 @@ interface PluginApi {
|
|
|
195
112
|
*
|
|
196
113
|
* Подключается через `itd.use(plugin)` и регистрирует расширения одного или обоих уровней:
|
|
197
114
|
* {@link OperationTransformer} для логической операции и {@link AttemptInterceptor} для
|
|
198
|
-
* отдельной транспортной попытки.
|
|
199
|
-
* и его lifecycle, не зная деталей реализации.
|
|
115
|
+
* отдельной транспортной попытки.
|
|
200
116
|
*
|
|
201
117
|
* Настройки отдельного вызова плагин объявляет своим полем в `RequestExtensions` через
|
|
202
|
-
*
|
|
203
|
-
*
|
|
118
|
+
* дополнение интерфейса. Пользователь передаёт их в `RequestOptions.extensions`, а обёртка
|
|
119
|
+
* операции читает поле своего плагина.
|
|
204
120
|
*
|
|
205
121
|
* @example Логирование логических операций
|
|
206
122
|
* ```ts
|
|
@@ -238,36 +154,141 @@ interface ClientPlugin {
|
|
|
238
154
|
install(api: PluginApi): void | PluginTeardown;
|
|
239
155
|
}
|
|
240
156
|
//#endregion
|
|
241
|
-
//#region src/core/
|
|
242
|
-
/**
|
|
243
|
-
interface
|
|
244
|
-
/**
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
157
|
+
//#region src/core/plugins/registry.d.ts
|
|
158
|
+
/** Что реестру нужно знать об остановке. @internal */
|
|
159
|
+
interface PluginRegistryOptions {
|
|
160
|
+
/** Срок ожидания операций плагина при его отключении, мс. `0` — ждать без ограничения. */
|
|
161
|
+
shutdownTimeout: number;
|
|
162
|
+
clock: ItdClock;
|
|
163
|
+
/** Возвращает публичные метаданные встроенной или feature-операции. */
|
|
164
|
+
operationMetadata: (operationId: OperationRequestOptions['operationId']) => OperationMetadata | undefined;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Список подключённых плагинов и зарегистрированных ими расширений.
|
|
168
|
+
*
|
|
169
|
+
* {@link run} собирает operation transformers вокруг одной логической операции и прикрепляет
|
|
170
|
+
* к ней неизменяемый снимок attempt interceptors. Transport исполняет этот снимок отдельно
|
|
171
|
+
* для каждой сетевой попытки. Порядок плагинов одинаков для обеих цепочек.
|
|
172
|
+
*
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
declare class PluginRegistry {
|
|
176
|
+
#private;
|
|
177
|
+
constructor(options: PluginRegistryOptions);
|
|
178
|
+
/** Сколько плагинов подключено. */
|
|
179
|
+
get size(): number;
|
|
180
|
+
/** Имена плагинов в фактическом порядке выполнения. */
|
|
181
|
+
names(): string[];
|
|
182
|
+
/** Подключён ли плагин с таким именем. */
|
|
183
|
+
has(name: string): boolean;
|
|
184
|
+
/** Проверяет добавление без вызова `install()`. @internal */
|
|
185
|
+
assertCanAdd(plugin: ClientPlugin): void;
|
|
186
|
+
/** Проверяет удаление без изменения реестра. @internal */
|
|
187
|
+
assertCanRemove(name: string): void;
|
|
188
|
+
/**
|
|
189
|
+
* Подключает плагин.
|
|
190
|
+
*
|
|
191
|
+
* `install()` выполняется синхронно. Каждая регистрация принадлежит установившему её
|
|
192
|
+
* плагину и участвует в общем порядке `before`/`after`.
|
|
193
|
+
*
|
|
194
|
+
* @throws {ItdConfigError} если плагин задан неверно, уже подключён или нарушает зависимости
|
|
195
|
+
*/
|
|
196
|
+
add(plugin: ClientPlugin, context: Omit<PluginApi, 'operations' | 'attempts'>): void;
|
|
197
|
+
/**
|
|
198
|
+
* Отключает плагин и вызывает его функцию очистки.
|
|
199
|
+
*
|
|
200
|
+
* Новые запросы перестают видеть расширения плагина сразу. Снимок уже начавшейся операции,
|
|
201
|
+
* включая её будущие retry, остаётся неизменным; очистка дождётся завершения операции,
|
|
202
|
+
* но не дольше отведённого срока.
|
|
203
|
+
*
|
|
204
|
+
* @returns `false`, если такого плагина не было
|
|
205
|
+
* @throws {ItdStateError} если операции плагина не завершились за отведённый срок
|
|
206
|
+
*/
|
|
207
|
+
remove(name: string): Promise<boolean>;
|
|
208
|
+
/**
|
|
209
|
+
* Отключает все плагины окончательно.
|
|
210
|
+
*
|
|
211
|
+
* Очистка идёт изнутри наружу — в порядке, обратном выполнению расширений. Срок ожидания
|
|
212
|
+
* общий на все плагины.
|
|
213
|
+
*/
|
|
214
|
+
dispose(): Promise<void>;
|
|
215
|
+
/**
|
|
216
|
+
* Прогоняет запрос через operation transformers и прикрепляет attempt interceptors.
|
|
217
|
+
*
|
|
218
|
+
* Снимки обеих цепочек берутся в начале: `unuse()` влияет на новые операции, но не меняет
|
|
219
|
+
* уже выполняющуюся и не удаляет interceptors из её последующих retry.
|
|
220
|
+
*
|
|
221
|
+
* Каждый `next` одноразовый: transformer может завершить операцию сам, но не может породить
|
|
222
|
+
* вторую — для `posts.create` это была бы вторая публикация.
|
|
223
|
+
*
|
|
224
|
+
* @param execute выполнение логической операции, вызываемое самым внутренним transformer
|
|
225
|
+
*/
|
|
226
|
+
run(request: OperationRequestOptions, execute: (request: OperationRequestOptions) => Promise<unknown>): Promise<unknown>;
|
|
227
|
+
}
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region src/core/execution/pipeline.d.ts
|
|
230
|
+
/** Тело, заново подготовленное для одной транспортной попытки. */
|
|
231
|
+
interface PreparedRequestBody {
|
|
232
|
+
body: BodyInit;
|
|
233
|
+
/** Заголовки тела, например multipart boundary. Пользовательские заголовки важнее. */
|
|
234
|
+
headers?: Record<string, string> | undefined;
|
|
235
|
+
/** Освобождает открытый файл или входящий HTTP-поток. */
|
|
236
|
+
cleanup?: (() => void | Promise<void>) | undefined;
|
|
255
237
|
}
|
|
238
|
+
/** Контекст подготовки повторяемого тела. */
|
|
239
|
+
interface RequestBodyContext {
|
|
240
|
+
signal: AbortSignal;
|
|
241
|
+
attempt: number;
|
|
242
|
+
}
|
|
243
|
+
/** Создаёт новое тело для каждой транспортной попытки. */
|
|
244
|
+
type RequestBodyFactory = (context: RequestBodyContext) => PreparedRequestBody | Promise<PreparedRequestBody>;
|
|
245
|
+
/**
|
|
246
|
+
* Описание запроса внутри конвейера.
|
|
247
|
+
*
|
|
248
|
+
* Отличается от публичного {@link RawRequestOptions} одним служебным полем: слои конвейера
|
|
249
|
+
* должны уметь дописать заголовки так, чтобы пользовательские `headers` всё равно остались
|
|
250
|
+
* важнее. Смешивать их в одном объекте нельзя — тогда слой авторизации перебивал бы
|
|
251
|
+
* `Authorization`, заданный вызывающим кодом вручную.
|
|
252
|
+
*/
|
|
253
|
+
interface PipelineRequest extends OperationRequestOptions {
|
|
254
|
+
/** Повторяемое тело. Используется внутренними ресурсами вместо `body`. @internal */
|
|
255
|
+
bodyFactory?: RequestBodyFactory | undefined;
|
|
256
|
+
/**
|
|
257
|
+
* Заголовки, добавленные слоями конвейера.
|
|
258
|
+
*
|
|
259
|
+
* Ставятся до пользовательских `headers` и потому могут быть ими переопределены.
|
|
260
|
+
*
|
|
261
|
+
* @internal
|
|
262
|
+
*/
|
|
263
|
+
layerHeaders?: Record<string, string> | undefined;
|
|
264
|
+
/**
|
|
265
|
+
* Номер фактически начатой транспортной попытки, начиная с 1. Проставляет attempt layer.
|
|
266
|
+
*
|
|
267
|
+
* @internal
|
|
268
|
+
*/
|
|
269
|
+
attempt?: number | undefined;
|
|
270
|
+
}
|
|
271
|
+
/** Запрос на внешней границе pipeline. Низкоуровневый вызов без ID считается `raw`. */
|
|
272
|
+
type PipelineRequestInput = Omit<PipelineRequest, 'operationId'> & {
|
|
273
|
+
operationId?: OperationId | undefined;
|
|
274
|
+
};
|
|
275
|
+
/** Обработчик запроса. Самый внутренний в цепочке — транспорт. */
|
|
276
|
+
type RequestHandler = (request: PipelineRequest) => Promise<unknown>;
|
|
256
277
|
//#endregion
|
|
257
278
|
//#region src/core/execution/http.d.ts
|
|
258
279
|
/** Что нужно фасаду для работы. */
|
|
259
280
|
interface HttpClientDeps {
|
|
260
281
|
/** Готовый обработчик — вся цепочка слоёв поверх транспорта. */
|
|
261
282
|
handler: RequestHandler;
|
|
283
|
+
plugins: PluginRegistry;
|
|
262
284
|
baseUrl: string;
|
|
263
|
-
/** Каталог, из которого берётся HTTP-метод семантической операции. */
|
|
264
|
-
catalog: OperationCatalog;
|
|
265
285
|
}
|
|
286
|
+
/** Параметры операции без ID и метода, заданных её контрактом. @internal */
|
|
287
|
+
type HttpOperationOptions = Omit<PipelineRequest, 'operationId' | 'method'>;
|
|
266
288
|
/**
|
|
267
289
|
* Точка входа ресурсов в конвейер запросов.
|
|
268
290
|
*
|
|
269
|
-
* Принимает
|
|
270
|
-
* во внутреннем runtime клиента, — и отдаёт ресурсам методы `request`/`operation`.
|
|
291
|
+
* Принимает готовую цепочку обработки и предоставляет ресурсам методы `request`/`execute`.
|
|
271
292
|
* О слоях и их порядке ресурсы не знают.
|
|
272
293
|
*/
|
|
273
294
|
declare class HttpClient {
|
|
@@ -285,52 +306,157 @@ declare class HttpClient {
|
|
|
285
306
|
* @throws {ItdNetworkError} если запрос не дошёл до сервера
|
|
286
307
|
*/
|
|
287
308
|
request<T = unknown>(options: PipelineRequestInput): Promise<T>;
|
|
288
|
-
/** Выполняет
|
|
289
|
-
|
|
309
|
+
/** Выполняет контракт операции; `next()` плагина возвращает результат после `read`. */
|
|
310
|
+
execute<T, TId extends OperationId>(operation: OperationContract<T, TId>, options: HttpOperationOptions): Promise<T>;
|
|
290
311
|
/** Выполняет внутреннюю операцию финализации после начала `ItdClient.dispose()`. @internal */
|
|
291
|
-
cleanupOperation<T
|
|
312
|
+
cleanupOperation<T, TId extends OperationId>(operation: OperationContract<T, TId>, options: HttpOperationOptions): Promise<T>;
|
|
292
313
|
}
|
|
293
314
|
//#endregion
|
|
294
|
-
//#region src/
|
|
295
|
-
/**
|
|
296
|
-
interface
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
315
|
+
//#region src/core/attachments/resolver.d.ts
|
|
316
|
+
/** Дополнительные требования потребителя к подготовленному источнику. */
|
|
317
|
+
interface ResolveFileOptions {
|
|
318
|
+
/** Имя, которое имеет приоритет над именем источника. */
|
|
319
|
+
readonly filename?: string | undefined;
|
|
320
|
+
/** MIME-тип, который имеет приоритет над типом источника. */
|
|
321
|
+
readonly contentType?: string | undefined;
|
|
322
|
+
/** Дополнительный предел размера для любого вида источника. */
|
|
323
|
+
readonly maxBytes?: number | undefined;
|
|
324
|
+
/** Размер очереди библиотеки при потоковом чтении. */
|
|
325
|
+
readonly streamBufferBytes?: number | undefined;
|
|
326
|
+
/** Отклонить поток, размер которого нельзя узнать до чтения. */
|
|
327
|
+
readonly requireKnownSize?: boolean | undefined;
|
|
328
|
+
}
|
|
329
|
+
/** Буфер, полностью принадлежащий вызывающему коду. */
|
|
330
|
+
interface PreparedBufferSource {
|
|
331
|
+
readonly mode: typeof FileTransferMode.Buffer;
|
|
332
|
+
readonly blob: Blob;
|
|
333
|
+
readonly size: number;
|
|
334
|
+
readonly filename?: string | undefined;
|
|
335
|
+
readonly contentType: string | undefined;
|
|
314
336
|
}
|
|
315
|
-
/**
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
337
|
+
/**
|
|
338
|
+
* Одна открытая сессия чтения потокового источника.
|
|
339
|
+
*
|
|
340
|
+
* Потребитель обязан вызвать {@link close} в `finally`. Повторный вызов безопасен и ждёт
|
|
341
|
+
* тот же результат освобождения ресурсов.
|
|
342
|
+
*/
|
|
343
|
+
interface PreparedStreamSource {
|
|
344
|
+
readonly mode: typeof FileTransferMode.Stream;
|
|
345
|
+
readonly stream: ReadableStream<Uint8Array>;
|
|
346
|
+
readonly size: number | undefined;
|
|
347
|
+
readonly filename?: string | undefined;
|
|
348
|
+
readonly contentType: string | undefined;
|
|
349
|
+
close(): Promise<void>;
|
|
323
350
|
}
|
|
324
|
-
/**
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
351
|
+
/** Подготовленный файловый источник без правил конкретного протокола загрузки. */
|
|
352
|
+
type PreparedFileSource = PreparedBufferSource | PreparedStreamSource;
|
|
353
|
+
/** Контекст одной попытки открытия файлового источника. */
|
|
354
|
+
interface ResolveFileContext {
|
|
355
|
+
readonly signal?: AbortSignal | undefined;
|
|
356
|
+
/** Номер попытки потребителя, начиная с 1. */
|
|
357
|
+
readonly attempt?: number | undefined;
|
|
358
|
+
}
|
|
359
|
+
/** Узкий файловый порт, доступный подключаемым предметным модулям. */
|
|
360
|
+
interface FileResolver {
|
|
361
|
+
resolve(input: FileInput, options?: ResolveFileOptions, context?: ResolveFileContext): Promise<PreparedFileSource>;
|
|
362
|
+
}
|
|
363
|
+
/** Внутренний контракт нужен `FilesResource` для сохранения семантики повторных попыток. */
|
|
364
|
+
interface InternalFileResolver extends FileResolver {
|
|
365
|
+
mode(input: FileInput): FileTransferMode;
|
|
366
|
+
}
|
|
367
|
+
//#endregion
|
|
368
|
+
//#region src/core/managed-resources.d.ts
|
|
369
|
+
/** Долгоживущий ресурс клиента. */
|
|
370
|
+
interface ManagedClientResource {
|
|
371
|
+
/** Короткое имя для диагностики зависшей остановки. */
|
|
372
|
+
readonly kind: string;
|
|
373
|
+
/** Синхронно прекращает принимать новую работу и запускает отмену. */
|
|
374
|
+
stop(): void;
|
|
375
|
+
/** Завершается после остановки обработчиков и освобождения внешних ресурсов. */
|
|
376
|
+
drain(): Promise<void>;
|
|
377
|
+
}
|
|
378
|
+
//#endregion
|
|
379
|
+
//#region src/core/features.d.ts
|
|
380
|
+
/** Параметры запроса feature: маршрут задаёт ресурс, transport metadata — manifest. */
|
|
381
|
+
type FeatureRequestOptions = Omit<RawRequestOptions, 'operationId' | 'method' | 'service' | 'baseUrl' | 'retrySafety' | 'rateLimitBucket'>;
|
|
382
|
+
/** Операция одного feature. Локальный ключ используется в {@link FeatureContext.request}. */
|
|
383
|
+
interface FeatureOperationDefinition<T = unknown> {
|
|
384
|
+
readonly method: OperationMethod;
|
|
385
|
+
readonly retrySafety: RetrySafety;
|
|
386
|
+
/** Имя сервиса из {@link ClientFeature.services}; без него используется основной API. */
|
|
387
|
+
readonly service?: string | undefined;
|
|
388
|
+
/** Локальное имя бакета из {@link ClientFeature.buckets}. */
|
|
389
|
+
readonly bucket?: string | undefined;
|
|
390
|
+
/** Преобразует тело ответа в публичный результат операции. По умолчанию возвращает тело без изменений. */
|
|
391
|
+
readonly read?: OperationContract<T>['read'] | undefined;
|
|
392
|
+
/** Необязательные метаданные, интерпретируемые подключёнными плагинами. */
|
|
393
|
+
readonly annotations?: OperationAnnotations | undefined;
|
|
394
|
+
}
|
|
395
|
+
/** Начальные ограничения нового серверного счётчика feature. */
|
|
396
|
+
interface FeatureBucketDefinition extends RateLimitBucketOverride {}
|
|
397
|
+
/** Результат синхронной сборки API feature. */
|
|
398
|
+
interface FeatureInstallation<TApi> {
|
|
399
|
+
readonly api: TApi;
|
|
400
|
+
/** Не терминальная остановка фоновых ресурсов при `client.close()`. */
|
|
401
|
+
readonly close?: (() => void | Promise<void>) | undefined;
|
|
402
|
+
/** Терминальное освобождение ресурсов при `client.dispose()`. */
|
|
403
|
+
readonly dispose?: (() => void | Promise<void>) | undefined;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Подключаемый предметный модуль клиента.
|
|
407
|
+
*
|
|
408
|
+
* Manifest регистрируется атомарно до `setup()`. `setup()` не должен ходить в сеть: он создаёт
|
|
409
|
+
* только типизированный facade, а запросы выполняются лениво его методами.
|
|
410
|
+
*/
|
|
411
|
+
interface ClientFeature<TApi> {
|
|
412
|
+
/** Пространство имён модуля; глобальные ID операций начинаются с `<name>.`. */
|
|
413
|
+
readonly name: string;
|
|
414
|
+
readonly services?: readonly ServiceDefinition[] | undefined;
|
|
415
|
+
/** Операции по локальным именам; глобальный ID каждой строит реестр. */
|
|
416
|
+
readonly operations: Readonly<Record<string, FeatureOperationDefinition>>;
|
|
417
|
+
readonly buckets?: Readonly<Record<string, FeatureBucketDefinition>> | undefined;
|
|
418
|
+
setup(context: FeatureContext): FeatureInstallation<TApi>;
|
|
419
|
+
}
|
|
420
|
+
/** Доступ подключаемого модуля к клиенту. */
|
|
421
|
+
interface FeatureContext {
|
|
422
|
+
readonly featureName: string;
|
|
423
|
+
readonly baseUrl: string;
|
|
424
|
+
readonly signal: AbortSignal;
|
|
425
|
+
readonly clock: ItdClock;
|
|
426
|
+
readonly logger: Logger | undefined;
|
|
427
|
+
/** Открывает файловый источник без правил конкретного протокола загрузки. */
|
|
428
|
+
readonly files: FileResolver;
|
|
429
|
+
/**
|
|
430
|
+
* Выполняет объявленную операцию через авторизацию, плагины, повторы и очередь клиента.
|
|
431
|
+
*
|
|
432
|
+
* Форма результата задаётся один раз полем `read` в описании операции. Плагины получают
|
|
433
|
+
* готовый результат и не видят функцию преобразования.
|
|
434
|
+
*/
|
|
435
|
+
request<T = unknown>(operation: string, options: FeatureRequestOptions): Promise<T>;
|
|
436
|
+
/** Возвращает фактический URL объявленного сервиса с учётом настроек клиента. */
|
|
437
|
+
serviceBaseUrl(name: string): string;
|
|
438
|
+
/** Окружение долговременного соединения объявленного сервиса. */
|
|
439
|
+
connection(name: string): ClientConnection;
|
|
440
|
+
/** Регистрирует активный долгоживущий ресурс до его остановки. */
|
|
441
|
+
manage(resource: ManagedClientResource): () => void;
|
|
442
|
+
/** Проверяет, что создавший модуль клиент ещё работает. */
|
|
443
|
+
assertActive(action: string): void;
|
|
444
|
+
}
|
|
445
|
+
//#endregion
|
|
446
|
+
//#region src/core/scheduling/rate-limit.d.ts
|
|
447
|
+
/** Снимок одного бакета. */
|
|
448
|
+
interface RateLimitBucketState {
|
|
449
|
+
/** Origin, на котором ведётся счётчик. `undefined` — очередь без известного направления. */
|
|
450
|
+
destination: string | undefined;
|
|
451
|
+
bucket: string;
|
|
452
|
+
/** Ёмкость из последнего ответа; `undefined`, пока ответов не было. */
|
|
453
|
+
limit: number | undefined;
|
|
454
|
+
/** Остаток из последнего ответа. */
|
|
455
|
+
remaining: number | undefined;
|
|
456
|
+
/** Запросов бакета прошло в общую очередь и ещё не завершилось. */
|
|
457
|
+
active: number;
|
|
458
|
+
/** Запросов бакета ждёт своей очереди — из-за паузы или предела одновременности. */
|
|
459
|
+
pending: number;
|
|
334
460
|
}
|
|
335
461
|
//#endregion
|
|
336
462
|
//#region src/resources/pagination.d.ts
|
|
@@ -470,13 +596,11 @@ declare class Paginator<T> implements AsyncIterable<T> {
|
|
|
470
596
|
*/
|
|
471
597
|
interface ListingSpec<T, P extends object> {
|
|
472
598
|
/** Стабильная семантическая операция списка. */
|
|
473
|
-
|
|
599
|
+
operation: OperationContract<Page<T>, BuiltInOperationId> | ((params: P) => OperationContract<Page<T>, BuiltInOperationId>);
|
|
474
600
|
/** Путь эндпоинта. */
|
|
475
601
|
path: (params: P) => string;
|
|
476
602
|
/** Параметры запроса без полей пагинации — их добавит перебор. */
|
|
477
603
|
query: (params: P) => QueryParams;
|
|
478
|
-
/** Читает страницу из ответа. Получает позицию — она нужна схеме со смещением. */
|
|
479
|
-
read: (body: unknown, state: PageState) => Page<T>;
|
|
480
604
|
/** Схема пагинации эндпоинта. */
|
|
481
605
|
mode: PaginationMode;
|
|
482
606
|
/** Начальная позиция, вычисленная из параметров (курсор, номер или смещение). */
|
|
@@ -494,6 +618,8 @@ declare class BaseResource {
|
|
|
494
618
|
/** @internal */
|
|
495
619
|
protected readonly http: HttpClient;
|
|
496
620
|
constructor(http: HttpClient);
|
|
621
|
+
/** Выполняет операцию без возвращаемого значения и отбрасывает служебное тело ответа. */
|
|
622
|
+
protected voidOperation(operation: OperationContract<void, BuiltInOperationId>, options: HttpOperationOptions): Promise<void>;
|
|
497
623
|
/**
|
|
498
624
|
* Собирает перебор страниц.
|
|
499
625
|
*
|
|
@@ -513,11 +639,10 @@ declare class BaseResource {
|
|
|
513
639
|
* @example
|
|
514
640
|
* ```ts
|
|
515
641
|
* #feed = this.paginated<Post, FeedParams>({
|
|
516
|
-
*
|
|
642
|
+
* operation: POSTS_LIST,
|
|
517
643
|
* path: () => '/api/posts',
|
|
518
644
|
* query: (p) => ({ tab: p.tab, limit: p.limit }),
|
|
519
645
|
* start: (p) => (p.cursor ? { cursor: p.cursor } : {}),
|
|
520
|
-
* read: (body) => readCursorPage<Post>(body, 'posts'),
|
|
521
646
|
* mode: PaginationMode.Cursor,
|
|
522
647
|
* });
|
|
523
648
|
* ```
|
|
@@ -525,6 +650,118 @@ declare class BaseResource {
|
|
|
525
650
|
protected paginated<T, P extends object>(spec: ListingSpec<T, P>): Listing<T, P>;
|
|
526
651
|
}
|
|
527
652
|
//#endregion
|
|
653
|
+
//#region src/resources/notifications.d.ts
|
|
654
|
+
/** Параметры запроса списка уведомлений. */
|
|
655
|
+
interface NotificationListParams {
|
|
656
|
+
limit?: number;
|
|
657
|
+
/** Смещение от начала списка. */
|
|
658
|
+
offset?: number;
|
|
659
|
+
}
|
|
660
|
+
/** Изменяемые настройки уведомлений. */
|
|
661
|
+
type UpdateNotificationSettingsInput = Partial<NotificationSettings>;
|
|
662
|
+
/**
|
|
663
|
+
* Уведомления: список, счётчик, отметки о прочтении, настройки.
|
|
664
|
+
*
|
|
665
|
+
* Доступна как `itd.notifications`. Все уведомления приведены к единой форме, поэтому
|
|
666
|
+
* объекты отсюда и из потока событий можно складывать в один список.
|
|
667
|
+
*/
|
|
668
|
+
declare class NotificationsResource extends BaseResource {
|
|
669
|
+
#private;
|
|
670
|
+
/**
|
|
671
|
+
* Загружает страницу уведомлений.
|
|
672
|
+
*
|
|
673
|
+
* Пагинация здесь основана на смещении.
|
|
674
|
+
*
|
|
675
|
+
* @example
|
|
676
|
+
* ```ts
|
|
677
|
+
* const page = await itd.notifications.list({ limit: 20 });
|
|
678
|
+
* const next = await itd.notifications.list({ limit: 20, offset: page.nextOffset });
|
|
679
|
+
* ```
|
|
680
|
+
*/
|
|
681
|
+
list(params?: NotificationListParams, options?: RequestOptions): Promise<Page<Notification>>;
|
|
682
|
+
/**
|
|
683
|
+
* Перебирает уведомления.
|
|
684
|
+
*
|
|
685
|
+
* @example
|
|
686
|
+
* ```ts
|
|
687
|
+
* for await (const notification of itd.notifications.iterate()) {
|
|
688
|
+
* console.log(formatNotificationText(notification));
|
|
689
|
+
* }
|
|
690
|
+
* ```
|
|
691
|
+
*/
|
|
692
|
+
iterate(params?: NotificationListParams, options?: PaginationOptions): Paginator<Notification>;
|
|
693
|
+
/** Загружает число непрочитанных уведомлений. */
|
|
694
|
+
count(options?: RequestOptions): Promise<number>;
|
|
695
|
+
/**
|
|
696
|
+
* Отмечает уведомление прочитанным.
|
|
697
|
+
*
|
|
698
|
+
* @returns сколько записей отметил сервер
|
|
699
|
+
*/
|
|
700
|
+
markRead(notificationId: string, options?: RequestOptions): Promise<number>;
|
|
701
|
+
/**
|
|
702
|
+
* Отмечает прочитанными сразу несколько уведомлений.
|
|
703
|
+
*
|
|
704
|
+
* Список автоматически режется на части по 20 идентификаторов — столько же отправляет
|
|
705
|
+
* сайт итд.com, поэтому на сервере вероятен предел. Части уходят последовательно,
|
|
706
|
+
* результат суммируется.
|
|
707
|
+
*
|
|
708
|
+
* @returns сколько записей отметил сервер суммарно
|
|
709
|
+
*/
|
|
710
|
+
markReadBatch(ids: string[], options?: RequestOptions): Promise<number>;
|
|
711
|
+
/** Отмечает прочитанными все уведомления. */
|
|
712
|
+
markAllRead(options?: RequestOptions): Promise<number>;
|
|
713
|
+
/** Загружает настройки уведомлений. */
|
|
714
|
+
getSettings(options?: RequestOptions): Promise<NotificationSettings>;
|
|
715
|
+
/**
|
|
716
|
+
* Обновляет настройки уведомлений.
|
|
717
|
+
*
|
|
718
|
+
* Отправляются только изменяемые поля, в том же виде, в каком сервер их возвращает.
|
|
719
|
+
*/
|
|
720
|
+
updateSettings(input: UpdateNotificationSettingsInput, options?: RequestOptions): Promise<NotificationSettings>;
|
|
721
|
+
}
|
|
722
|
+
//#endregion
|
|
723
|
+
//#region src/models/account.d.ts
|
|
724
|
+
/** Активная сессия входа. */
|
|
725
|
+
interface Session {
|
|
726
|
+
id: string;
|
|
727
|
+
/** Та ли это сессия, из которой выполнен запрос. */
|
|
728
|
+
isCurrent: boolean;
|
|
729
|
+
createdAt: IsoDate;
|
|
730
|
+
lastUsedAt: IsoDate;
|
|
731
|
+
expiresAt: IsoDate;
|
|
732
|
+
ipAddress: string;
|
|
733
|
+
/** Код страны по IP, например `RU`. */
|
|
734
|
+
ipCountry: string | null;
|
|
735
|
+
ipCity: string | null;
|
|
736
|
+
deviceType: Loose<'desktop' | 'mobile'>;
|
|
737
|
+
osName: string | null;
|
|
738
|
+
osVersion: string | null;
|
|
739
|
+
/** Название браузера или приложения. */
|
|
740
|
+
clientName: string | null;
|
|
741
|
+
clientVersion: string | null;
|
|
742
|
+
deviceModel: string | null;
|
|
743
|
+
}
|
|
744
|
+
/** Состояние платной подписки и её цена. */
|
|
745
|
+
interface Subscription {
|
|
746
|
+
/** Активна ли подписка сейчас. */
|
|
747
|
+
active: boolean;
|
|
748
|
+
/** Включено ли автопродление. */
|
|
749
|
+
recurringEnabled: boolean;
|
|
750
|
+
/** Цена в рублях. */
|
|
751
|
+
price: number;
|
|
752
|
+
}
|
|
753
|
+
/** Сохранённый способ оплаты. */
|
|
754
|
+
interface PaymentMethod {
|
|
755
|
+
id: string;
|
|
756
|
+
/** Последние четыре цифры карты. */
|
|
757
|
+
last4?: string;
|
|
758
|
+
/** Платёжная система: `visa`, `mastercard`, `mir`. */
|
|
759
|
+
brand?: string;
|
|
760
|
+
/** Основной ли это способ оплаты. */
|
|
761
|
+
isDefault?: boolean;
|
|
762
|
+
expiresAt?: IsoDate | null;
|
|
763
|
+
}
|
|
764
|
+
//#endregion
|
|
528
765
|
//#region src/domain/params.d.ts
|
|
529
766
|
/** Данные для создания опроса. */
|
|
530
767
|
interface CreatePollInput {
|
|
@@ -923,7 +1160,7 @@ interface UploadOptions {
|
|
|
923
1160
|
declare class FilesResource extends BaseResource {
|
|
924
1161
|
#private;
|
|
925
1162
|
constructor(http: HttpClient, deps: {
|
|
926
|
-
|
|
1163
|
+
files: InternalFileResolver;
|
|
927
1164
|
});
|
|
928
1165
|
/**
|
|
929
1166
|
* Загружает файл и возвращает его идентификатор.
|
|
@@ -980,76 +1217,6 @@ declare class HashtagsResource extends BaseResource {
|
|
|
980
1217
|
iteratePosts(tag: string, params?: HashtagPostsParams, options?: PaginationOptions): Paginator<Post>;
|
|
981
1218
|
}
|
|
982
1219
|
//#endregion
|
|
983
|
-
//#region src/resources/notifications.d.ts
|
|
984
|
-
/** Параметры запроса списка уведомлений. */
|
|
985
|
-
interface NotificationListParams {
|
|
986
|
-
limit?: number;
|
|
987
|
-
/** Смещение от начала списка. */
|
|
988
|
-
offset?: number;
|
|
989
|
-
}
|
|
990
|
-
/** Изменяемые настройки уведомлений. */
|
|
991
|
-
type UpdateNotificationSettingsInput = Partial<NotificationSettings>;
|
|
992
|
-
/**
|
|
993
|
-
* Уведомления: список, счётчик, отметки о прочтении, настройки.
|
|
994
|
-
*
|
|
995
|
-
* Доступна как `itd.notifications`. Все уведомления приведены к единой форме, поэтому
|
|
996
|
-
* объекты отсюда и из потока событий можно складывать в один список.
|
|
997
|
-
*/
|
|
998
|
-
declare class NotificationsResource extends BaseResource {
|
|
999
|
-
#private;
|
|
1000
|
-
/**
|
|
1001
|
-
* Загружает страницу уведомлений.
|
|
1002
|
-
*
|
|
1003
|
-
* Пагинация здесь основана на смещении.
|
|
1004
|
-
*
|
|
1005
|
-
* @example
|
|
1006
|
-
* ```ts
|
|
1007
|
-
* const page = await itd.notifications.list({ limit: 20 });
|
|
1008
|
-
* const next = await itd.notifications.list({ limit: 20, offset: page.nextOffset });
|
|
1009
|
-
* ```
|
|
1010
|
-
*/
|
|
1011
|
-
list(params?: NotificationListParams, options?: RequestOptions): Promise<Page<Notification>>;
|
|
1012
|
-
/**
|
|
1013
|
-
* Перебирает уведомления.
|
|
1014
|
-
*
|
|
1015
|
-
* @example
|
|
1016
|
-
* ```ts
|
|
1017
|
-
* for await (const notification of itd.notifications.iterate()) {
|
|
1018
|
-
* console.log(formatNotificationText(notification));
|
|
1019
|
-
* }
|
|
1020
|
-
* ```
|
|
1021
|
-
*/
|
|
1022
|
-
iterate(params?: NotificationListParams, options?: PaginationOptions): Paginator<Notification>;
|
|
1023
|
-
/** Загружает число непрочитанных уведомлений. */
|
|
1024
|
-
count(options?: RequestOptions): Promise<number>;
|
|
1025
|
-
/**
|
|
1026
|
-
* Отмечает уведомление прочитанным.
|
|
1027
|
-
*
|
|
1028
|
-
* @returns сколько записей отметил сервер
|
|
1029
|
-
*/
|
|
1030
|
-
markRead(notificationId: string, options?: RequestOptions): Promise<number>;
|
|
1031
|
-
/**
|
|
1032
|
-
* Отмечает прочитанными сразу несколько уведомлений.
|
|
1033
|
-
*
|
|
1034
|
-
* Список автоматически режется на части по 20 идентификаторов — столько же отправляет
|
|
1035
|
-
* сайт итд.com, поэтому на сервере вероятен предел. Части уходят последовательно,
|
|
1036
|
-
* результат суммируется.
|
|
1037
|
-
*
|
|
1038
|
-
* @returns сколько записей отметил сервер суммарно
|
|
1039
|
-
*/
|
|
1040
|
-
markReadBatch(ids: string[], options?: RequestOptions): Promise<number>;
|
|
1041
|
-
/** Отмечает прочитанными все уведомления. */
|
|
1042
|
-
markAllRead(options?: RequestOptions): Promise<number>;
|
|
1043
|
-
/** Загружает настройки уведомлений. */
|
|
1044
|
-
getSettings(options?: RequestOptions): Promise<NotificationSettings>;
|
|
1045
|
-
/**
|
|
1046
|
-
* Обновляет настройки уведомлений.
|
|
1047
|
-
*
|
|
1048
|
-
* Отправляются только изменяемые поля, в том же виде, в каком сервер их возвращает.
|
|
1049
|
-
*/
|
|
1050
|
-
updateSettings(input: UpdateNotificationSettingsInput, options?: RequestOptions): Promise<NotificationSettings>;
|
|
1051
|
-
}
|
|
1052
|
-
//#endregion
|
|
1053
1220
|
//#region src/models/platform.d.ts
|
|
1054
1221
|
/** Клан в рейтинге. */
|
|
1055
1222
|
interface Clan {
|
|
@@ -1160,6 +1327,14 @@ interface PlatformStatus {
|
|
|
1160
1327
|
services: ServiceStatus[];
|
|
1161
1328
|
}
|
|
1162
1329
|
//#endregion
|
|
1330
|
+
//#region src/resources/status.d.ts
|
|
1331
|
+
/** API встроенного status feature. @internal */
|
|
1332
|
+
declare class StatusResource {
|
|
1333
|
+
#private;
|
|
1334
|
+
constructor(context: FeatureContext);
|
|
1335
|
+
get(options?: RequestOptions): Promise<PlatformStatus>;
|
|
1336
|
+
}
|
|
1337
|
+
//#endregion
|
|
1163
1338
|
//#region src/resources/platform.d.ts
|
|
1164
1339
|
/** Требования к версии одного приложения платформы. */
|
|
1165
1340
|
interface PlatformClientVersion {
|
|
@@ -1182,6 +1357,9 @@ interface PlatformVersions {
|
|
|
1182
1357
|
* Доступна как `itd.platform`.
|
|
1183
1358
|
*/
|
|
1184
1359
|
declare class PlatformResource extends BaseResource {
|
|
1360
|
+
#private;
|
|
1361
|
+
/** @internal */
|
|
1362
|
+
constructor(http: ConstructorParameters<typeof BaseResource>[0], status: StatusResource);
|
|
1185
1363
|
/**
|
|
1186
1364
|
* Загружает минимальные и актуальные версии клиентских приложений.
|
|
1187
1365
|
*
|
|
@@ -2246,5 +2424,5 @@ interface RenderSpansOptions {
|
|
|
2246
2424
|
*/
|
|
2247
2425
|
declare function renderSpans(content: string, spans?: readonly Span[] | null | undefined, options?: RenderSpansOptions): string;
|
|
2248
2426
|
//#endregion
|
|
2249
|
-
export { poll as $,
|
|
2250
|
-
//# sourceMappingURL=render-
|
|
2427
|
+
export { poll as $, PaymentMethod as $t, TelemetryResource as A, AttemptNext as An, CommentsResource as At, ReportInput as B, Post as Bt, DwellEntry as C, PreparedStreamSource as Cn, Report as Ct, TelemetryBatchOptions as D, AttemptContext as Dn, FilesResource as Dt, TelemetryBatch as E, HttpClient as En, HashtagsResource as Et, SubscriptionResource as F, PluginTeardown as Fn, Hashtag as Ft, UserPostsParams as G, BuilderInput as Gt, CommentsParams as H, CommentBuilder as Ht, SearchResource as I, LikeResult as It, PostInput as J, CreateCommentInput as Jt, CreatePostInput as K, ItdBuilder as Kt, SearchResult as L, PinPostResult as Lt, ViewTracker as M, OperationExtensions as Mn, Attachment as Mt, ViewTrackerInput as N, OperationTransformer as Nn, Comment as Nt, TelemetryClock as O, AttemptExtensions as On, UploadOptions as Ot, ViewTrackerOptions as P, PluginApi as Pn, CommentReplyTo as Pt, PollInput as Q, UpdatePostInput as Qt, ReportsResource as R, Poll as Rt, UsersResource as S, PreparedFileSource as Sn, Portal as St, PhotoOpenInput as T, ResolveFileOptions as Tn, HashtagPostsParams as Tt, FeedParams as U, CommentInput as Ut, report as V, PostStats as Vt, PostsResource as W, comment as Wt, post as X, CreatePostData as Xt, PostUpdateInput as Y, CreatePollInput as Yt, PollBuilder as Z, CreateReportInput as Zt, fromUrl as _, FeatureOperationDefinition as _n, StatusIncidentLine as _t, isMyProfile as a, BaseResource as an, MarkupContent as at, UpdateProfileInput as b, FileResolver as bn, ChangelogEntry as bt, ALLOWED_MIME_TYPES as c, PaginationMode as cn, TextMarkup as ct, AudioMimeType as d, mapPage as dn, PlatformClientVersion as dt, Session as en, ParseMarkupOptions as et, IMAGE_MIME_TYPES as f, RateLimitBucketState as fn, PlatformResource as ft, fromStream as g, FeatureInstallation as gn, StatusDay as gt, VideoMimeType as h, FeatureContext as hn, ServiceStatus as ht, statusDays as i, UpdateNotificationSettingsInput as in, MarkupBuilder as it, VideoProgressInput as j, ClientPlugin as jn, RepliesParams as jt, TelemetryOptions as k, AttemptInterceptor as kn, UploadedFile as kt, AUDIO_MIME_TYPES as l, Paginator as ln, autoSpans as lt, VIDEO_MIME_TYPES as m, FeatureBucketDefinition as mn, PlatformStatus as mt, SpanRenderFormat as n, NotificationListParams as nn, parseMarkdown as nt, toDate as o, Page as on, MarkupInput as ot, ImageMimeType as p, ClientFeature as pn, PlatformVersions as pt, PostBuilder as q, isBuilder as qt, renderSpans as r, NotificationsResource as rn, AutoSpansOptions as rt, utcStampToIso as s, PageState as sn, MarkupSpan as st, RenderSpansOptions as t, Subscription as tn, parseHtml as tt, AllowedMimeType as u, PaginatorOptions as un, markup as ut, VerificationResource as v, FeatureRequestOptions as vn, Announcement as vt, InteractionEntry as w, ResolveFileContext as wn, VerificationStatus as wt, UserListParams as x, PreparedBufferSource as xn, Clan as xt, UpdatePrivacyInput as y, ManagedClientResource as yn, AnnouncementButton as yt, ReportBuilder as z, PollOption as zt };
|
|
2428
|
+
//# sourceMappingURL=render-BszcKF7S.d.cts.map
|