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.
- package/README.md +72 -27
- 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 +234 -200
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +70 -64
- package/dist/index.d.ts +70 -64
- package/dist/index.js +202 -179
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +6 -5
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -2
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +5 -4
- package/dist/node/index.js.map +1 -1
- package/dist/rest/index.cjs +32 -26
- package/dist/rest/index.cjs.map +1 -1
- package/dist/rest/index.d.cts +9 -7
- package/dist/rest/index.d.ts +9 -7
- package/dist/rest/index.js +19 -21
- 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/{websocket-BLR8eVJV.js → events-C5wnTXPT.js} +770 -490
- package/dist/shared/events-C5wnTXPT.js.map +1 -0
- package/dist/shared/events-CqtkP65d.d.ts +698 -0
- package/dist/shared/events-DGAWlCaI.d.cts +698 -0
- package/dist/shared/{websocket-C_eI4H2o.cjs → events-FZfnEez0.cjs} +834 -518
- package/dist/shared/events-FZfnEez0.cjs.map +1 -0
- package/dist/shared/{storage-BPJR_k4-.cjs → key-value-store-B5GYVEYZ.cjs} +2 -86
- package/dist/shared/key-value-store-B5GYVEYZ.cjs.map +1 -0
- package/dist/shared/{storage-D86edNCB.js → key-value-store-Bt2PSMxY.js} +3 -69
- package/dist/shared/key-value-store-Bt2PSMxY.js.map +1 -0
- package/dist/shared/key-value-store-COZaNHZS.d.cts +69 -0
- package/dist/shared/key-value-store-COZaNHZS.d.ts +69 -0
- package/dist/shared/{multi-storage-DccjD7Ww.d.ts → multi-storage-BEL7tcKn.d.cts} +3 -2
- package/dist/shared/{multi-storage--yTEqiod.cjs → multi-storage-CDKLa956.cjs} +11 -10
- package/dist/shared/{multi-storage--yTEqiod.cjs.map → multi-storage-CDKLa956.cjs.map} +1 -1
- package/dist/shared/{multi-storage-CjAPB5Kq.d.cts → multi-storage-LkljOSzA.d.ts} +3 -2
- package/dist/shared/{multi-storage-CkvTUC5m.js → multi-storage-SoW05uzO.js} +5 -4
- package/dist/shared/{multi-storage-CkvTUC5m.js.map → multi-storage-SoW05uzO.js.map} +1 -1
- package/dist/shared/{options-Dg5N3r1V.cjs → options-DOJYtoti.cjs} +8 -6
- package/dist/shared/options-DOJYtoti.cjs.map +1 -0
- package/dist/shared/{options-DtATYdLr.js → options-DhgGg7Ms.js} +8 -6
- package/dist/shared/options-DhgGg7Ms.js.map +1 -0
- package/dist/shared/{cookies-DZwFq6kr.cjs → redact-BP00URmQ.cjs} +312 -2
- package/dist/shared/redact-BP00URmQ.cjs.map +1 -0
- package/dist/shared/{cookies-tX2sNwxb.js → redact-Ba5iSVYZ.js} +235 -3
- package/dist/shared/redact-Ba5iSVYZ.js.map +1 -0
- package/dist/shared/{render-CgwKdOzu.d.ts → render-B4qis7Sb.d.ts} +775 -313
- package/dist/shared/{render-DO0F5YSm.d.cts → render-DDwy2Ame.d.cts} +775 -313
- package/dist/shared/{render-mcuELiYi.cjs → render-Dqi8Owqk.cjs} +1464 -662
- package/dist/shared/render-Dqi8Owqk.cjs.map +1 -0
- package/dist/shared/{render-C6HRPs10.js → render-hiWFh2s4.js} +1366 -618
- package/dist/shared/render-hiWFh2s4.js.map +1 -0
- package/dist/shared/storage-BQrtKon9.d.cts +86 -0
- package/dist/shared/storage-CTRGT5wF.d.ts +86 -0
- package/dist/shared/storage-CfHKzVHf.js +71 -0
- package/dist/shared/storage-CfHKzVHf.js.map +1 -0
- package/dist/shared/storage-QNVxzpDB.cjs +88 -0
- package/dist/shared/storage-QNVxzpDB.cjs.map +1 -0
- package/dist/shared/{url-BaMCQpYH.cjs → url-Bsb3xE5U.cjs} +577 -466
- package/dist/shared/url-Bsb3xE5U.cjs.map +1 -0
- package/dist/shared/{url-IU0xN9wX.js → url-DP33mp3s.js} +508 -409
- package/dist/shared/url-DP33mp3s.js.map +1 -0
- package/dist/shared/{url-DTfZ2toq.d.ts → url-XBsMdAcv.d.cts} +1313 -1200
- package/dist/shared/{url-DTfZ2toq.d.cts → url-XBsMdAcv.d.ts} +1313 -1200
- package/dist/web/index.cjs +5 -4
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.js +3 -2
- package/dist/web/index.js.map +1 -1
- 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-CG8oCQ9F.cjs +0 -108
- package/dist/shared/auth-provider-CG8oCQ9F.cjs.map +0 -1
- package/dist/shared/auth-provider-mYqxsSVa.js +0 -91
- package/dist/shared/auth-provider-mYqxsSVa.js.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-C6HRPs10.js.map +0 -1
- package/dist/shared/render-mcuELiYi.cjs.map +0 -1
- package/dist/shared/storage-BPJR_k4-.cjs.map +0 -1
- package/dist/shared/storage-C_eICCep.d.cts +0 -152
- package/dist/shared/storage-C_eICCep.d.ts +0 -152
- package/dist/shared/storage-D86edNCB.js.map +0 -1
- package/dist/shared/url-BaMCQpYH.cjs.map +0 -1
- package/dist/shared/url-IU0xN9wX.js.map +0 -1
- package/dist/shared/websocket-BLR8eVJV.js.map +0 -1
- package/dist/shared/websocket-C_eI4H2o.cjs.map +0 -1
- package/dist/shared/websocket-DF7XIMiX.d.cts +0 -562
- package/dist/shared/websocket-DYKBr8HF.d.ts +0 -562
|
@@ -1,31 +1,230 @@
|
|
|
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-XBsMdAcv.js";
|
|
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.js";
|
|
3
|
-
|
|
3
|
+
import { r as KeyValueStore } from "./key-value-store-COZaNHZS.js";
|
|
4
|
+
//#region src/core/plugins/contracts.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Обёртка одной логической операции.
|
|
7
|
+
*
|
|
8
|
+
* Вызывается один раз независимо от повторов и обновления авторизации. Может изменить
|
|
9
|
+
* параметры запроса, обработать публичный результат метода или завершить операцию локально.
|
|
10
|
+
* `operationId`, HTTP-метод и безопасность повтора задаются операцией.
|
|
11
|
+
*
|
|
12
|
+
* @param request описание логической операции; не изменяйте сам объект — передайте копию в `next`
|
|
13
|
+
* @param next следующая обёртка либо выполнение операции
|
|
14
|
+
* `next()` возвращает результат публичного метода. Если обёртка не вызывает `next`, её
|
|
15
|
+
* собственный результат считается готовым и повторно не нормализуется.
|
|
16
|
+
*
|
|
17
|
+
* @returns результат в том виде, в котором его получит вызывающий код
|
|
18
|
+
*
|
|
19
|
+
* @example Дописать заголовок ко всем операциям
|
|
20
|
+
* ```ts
|
|
21
|
+
* const transformer: OperationTransformer = (request, next) =>
|
|
22
|
+
* next({ ...request, headers: { ...request.headers, 'X-Trace': trace() } });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
type OperationTransformer = (request: OperationRequestOptions, next: (request: OperationRequestOptions) => Promise<unknown>) => Promise<unknown>;
|
|
26
|
+
/** Финальные данные одной транспортной попытки. */
|
|
27
|
+
interface AttemptContext {
|
|
28
|
+
/** Постоянный идентификатор операции. */
|
|
29
|
+
readonly operationId: OperationId;
|
|
30
|
+
/** Нормализованный HTTP-метод. */
|
|
31
|
+
readonly method: string;
|
|
32
|
+
/** Исходный путь операции до выбора сервиса или `baseUrl`. */
|
|
33
|
+
readonly path: string;
|
|
34
|
+
/** Полный URL со строкой запроса. */
|
|
35
|
+
readonly url: string;
|
|
36
|
+
/** Итоговые изменяемые заголовки. */
|
|
37
|
+
readonly headers: Headers;
|
|
38
|
+
/** Номер сетевой попытки, начиная с 1. */
|
|
39
|
+
readonly attempt: number;
|
|
40
|
+
/** Подготовленное тело запроса. Поток нельзя читать заранее. */
|
|
41
|
+
readonly body: BodyInit | undefined;
|
|
42
|
+
/** Общий сигнал отмены и таймаута этой попытки. */
|
|
43
|
+
readonly signal: AbortSignal;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Продолжение цепочки перехватчиков. Можно вызвать только один раз.
|
|
47
|
+
*/
|
|
48
|
+
type AttemptNext = () => Promise<Response>;
|
|
4
49
|
/**
|
|
5
|
-
*
|
|
50
|
+
* Обёртка одной транспортной попытки.
|
|
51
|
+
*
|
|
52
|
+
* Получает уже разрешённый URL, итоговые заголовки, подготовленное тело и номер попытки.
|
|
53
|
+
* Может изменить заголовки, измерить задержку, обработать сырой `Response` или вернуть
|
|
54
|
+
* созданный вручную `Response`.
|
|
6
55
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
56
|
+
* Вызывается для каждой сетевой попытки. Если перехватчик читает тело ответа, используйте
|
|
57
|
+
* `response.clone()`: исходный ответ дальше обрабатывает транспорт.
|
|
58
|
+
*
|
|
59
|
+
* @param context окончательные данные текущей транспортной попытки
|
|
60
|
+
* @param next следующий перехватчик либо вызов `fetch`
|
|
61
|
+
* @returns исходный или синтетический сырой `Response`
|
|
62
|
+
*/
|
|
63
|
+
type AttemptInterceptor = (context: AttemptContext, next: AttemptNext) => Promise<Response>;
|
|
64
|
+
/** Регистрация расширений логической операции. */
|
|
65
|
+
interface OperationExtensions {
|
|
66
|
+
/** Возвращает неизменяемые метаданные зарегистрированной операции. */
|
|
67
|
+
get(operationId: OperationId): OperationMetadata | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Подключает обёртку операции.
|
|
70
|
+
*
|
|
71
|
+
* Зарегистрированные раньше оборачивают зарегистрированные позже. Возвращённая функция
|
|
72
|
+
* идемпотентна и снимает только эту регистрацию.
|
|
73
|
+
*/
|
|
74
|
+
use(transformer: OperationTransformer): Unsubscribe;
|
|
75
|
+
}
|
|
76
|
+
/** Регистрация расширений транспортной попытки. */
|
|
77
|
+
interface AttemptExtensions {
|
|
78
|
+
/**
|
|
79
|
+
* Подключает перехватчик попытки.
|
|
80
|
+
*
|
|
81
|
+
* Зарегистрированные раньше оборачивают зарегистрированные позже. Возвращённая функция
|
|
82
|
+
* идемпотентна и снимает только эту регистрацию.
|
|
83
|
+
*/
|
|
84
|
+
use(interceptor: AttemptInterceptor): Unsubscribe;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Функция освобождения ресурсов плагина.
|
|
88
|
+
*/
|
|
89
|
+
type PluginTeardown = () => void | Promise<void>;
|
|
90
|
+
/** API, доступный плагину при подключении. */
|
|
91
|
+
interface PluginApi {
|
|
92
|
+
/** Базовый URL клиента — например чтобы разобрать абсолютные ссылки из ответа. */
|
|
93
|
+
baseUrl: string;
|
|
94
|
+
/** Логгер клиента, если он включён. */
|
|
95
|
+
logger: Logger | undefined;
|
|
96
|
+
/** Обёртки логической операции. */
|
|
97
|
+
operations: OperationExtensions;
|
|
98
|
+
/** Перехватчики сетевой попытки. */
|
|
99
|
+
attempts: AttemptExtensions;
|
|
100
|
+
/**
|
|
101
|
+
* Внутренний идентификатор текущей авторизации.
|
|
102
|
+
*/
|
|
103
|
+
getAuthScope?: (() => string) | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* Загружает сессию и возвращает идентификаторы аккаунта и конкретной сессии из JWT.
|
|
106
|
+
*
|
|
107
|
+
* Используйте для общего состояния нескольких клиентов одного аккаунта.
|
|
108
|
+
*/
|
|
109
|
+
getAuthIdentity?: (() => Promise<AuthIdentity>) | undefined;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Плагин клиента.
|
|
113
|
+
*
|
|
114
|
+
* Подключается через `itd.use(plugin)` и регистрирует расширения одного или обоих уровней:
|
|
115
|
+
* {@link OperationTransformer} для логической операции и {@link AttemptInterceptor} для
|
|
116
|
+
* отдельной транспортной попытки.
|
|
117
|
+
*
|
|
118
|
+
* Настройки отдельного вызова плагин объявляет своим полем в `RequestExtensions` через
|
|
119
|
+
* дополнение интерфейса. Пользователь передаёт их в `RequestOptions.extensions`, а обёртка
|
|
120
|
+
* операции читает поле своего плагина.
|
|
121
|
+
*
|
|
122
|
+
* @example Логирование логических операций
|
|
123
|
+
* ```ts
|
|
124
|
+
* const logging: ClientPlugin = {
|
|
125
|
+
* name: 'logging',
|
|
126
|
+
* install({ operations, logger }) {
|
|
127
|
+
* operations.use(async (request, next) => {
|
|
128
|
+
* logger?.info(`${request.method} ${request.path}`);
|
|
129
|
+
* return next(request);
|
|
130
|
+
* });
|
|
131
|
+
* },
|
|
132
|
+
* };
|
|
133
|
+
*
|
|
134
|
+
* itd.use(logging);
|
|
135
|
+
* ```
|
|
136
|
+
*/
|
|
137
|
+
interface ClientPlugin {
|
|
138
|
+
/** Имя плагина. Должно быть уникальным: повторное подключение — ошибка. */
|
|
139
|
+
name: string;
|
|
140
|
+
/** Плагины, которые обязаны быть подключены раньше этого. */
|
|
141
|
+
requires?: readonly string[];
|
|
142
|
+
/** Несовместимые плагины. Достаточно объявить конфликт с одной стороны. */
|
|
143
|
+
conflicts?: readonly string[];
|
|
144
|
+
/** Имена плагинов, снаружи которых должны стоять оба вида расширений этого плагина. */
|
|
145
|
+
before?: readonly string[];
|
|
146
|
+
/** Имена плагинов, внутри которых должны стоять оба вида расширений этого плагина. */
|
|
147
|
+
after?: readonly string[];
|
|
148
|
+
/**
|
|
149
|
+
* Устанавливает плагин.
|
|
150
|
+
*
|
|
151
|
+
* Может вернуть функцию освобождения ресурсов. Она вызывается при `unuse()` или
|
|
152
|
+
* окончательном `dispose()` клиента и может быть асинхронной. Сам `install()` синхронный:
|
|
153
|
+
* регистрация расширений завершается до того, как `use()` вернёт управление.
|
|
154
|
+
*/
|
|
155
|
+
install(api: PluginApi): void | PluginTeardown;
|
|
156
|
+
}
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/core/plugins/registry.d.ts
|
|
159
|
+
/** Что реестру нужно знать об остановке. @internal */
|
|
160
|
+
interface PluginRegistryOptions {
|
|
161
|
+
/** Срок ожидания операций плагина при его отключении, мс. `0` — ждать без ограничения. */
|
|
162
|
+
shutdownTimeout: number;
|
|
163
|
+
clock: ItdClock;
|
|
164
|
+
/** Возвращает публичные метаданные встроенной или feature-операции. */
|
|
165
|
+
operationMetadata: (operationId: OperationRequestOptions['operationId']) => OperationMetadata | undefined;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Список подключённых плагинов и зарегистрированных ими расширений.
|
|
169
|
+
*
|
|
170
|
+
* {@link run} собирает operation transformers вокруг одной логической операции и прикрепляет
|
|
171
|
+
* к ней неизменяемый снимок attempt interceptors. Transport исполняет этот снимок отдельно
|
|
172
|
+
* для каждой сетевой попытки. Порядок плагинов одинаков для обеих цепочек.
|
|
11
173
|
*
|
|
12
174
|
* @internal
|
|
13
175
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
|
|
176
|
+
declare class PluginRegistry {
|
|
177
|
+
#private;
|
|
178
|
+
constructor(options: PluginRegistryOptions);
|
|
179
|
+
/** Сколько плагинов подключено. */
|
|
180
|
+
get size(): number;
|
|
181
|
+
/** Имена плагинов в фактическом порядке выполнения. */
|
|
182
|
+
names(): string[];
|
|
183
|
+
/** Подключён ли плагин с таким именем. */
|
|
184
|
+
has(name: string): boolean;
|
|
185
|
+
/** Проверяет добавление без вызова `install()`. @internal */
|
|
186
|
+
assertCanAdd(plugin: ClientPlugin): void;
|
|
187
|
+
/** Проверяет удаление без изменения реестра. @internal */
|
|
188
|
+
assertCanRemove(name: string): void;
|
|
189
|
+
/**
|
|
190
|
+
* Подключает плагин.
|
|
191
|
+
*
|
|
192
|
+
* `install()` выполняется синхронно. Каждая регистрация принадлежит установившему её
|
|
193
|
+
* плагину и участвует в общем порядке `before`/`after`.
|
|
194
|
+
*
|
|
195
|
+
* @throws {ItdConfigError} если плагин задан неверно, уже подключён или нарушает зависимости
|
|
196
|
+
*/
|
|
197
|
+
add(plugin: ClientPlugin, context: Omit<PluginApi, 'operations' | 'attempts'>): void;
|
|
198
|
+
/**
|
|
199
|
+
* Отключает плагин и вызывает его функцию очистки.
|
|
200
|
+
*
|
|
201
|
+
* Новые запросы перестают видеть расширения плагина сразу. Снимок уже начавшейся операции,
|
|
202
|
+
* включая её будущие retry, остаётся неизменным; очистка дождётся завершения операции,
|
|
203
|
+
* но не дольше отведённого срока.
|
|
204
|
+
*
|
|
205
|
+
* @returns `false`, если такого плагина не было
|
|
206
|
+
* @throws {ItdStateError} если операции плагина не завершились за отведённый срок
|
|
207
|
+
*/
|
|
208
|
+
remove(name: string): Promise<boolean>;
|
|
209
|
+
/**
|
|
210
|
+
* Отключает все плагины окончательно.
|
|
211
|
+
*
|
|
212
|
+
* Очистка идёт изнутри наружу — в порядке, обратном выполнению расширений. Срок ожидания
|
|
213
|
+
* общий на все плагины.
|
|
214
|
+
*/
|
|
215
|
+
dispose(): Promise<void>;
|
|
216
|
+
/**
|
|
217
|
+
* Прогоняет запрос через operation transformers и прикрепляет attempt interceptors.
|
|
218
|
+
*
|
|
219
|
+
* Снимки обеих цепочек берутся в начале: `unuse()` влияет на новые операции, но не меняет
|
|
220
|
+
* уже выполняющуюся и не удаляет interceptors из её последующих retry.
|
|
221
|
+
*
|
|
222
|
+
* Каждый `next` одноразовый: transformer может завершить операцию сам, но не может породить
|
|
223
|
+
* вторую — для `posts.create` это была бы вторая публикация.
|
|
224
|
+
*
|
|
225
|
+
* @param execute выполнение логической операции, вызываемое самым внутренним transformer
|
|
226
|
+
*/
|
|
227
|
+
run(request: OperationRequestOptions, execute: (request: OperationRequestOptions) => Promise<unknown>): Promise<unknown>;
|
|
29
228
|
}
|
|
30
229
|
//#endregion
|
|
31
230
|
//#region src/core/execution/pipeline.d.ts
|
|
@@ -82,15 +281,15 @@ type RequestHandler = (request: PipelineRequest) => Promise<unknown>;
|
|
|
82
281
|
interface HttpClientDeps {
|
|
83
282
|
/** Готовый обработчик — вся цепочка слоёв поверх транспорта. */
|
|
84
283
|
handler: RequestHandler;
|
|
284
|
+
plugins: PluginRegistry;
|
|
85
285
|
baseUrl: string;
|
|
86
|
-
/** Каталог, из которого берётся HTTP-метод семантической операции. */
|
|
87
|
-
catalog: OperationCatalog;
|
|
88
286
|
}
|
|
287
|
+
/** Параметры операции без ID и метода, заданных её контрактом. @internal */
|
|
288
|
+
type HttpOperationOptions = Omit<PipelineRequest, 'operationId' | 'method'>;
|
|
89
289
|
/**
|
|
90
290
|
* Точка входа ресурсов в конвейер запросов.
|
|
91
291
|
*
|
|
92
|
-
* Принимает
|
|
93
|
-
* во внутреннем runtime клиента, — и отдаёт ресурсам методы `request`/`operation`.
|
|
292
|
+
* Принимает готовую цепочку обработки и предоставляет ресурсам методы `request`/`execute`.
|
|
94
293
|
* О слоях и их порядке ресурсы не знают.
|
|
95
294
|
*/
|
|
96
295
|
declare class HttpClient {
|
|
@@ -108,23 +307,91 @@ declare class HttpClient {
|
|
|
108
307
|
* @throws {ItdNetworkError} если запрос не дошёл до сервера
|
|
109
308
|
*/
|
|
110
309
|
request<T = unknown>(options: PipelineRequestInput): Promise<T>;
|
|
111
|
-
/** Выполняет
|
|
112
|
-
|
|
310
|
+
/** Выполняет контракт операции; `next()` плагина возвращает результат после `read`. */
|
|
311
|
+
execute<T, TId extends OperationId>(operation: OperationContract<T, TId>, options: HttpOperationOptions): Promise<T>;
|
|
113
312
|
/** Выполняет внутреннюю операцию финализации после начала `ItdClient.dispose()`. @internal */
|
|
114
|
-
cleanupOperation<T
|
|
313
|
+
cleanupOperation<T, TId extends OperationId>(operation: OperationContract<T, TId>, options: HttpOperationOptions): Promise<T>;
|
|
314
|
+
}
|
|
315
|
+
//#endregion
|
|
316
|
+
//#region src/core/attachments/resolver.d.ts
|
|
317
|
+
/** Дополнительные требования потребителя к подготовленному источнику. */
|
|
318
|
+
interface ResolveFileOptions {
|
|
319
|
+
/** Имя, которое имеет приоритет над именем источника. */
|
|
320
|
+
readonly filename?: string | undefined;
|
|
321
|
+
/** MIME-тип, который имеет приоритет над типом источника. */
|
|
322
|
+
readonly contentType?: string | undefined;
|
|
323
|
+
/** Дополнительный предел размера для любого вида источника. */
|
|
324
|
+
readonly maxBytes?: number | undefined;
|
|
325
|
+
/** Размер очереди библиотеки при потоковом чтении. */
|
|
326
|
+
readonly streamBufferBytes?: number | undefined;
|
|
327
|
+
/** Отклонить поток, размер которого нельзя узнать до чтения. */
|
|
328
|
+
readonly requireKnownSize?: boolean | undefined;
|
|
329
|
+
}
|
|
330
|
+
/** Буфер, полностью принадлежащий вызывающему коду. */
|
|
331
|
+
interface PreparedBufferSource {
|
|
332
|
+
readonly mode: typeof FileTransferMode.Buffer;
|
|
333
|
+
readonly blob: Blob;
|
|
334
|
+
readonly size: number;
|
|
335
|
+
readonly filename?: string | undefined;
|
|
336
|
+
readonly contentType: string | undefined;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Одна открытая сессия чтения потокового источника.
|
|
340
|
+
*
|
|
341
|
+
* Потребитель обязан вызвать {@link close} в `finally`. Повторный вызов безопасен и ждёт
|
|
342
|
+
* тот же результат освобождения ресурсов.
|
|
343
|
+
*/
|
|
344
|
+
interface PreparedStreamSource {
|
|
345
|
+
readonly mode: typeof FileTransferMode.Stream;
|
|
346
|
+
readonly stream: ReadableStream<Uint8Array>;
|
|
347
|
+
readonly size: number | undefined;
|
|
348
|
+
readonly filename?: string | undefined;
|
|
349
|
+
readonly contentType: string | undefined;
|
|
350
|
+
close(): Promise<void>;
|
|
351
|
+
}
|
|
352
|
+
/** Подготовленный файловый источник без правил конкретного протокола загрузки. */
|
|
353
|
+
type PreparedFileSource = PreparedBufferSource | PreparedStreamSource;
|
|
354
|
+
/** Контекст одной попытки открытия файлового источника. */
|
|
355
|
+
interface ResolveFileContext {
|
|
356
|
+
readonly signal?: AbortSignal | undefined;
|
|
357
|
+
/** Номер попытки потребителя, начиная с 1. */
|
|
358
|
+
readonly attempt?: number | undefined;
|
|
359
|
+
}
|
|
360
|
+
/** Узкий файловый порт, доступный подключаемым предметным модулям. */
|
|
361
|
+
interface FileResolver {
|
|
362
|
+
resolve(input: FileInput, options?: ResolveFileOptions, context?: ResolveFileContext): Promise<PreparedFileSource>;
|
|
363
|
+
}
|
|
364
|
+
/** Внутренний контракт нужен `FilesResource` для сохранения семантики повторных попыток. */
|
|
365
|
+
interface InternalFileResolver extends FileResolver {
|
|
366
|
+
mode(input: FileInput): FileTransferMode;
|
|
367
|
+
}
|
|
368
|
+
//#endregion
|
|
369
|
+
//#region src/core/managed-resources.d.ts
|
|
370
|
+
/** Долгоживущий ресурс клиента. */
|
|
371
|
+
interface ManagedClientResource {
|
|
372
|
+
/** Короткое имя для диагностики зависшей остановки. */
|
|
373
|
+
readonly kind: string;
|
|
374
|
+
/** Синхронно прекращает принимать новую работу и запускает отмену. */
|
|
375
|
+
stop(): void;
|
|
376
|
+
/** Завершается после остановки обработчиков и освобождения внешних ресурсов. */
|
|
377
|
+
drain(): Promise<void>;
|
|
115
378
|
}
|
|
116
379
|
//#endregion
|
|
117
380
|
//#region src/core/features.d.ts
|
|
118
381
|
/** Параметры запроса feature: маршрут задаёт ресурс, transport metadata — manifest. */
|
|
119
382
|
type FeatureRequestOptions = Omit<RawRequestOptions, 'operationId' | 'method' | 'service' | 'baseUrl' | 'retrySafety' | 'rateLimitBucket'>;
|
|
120
383
|
/** Операция одного feature. Локальный ключ используется в {@link FeatureContext.request}. */
|
|
121
|
-
interface FeatureOperationDefinition {
|
|
384
|
+
interface FeatureOperationDefinition<T = unknown> {
|
|
122
385
|
readonly method: OperationMethod;
|
|
123
386
|
readonly retrySafety: RetrySafety;
|
|
124
387
|
/** Имя сервиса из {@link ClientFeature.services}; без него используется основной API. */
|
|
125
388
|
readonly service?: string | undefined;
|
|
126
389
|
/** Локальное имя бакета из {@link ClientFeature.buckets}. */
|
|
127
390
|
readonly bucket?: string | undefined;
|
|
391
|
+
/** Преобразует тело ответа в публичный результат операции. По умолчанию возвращает тело без изменений. */
|
|
392
|
+
readonly read?: OperationContract<T>['read'] | undefined;
|
|
393
|
+
/** Необязательные метаданные, интерпретируемые подключёнными плагинами. */
|
|
394
|
+
readonly annotations?: OperationAnnotations | undefined;
|
|
128
395
|
}
|
|
129
396
|
/** Начальные ограничения нового серверного счётчика feature. */
|
|
130
397
|
interface FeatureBucketDefinition extends RateLimitBucketOverride {}
|
|
@@ -151,178 +418,30 @@ interface ClientFeature<TApi> {
|
|
|
151
418
|
readonly buckets?: Readonly<Record<string, FeatureBucketDefinition>> | undefined;
|
|
152
419
|
setup(context: FeatureContext): FeatureInstallation<TApi>;
|
|
153
420
|
}
|
|
154
|
-
/**
|
|
421
|
+
/** Доступ подключаемого модуля к клиенту. */
|
|
155
422
|
interface FeatureContext {
|
|
156
423
|
readonly featureName: string;
|
|
157
424
|
readonly baseUrl: string;
|
|
158
425
|
readonly signal: AbortSignal;
|
|
159
426
|
readonly clock: ItdClock;
|
|
160
427
|
readonly logger: Logger | undefined;
|
|
161
|
-
/**
|
|
162
|
-
|
|
163
|
-
/** Возвращает фактический URL объявленного сервиса с учётом настроек клиента. */
|
|
164
|
-
serviceBaseUrl(name: string): string;
|
|
165
|
-
}
|
|
166
|
-
//#endregion
|
|
167
|
-
//#region src/core/plugins/contracts.d.ts
|
|
168
|
-
/**
|
|
169
|
-
* Обёртка одной логической операции.
|
|
170
|
-
*
|
|
171
|
-
* Вызывается ровно один раз независимо от retry и auth recovery. Может изменить
|
|
172
|
-
* семантический запрос, обработать разобранный результат или завершить операцию локально.
|
|
173
|
-
*
|
|
174
|
-
* @param request описание логической операции; не изменяйте сам объект — передайте копию в `next`
|
|
175
|
-
* @param next следующая обёртка либо выполнение операции
|
|
176
|
-
* @returns разобранный результат в том виде, в котором его получит вызывающий код
|
|
177
|
-
*
|
|
178
|
-
* @example Дописать заголовок ко всем операциям
|
|
179
|
-
* ```ts
|
|
180
|
-
* const transformer: OperationTransformer = (request, next) =>
|
|
181
|
-
* next({ ...request, headers: { ...request.headers, 'X-Trace': trace() } });
|
|
182
|
-
* ```
|
|
183
|
-
*/
|
|
184
|
-
type OperationTransformer = (request: OperationRequestOptions, next: (request: OperationRequestOptions) => Promise<unknown>) => Promise<unknown>;
|
|
185
|
-
/** Финальные данные одной транспортной попытки. */
|
|
186
|
-
interface AttemptContext {
|
|
187
|
-
/** Стабильная семантическая операция. */
|
|
188
|
-
readonly operationId: OperationId;
|
|
189
|
-
/** Нормализованный HTTP-метод. */
|
|
190
|
-
readonly method: string;
|
|
191
|
-
/** Исходный путь операции до разрешения service/base URL. */
|
|
192
|
-
readonly path: string;
|
|
193
|
-
/** Полностью разрешённый URL со строкой query. */
|
|
194
|
-
readonly url: string;
|
|
195
|
-
/** Итоговые заголовки. Сам объект mutable для подписи и diagnostic headers. */
|
|
196
|
-
readonly headers: Headers;
|
|
197
|
-
/** Номер transport attempt, начиная с 1. */
|
|
198
|
-
readonly attempt: number;
|
|
199
|
-
/** Тело после сериализации либо подготовки body factory. Поток нельзя читать заранее. */
|
|
200
|
-
readonly body: BodyInit | undefined;
|
|
201
|
-
/** Общий сигнал отмены и таймаута этой попытки. */
|
|
202
|
-
readonly signal: AbortSignal;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Продолжение attempt chain.
|
|
206
|
-
*
|
|
207
|
-
* В рамках одного interceptor его можно вызвать только один раз. Возвращает сырой ответ:
|
|
208
|
-
* transport ещё не проверял status и не читал body.
|
|
209
|
-
*/
|
|
210
|
-
type AttemptNext = () => Promise<Response>;
|
|
211
|
-
/**
|
|
212
|
-
* Обёртка одной транспортной попытки.
|
|
213
|
-
*
|
|
214
|
-
* Получает уже разрешённый URL, итоговые заголовки, подготовленное тело и номер попытки.
|
|
215
|
-
* Может дописать заголовки, измерить wire latency, обработать сырой `Response` или вернуть
|
|
216
|
-
* синтетический `Response`. Семантический input здесь намеренно недоступен для изменения.
|
|
217
|
-
*
|
|
218
|
-
* Вызывается заново для каждого retry и auth recovery. `next()` разрешено вызвать один раз.
|
|
219
|
-
* Если interceptor читает тело ответа, читать нужно `response.clone()`: исходный body после
|
|
220
|
-
* цепочки разбирает transport. Исключение interceptor остаётся пользовательской ошибкой и не
|
|
221
|
-
* классифицируется как сетевой сбой для автоматического retry.
|
|
222
|
-
*
|
|
223
|
-
* @param context окончательные данные текущей транспортной попытки
|
|
224
|
-
* @param next следующий interceptor либо вызов `fetch`
|
|
225
|
-
* @returns исходный или синтетический сырой `Response`
|
|
226
|
-
*/
|
|
227
|
-
type AttemptInterceptor = (context: AttemptContext, next: AttemptNext) => Promise<Response>;
|
|
228
|
-
/** Регистрация расширений логической операции. */
|
|
229
|
-
interface OperationExtensions {
|
|
230
|
-
/**
|
|
231
|
-
* Подключает transformer.
|
|
232
|
-
*
|
|
233
|
-
* Зарегистрированные раньше оборачивают зарегистрированные позже. Возвращённая функция
|
|
234
|
-
* идемпотентна и снимает только эту регистрацию.
|
|
235
|
-
*/
|
|
236
|
-
use(transformer: OperationTransformer): Unsubscribe;
|
|
237
|
-
}
|
|
238
|
-
/** Регистрация расширений транспортной попытки. */
|
|
239
|
-
interface AttemptExtensions {
|
|
240
|
-
/**
|
|
241
|
-
* Подключает interceptor.
|
|
242
|
-
*
|
|
243
|
-
* Зарегистрированные раньше оборачивают зарегистрированные позже. Возвращённая функция
|
|
244
|
-
* идемпотентна и снимает только эту регистрацию.
|
|
245
|
-
*/
|
|
246
|
-
use(interceptor: AttemptInterceptor): Unsubscribe;
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Освобождение ресурсов, заведённых плагином при установке.
|
|
250
|
-
*
|
|
251
|
-
* Вызывается после завершения логических операций, уже вошедших в расширения плагина,
|
|
252
|
-
* поэтому может безопасно закрывать используемые ими соединения и хранилища.
|
|
253
|
-
*/
|
|
254
|
-
type PluginTeardown = () => void | Promise<void>;
|
|
255
|
-
/** API, доступный плагину при подключении. */
|
|
256
|
-
interface PluginApi {
|
|
257
|
-
/** Базовый URL клиента — например чтобы разобрать абсолютные ссылки из ответа. */
|
|
258
|
-
baseUrl: string;
|
|
259
|
-
/** Отладочный вывод клиента, если он включён. */
|
|
260
|
-
logger: Logger | undefined;
|
|
261
|
-
/** Расширения логической операции: выполняются один раз и могут short-circuit сеть. */
|
|
262
|
-
operations: OperationExtensions;
|
|
263
|
-
/** Расширения wire attempt: выполняются заново после каждого retry/auth recovery. */
|
|
264
|
-
attempts: AttemptExtensions;
|
|
265
|
-
/**
|
|
266
|
-
* Непрозрачная fallback-область текущей авторизации.
|
|
267
|
-
*
|
|
268
|
-
* Нужна плагинам, которые обязаны безопасно изолировать непрозрачный токен. Для объединения
|
|
269
|
-
* состояния копий одного аккаунта используйте {@link getAuthIdentity}.
|
|
270
|
-
*/
|
|
271
|
-
getAuthScope?: (() => string) | undefined;
|
|
272
|
-
/**
|
|
273
|
-
* Загружает сессию и возвращает идентификаторы аккаунта и конкретной сессии из JWT.
|
|
274
|
-
*
|
|
275
|
-
* Предпочтительнее {@link getAuthScope} для состояния, которое должно объединяться между
|
|
276
|
-
* несколькими экземплярами клиента одного аккаунта.
|
|
277
|
-
*/
|
|
278
|
-
getAuthIdentity?: (() => Promise<AuthIdentity>) | undefined;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Плагин клиента.
|
|
282
|
-
*
|
|
283
|
-
* Подключается через `itd.use(plugin)` и регистрирует расширения одного или обоих уровней:
|
|
284
|
-
* {@link OperationTransformer} для логической операции и {@link AttemptInterceptor} для
|
|
285
|
-
* отдельной транспортной попытки. Core взаимодействует с плагином только через эти контракты
|
|
286
|
-
* и его lifecycle, не зная деталей реализации.
|
|
287
|
-
*
|
|
288
|
-
* Настройки отдельного вызова плагин объявляет своим полем в `RequestExtensions` через
|
|
289
|
-
* declaration merging. Пользователь передаёт их в `RequestOptions.extensions`, а operation
|
|
290
|
-
* transformer читает только принадлежащий плагину namespace.
|
|
291
|
-
*
|
|
292
|
-
* @example Логирование логических операций
|
|
293
|
-
* ```ts
|
|
294
|
-
* const logging: ClientPlugin = {
|
|
295
|
-
* name: 'logging',
|
|
296
|
-
* install({ operations, logger }) {
|
|
297
|
-
* operations.use(async (request, next) => {
|
|
298
|
-
* logger?.info(`${request.method} ${request.path}`);
|
|
299
|
-
* return next(request);
|
|
300
|
-
* });
|
|
301
|
-
* },
|
|
302
|
-
* };
|
|
303
|
-
*
|
|
304
|
-
* itd.use(logging);
|
|
305
|
-
* ```
|
|
306
|
-
*/
|
|
307
|
-
interface ClientPlugin {
|
|
308
|
-
/** Имя плагина. Должно быть уникальным: повторное подключение — ошибка. */
|
|
309
|
-
name: string;
|
|
310
|
-
/** Плагины, которые обязаны быть подключены раньше этого. */
|
|
311
|
-
requires?: readonly string[];
|
|
312
|
-
/** Несовместимые плагины. Достаточно объявить конфликт с одной стороны. */
|
|
313
|
-
conflicts?: readonly string[];
|
|
314
|
-
/** Имена плагинов, снаружи которых должны стоять оба вида расширений этого плагина. */
|
|
315
|
-
before?: readonly string[];
|
|
316
|
-
/** Имена плагинов, внутри которых должны стоять оба вида расширений этого плагина. */
|
|
317
|
-
after?: readonly string[];
|
|
428
|
+
/** Открывает файловый источник без правил конкретного протокола загрузки. */
|
|
429
|
+
readonly files: FileResolver;
|
|
318
430
|
/**
|
|
319
|
-
*
|
|
431
|
+
* Выполняет объявленную операцию через авторизацию, плагины, повторы и очередь клиента.
|
|
320
432
|
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
* регистрация расширений завершается до того, как `use()` вернёт управление.
|
|
433
|
+
* Форма результата задаётся один раз полем `read` в описании операции. Плагины получают
|
|
434
|
+
* готовый результат и не видят функцию преобразования.
|
|
324
435
|
*/
|
|
325
|
-
|
|
436
|
+
request<T = unknown>(operation: string, options: FeatureRequestOptions): Promise<T>;
|
|
437
|
+
/** Возвращает фактический URL объявленного сервиса с учётом настроек клиента. */
|
|
438
|
+
serviceBaseUrl(name: string): string;
|
|
439
|
+
/** Окружение долговременного соединения объявленного сервиса. */
|
|
440
|
+
connection(name: string): ClientConnection;
|
|
441
|
+
/** Регистрирует активный долгоживущий ресурс до его остановки. */
|
|
442
|
+
manage(resource: ManagedClientResource): () => void;
|
|
443
|
+
/** Проверяет, что создавший модуль клиент ещё работает. */
|
|
444
|
+
assertActive(action: string): void;
|
|
326
445
|
}
|
|
327
446
|
//#endregion
|
|
328
447
|
//#region src/core/scheduling/rate-limit.d.ts
|
|
@@ -341,48 +460,6 @@ interface RateLimitBucketState {
|
|
|
341
460
|
pending: number;
|
|
342
461
|
}
|
|
343
462
|
//#endregion
|
|
344
|
-
//#region src/models/account.d.ts
|
|
345
|
-
/** Активная сессия входа. */
|
|
346
|
-
interface Session {
|
|
347
|
-
id: string;
|
|
348
|
-
/** Та ли это сессия, из которой выполнен запрос. */
|
|
349
|
-
isCurrent: boolean;
|
|
350
|
-
createdAt: IsoDate;
|
|
351
|
-
lastUsedAt: IsoDate;
|
|
352
|
-
expiresAt: IsoDate;
|
|
353
|
-
ipAddress: string;
|
|
354
|
-
/** Код страны по IP, например `RU`. */
|
|
355
|
-
ipCountry: string | null;
|
|
356
|
-
ipCity: string | null;
|
|
357
|
-
deviceType: Loose<'desktop' | 'mobile'>;
|
|
358
|
-
osName: string | null;
|
|
359
|
-
osVersion: string | null;
|
|
360
|
-
/** Название браузера или приложения. */
|
|
361
|
-
clientName: string | null;
|
|
362
|
-
clientVersion: string | null;
|
|
363
|
-
deviceModel: string | null;
|
|
364
|
-
}
|
|
365
|
-
/** Состояние платной подписки и её цена. */
|
|
366
|
-
interface Subscription {
|
|
367
|
-
/** Активна ли подписка сейчас. */
|
|
368
|
-
active: boolean;
|
|
369
|
-
/** Включено ли автопродление. */
|
|
370
|
-
recurringEnabled: boolean;
|
|
371
|
-
/** Цена в рублях. */
|
|
372
|
-
price: number;
|
|
373
|
-
}
|
|
374
|
-
/** Сохранённый способ оплаты. */
|
|
375
|
-
interface PaymentMethod {
|
|
376
|
-
id: string;
|
|
377
|
-
/** Последние четыре цифры карты. */
|
|
378
|
-
last4?: string;
|
|
379
|
-
/** Платёжная система: `visa`, `mastercard`, `mir`. */
|
|
380
|
-
brand?: string;
|
|
381
|
-
/** Основной ли это способ оплаты. */
|
|
382
|
-
isDefault?: boolean;
|
|
383
|
-
expiresAt?: IsoDate | null;
|
|
384
|
-
}
|
|
385
|
-
//#endregion
|
|
386
463
|
//#region src/resources/pagination.d.ts
|
|
387
464
|
/**
|
|
388
465
|
* Страница списка — единая форма для всех трёх схем пагинации API.
|
|
@@ -520,13 +597,11 @@ declare class Paginator<T> implements AsyncIterable<T> {
|
|
|
520
597
|
*/
|
|
521
598
|
interface ListingSpec<T, P extends object> {
|
|
522
599
|
/** Стабильная семантическая операция списка. */
|
|
523
|
-
|
|
600
|
+
operation: OperationContract<Page<T>, BuiltInOperationId> | ((params: P) => OperationContract<Page<T>, BuiltInOperationId>);
|
|
524
601
|
/** Путь эндпоинта. */
|
|
525
602
|
path: (params: P) => string;
|
|
526
603
|
/** Параметры запроса без полей пагинации — их добавит перебор. */
|
|
527
604
|
query: (params: P) => QueryParams;
|
|
528
|
-
/** Читает страницу из ответа. Получает позицию — она нужна схеме со смещением. */
|
|
529
|
-
read: (body: unknown, state: PageState) => Page<T>;
|
|
530
605
|
/** Схема пагинации эндпоинта. */
|
|
531
606
|
mode: PaginationMode;
|
|
532
607
|
/** Начальная позиция, вычисленная из параметров (курсор, номер или смещение). */
|
|
@@ -544,6 +619,8 @@ declare class BaseResource {
|
|
|
544
619
|
/** @internal */
|
|
545
620
|
protected readonly http: HttpClient;
|
|
546
621
|
constructor(http: HttpClient);
|
|
622
|
+
/** Выполняет операцию без возвращаемого значения и отбрасывает служебное тело ответа. */
|
|
623
|
+
protected voidOperation(operation: OperationContract<void, BuiltInOperationId>, options: HttpOperationOptions): Promise<void>;
|
|
547
624
|
/**
|
|
548
625
|
* Собирает перебор страниц.
|
|
549
626
|
*
|
|
@@ -563,11 +640,10 @@ declare class BaseResource {
|
|
|
563
640
|
* @example
|
|
564
641
|
* ```ts
|
|
565
642
|
* #feed = this.paginated<Post, FeedParams>({
|
|
566
|
-
*
|
|
643
|
+
* operation: POSTS_LIST,
|
|
567
644
|
* path: () => '/api/posts',
|
|
568
645
|
* query: (p) => ({ tab: p.tab, limit: p.limit }),
|
|
569
646
|
* start: (p) => (p.cursor ? { cursor: p.cursor } : {}),
|
|
570
|
-
* read: (body) => readCursorPage<Post>(body, 'posts'),
|
|
571
647
|
* mode: PaginationMode.Cursor,
|
|
572
648
|
* });
|
|
573
649
|
* ```
|
|
@@ -575,6 +651,118 @@ declare class BaseResource {
|
|
|
575
651
|
protected paginated<T, P extends object>(spec: ListingSpec<T, P>): Listing<T, P>;
|
|
576
652
|
}
|
|
577
653
|
//#endregion
|
|
654
|
+
//#region src/resources/notifications.d.ts
|
|
655
|
+
/** Параметры запроса списка уведомлений. */
|
|
656
|
+
interface NotificationListParams {
|
|
657
|
+
limit?: number;
|
|
658
|
+
/** Смещение от начала списка. */
|
|
659
|
+
offset?: number;
|
|
660
|
+
}
|
|
661
|
+
/** Изменяемые настройки уведомлений. */
|
|
662
|
+
type UpdateNotificationSettingsInput = Partial<NotificationSettings>;
|
|
663
|
+
/**
|
|
664
|
+
* Уведомления: список, счётчик, отметки о прочтении, настройки.
|
|
665
|
+
*
|
|
666
|
+
* Доступна как `itd.notifications`. Все уведомления приведены к единой форме, поэтому
|
|
667
|
+
* объекты отсюда и из потока событий можно складывать в один список.
|
|
668
|
+
*/
|
|
669
|
+
declare class NotificationsResource extends BaseResource {
|
|
670
|
+
#private;
|
|
671
|
+
/**
|
|
672
|
+
* Загружает страницу уведомлений.
|
|
673
|
+
*
|
|
674
|
+
* Пагинация здесь основана на смещении.
|
|
675
|
+
*
|
|
676
|
+
* @example
|
|
677
|
+
* ```ts
|
|
678
|
+
* const page = await itd.notifications.list({ limit: 20 });
|
|
679
|
+
* const next = await itd.notifications.list({ limit: 20, offset: page.nextOffset });
|
|
680
|
+
* ```
|
|
681
|
+
*/
|
|
682
|
+
list(params?: NotificationListParams, options?: RequestOptions): Promise<Page<Notification>>;
|
|
683
|
+
/**
|
|
684
|
+
* Перебирает уведомления.
|
|
685
|
+
*
|
|
686
|
+
* @example
|
|
687
|
+
* ```ts
|
|
688
|
+
* for await (const notification of itd.notifications.iterate()) {
|
|
689
|
+
* console.log(formatNotificationText(notification));
|
|
690
|
+
* }
|
|
691
|
+
* ```
|
|
692
|
+
*/
|
|
693
|
+
iterate(params?: NotificationListParams, options?: PaginationOptions): Paginator<Notification>;
|
|
694
|
+
/** Загружает число непрочитанных уведомлений. */
|
|
695
|
+
count(options?: RequestOptions): Promise<number>;
|
|
696
|
+
/**
|
|
697
|
+
* Отмечает уведомление прочитанным.
|
|
698
|
+
*
|
|
699
|
+
* @returns сколько записей отметил сервер
|
|
700
|
+
*/
|
|
701
|
+
markRead(notificationId: string, options?: RequestOptions): Promise<number>;
|
|
702
|
+
/**
|
|
703
|
+
* Отмечает прочитанными сразу несколько уведомлений.
|
|
704
|
+
*
|
|
705
|
+
* Список автоматически режется на части по 20 идентификаторов — столько же отправляет
|
|
706
|
+
* сайт итд.com, поэтому на сервере вероятен предел. Части уходят последовательно,
|
|
707
|
+
* результат суммируется.
|
|
708
|
+
*
|
|
709
|
+
* @returns сколько записей отметил сервер суммарно
|
|
710
|
+
*/
|
|
711
|
+
markReadBatch(ids: string[], options?: RequestOptions): Promise<number>;
|
|
712
|
+
/** Отмечает прочитанными все уведомления. */
|
|
713
|
+
markAllRead(options?: RequestOptions): Promise<number>;
|
|
714
|
+
/** Загружает настройки уведомлений. */
|
|
715
|
+
getSettings(options?: RequestOptions): Promise<NotificationSettings>;
|
|
716
|
+
/**
|
|
717
|
+
* Обновляет настройки уведомлений.
|
|
718
|
+
*
|
|
719
|
+
* Отправляются только изменяемые поля, в том же виде, в каком сервер их возвращает.
|
|
720
|
+
*/
|
|
721
|
+
updateSettings(input: UpdateNotificationSettingsInput, options?: RequestOptions): Promise<NotificationSettings>;
|
|
722
|
+
}
|
|
723
|
+
//#endregion
|
|
724
|
+
//#region src/models/account.d.ts
|
|
725
|
+
/** Активная сессия входа. */
|
|
726
|
+
interface Session {
|
|
727
|
+
id: string;
|
|
728
|
+
/** Та ли это сессия, из которой выполнен запрос. */
|
|
729
|
+
isCurrent: boolean;
|
|
730
|
+
createdAt: IsoDate;
|
|
731
|
+
lastUsedAt: IsoDate;
|
|
732
|
+
expiresAt: IsoDate;
|
|
733
|
+
ipAddress: string;
|
|
734
|
+
/** Код страны по IP, например `RU`. */
|
|
735
|
+
ipCountry: string | null;
|
|
736
|
+
ipCity: string | null;
|
|
737
|
+
deviceType: Loose<'desktop' | 'mobile'>;
|
|
738
|
+
osName: string | null;
|
|
739
|
+
osVersion: string | null;
|
|
740
|
+
/** Название браузера или приложения. */
|
|
741
|
+
clientName: string | null;
|
|
742
|
+
clientVersion: string | null;
|
|
743
|
+
deviceModel: string | null;
|
|
744
|
+
}
|
|
745
|
+
/** Состояние платной подписки и её цена. */
|
|
746
|
+
interface Subscription {
|
|
747
|
+
/** Активна ли подписка сейчас. */
|
|
748
|
+
active: boolean;
|
|
749
|
+
/** Включено ли автопродление. */
|
|
750
|
+
recurringEnabled: boolean;
|
|
751
|
+
/** Цена в рублях. */
|
|
752
|
+
price: number;
|
|
753
|
+
}
|
|
754
|
+
/** Сохранённый способ оплаты. */
|
|
755
|
+
interface PaymentMethod {
|
|
756
|
+
id: string;
|
|
757
|
+
/** Последние четыре цифры карты. */
|
|
758
|
+
last4?: string;
|
|
759
|
+
/** Платёжная система: `visa`, `mastercard`, `mir`. */
|
|
760
|
+
brand?: string;
|
|
761
|
+
/** Основной ли это способ оплаты. */
|
|
762
|
+
isDefault?: boolean;
|
|
763
|
+
expiresAt?: IsoDate | null;
|
|
764
|
+
}
|
|
765
|
+
//#endregion
|
|
578
766
|
//#region src/domain/params.d.ts
|
|
579
767
|
/** Данные для создания опроса. */
|
|
580
768
|
interface CreatePollInput {
|
|
@@ -973,7 +1161,7 @@ interface UploadOptions {
|
|
|
973
1161
|
declare class FilesResource extends BaseResource {
|
|
974
1162
|
#private;
|
|
975
1163
|
constructor(http: HttpClient, deps: {
|
|
976
|
-
|
|
1164
|
+
files: InternalFileResolver;
|
|
977
1165
|
});
|
|
978
1166
|
/**
|
|
979
1167
|
* Загружает файл и возвращает его идентификатор.
|
|
@@ -1030,76 +1218,6 @@ declare class HashtagsResource extends BaseResource {
|
|
|
1030
1218
|
iteratePosts(tag: string, params?: HashtagPostsParams, options?: PaginationOptions): Paginator<Post>;
|
|
1031
1219
|
}
|
|
1032
1220
|
//#endregion
|
|
1033
|
-
//#region src/resources/notifications.d.ts
|
|
1034
|
-
/** Параметры запроса списка уведомлений. */
|
|
1035
|
-
interface NotificationListParams {
|
|
1036
|
-
limit?: number;
|
|
1037
|
-
/** Смещение от начала списка. */
|
|
1038
|
-
offset?: number;
|
|
1039
|
-
}
|
|
1040
|
-
/** Изменяемые настройки уведомлений. */
|
|
1041
|
-
type UpdateNotificationSettingsInput = Partial<NotificationSettings>;
|
|
1042
|
-
/**
|
|
1043
|
-
* Уведомления: список, счётчик, отметки о прочтении, настройки.
|
|
1044
|
-
*
|
|
1045
|
-
* Доступна как `itd.notifications`. Все уведомления приведены к единой форме, поэтому
|
|
1046
|
-
* объекты отсюда и из потока событий можно складывать в один список.
|
|
1047
|
-
*/
|
|
1048
|
-
declare class NotificationsResource extends BaseResource {
|
|
1049
|
-
#private;
|
|
1050
|
-
/**
|
|
1051
|
-
* Загружает страницу уведомлений.
|
|
1052
|
-
*
|
|
1053
|
-
* Пагинация здесь основана на смещении.
|
|
1054
|
-
*
|
|
1055
|
-
* @example
|
|
1056
|
-
* ```ts
|
|
1057
|
-
* const page = await itd.notifications.list({ limit: 20 });
|
|
1058
|
-
* const next = await itd.notifications.list({ limit: 20, offset: page.nextOffset });
|
|
1059
|
-
* ```
|
|
1060
|
-
*/
|
|
1061
|
-
list(params?: NotificationListParams, options?: RequestOptions): Promise<Page<Notification>>;
|
|
1062
|
-
/**
|
|
1063
|
-
* Перебирает уведомления.
|
|
1064
|
-
*
|
|
1065
|
-
* @example
|
|
1066
|
-
* ```ts
|
|
1067
|
-
* for await (const notification of itd.notifications.iterate()) {
|
|
1068
|
-
* console.log(formatNotificationText(notification));
|
|
1069
|
-
* }
|
|
1070
|
-
* ```
|
|
1071
|
-
*/
|
|
1072
|
-
iterate(params?: NotificationListParams, options?: PaginationOptions): Paginator<Notification>;
|
|
1073
|
-
/** Загружает число непрочитанных уведомлений. */
|
|
1074
|
-
count(options?: RequestOptions): Promise<number>;
|
|
1075
|
-
/**
|
|
1076
|
-
* Отмечает уведомление прочитанным.
|
|
1077
|
-
*
|
|
1078
|
-
* @returns сколько записей отметил сервер
|
|
1079
|
-
*/
|
|
1080
|
-
markRead(notificationId: string, options?: RequestOptions): Promise<number>;
|
|
1081
|
-
/**
|
|
1082
|
-
* Отмечает прочитанными сразу несколько уведомлений.
|
|
1083
|
-
*
|
|
1084
|
-
* Список автоматически режется на части по 20 идентификаторов — столько же отправляет
|
|
1085
|
-
* сайт итд.com, поэтому на сервере вероятен предел. Части уходят последовательно,
|
|
1086
|
-
* результат суммируется.
|
|
1087
|
-
*
|
|
1088
|
-
* @returns сколько записей отметил сервер суммарно
|
|
1089
|
-
*/
|
|
1090
|
-
markReadBatch(ids: string[], options?: RequestOptions): Promise<number>;
|
|
1091
|
-
/** Отмечает прочитанными все уведомления. */
|
|
1092
|
-
markAllRead(options?: RequestOptions): Promise<number>;
|
|
1093
|
-
/** Загружает настройки уведомлений. */
|
|
1094
|
-
getSettings(options?: RequestOptions): Promise<NotificationSettings>;
|
|
1095
|
-
/**
|
|
1096
|
-
* Обновляет настройки уведомлений.
|
|
1097
|
-
*
|
|
1098
|
-
* Отправляются только изменяемые поля, в том же виде, в каком сервер их возвращает.
|
|
1099
|
-
*/
|
|
1100
|
-
updateSettings(input: UpdateNotificationSettingsInput, options?: RequestOptions): Promise<NotificationSettings>;
|
|
1101
|
-
}
|
|
1102
|
-
//#endregion
|
|
1103
1221
|
//#region src/models/platform.d.ts
|
|
1104
1222
|
/** Клан в рейтинге. */
|
|
1105
1223
|
interface Clan {
|
|
@@ -1831,6 +1949,297 @@ declare class SearchResource extends BaseResource {
|
|
|
1831
1949
|
all(query: string, options?: RequestOptions): Promise<SearchResult>;
|
|
1832
1950
|
}
|
|
1833
1951
|
//#endregion
|
|
1952
|
+
//#region src/models/shop.d.ts
|
|
1953
|
+
/** Категория товара магазина. */
|
|
1954
|
+
declare const ShopProductCategory: Readonly<{
|
|
1955
|
+
readonly Apparel: "apparel";
|
|
1956
|
+
readonly Accessories: "accessories";
|
|
1957
|
+
readonly Print: "print";
|
|
1958
|
+
}>;
|
|
1959
|
+
type ShopProductCategory = Loose<(typeof ShopProductCategory)[keyof typeof ShopProductCategory]>;
|
|
1960
|
+
/** Состояние товара в каталоге. */
|
|
1961
|
+
declare const ShopProductStatus: Readonly<{
|
|
1962
|
+
readonly Available: "available";
|
|
1963
|
+
readonly Preorder: "preorder";
|
|
1964
|
+
readonly SoldOut: "soldout";
|
|
1965
|
+
}>;
|
|
1966
|
+
type ShopProductStatus = Loose<(typeof ShopProductStatus)[keyof typeof ShopProductStatus]>;
|
|
1967
|
+
/** Вариант цвета товара. */
|
|
1968
|
+
interface ShopProductColor {
|
|
1969
|
+
id: string;
|
|
1970
|
+
label: string;
|
|
1971
|
+
hex: string;
|
|
1972
|
+
images: string[];
|
|
1973
|
+
}
|
|
1974
|
+
/** Характеристика товара. */
|
|
1975
|
+
interface ShopProductSpec {
|
|
1976
|
+
label: string;
|
|
1977
|
+
value: string;
|
|
1978
|
+
}
|
|
1979
|
+
/** Строка таблицы размеров. */
|
|
1980
|
+
interface ShopSizeChartRow {
|
|
1981
|
+
size: string;
|
|
1982
|
+
values: string[];
|
|
1983
|
+
}
|
|
1984
|
+
/** Таблица размеров товара. */
|
|
1985
|
+
interface ShopSizeChart {
|
|
1986
|
+
columns: string[];
|
|
1987
|
+
rows: ShopSizeChartRow[];
|
|
1988
|
+
note?: string | undefined;
|
|
1989
|
+
}
|
|
1990
|
+
/** Товар магазина. Цены указаны в рублях. */
|
|
1991
|
+
interface ShopProduct {
|
|
1992
|
+
id: string;
|
|
1993
|
+
title: string;
|
|
1994
|
+
category: ShopProductCategory;
|
|
1995
|
+
price: number;
|
|
1996
|
+
images: string[];
|
|
1997
|
+
sizes: string[];
|
|
1998
|
+
colors: ShopProductColor[];
|
|
1999
|
+
description: string;
|
|
2000
|
+
specs: ShopProductSpec[];
|
|
2001
|
+
sizeChart?: ShopSizeChart | null | undefined;
|
|
2002
|
+
status: ShopProductStatus;
|
|
2003
|
+
stockLeft: number | null;
|
|
2004
|
+
}
|
|
2005
|
+
/** Позиция для расчёта доставки или создания заказа. */
|
|
2006
|
+
interface ShopOrderItemInput {
|
|
2007
|
+
productId: string;
|
|
2008
|
+
size: string | null;
|
|
2009
|
+
color: string | null;
|
|
2010
|
+
qty: number;
|
|
2011
|
+
}
|
|
2012
|
+
/** Страна, в которую доступна доставка. */
|
|
2013
|
+
interface ShopDeliveryCountry {
|
|
2014
|
+
code: string;
|
|
2015
|
+
name: string;
|
|
2016
|
+
}
|
|
2017
|
+
/** Город из подсказок службы доставки. */
|
|
2018
|
+
interface ShopDeliveryCity {
|
|
2019
|
+
code: number;
|
|
2020
|
+
name: string;
|
|
2021
|
+
countryCode: string;
|
|
2022
|
+
}
|
|
2023
|
+
/** Пункт выдачи заказа. */
|
|
2024
|
+
interface ShopDeliveryPoint {
|
|
2025
|
+
code: string;
|
|
2026
|
+
name: string;
|
|
2027
|
+
city: string;
|
|
2028
|
+
cityCode: number;
|
|
2029
|
+
countryCode: string;
|
|
2030
|
+
postalCode: string;
|
|
2031
|
+
address: string;
|
|
2032
|
+
latitude: number;
|
|
2033
|
+
longitude: number;
|
|
2034
|
+
workTime?: string | undefined;
|
|
2035
|
+
metro?: string | undefined;
|
|
2036
|
+
note?: string | undefined;
|
|
2037
|
+
dressingRoom: boolean;
|
|
2038
|
+
card: boolean;
|
|
2039
|
+
cash: boolean;
|
|
2040
|
+
}
|
|
2041
|
+
/** Направление для расчёта доставки. */
|
|
2042
|
+
interface ShopDeliveryDestination {
|
|
2043
|
+
code: number;
|
|
2044
|
+
countryCode: string;
|
|
2045
|
+
}
|
|
2046
|
+
/** Стоимость и ожидаемый срок доставки. */
|
|
2047
|
+
interface ShopDeliveryCalculation {
|
|
2048
|
+
/** Стоимость доставки в копейках. */
|
|
2049
|
+
costKopecks: number;
|
|
2050
|
+
/** Стоимость доставки в рублях. */
|
|
2051
|
+
cost: number;
|
|
2052
|
+
periodMin: number;
|
|
2053
|
+
periodMax: number;
|
|
2054
|
+
tariffCode: number;
|
|
2055
|
+
tariffName: string;
|
|
2056
|
+
weightGrams: number;
|
|
2057
|
+
}
|
|
2058
|
+
/** Данные получателя заказа. */
|
|
2059
|
+
interface ShopRecipient {
|
|
2060
|
+
name: string;
|
|
2061
|
+
phone: string;
|
|
2062
|
+
email: string;
|
|
2063
|
+
country: string;
|
|
2064
|
+
city: string;
|
|
2065
|
+
address: string;
|
|
2066
|
+
cityCode: number | null;
|
|
2067
|
+
deliveryPoint: string;
|
|
2068
|
+
comment: string;
|
|
2069
|
+
}
|
|
2070
|
+
/** Вид согласия, которое принимает покупатель. */
|
|
2071
|
+
declare const ShopConsentKind: Readonly<{
|
|
2072
|
+
readonly Offer: "offer";
|
|
2073
|
+
readonly PersonalData: "personal_data";
|
|
2074
|
+
readonly Cookie: "cookie";
|
|
2075
|
+
}>;
|
|
2076
|
+
type ShopConsentKind = (typeof ShopConsentKind)[keyof typeof ShopConsentKind];
|
|
2077
|
+
/** Принятое или отклонённое условие магазина. */
|
|
2078
|
+
interface ShopConsent {
|
|
2079
|
+
kind: ShopConsentKind;
|
|
2080
|
+
accepted: boolean;
|
|
2081
|
+
docSlug: string;
|
|
2082
|
+
docVersion: string;
|
|
2083
|
+
}
|
|
2084
|
+
/** Место, в котором было получено согласие. */
|
|
2085
|
+
interface ShopConsentContext {
|
|
2086
|
+
form: string;
|
|
2087
|
+
page: string;
|
|
2088
|
+
visitorId: string;
|
|
2089
|
+
}
|
|
2090
|
+
/** Данные для создания заказа. */
|
|
2091
|
+
interface CreateShopOrderInput {
|
|
2092
|
+
items: ShopOrderItemInput[];
|
|
2093
|
+
recipient: ShopRecipient;
|
|
2094
|
+
consents: ShopConsent[];
|
|
2095
|
+
consentContext: ShopConsentContext;
|
|
2096
|
+
}
|
|
2097
|
+
/** Результат создания заказа. */
|
|
2098
|
+
interface ShopCreatedOrder {
|
|
2099
|
+
number: string;
|
|
2100
|
+
/** Токен для открытия только что созданного гостевого заказа. */
|
|
2101
|
+
pass?: string | undefined;
|
|
2102
|
+
}
|
|
2103
|
+
/** Состояние заказа. */
|
|
2104
|
+
declare const ShopOrderStatus: Readonly<{
|
|
2105
|
+
readonly New: "new";
|
|
2106
|
+
readonly Paid: "paid";
|
|
2107
|
+
readonly Shipping: "ship";
|
|
2108
|
+
readonly Done: "done";
|
|
2109
|
+
readonly Cancelled: "cancelled";
|
|
2110
|
+
readonly Refunded: "refunded";
|
|
2111
|
+
readonly Expired: "expired";
|
|
2112
|
+
}>;
|
|
2113
|
+
type ShopOrderStatus = Loose<(typeof ShopOrderStatus)[keyof typeof ShopOrderStatus]>;
|
|
2114
|
+
/** Заказ в списке заказов. */
|
|
2115
|
+
interface ShopOrderSummary {
|
|
2116
|
+
number: string;
|
|
2117
|
+
titles: string[];
|
|
2118
|
+
status: ShopOrderStatus;
|
|
2119
|
+
total: number;
|
|
2120
|
+
createdAt: IsoDate;
|
|
2121
|
+
}
|
|
2122
|
+
/** Товар в оформленном заказе. */
|
|
2123
|
+
interface ShopOrderItem {
|
|
2124
|
+
slug: string;
|
|
2125
|
+
title: string;
|
|
2126
|
+
color?: string | null | undefined;
|
|
2127
|
+
size?: string | null | undefined;
|
|
2128
|
+
qty: number;
|
|
2129
|
+
sum: number;
|
|
2130
|
+
}
|
|
2131
|
+
/** Адрес доставки оформленного заказа. */
|
|
2132
|
+
interface ShopOrderDelivery {
|
|
2133
|
+
city: string;
|
|
2134
|
+
address: string;
|
|
2135
|
+
point?: string | null | undefined;
|
|
2136
|
+
}
|
|
2137
|
+
/** Контакты поддержки магазина. */
|
|
2138
|
+
interface ShopOrderSupport {
|
|
2139
|
+
email: string;
|
|
2140
|
+
telegram?: string | undefined;
|
|
2141
|
+
}
|
|
2142
|
+
/** Оформленный заказ. */
|
|
2143
|
+
interface ShopOrder {
|
|
2144
|
+
number: string;
|
|
2145
|
+
status: ShopOrderStatus;
|
|
2146
|
+
createdAt: IsoDate;
|
|
2147
|
+
payment: {
|
|
2148
|
+
pending: boolean;
|
|
2149
|
+
};
|
|
2150
|
+
items: ShopOrderItem[];
|
|
2151
|
+
itemsTotal: number;
|
|
2152
|
+
shipping: number;
|
|
2153
|
+
total: number;
|
|
2154
|
+
delivery: ShopOrderDelivery;
|
|
2155
|
+
track?: string | null | undefined;
|
|
2156
|
+
comment?: string | null | undefined;
|
|
2157
|
+
support?: ShopOrderSupport | null | undefined;
|
|
2158
|
+
}
|
|
2159
|
+
/** Ссылка на страницу оплаты. */
|
|
2160
|
+
interface ShopPayment {
|
|
2161
|
+
url: string;
|
|
2162
|
+
}
|
|
2163
|
+
/** Временный доступ к гостевым заказам. */
|
|
2164
|
+
interface ShopOrderAccessSession {
|
|
2165
|
+
email: string;
|
|
2166
|
+
token: string;
|
|
2167
|
+
expiresAt: number;
|
|
2168
|
+
}
|
|
2169
|
+
/** Ответ проверки кода из письма. */
|
|
2170
|
+
interface ShopOrderAccessVerification {
|
|
2171
|
+
token: string;
|
|
2172
|
+
expiresInSec: number;
|
|
2173
|
+
}
|
|
2174
|
+
//#endregion
|
|
2175
|
+
//#region src/resources/shop.d.ts
|
|
2176
|
+
/** Параметры запроса, который может использовать токен доступа к заказам. */
|
|
2177
|
+
interface ShopOrderRequestOptions extends RequestOptions {
|
|
2178
|
+
/** Временный токен из проверки кода или `pass` созданного заказа. */
|
|
2179
|
+
orderAccessToken?: string | undefined;
|
|
2180
|
+
/** `false` запрещает отправлять Bearer-токен ИТД. По умолчанию используется авторизация клиента. */
|
|
2181
|
+
useItdAuth?: boolean | undefined;
|
|
2182
|
+
}
|
|
2183
|
+
/** Параметры создания заказа. */
|
|
2184
|
+
interface CreateShopOrderOptions extends RequestOptions {
|
|
2185
|
+
/** Ключ защиты от повторного создания заказа. По умолчанию создаётся автоматически. */
|
|
2186
|
+
idempotencyKey?: string | undefined;
|
|
2187
|
+
}
|
|
2188
|
+
/** Параметры перехода к оплате. */
|
|
2189
|
+
interface PayShopOrderOptions extends ShopOrderRequestOptions {
|
|
2190
|
+
/** Адрес возврата после оплаты. */
|
|
2191
|
+
returnUrl: string;
|
|
2192
|
+
}
|
|
2193
|
+
/** Каталог товаров магазина. */
|
|
2194
|
+
declare class ShopProductsResource extends BaseResource {
|
|
2195
|
+
/** Загружает все товары. */
|
|
2196
|
+
list(options?: RequestOptions): Promise<ShopProduct[]>;
|
|
2197
|
+
/** Загружает товар по идентификатору. */
|
|
2198
|
+
get(productId: string, options?: RequestOptions): Promise<ShopProduct | null>;
|
|
2199
|
+
}
|
|
2200
|
+
/** Расчёт и выбор доставки. */
|
|
2201
|
+
declare class ShopDeliveryResource extends BaseResource {
|
|
2202
|
+
/** Загружает страны, в которые доступна доставка. */
|
|
2203
|
+
countries(options?: RequestOptions): Promise<ShopDeliveryCountry[]>;
|
|
2204
|
+
/** Ищет города службы доставки. */
|
|
2205
|
+
cities(query: string, countryCode?: string, options?: RequestOptions): Promise<ShopDeliveryCity[]>;
|
|
2206
|
+
/** Загружает пункты выдачи в городе. */
|
|
2207
|
+
points(cityCode: number, options?: RequestOptions): Promise<ShopDeliveryPoint[]>;
|
|
2208
|
+
/** Рассчитывает стоимость и срок доставки. */
|
|
2209
|
+
calculate(items: ShopOrderItemInput[], destination: ShopDeliveryDestination, options?: RequestOptions): Promise<ShopDeliveryCalculation>;
|
|
2210
|
+
}
|
|
2211
|
+
/** Создание, просмотр и оплата заказов. */
|
|
2212
|
+
declare class ShopOrdersResource extends BaseResource {
|
|
2213
|
+
/** Создаёт заказ. */
|
|
2214
|
+
create(input: CreateShopOrderInput, options?: CreateShopOrderOptions): Promise<ShopCreatedOrder>;
|
|
2215
|
+
/** Загружает заказы аккаунта ИТД или владельца временного токена. */
|
|
2216
|
+
list(options?: ShopOrderRequestOptions): Promise<{
|
|
2217
|
+
items: ShopOrderSummary[];
|
|
2218
|
+
}>;
|
|
2219
|
+
/** Загружает заказ по номеру. */
|
|
2220
|
+
get(orderNumber: string, options?: ShopOrderRequestOptions): Promise<ShopOrder | null>;
|
|
2221
|
+
/** Создаёт ссылку на оплату заказа. */
|
|
2222
|
+
pay(orderNumber: string, options: PayShopOrderOptions): Promise<ShopPayment>;
|
|
2223
|
+
/** Отправляет на почту код доступа к гостевым заказам. */
|
|
2224
|
+
requestAccessCode(email: string, options?: RequestOptions): Promise<void>;
|
|
2225
|
+
/** Проверяет код из письма и возвращает временный токен заказов. */
|
|
2226
|
+
verifyAccessCode(email: string, code: string, options?: RequestOptions): Promise<ShopOrderAccessVerification>;
|
|
2227
|
+
}
|
|
2228
|
+
/** Запись согласий магазина. */
|
|
2229
|
+
declare class ShopConsentsResource extends BaseResource {
|
|
2230
|
+
/** Записывает согласия покупателя. */
|
|
2231
|
+
record(consents: ShopConsent[], consentContext: ShopConsentContext, options?: RequestOptions): Promise<void>;
|
|
2232
|
+
}
|
|
2233
|
+
/** Магазин ИТД. */
|
|
2234
|
+
declare class ShopResource {
|
|
2235
|
+
readonly products: ShopProductsResource;
|
|
2236
|
+
readonly delivery: ShopDeliveryResource;
|
|
2237
|
+
readonly orders: ShopOrdersResource;
|
|
2238
|
+
readonly consents: ShopConsentsResource;
|
|
2239
|
+
/** @internal */
|
|
2240
|
+
constructor(http: ConstructorParameters<typeof BaseResource>[0]);
|
|
2241
|
+
}
|
|
2242
|
+
//#endregion
|
|
1834
2243
|
//#region src/resources/subscription.d.ts
|
|
1835
2244
|
/**
|
|
1836
2245
|
* Подписка и способы оплаты.
|
|
@@ -2276,6 +2685,59 @@ declare function isMyProfile(profile: Profile): profile is MyProfile;
|
|
|
2276
2685
|
*/
|
|
2277
2686
|
declare function statusDays(service: ServiceStatus): (StatusDay | null)[];
|
|
2278
2687
|
//#endregion
|
|
2688
|
+
//#region src/shop/order-access.d.ts
|
|
2689
|
+
/** Хранилище временного доступа к гостевым заказам. */
|
|
2690
|
+
interface ShopOrderAccessStorage {
|
|
2691
|
+
get(): ShopOrderAccessSession | null | Promise<ShopOrderAccessSession | null>;
|
|
2692
|
+
set(session: ShopOrderAccessSession): void | Promise<void>;
|
|
2693
|
+
clear(): void | Promise<void>;
|
|
2694
|
+
}
|
|
2695
|
+
/** Хранилище доступа к заказам в памяти процесса. */
|
|
2696
|
+
declare class MemoryShopOrderAccessStorage implements ShopOrderAccessStorage {
|
|
2697
|
+
#private;
|
|
2698
|
+
constructor(initial?: ShopOrderAccessSession | null);
|
|
2699
|
+
get(): ShopOrderAccessSession | null;
|
|
2700
|
+
set(session: ShopOrderAccessSession): void;
|
|
2701
|
+
clear(): void;
|
|
2702
|
+
}
|
|
2703
|
+
/** Настройки хранилища доступа к заказам. */
|
|
2704
|
+
interface ShopOrderAccessStorageAdapterOptions {
|
|
2705
|
+
/** Ключ записи. По умолчанию `shop-order-access`. */
|
|
2706
|
+
key?: string | undefined;
|
|
2707
|
+
}
|
|
2708
|
+
/** Создаёт хранилище доступа к заказам поверх `KeyValueStore`. */
|
|
2709
|
+
declare function createShopOrderAccessStorage(store: KeyValueStore<ShopOrderAccessSession>, options?: ShopOrderAccessStorageAdapterOptions): ShopOrderAccessStorage;
|
|
2710
|
+
/** Создаёт независимое хранилище доступа к заказам в памяти. */
|
|
2711
|
+
declare function createMemoryShopOrderAccessStorage(): ShopOrderAccessStorage;
|
|
2712
|
+
//#endregion
|
|
2713
|
+
//#region src/shop/feature.d.ts
|
|
2714
|
+
/** Настройки подключаемого модуля доступа к заказам по коду из письма. */
|
|
2715
|
+
interface ShopFeatureOptions {
|
|
2716
|
+
/** Отдельное хранилище токена заказов. По умолчанию используется память процесса. */
|
|
2717
|
+
storage?: ShopOrderAccessStorage | undefined;
|
|
2718
|
+
}
|
|
2719
|
+
/** API гостевого доступа к заказам по коду из письма. */
|
|
2720
|
+
interface ShopFeatureApi {
|
|
2721
|
+
/** Отправляет код и запоминает адрес до проверки. */
|
|
2722
|
+
requestCode(email: string, options?: RequestOptions): Promise<void>;
|
|
2723
|
+
/** Проверяет код для адреса, переданного в {@link requestCode}. */
|
|
2724
|
+
verifyCode(code: string, options?: RequestOptions): Promise<ShopOrderAccessSession>;
|
|
2725
|
+
/** Возвращает действующий доступ или `null`. */
|
|
2726
|
+
session(): Promise<ShopOrderAccessSession | null>;
|
|
2727
|
+
/** Удаляет сохранённый доступ. */
|
|
2728
|
+
clear(): Promise<void>;
|
|
2729
|
+
/** Загружает гостевые заказы сохранённого адреса. */
|
|
2730
|
+
list(options?: RequestOptions): Promise<{
|
|
2731
|
+
items: ShopOrderSummary[];
|
|
2732
|
+
}>;
|
|
2733
|
+
/** Загружает гостевой заказ. */
|
|
2734
|
+
get(orderNumber: string, options?: RequestOptions): Promise<ShopOrder | null>;
|
|
2735
|
+
/** Создаёт ссылку на оплату гостевого заказа. */
|
|
2736
|
+
pay(orderNumber: string, returnUrl: string, options?: RequestOptions): Promise<ShopPayment>;
|
|
2737
|
+
}
|
|
2738
|
+
/** Создаёт подключаемый модуль для доступа к заказам по коду из письма. */
|
|
2739
|
+
declare function createShopFeature(options?: ShopFeatureOptions): ClientFeature<ShopFeatureApi>;
|
|
2740
|
+
//#endregion
|
|
2279
2741
|
//#region src/spans/render.d.ts
|
|
2280
2742
|
/** Формат результата {@link renderSpans}. */
|
|
2281
2743
|
declare const SpanRenderFormat: Readonly<{
|
|
@@ -2307,5 +2769,5 @@ interface RenderSpansOptions {
|
|
|
2307
2769
|
*/
|
|
2308
2770
|
declare function renderSpans(content: string, spans?: readonly Span[] | null | undefined, options?: RenderSpansOptions): string;
|
|
2309
2771
|
//#endregion
|
|
2310
|
-
export {
|
|
2311
|
-
//# sourceMappingURL=render-
|
|
2772
|
+
export { ShopConsent as $, Paginator as $n, autoSpans as $t, UsersResource as A, Post as An, ReportInput as At, ViewTracker as B, CreatePostData as Bn, post as Bt, VideoMimeType as C, Comment as Cn, OperationTransformer as Cr, ShopRecipient as Ct, UpdatePrivacyInput as D, PinPostResult as Dn, SearchResult as Dt, VerificationResource as E, LikeResult as En, SearchResource as Et, TelemetryBatchOptions as F, BuilderInput as Fn, UserPostsParams as Ft, PayShopOrderOptions as G, Subscription as Gn, parseHtml as Gt, ViewTrackerOptions as H, UpdatePostInput as Hn, PollInput as Ht, TelemetryClock as I, ItdBuilder as In, CreatePostInput as It, ShopOrderRequestOptions as J, UpdateNotificationSettingsInput as Jn, MarkupBuilder as Jt, ShopConsentsResource as K, NotificationListParams as Kn, parseMarkdown as Kt, TelemetryOptions as L, isBuilder as Ln, PostBuilder as Lt, InteractionEntry as M, CommentBuilder as Mn, CommentsParams as Mt, PhotoOpenInput as N, CommentInput as Nn, FeedParams as Nt, UpdateProfileInput as O, Poll as On, ReportsResource as Ot, TelemetryBatch as P, comment as Pn, PostsResource as Pt, CreateShopOrderInput as Q, PaginationMode as Qn, TextMarkup as Qt, TelemetryResource as R, CreateCommentInput as Rn, PostInput as Rt, VIDEO_MIME_TYPES as S, Attachment as Sn, OperationExtensions as Sr, ShopProductStatus as St, fromUrl as T, Hashtag as Tn, PluginTeardown as Tr, ShopSizeChartRow as Tt, SubscriptionResource as U, PaymentMethod as Un, poll as Ut, ViewTrackerInput as V, CreateReportInput as Vn, PollBuilder as Vt, CreateShopOrderOptions as W, Session as Wn, ParseMarkupOptions as Wt, ShopProductsResource as X, Page as Xn, MarkupInput as Xt, ShopOrdersResource as Y, BaseResource as Yn, MarkupContent as Yt, ShopResource as Z, PageState as Zn, MarkupSpan as Zt, AUDIO_MIME_TYPES as _, FilesResource as _n, AttemptContext as _r, ShopPayment as _t, ShopFeatureOptions as a, ServiceStatus as an, FeatureContext as ar, ShopDeliveryCountry as at, IMAGE_MIME_TYPES as b, CommentsResource as bn, AttemptNext as br, ShopProductColor as bt, ShopOrderAccessStorage as c, Announcement as cn, FeatureRequestOptions as cr, ShopOrder as ct, createShopOrderAccessStorage as d, Clan as dn, PreparedBufferSource as dr, ShopOrderDelivery as dt, markup as en, PaginatorOptions as er, ShopConsentContext as et, statusDays as f, Portal as fn, PreparedFileSource as fr, ShopOrderItem as ft, ALLOWED_MIME_TYPES as g, HashtagsResource as gn, HttpClient as gr, ShopOrderSupport as gt, utcStampToIso as h, HashtagPostsParams as hn, ResolveFileOptions as hr, ShopOrderSummary as ht, ShopFeatureApi as i, PlatformStatus as in, FeatureBucketDefinition as ir, ShopDeliveryCity as it, DwellEntry as j, PostStats as jn, report as jt, UserListParams as k, PollOption as kn, ReportBuilder as kt, ShopOrderAccessStorageAdapterOptions as l, AnnouncementButton as ln, ManagedClientResource as lr, ShopOrderAccessSession as lt, toDate as m, VerificationStatus as mn, ResolveFileContext as mr, ShopOrderStatus as mt, SpanRenderFormat as n, PlatformResource as nn, RateLimitBucketState as nr, ShopCreatedOrder as nt, createShopFeature as o, StatusDay as on, FeatureInstallation as or, ShopDeliveryDestination as ot, isMyProfile as p, Report as pn, PreparedStreamSource as pr, ShopOrderItemInput as pt, ShopDeliveryResource as q, NotificationsResource as qn, AutoSpansOptions as qt, renderSpans as r, PlatformVersions as rn, ClientFeature as rr, ShopDeliveryCalculation as rt, MemoryShopOrderAccessStorage as s, StatusIncidentLine as sn, FeatureOperationDefinition as sr, ShopDeliveryPoint as st, RenderSpansOptions as t, PlatformClientVersion as tn, mapPage as tr, ShopConsentKind as tt, createMemoryShopOrderAccessStorage as u, ChangelogEntry as un, FileResolver as ur, ShopOrderAccessVerification as ut, AllowedMimeType as v, UploadOptions as vn, AttemptExtensions as vr, ShopProduct as vt, fromStream as w, CommentReplyTo as wn, PluginApi as wr, ShopSizeChart as wt, ImageMimeType as x, RepliesParams as xn, ClientPlugin as xr, ShopProductSpec as xt, AudioMimeType as y, UploadedFile as yn, AttemptInterceptor as yr, ShopProductCategory as yt, VideoProgressInput as z, CreatePollInput as zn, PostUpdateInput as zt };
|
|
2773
|
+
//# sourceMappingURL=render-B4qis7Sb.d.ts.map
|