itd-api 0.0.2 → 0.0.4
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 +133 -11
- package/dist/{chunk-76C65H5J.js → chunk-JV75JWOX.js} +646 -275
- package/dist/chunk-JV75JWOX.js.map +1 -0
- package/dist/{chunk-QILCVTJI.cjs → chunk-XG43KEYF.cjs} +667 -274
- package/dist/chunk-XG43KEYF.cjs.map +1 -0
- package/dist/{index-RzyK1gKg.d.cts → index-olL_q_yu.d.cts} +392 -47
- package/dist/{index-RzyK1gKg.d.ts → index-olL_q_yu.d.ts} +392 -47
- package/dist/index.cjs +150 -62
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.cjs +149 -61
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +8 -12
- package/dist/node.d.ts +8 -12
- package/dist/node.js +2 -2
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-76C65H5J.js.map +0 -1
- package/dist/chunk-QILCVTJI.cjs.map +0 -1
|
@@ -198,8 +198,15 @@ declare const ItdErrorCode: Readonly<{
|
|
|
198
198
|
readonly BUSINESS_RULE_VIOLATION: "BUSINESS_RULE_VIOLATION";
|
|
199
199
|
readonly RATE_LIMIT_EXCEEDED: "RATE_LIMIT_EXCEEDED";
|
|
200
200
|
readonly UNKNOWN_ERROR: "UNKNOWN_ERROR";
|
|
201
|
+
/** Сервер отвечает так на `404`, `ENTITY_NOT_FOUND` в этом случае не приходит. */
|
|
202
|
+
readonly NOT_FOUND: "NOT_FOUND";
|
|
203
|
+
/** На практике не приходит: вместо него сервер шлёт `TURNSTILE_VERIFICATION_FAILED`. */
|
|
201
204
|
readonly CAPTCHA_FAILED: "CAPTCHA_FAILED";
|
|
205
|
+
/** Капча не пройдена: токен Turnstile недействителен, просрочен или уже использован. */
|
|
206
|
+
readonly TURNSTILE_VERIFICATION_FAILED: "TURNSTILE_VERIFICATION_FAILED";
|
|
202
207
|
readonly OTP_INVALID: "OTP_INVALID";
|
|
208
|
+
/** `flowToken` неизвестен или просрочен — поток подтверждения нужно начинать заново. */
|
|
209
|
+
readonly INVALID_FLOW_TOKEN: "INVALID_FLOW_TOKEN";
|
|
203
210
|
readonly ACCOUNT_DEACTIVATED: "ACCOUNT_DEACTIVATED";
|
|
204
211
|
readonly ACCOUNT_EMAIL_DOMAIN_NOT_ALLOWED: "ACCOUNT_EMAIL_DOMAIN_NOT_ALLOWED";
|
|
205
212
|
readonly ACCOUNT_INVALID_CREDENTIALS: "ACCOUNT_INVALID_CREDENTIALS";
|
|
@@ -208,6 +215,10 @@ declare const ItdErrorCode: Readonly<{
|
|
|
208
215
|
readonly SESSION_EXPIRED: "SESSION_EXPIRED";
|
|
209
216
|
readonly SESSION_REVOKED: "SESSION_REVOKED";
|
|
210
217
|
readonly SESSION_INVALID_REFRESH_TOKEN: "SESSION_INVALID_REFRESH_TOKEN";
|
|
218
|
+
/** Запрос обновления пришёл без cookie `refresh_token` — продлевать нечего. */
|
|
219
|
+
readonly REFRESH_TOKEN_MISSING: "REFRESH_TOKEN_MISSING";
|
|
220
|
+
/** Cookie `refresh_token` есть, но сессии за ней уже нет: отозвана или истекла. */
|
|
221
|
+
readonly SESSION_NOT_FOUND: "SESSION_NOT_FOUND";
|
|
211
222
|
readonly MISSING_FLOW_TOKEN: "MISSING_FLOW_TOKEN";
|
|
212
223
|
readonly PROFILE_USERNAME_TAKEN: "PROFILE_USERNAME_TAKEN";
|
|
213
224
|
readonly PROFILE_RESTRICTION_ACTIVE: "PROFILE_RESTRICTION_ACTIVE";
|
|
@@ -1064,7 +1075,23 @@ type ReportInput = BuilderInput<CreateReportInput, ReportBuilder>;
|
|
|
1064
1075
|
* - `server` — cookie ведёт встроенный jar, заголовок `Cookie` подставляется вручную;
|
|
1065
1076
|
* - `auto` — определяется по среде исполнения (значение по умолчанию).
|
|
1066
1077
|
*/
|
|
1067
|
-
|
|
1078
|
+
declare const RuntimeMode: Readonly<{
|
|
1079
|
+
/** Определяется по среде исполнения. Значение по умолчанию. */
|
|
1080
|
+
readonly Auto: "auto";
|
|
1081
|
+
/** Cookie ведёт браузер, запросы уходят с `credentials: 'include'`. */
|
|
1082
|
+
readonly Browser: "browser";
|
|
1083
|
+
/** Cookie ведёт встроенный jar, заголовок `Cookie` подставляется вручную. */
|
|
1084
|
+
readonly Server: "server";
|
|
1085
|
+
}>;
|
|
1086
|
+
type RuntimeMode = (typeof RuntimeMode)[keyof typeof RuntimeMode];
|
|
1087
|
+
/** Распознанная среда исполнения. */
|
|
1088
|
+
declare const DetectedRuntime: Readonly<{
|
|
1089
|
+
readonly Browser: "browser";
|
|
1090
|
+
/** Есть `window`, но нет `document`; cookie ведёт нативный сетевой слой. */
|
|
1091
|
+
readonly ReactNative: "react-native";
|
|
1092
|
+
readonly Server: "server";
|
|
1093
|
+
}>;
|
|
1094
|
+
type DetectedRuntime = (typeof DetectedRuntime)[keyof typeof DetectedRuntime];
|
|
1068
1095
|
|
|
1069
1096
|
/**
|
|
1070
1097
|
* Сохранённая сессия.
|
|
@@ -1084,6 +1111,14 @@ interface ItdSession {
|
|
|
1084
1111
|
refreshToken?: string | undefined;
|
|
1085
1112
|
/** Сырые cookie в форме `имя=значение`, привязанные к origin API. */
|
|
1086
1113
|
cookies?: string[] | undefined;
|
|
1114
|
+
/**
|
|
1115
|
+
* Идентификатор устройства для заголовка `X-Device-Id`.
|
|
1116
|
+
*
|
|
1117
|
+
* Сервер различает по нему записи в списке сессий, поэтому значение должно пережить
|
|
1118
|
+
* перезапуск процесса — иначе каждый старт бота порождает новую сессию. Библиотека
|
|
1119
|
+
* заводит его сама при первом запросе и хранит здесь.
|
|
1120
|
+
*/
|
|
1121
|
+
deviceId?: string | undefined;
|
|
1087
1122
|
/** Когда сессия получена, мс с начала эпохи. Нужно для диагностики. */
|
|
1088
1123
|
obtainedAt?: number | undefined;
|
|
1089
1124
|
}
|
|
@@ -1159,27 +1194,44 @@ type QueryValue = string | number | boolean | null | undefined | readonly (strin
|
|
|
1159
1194
|
/** Параметры строки запроса. */
|
|
1160
1195
|
type QueryParams = Record<string, QueryValue>;
|
|
1161
1196
|
|
|
1197
|
+
/**
|
|
1198
|
+
* Вход по логину и паролю.
|
|
1199
|
+
*
|
|
1200
|
+
* Вход требует токен капчи Cloudflare Turnstile, поэтому полностью автоматическим он быть
|
|
1201
|
+
* не может: капчу должен решить кто-то снаружи. Токен одноразовый и живёт несколько минут,
|
|
1202
|
+
* так что долгоживущему клиенту нужен `getTurnstileToken` — он спрашивается заново перед
|
|
1203
|
+
* каждой попыткой входа. Одиночный `turnstileToken` годится для разового скрипта.
|
|
1204
|
+
*/
|
|
1205
|
+
interface CredentialsAuth {
|
|
1206
|
+
email: string;
|
|
1207
|
+
password: string;
|
|
1208
|
+
/** Разовый токен капчи. Для повторного входа после истечения сессии не подойдёт. */
|
|
1209
|
+
turnstileToken?: string | undefined;
|
|
1210
|
+
/** Источник свежего токена капчи. Спрашивается перед каждым входом. */
|
|
1211
|
+
getTurnstileToken?: (() => string | Promise<string>) | undefined;
|
|
1212
|
+
}
|
|
1162
1213
|
/**
|
|
1163
1214
|
* Как клиент получает доступ к API.
|
|
1164
1215
|
*
|
|
1165
|
-
*
|
|
1166
|
-
*
|
|
1216
|
+
* Четыре формы — от разового вызова с готовым токеном до полноценной сессии, которую
|
|
1217
|
+
* библиотека заводит и продлевает сама.
|
|
1218
|
+
*
|
|
1219
|
+
* Опция необязательна: если {@link ItdClientOptions.storage} уже содержит сессию, доступ
|
|
1220
|
+
* берётся оттуда. Когда заданы обе, хранилище главнее — оно отражает текущее состояние
|
|
1221
|
+
* сессии, — а недостающие поля берутся отсюда.
|
|
1167
1222
|
*
|
|
1168
1223
|
* @example
|
|
1169
1224
|
* ```ts
|
|
1170
1225
|
* new ItdClient({ auth: '<accessToken>' }); // разовый вызов
|
|
1171
1226
|
* new ItdClient({ auth: { accessToken, refreshToken } }); // восстановить сессию
|
|
1172
|
-
* new ItdClient({ auth: { email, password } });
|
|
1227
|
+
* new ItdClient({ auth: { email, password, getTurnstileToken } }); // залогиниться самому
|
|
1173
1228
|
* new ItdClient({ auth: { getToken: () => vault.read() } }); // токен из внешнего источника
|
|
1174
1229
|
* ```
|
|
1175
1230
|
*/
|
|
1176
1231
|
type AuthInput = string | {
|
|
1177
1232
|
accessToken: string;
|
|
1178
1233
|
refreshToken?: string | undefined;
|
|
1179
|
-
} | {
|
|
1180
|
-
email: string;
|
|
1181
|
-
password: string;
|
|
1182
|
-
} | {
|
|
1234
|
+
} | CredentialsAuth | {
|
|
1183
1235
|
getToken: () => string | null | Promise<string | null>;
|
|
1184
1236
|
};
|
|
1185
1237
|
/** Куда библиотека пишет отладочные сообщения. Совместим с `console`. */
|
|
@@ -1326,6 +1378,22 @@ interface ItdClientOptions {
|
|
|
1326
1378
|
logger?: Logger | boolean | undefined;
|
|
1327
1379
|
/** Заголовки, добавляемые ко всем запросам, — например `User-Agent` для бота. */
|
|
1328
1380
|
headers?: Record<string, string> | undefined;
|
|
1381
|
+
/**
|
|
1382
|
+
* Значение заголовка `X-Device-Id`, который уходит с каждым запросом.
|
|
1383
|
+
*
|
|
1384
|
+
* Сервер различает по нему записи в списке сессий, поэтому значение должно быть стабильным.
|
|
1385
|
+
* Если не задать, библиотека заведёт идентификатор сама и сохранит его в {@link ItdSession},
|
|
1386
|
+
* так что при постоянном хранилище он переживёт перезапуск процесса.
|
|
1387
|
+
*/
|
|
1388
|
+
deviceId?: string | undefined;
|
|
1389
|
+
/**
|
|
1390
|
+
* Значение заголовка `User-Agent`. `false` — не отправлять его вовсе.
|
|
1391
|
+
*
|
|
1392
|
+
* По умолчанию `Mozilla/5.0 (compatible; itd-api/<версия>; …)`: `fetch` в Node не шлёт
|
|
1393
|
+
* `User-Agent` сам, а сайт стоит за DDoS-Guard, который такие запросы может не пропустить.
|
|
1394
|
+
* В браузере опция не действует — там заголовок менять запрещено.
|
|
1395
|
+
*/
|
|
1396
|
+
userAgent?: string | false | undefined;
|
|
1329
1397
|
/** Как обращаться с cookie. По умолчанию определяется по среде исполнения. */
|
|
1330
1398
|
mode?: RuntimeMode | undefined;
|
|
1331
1399
|
}
|
|
@@ -1352,6 +1420,14 @@ interface RawRequestOptions extends RequestOptions {
|
|
|
1352
1420
|
skipAuth?: boolean | undefined;
|
|
1353
1421
|
/** Не пытаться обновить токен при `401` — используется самими эндпоинтами авторизации. */
|
|
1354
1422
|
skipAuthRefresh?: boolean | undefined;
|
|
1423
|
+
/**
|
|
1424
|
+
* Выполнить запрос мимо очереди.
|
|
1425
|
+
*
|
|
1426
|
+
* Нужно запросам, которые слой авторизации делает **изнутри** другого запроса: продление
|
|
1427
|
+
* токена и отложенный вход. Такой запрос обязан стартовать, пока исходный держит место
|
|
1428
|
+
* в очереди и ждёт его результата, — иначе оба ждут друг друга и не завершатся никогда.
|
|
1429
|
+
*/
|
|
1430
|
+
skipQueue?: boolean | undefined;
|
|
1355
1431
|
/** Вернуть тело ответа без снятия обёртки `{ data: … }`. */
|
|
1356
1432
|
raw?: boolean | undefined;
|
|
1357
1433
|
}
|
|
@@ -1360,6 +1436,21 @@ interface RawRequestOptions extends RequestOptions {
|
|
|
1360
1436
|
declare const DEFAULT_BASE_URL = "https://xn--d1ah4a.com";
|
|
1361
1437
|
/** Таймаут запроса по умолчанию. Столько же использует официальный клиент итд.com. */
|
|
1362
1438
|
declare const DEFAULT_TIMEOUT = 30000;
|
|
1439
|
+
/**
|
|
1440
|
+
* Версия библиотеки — попадает в `User-Agent`.
|
|
1441
|
+
*/
|
|
1442
|
+
declare const LIBRARY_VERSION = "0.0.4";
|
|
1443
|
+
/**
|
|
1444
|
+
* `User-Agent` по умолчанию.
|
|
1445
|
+
*
|
|
1446
|
+
* Сайт стоит за DDoS-Guard, и запросы вовсе без `User-Agent` (так делает `fetch` в Node)
|
|
1447
|
+
* имеют шанс не пройти фильтр. Префикс `Mozilla/5.0` — дань традиции таких фильтров,
|
|
1448
|
+
* дальше идёт честное имя библиотеки: подделываться под браузер она не должна.
|
|
1449
|
+
*
|
|
1450
|
+
* В браузере заголовок не выставляется — `User-Agent` там запрещён к изменению, и среда
|
|
1451
|
+
* молча его игнорирует.
|
|
1452
|
+
*/
|
|
1453
|
+
declare const DEFAULT_USER_AGENT = "Mozilla/5.0 (compatible; itd-api/0.0.4; +https://github.com/KiowDev/itd-api)";
|
|
1363
1454
|
/**
|
|
1364
1455
|
* Настройки повторов со всеми значениями по умолчанию.
|
|
1365
1456
|
*
|
|
@@ -1395,6 +1486,10 @@ interface ResolvedConfig {
|
|
|
1395
1486
|
hooks: ClientHooks;
|
|
1396
1487
|
logger: Logger | undefined;
|
|
1397
1488
|
headers: Record<string, string>;
|
|
1489
|
+
/** Значение заголовка `X-Device-Id`, если задано вручную. Иначе заводится само. */
|
|
1490
|
+
deviceId: string | undefined;
|
|
1491
|
+
/** Значение заголовка `User-Agent`. `undefined` — заголовок не выставляется. */
|
|
1492
|
+
userAgent: string | undefined;
|
|
1398
1493
|
mode: RuntimeMode;
|
|
1399
1494
|
/** Вести ли собственный cookie-jar (вне браузера и React Native). */
|
|
1400
1495
|
useCookieJar: boolean;
|
|
@@ -1402,6 +1497,18 @@ interface ResolvedConfig {
|
|
|
1402
1497
|
sendCredentials: boolean;
|
|
1403
1498
|
}
|
|
1404
1499
|
|
|
1500
|
+
/** Имя cookie-флага «есть refresh-сессия». Ставится сайтом итд.com рядом с refresh-токеном. */
|
|
1501
|
+
declare const AUTH_FLAG_COOKIE = "is_auth";
|
|
1502
|
+
/**
|
|
1503
|
+
* Имя cookie с refresh-токеном.
|
|
1504
|
+
*
|
|
1505
|
+
* `POST /api/v1/auth/refresh` читает токен **только отсюда** — тело запроса сервер игнорирует.
|
|
1506
|
+
* Cookie помечена `HttpOnly`, поэтому в браузере её не прочитать и не выставить; вне браузера
|
|
1507
|
+
* она проходит через jar, и туда же кладётся токен, переданный строкой.
|
|
1508
|
+
*/
|
|
1509
|
+
declare const REFRESH_COOKIE = "refresh_token";
|
|
1510
|
+
/** Путь, которым сервер ограничивает {@link REFRESH_COOKIE}. */
|
|
1511
|
+
declare const REFRESH_COOKIE_PATH = "/api/v1/auth";
|
|
1405
1512
|
/**
|
|
1406
1513
|
* Минимальное хранилище cookie для сред без своего.
|
|
1407
1514
|
*
|
|
@@ -1422,6 +1529,13 @@ declare class CookieJar {
|
|
|
1422
1529
|
* внутри `Expires=Wed, 09 Jun 2027 …`. Разделением занимается `set-cookie-parser`.
|
|
1423
1530
|
*/
|
|
1424
1531
|
setFromResponse(url: string, response: Response): void;
|
|
1532
|
+
/**
|
|
1533
|
+
* Кладёт cookie напрямую, минуя `Set-Cookie`.
|
|
1534
|
+
*
|
|
1535
|
+
* Нужно ровно в одном случае: пользователь передал refresh-токен строкой, а сервер читает
|
|
1536
|
+
* его только из cookie. Значение не кодируется — оно уходит в заголовок как есть.
|
|
1537
|
+
*/
|
|
1538
|
+
set(url: string, name: string, value: string, path?: string): void;
|
|
1425
1539
|
/** Сохраняет cookie из готовых строк `Set-Cookie`. */
|
|
1426
1540
|
setFromStrings(url: string, setCookieStrings: string[]): void;
|
|
1427
1541
|
/**
|
|
@@ -1430,6 +1544,15 @@ declare class CookieJar {
|
|
|
1430
1544
|
* @returns строка вида `a=1; b=2` либо `undefined`, если подходящих cookie нет
|
|
1431
1545
|
*/
|
|
1432
1546
|
getHeader(url: string): string | undefined;
|
|
1547
|
+
/**
|
|
1548
|
+
* Значение действующей cookie.
|
|
1549
|
+
*
|
|
1550
|
+
* Нужно, чтобы забрать обновлённый refresh-токен: сервер ротирует его при каждом
|
|
1551
|
+
* продлении сессии, и сохранять надо именно новое значение.
|
|
1552
|
+
*
|
|
1553
|
+
* @param url если указан, учитываются origin, путь и флаг `Secure`
|
|
1554
|
+
*/
|
|
1555
|
+
getValue(name: string, url?: string): string | undefined;
|
|
1433
1556
|
/**
|
|
1434
1557
|
* Есть ли действующая cookie с таким именем.
|
|
1435
1558
|
*
|
|
@@ -1504,6 +1627,13 @@ interface HttpCollaborators {
|
|
|
1504
1627
|
* Повтор выполняется ровно один раз.
|
|
1505
1628
|
*/
|
|
1506
1629
|
onUnauthorized?(): Promise<boolean>;
|
|
1630
|
+
/**
|
|
1631
|
+
* Идентификатор устройства для заголовка `X-Device-Id`.
|
|
1632
|
+
*
|
|
1633
|
+
* Отдельно от {@link getAuthHeaders}, потому что нужен и на анонимных запросах —
|
|
1634
|
+
* например на `sign-in`, где заголовка авторизации ещё нет.
|
|
1635
|
+
*/
|
|
1636
|
+
getDeviceId?(): Promise<string> | string;
|
|
1507
1637
|
/** Значение заголовка `Cookie` для указанного URL. */
|
|
1508
1638
|
getCookieHeader?(url: string): string | undefined;
|
|
1509
1639
|
/** Приём `Set-Cookie` из ответа. */
|
|
@@ -1555,6 +1685,28 @@ declare class HttpClient {
|
|
|
1555
1685
|
request<T = unknown>(options: RawRequestOptions): Promise<T>;
|
|
1556
1686
|
}
|
|
1557
1687
|
|
|
1688
|
+
/** Пути авторизации. Вынесены, чтобы не расходиться между модулями. */
|
|
1689
|
+
declare const AUTH_PATHS: {
|
|
1690
|
+
readonly signIn: "/api/v1/auth/sign-in";
|
|
1691
|
+
readonly refresh: "/api/v1/auth/refresh";
|
|
1692
|
+
};
|
|
1693
|
+
/**
|
|
1694
|
+
* Публичный ключ Cloudflare Turnstile платформы итд.com.
|
|
1695
|
+
*
|
|
1696
|
+
* Нужен, чтобы отрисовать виджет капчи и получить токен для `signIn`, `signUp`
|
|
1697
|
+
* и `forgotPassword`.
|
|
1698
|
+
*
|
|
1699
|
+
* @example
|
|
1700
|
+
* ```ts
|
|
1701
|
+
* turnstile.render('#captcha', {
|
|
1702
|
+
* sitekey: TURNSTILE_SITE_KEY,
|
|
1703
|
+
* callback: (turnstileToken) => itd.auth.signIn({ email, password, turnstileToken }),
|
|
1704
|
+
* });
|
|
1705
|
+
* ```
|
|
1706
|
+
*/
|
|
1707
|
+
declare const TURNSTILE_SITE_KEY = "0x4AAAAAACHhxczw6fJGwPBg";
|
|
1708
|
+
/** Заголовок с идентификатором устройства. Сервер связывает с ним запись в списке сессий. */
|
|
1709
|
+
declare const DEVICE_ID_HEADER = "X-Device-Id";
|
|
1558
1710
|
/** События слоя авторизации. */
|
|
1559
1711
|
interface AuthEvents {
|
|
1560
1712
|
/** Токен получен или обновлён. */
|
|
@@ -1590,13 +1742,24 @@ declare class AuthManager {
|
|
|
1590
1742
|
/**
|
|
1591
1743
|
* Есть ли признак живой refresh-сессии.
|
|
1592
1744
|
*
|
|
1593
|
-
*
|
|
1594
|
-
*
|
|
1745
|
+
* Рядом с refresh-токеном сервер ставит незакрытую cookie `is_auth` — по ней видно,
|
|
1746
|
+
* что продлевать сессию вообще есть смысл, и API не дёргается у анонимов.
|
|
1595
1747
|
* В браузере cookie ведёт сама среда, поэтому там ответ всегда `true`.
|
|
1748
|
+
*
|
|
1749
|
+
* Асинхронный, потому что признак может лежать в {@link TokenStorage}: до чтения оттуда
|
|
1750
|
+
* ответ был бы `false` даже при полностью рабочей сохранённой сессии.
|
|
1596
1751
|
*/
|
|
1597
|
-
hasRefreshSession(): boolean
|
|
1752
|
+
hasRefreshSession(): Promise<boolean>;
|
|
1598
1753
|
/** Заголовки авторизации для очередного запроса. Пустой объект, если токена нет. */
|
|
1599
1754
|
getAuthHeaders(): Promise<Record<string, string>>;
|
|
1755
|
+
/**
|
|
1756
|
+
* Идентификатор устройства для заголовка `X-Device-Id`.
|
|
1757
|
+
*
|
|
1758
|
+
* Заводится один раз и сохраняется в сессии, чтобы пережить перезапуск процесса:
|
|
1759
|
+
* сервер связывает с ним запись в списке сессий, и плавающее значение плодило бы
|
|
1760
|
+
* по новой сессии на каждый старт.
|
|
1761
|
+
*/
|
|
1762
|
+
getDeviceId(): Promise<string>;
|
|
1600
1763
|
/**
|
|
1601
1764
|
* Текущий токен доступа.
|
|
1602
1765
|
*
|
|
@@ -1624,7 +1787,12 @@ declare class AuthManager {
|
|
|
1624
1787
|
getSession(): Promise<ItdSession | null>;
|
|
1625
1788
|
/** Заменяет сессию целиком. */
|
|
1626
1789
|
setSession(session: ItdSession): Promise<void>;
|
|
1627
|
-
/**
|
|
1790
|
+
/**
|
|
1791
|
+
* Забывает сессию и cookie. Сетевой запрос не выполняется.
|
|
1792
|
+
*
|
|
1793
|
+
* Идентификатор устройства выход переживает: иначе каждая пара «выход — вход» плодила бы
|
|
1794
|
+
* новую запись в списке сессий.
|
|
1795
|
+
*/
|
|
1628
1796
|
clear(): Promise<void>;
|
|
1629
1797
|
}
|
|
1630
1798
|
|
|
@@ -1748,6 +1916,10 @@ interface RealtimeTransport {
|
|
|
1748
1916
|
*/
|
|
1749
1917
|
connect(context: TransportContext): Promise<void>;
|
|
1750
1918
|
}
|
|
1919
|
+
/** Ошибка, по которой видно, что сервер отверг авторизацию потока. */
|
|
1920
|
+
declare class UnauthorizedStreamError extends Error {
|
|
1921
|
+
constructor();
|
|
1922
|
+
}
|
|
1751
1923
|
|
|
1752
1924
|
/** События потока уведомлений. */
|
|
1753
1925
|
interface RealtimeEvents {
|
|
@@ -1795,7 +1967,15 @@ interface RealtimeEvents {
|
|
|
1795
1967
|
};
|
|
1796
1968
|
}
|
|
1797
1969
|
/** Способ получения событий. */
|
|
1798
|
-
|
|
1970
|
+
declare const RealtimeTransportKind: Readonly<{
|
|
1971
|
+
/** Поток событий, если среда умеет читать тело по частям, иначе опрос. */
|
|
1972
|
+
readonly Auto: "auto";
|
|
1973
|
+
/** Поток `text/event-stream`. */
|
|
1974
|
+
readonly Sse: "sse";
|
|
1975
|
+
/** Периодический опрос REST. */
|
|
1976
|
+
readonly Poll: "poll";
|
|
1977
|
+
}>;
|
|
1978
|
+
type RealtimeTransportKind = (typeof RealtimeTransportKind)[keyof typeof RealtimeTransportKind];
|
|
1799
1979
|
/** Настройки потока уведомлений. */
|
|
1800
1980
|
interface RealtimeOptions extends ReconnectOptions {
|
|
1801
1981
|
/**
|
|
@@ -1920,7 +2100,15 @@ interface Page<T> {
|
|
|
1920
2100
|
raw: unknown;
|
|
1921
2101
|
}
|
|
1922
2102
|
/** Схема пагинации эндпоинта. */
|
|
1923
|
-
|
|
2103
|
+
declare const PaginationMode: Readonly<{
|
|
2104
|
+
/** Следующая страница запрашивается непрозрачным курсором. */
|
|
2105
|
+
readonly Cursor: "cursor";
|
|
2106
|
+
/** Следующая страница запрашивается номером. */
|
|
2107
|
+
readonly Page: "page";
|
|
2108
|
+
/** Следующая страница запрашивается смещением от начала списка. */
|
|
2109
|
+
readonly Offset: "offset";
|
|
2110
|
+
}>;
|
|
2111
|
+
type PaginationMode = (typeof PaginationMode)[keyof typeof PaginationMode];
|
|
1924
2112
|
/** Позиция, с которой запрашивается очередная страница. */
|
|
1925
2113
|
interface PageState {
|
|
1926
2114
|
cursor?: string | undefined;
|
|
@@ -1932,6 +2120,13 @@ interface PaginatorOptions<T> {
|
|
|
1932
2120
|
mode: PaginationMode;
|
|
1933
2121
|
/** Загружает одну страницу для указанной позиции. */
|
|
1934
2122
|
load: (state: PageState) => Promise<Page<T>>;
|
|
2123
|
+
/**
|
|
2124
|
+
* С какой позиции начать. По умолчанию с начала списка.
|
|
2125
|
+
*
|
|
2126
|
+
* Нужно, чтобы перебор можно было продолжить с сохранённого курсора, а не только
|
|
2127
|
+
* начать заново.
|
|
2128
|
+
*/
|
|
2129
|
+
start?: PageState | undefined;
|
|
1935
2130
|
/**
|
|
1936
2131
|
* Предохранитель от бесконечного перебора. По умолчанию 1000.
|
|
1937
2132
|
*
|
|
@@ -1948,6 +2143,10 @@ interface PaginatorOptions<T> {
|
|
|
1948
2143
|
* Скрывает различия трёх схем пагинации: перебор элементов, страниц и сбор в массив
|
|
1949
2144
|
* выглядят одинаково независимо от эндпоинта.
|
|
1950
2145
|
*
|
|
2146
|
+
* **Одноразовый.** Позиция хранится внутри, поэтому повторный перебор того же объекта
|
|
2147
|
+
* ничего не вернёт: он продолжится с места, где закончился прошлый. Нужен второй проход —
|
|
2148
|
+
* возьмите новый перебор у того же метода ресурса.
|
|
2149
|
+
*
|
|
1951
2150
|
* @example Перебор элементов
|
|
1952
2151
|
* ```ts
|
|
1953
2152
|
* for await (const post of itd.posts.iterate({ tab: 'following' })) {
|
|
@@ -2004,9 +2203,11 @@ declare class BaseResource {
|
|
|
2004
2203
|
*
|
|
2005
2204
|
* @param mode схема пагинации эндпоинта
|
|
2006
2205
|
* @param load загружает одну страницу для указанной позиции
|
|
2206
|
+
* @param options `maxPages` и `signal`, а также `start` — позиция, с которой продолжить
|
|
2007
2207
|
*/
|
|
2008
2208
|
protected paginate<T>(mode: PaginationMode, load: (state: PageState) => Promise<Page<T>>, options?: RequestOptions & {
|
|
2009
2209
|
maxPages?: number;
|
|
2210
|
+
start?: PageState;
|
|
2010
2211
|
}): Paginator<T>;
|
|
2011
2212
|
}
|
|
2012
2213
|
|
|
@@ -2015,6 +2216,45 @@ interface Credentials {
|
|
|
2015
2216
|
email: string;
|
|
2016
2217
|
password: string;
|
|
2017
2218
|
}
|
|
2219
|
+
/**
|
|
2220
|
+
* Учётные данные вместе с токеном капчи.
|
|
2221
|
+
*
|
|
2222
|
+
* `turnstileToken` обязателен: без него сервер отвечает `VALIDATION_ERROR`, с недействительным —
|
|
2223
|
+
* `TURNSTILE_VERIFICATION_FAILED`. Токен даёт виджет Cloudflare Turnstile с ключом
|
|
2224
|
+
* {@link TURNSTILE_SITE_KEY}; он одноразовый и живёт несколько минут.
|
|
2225
|
+
*/
|
|
2226
|
+
interface CaptchaCredentials extends Credentials {
|
|
2227
|
+
turnstileToken: string;
|
|
2228
|
+
}
|
|
2229
|
+
/** Запрос письма для сброса пароля. Капча обязательна, как и при входе. */
|
|
2230
|
+
interface ForgotPasswordInput {
|
|
2231
|
+
email: string;
|
|
2232
|
+
turnstileToken: string;
|
|
2233
|
+
}
|
|
2234
|
+
/**
|
|
2235
|
+
* Установка нового пароля.
|
|
2236
|
+
*
|
|
2237
|
+
* Сброс идёт тем же потоком с кодом, что и вход: {@link AuthResource.forgotPassword} выдаёт
|
|
2238
|
+
* `flowToken`, письмо приносит `otp`, и всё это вместе с новым паролем уходит сюда.
|
|
2239
|
+
*/
|
|
2240
|
+
interface ResetPasswordInput {
|
|
2241
|
+
email: string;
|
|
2242
|
+
otp: string;
|
|
2243
|
+
flowToken: string;
|
|
2244
|
+
newPassword: string;
|
|
2245
|
+
}
|
|
2246
|
+
/** Провайдер внешнего входа. */
|
|
2247
|
+
declare const OAuthProvider: Readonly<{
|
|
2248
|
+
readonly Yandex: "yandex";
|
|
2249
|
+
readonly Google: "google";
|
|
2250
|
+
}>;
|
|
2251
|
+
type OAuthProvider = (typeof OAuthProvider)[keyof typeof OAuthProvider];
|
|
2252
|
+
/** Чем закончился вход: сразу токеном или запросом кода подтверждения. */
|
|
2253
|
+
declare const SignInStatus: Readonly<{
|
|
2254
|
+
readonly Authenticated: "authenticated";
|
|
2255
|
+
readonly OtpRequired: "otp_required";
|
|
2256
|
+
}>;
|
|
2257
|
+
type SignInStatus = (typeof SignInStatus)[keyof typeof SignInStatus];
|
|
2018
2258
|
/**
|
|
2019
2259
|
* Результат входа.
|
|
2020
2260
|
*
|
|
@@ -2022,14 +2262,12 @@ interface Credentials {
|
|
|
2022
2262
|
* объединение делает оба случая явными.
|
|
2023
2263
|
*/
|
|
2024
2264
|
type SignInResult = {
|
|
2025
|
-
status:
|
|
2265
|
+
status: typeof SignInStatus.Authenticated;
|
|
2026
2266
|
accessToken: string;
|
|
2027
2267
|
} | {
|
|
2028
|
-
status:
|
|
2268
|
+
status: typeof SignInStatus.OtpRequired;
|
|
2029
2269
|
flowToken: string | undefined;
|
|
2030
2270
|
};
|
|
2031
|
-
/** Провайдер внешнего входа. */
|
|
2032
|
-
type OAuthProvider = 'yandex' | 'google';
|
|
2033
2271
|
/**
|
|
2034
2272
|
* Авторизация, сессии и пароли.
|
|
2035
2273
|
*
|
|
@@ -2045,7 +2283,7 @@ declare class AuthResource extends BaseResource {
|
|
|
2045
2283
|
*
|
|
2046
2284
|
* @returns `flowToken`, который нужно передать в {@link verifyOtp}
|
|
2047
2285
|
*/
|
|
2048
|
-
signUp(credentials:
|
|
2286
|
+
signUp(credentials: CaptchaCredentials, options?: RequestOptions): Promise<string>;
|
|
2049
2287
|
/**
|
|
2050
2288
|
* Выполняет вход.
|
|
2051
2289
|
*
|
|
@@ -2053,8 +2291,10 @@ declare class AuthResource extends BaseResource {
|
|
|
2053
2291
|
* тогда продолжайте через {@link verifyOtp} либо воспользуйтесь {@link signInWithOtp}.
|
|
2054
2292
|
*
|
|
2055
2293
|
* При успешном входе токен сохраняется в клиенте автоматически.
|
|
2294
|
+
*
|
|
2295
|
+
* @param credentials email, пароль и обязательный токен капчи — см. {@link CaptchaCredentials}
|
|
2056
2296
|
*/
|
|
2057
|
-
signIn(credentials:
|
|
2297
|
+
signIn(credentials: CaptchaCredentials, options?: RequestOptions): Promise<SignInResult>;
|
|
2058
2298
|
/**
|
|
2059
2299
|
* Подтверждает вход кодом из письма.
|
|
2060
2300
|
*
|
|
@@ -2087,7 +2327,7 @@ declare class AuthResource extends BaseResource {
|
|
|
2087
2327
|
* });
|
|
2088
2328
|
* ```
|
|
2089
2329
|
*/
|
|
2090
|
-
signInWithOtp(input:
|
|
2330
|
+
signInWithOtp(input: CaptchaCredentials & {
|
|
2091
2331
|
getOtp: () => string | Promise<string>;
|
|
2092
2332
|
}, options?: RequestOptions): Promise<string>;
|
|
2093
2333
|
/**
|
|
@@ -2100,25 +2340,71 @@ declare class AuthResource extends BaseResource {
|
|
|
2100
2340
|
/**
|
|
2101
2341
|
* Есть ли признак живой сессии обновления.
|
|
2102
2342
|
*
|
|
2103
|
-
* Проверяет cookie `is_auth`, которую сервер ставит рядом с refresh
|
|
2104
|
-
* не дёргать API у неавторизованного
|
|
2105
|
-
* cookie ведёт сама среда, и прочитать её
|
|
2343
|
+
* Проверяет cookie `is_auth`, которую сервер ставит рядом с refresh-токеном, а также
|
|
2344
|
+
* refresh-токен, переданный строкой. Позволяет не дёргать API у неавторизованного
|
|
2345
|
+
* пользователя. В браузере всегда `true`: cookie ведёт сама среда, и прочитать её
|
|
2346
|
+
* из JS нельзя.
|
|
2347
|
+
*
|
|
2348
|
+
* Читает {@link TokenStorage}, поэтому результат верен и до первого запроса.
|
|
2349
|
+
*
|
|
2350
|
+
* @example
|
|
2351
|
+
* ```ts
|
|
2352
|
+
* if (await itd.auth.hasRefreshSession()) await itd.auth.refresh();
|
|
2353
|
+
* else redirectToLogin();
|
|
2354
|
+
* ```
|
|
2106
2355
|
*/
|
|
2107
|
-
hasRefreshSession(): boolean
|
|
2356
|
+
hasRefreshSession(): Promise<boolean>;
|
|
2108
2357
|
/** Завершает текущую сессию на сервере и очищает локальную. */
|
|
2109
2358
|
logout(options?: RequestOptions): Promise<void>;
|
|
2110
|
-
/**
|
|
2359
|
+
/**
|
|
2360
|
+
* Завершает все сессии пользователя и очищает локальную.
|
|
2361
|
+
*
|
|
2362
|
+
* Собран из двух запросов, потому что единого эндпоинта на сервере нет:
|
|
2363
|
+
* `POST /api/v1/auth/logout-all` отвечает `404`. Сначала отзываются все прочие сессии
|
|
2364
|
+
* (`DELETE /api/v1/auth/sessions`), затем завершается текущая — в обратном порядке
|
|
2365
|
+
* отзывать было бы уже нечем.
|
|
2366
|
+
*/
|
|
2111
2367
|
logoutAll(options?: RequestOptions): Promise<void>;
|
|
2112
2368
|
/** Забывает сессию локально, не обращаясь к серверу. */
|
|
2113
2369
|
signOut(): Promise<void>;
|
|
2114
|
-
/**
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2370
|
+
/**
|
|
2371
|
+
* Запрашивает письмо с кодом для сброса пароля.
|
|
2372
|
+
*
|
|
2373
|
+
* @returns `flowToken`, который нужно передать в {@link resetPassword}
|
|
2374
|
+
*/
|
|
2375
|
+
forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<string>;
|
|
2376
|
+
/**
|
|
2377
|
+
* Устанавливает новый пароль по коду из письма.
|
|
2378
|
+
*
|
|
2379
|
+
* Сервер ждёт все четыре поля сразу — `email`, `otp`, `flowToken` и `newPassword`;
|
|
2380
|
+
* при нехватке любого отвечает `422`.
|
|
2381
|
+
*/
|
|
2382
|
+
resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<void>;
|
|
2383
|
+
/**
|
|
2384
|
+
* Полный сброс пароля с кодом из письма.
|
|
2385
|
+
*
|
|
2386
|
+
* Тот же приём, что и {@link signInWithOtp}: код запрашивается функцией `getOtp`,
|
|
2387
|
+
* остальное библиотека делает сама.
|
|
2388
|
+
*
|
|
2389
|
+
* @example
|
|
2390
|
+
* ```ts
|
|
2391
|
+
* await itd.auth.resetPasswordWithOtp({
|
|
2392
|
+
* email,
|
|
2393
|
+
* turnstileToken,
|
|
2394
|
+
* newPassword,
|
|
2395
|
+
* getOtp: () => rl.question('Код из письма: '),
|
|
2396
|
+
* });
|
|
2397
|
+
* ```
|
|
2398
|
+
*/
|
|
2399
|
+
resetPasswordWithOtp(input: ForgotPasswordInput & {
|
|
2119
2400
|
newPassword: string;
|
|
2401
|
+
getOtp: () => string | Promise<string>;
|
|
2120
2402
|
}, options?: RequestOptions): Promise<void>;
|
|
2121
|
-
/**
|
|
2403
|
+
/**
|
|
2404
|
+
* Меняет пароль. Требует действующей сессии.
|
|
2405
|
+
*
|
|
2406
|
+
* При неверном текущем пароле сервер отвечает `ACCOUNT_CURRENT_PASSWORD_INCORRECT`.
|
|
2407
|
+
*/
|
|
2122
2408
|
changePassword(input: {
|
|
2123
2409
|
oldPassword: string;
|
|
2124
2410
|
newPassword: string;
|
|
@@ -2268,8 +2554,6 @@ declare class FilesResource extends BaseResource {
|
|
|
2268
2554
|
get(fileId: string, options?: RequestOptions): Promise<unknown>;
|
|
2269
2555
|
/** Удаляет загруженный файл. */
|
|
2270
2556
|
remove(fileId: string, options?: RequestOptions): Promise<void>;
|
|
2271
|
-
/** Приводит любой поддерживаемый вход к `Blob` с именем и проверенным типом. */
|
|
2272
|
-
private prepare;
|
|
2273
2557
|
}
|
|
2274
2558
|
|
|
2275
2559
|
/** Параметры запроса постов по хэштегу. */
|
|
@@ -2461,6 +2745,7 @@ type UpdateNotificationSettingsInput = Partial<NotificationSettings>;
|
|
|
2461
2745
|
* объекты отсюда и из потока событий можно складывать в один список.
|
|
2462
2746
|
*/
|
|
2463
2747
|
declare class NotificationsResource extends BaseResource {
|
|
2748
|
+
#private;
|
|
2464
2749
|
/**
|
|
2465
2750
|
* Загружает страницу уведомлений.
|
|
2466
2751
|
*
|
|
@@ -2734,10 +3019,7 @@ declare class UsersResource extends BaseResource {
|
|
|
2734
3019
|
/** Загружает рекомендации, на кого подписаться. */
|
|
2735
3020
|
whoToFollow(options?: RequestOptions): Promise<UserSummary[]>;
|
|
2736
3021
|
/** Загружает рейтинг кланов. */
|
|
2737
|
-
topClans(options?: RequestOptions): Promise<
|
|
2738
|
-
avatar: string;
|
|
2739
|
-
memberCount: number;
|
|
2740
|
-
}[]>;
|
|
3022
|
+
topClans(options?: RequestOptions): Promise<Clan[]>;
|
|
2741
3023
|
/**
|
|
2742
3024
|
* Подписывается на пользователя.
|
|
2743
3025
|
*
|
|
@@ -2808,7 +3090,10 @@ declare class UsersResource extends BaseResource {
|
|
|
2808
3090
|
* import { FileTokenStorage } from 'itd-api/node';
|
|
2809
3091
|
*
|
|
2810
3092
|
* const itd = new ItdClient({
|
|
2811
|
-
* auth
|
|
3093
|
+
* // `auth` не обязателен: когда хранилище уже содержит сессию, токен берётся оттуда,
|
|
3094
|
+
* // а истёкший продлевается сам. Здесь он нужен на первый запуск.
|
|
3095
|
+
* // Вход по паролю требует токена капчи — см. AuthInput и TURNSTILE_SITE_KEY.
|
|
3096
|
+
* auth: { email, password, getTurnstileToken },
|
|
2812
3097
|
* storage: new FileTokenStorage('./.itd-session.json'),
|
|
2813
3098
|
* rateLimit: { concurrency: 4, rps: 8 },
|
|
2814
3099
|
* });
|
|
@@ -2926,8 +3211,44 @@ declare function createClient(options?: ItdClientOptions): ItdClient;
|
|
|
2926
3211
|
|
|
2927
3212
|
/** Бренд, по которому ошибки библиотеки распознаются надёжнее, чем через `instanceof`. */
|
|
2928
3213
|
declare const ITD_ERROR: unique symbol;
|
|
2929
|
-
/**
|
|
2930
|
-
|
|
3214
|
+
/**
|
|
3215
|
+
* Категория ошибки. Определяет, какие поля у неё есть.
|
|
3216
|
+
*
|
|
3217
|
+
* Значение, а не только тип: категорию нужно с чем-то сравнивать в рантайме.
|
|
3218
|
+
*/
|
|
3219
|
+
declare const ItdErrorKind: Readonly<{
|
|
3220
|
+
/** Сервер ответил статусом ≥ 400. */
|
|
3221
|
+
readonly Api: "api";
|
|
3222
|
+
/** Запрос не дошёл до сервера. */
|
|
3223
|
+
readonly Network: "network";
|
|
3224
|
+
/** Истёк таймаут запроса. */
|
|
3225
|
+
readonly Timeout: "timeout";
|
|
3226
|
+
/** Запрос отменён через `AbortSignal`. */
|
|
3227
|
+
readonly Abort: "abort";
|
|
3228
|
+
/** Некорректная конфигурация или аргументы — обнаружено до обращения к сети. */
|
|
3229
|
+
readonly Config: "config";
|
|
3230
|
+
}>;
|
|
3231
|
+
type ItdErrorKind = (typeof ItdErrorKind)[keyof typeof ItdErrorKind];
|
|
3232
|
+
/**
|
|
3233
|
+
* Разновидность ошибки API — то же, что класс ошибки, но в виде данных.
|
|
3234
|
+
*
|
|
3235
|
+
* Существует потому, что `instanceof` подводит, когда в дереве зависимостей оказались
|
|
3236
|
+
* две копии пакета или смешаны сборки ESM и CJS: классы тогда разные, хотя ошибка та же.
|
|
3237
|
+
* Проверки {@link isItdValidationError} и соседние опираются на это поле, а не на класс.
|
|
3238
|
+
*/
|
|
3239
|
+
declare const ItdApiErrorKind: Readonly<{
|
|
3240
|
+
/** Ни одна из специализаций не подошла. */
|
|
3241
|
+
readonly Generic: "generic";
|
|
3242
|
+
readonly Validation: "validation";
|
|
3243
|
+
readonly Auth: "auth";
|
|
3244
|
+
readonly Forbidden: "forbidden";
|
|
3245
|
+
readonly NotFound: "not_found";
|
|
3246
|
+
readonly Conflict: "conflict";
|
|
3247
|
+
readonly RateLimit: "rate_limit";
|
|
3248
|
+
readonly PhoneVerification: "phone_verification";
|
|
3249
|
+
readonly Server: "server";
|
|
3250
|
+
}>;
|
|
3251
|
+
type ItdApiErrorKind = (typeof ItdApiErrorKind)[keyof typeof ItdApiErrorKind];
|
|
2931
3252
|
/** Ошибки по полям формы: `{ email: ['уже занят'] }`. */
|
|
2932
3253
|
type ItdFieldErrors = Record<string, string[]>;
|
|
2933
3254
|
/**
|
|
@@ -3004,6 +3325,13 @@ interface ItdApiErrorInit {
|
|
|
3004
3325
|
* ```
|
|
3005
3326
|
*/
|
|
3006
3327
|
declare class ItdApiError extends ItdError {
|
|
3328
|
+
/**
|
|
3329
|
+
* Разновидность ошибки: та же информация, что и класс, но пригодная для сравнения.
|
|
3330
|
+
*
|
|
3331
|
+
* Позволяет разбирать ошибку через `switch`, а проверкам вроде {@link isItdAuthError} —
|
|
3332
|
+
* работать даже когда в проекте оказались две копии библиотеки.
|
|
3333
|
+
*/
|
|
3334
|
+
readonly apiKind: ItdApiErrorKind;
|
|
3007
3335
|
/** HTTP-статус ответа. */
|
|
3008
3336
|
readonly status: number;
|
|
3009
3337
|
/** Строковый код ошибки, например `VALIDATION_ERROR`. */
|
|
@@ -3034,7 +3362,10 @@ declare class ItdApiError extends ItdError {
|
|
|
3034
3362
|
readonly rateLimit: number | undefined;
|
|
3035
3363
|
/** Сколько запросов осталось в окне — заголовок `x-ratelimit-remaining`. */
|
|
3036
3364
|
readonly rateLimitRemaining: number | undefined;
|
|
3037
|
-
|
|
3365
|
+
/**
|
|
3366
|
+
* @param apiKind разновидность; подставляется подклассами, снаружи задавать не нужно
|
|
3367
|
+
*/
|
|
3368
|
+
constructor(init: ItdApiErrorInit, apiKind?: ItdApiErrorKind);
|
|
3038
3369
|
/**
|
|
3039
3370
|
* Проверяет код ошибки. Удобнее, чем сравнивать строки вручную.
|
|
3040
3371
|
*
|
|
@@ -3139,17 +3470,31 @@ declare function isItdApiError(value: unknown): value is ItdApiError;
|
|
|
3139
3470
|
declare function isItdValidationError(value: unknown): value is ItdValidationError;
|
|
3140
3471
|
/** Ошибка авторизации: истёкший или отозванный токен. */
|
|
3141
3472
|
declare function isItdAuthError(value: unknown): value is ItdAuthError;
|
|
3473
|
+
/** Доступ запрещён либо действие ограничено настройками приватности. */
|
|
3474
|
+
declare function isItdForbiddenError(value: unknown): value is ItdForbiddenError;
|
|
3475
|
+
/** Сущность не найдена. */
|
|
3476
|
+
declare function isItdNotFoundError(value: unknown): value is ItdNotFoundError;
|
|
3477
|
+
/** Сущность уже существует. */
|
|
3478
|
+
declare function isItdConflictError(value: unknown): value is ItdConflictError;
|
|
3142
3479
|
/** Превышен лимит запросов. */
|
|
3143
3480
|
declare function isItdRateLimitError(value: unknown): value is ItdRateLimitError;
|
|
3481
|
+
/** Действие требует подтверждённого телефона. Ссылка — в `verificationUrl`. */
|
|
3482
|
+
declare function isItdPhoneVerificationError(value: unknown): value is ItdPhoneVerificationError;
|
|
3483
|
+
/** Ошибка на стороне сервера (`5xx`). */
|
|
3484
|
+
declare function isItdServerError(value: unknown): value is ItdServerError;
|
|
3144
3485
|
|
|
3145
3486
|
/** Изображения, которые принимает `POST /api/files/upload`. */
|
|
3146
|
-
declare const IMAGE_MIME_TYPES: readonly
|
|
3487
|
+
declare const IMAGE_MIME_TYPES: readonly ["image/jpeg", "image/png", "image/gif", "image/webp", "image/avif", "image/heic", "image/heif"];
|
|
3488
|
+
type ImageMimeType = (typeof IMAGE_MIME_TYPES)[number];
|
|
3147
3489
|
/** Видео, которые принимает `POST /api/files/upload`. */
|
|
3148
|
-
declare const VIDEO_MIME_TYPES: readonly
|
|
3490
|
+
declare const VIDEO_MIME_TYPES: readonly ["video/mp4", "video/webm", "video/quicktime"];
|
|
3491
|
+
type VideoMimeType = (typeof VIDEO_MIME_TYPES)[number];
|
|
3149
3492
|
/** Аудио для голосовых комментариев. */
|
|
3150
|
-
declare const AUDIO_MIME_TYPES: readonly
|
|
3493
|
+
declare const AUDIO_MIME_TYPES: readonly ["audio/ogg"];
|
|
3494
|
+
type AudioMimeType = (typeof AUDIO_MIME_TYPES)[number];
|
|
3151
3495
|
/** Все типы, которые принимает загрузка. */
|
|
3152
|
-
declare const ALLOWED_MIME_TYPES: readonly
|
|
3496
|
+
declare const ALLOWED_MIME_TYPES: readonly ["image/jpeg", "image/png", "image/gif", "image/webp", "image/avif", "image/heic", "image/heif", "video/mp4", "video/webm", "video/quicktime", "audio/ogg"];
|
|
3497
|
+
type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number];
|
|
3153
3498
|
|
|
3154
3499
|
/**
|
|
3155
3500
|
* Собирает текст уведомления на русском.
|
|
@@ -3235,4 +3580,4 @@ interface SseTransportOptions {
|
|
|
3235
3580
|
idleTimeout?: number;
|
|
3236
3581
|
}
|
|
3237
3582
|
|
|
3238
|
-
export {
|
|
3583
|
+
export { IMAGE_MIME_TYPES as $, ALLOWED_MIME_TYPES as A, type BuilderInput as B, type CaptchaCredentials as C, type CreatePollInput as D, type CreatePostInput as E, type FileReader as F, type CreateReportInput as G, type Credentials as H, type ItdSession as I, type CredentialsAuth as J, DEFAULT_BASE_URL as K, DEFAULT_TIMEOUT as L, DEFAULT_USER_AGENT as M, DEVICE_ID_HEADER as N, DetectedRuntime as O, type DwellEntry as P, type ErrorContextHook as Q, type FeedParams as R, FeedTab as S, type TokenStorage as T, type FileInput as U, FilesResource as V, type FollowResult as W, type ForgotPasswordInput as X, type Hashtag as Y, type HashtagPostsParams as Z, HashtagsResource as _, ItdClient as a, type Profile as a$, type ImageMimeType as a0, type InteractionEntry as a1, type IsoDate as a2, ItdAbortError as a3, ItdApiError as a4, type ItdApiErrorInit as a5, ItdApiErrorKind as a6, ItdAuthError as a7, type ItdBuilder as a8, ItdConfigError as a9, type NotificationEvent as aA, type NotificationListParams as aB, type NotificationSettings as aC, NotificationType as aD, NotificationsResource as aE, OAuthProvider as aF, type Page as aG, type PageState as aH, PaginationMode as aI, Paginator as aJ, type PaymentMethod as aK, type Pin as aL, type PinPostResult as aM, type PinsResult as aN, PlatformResource as aO, type Poll as aP, PollBuilder as aQ, type PollInput as aR, type PollOption as aS, type PollTransportOptions as aT, type Portal as aU, type Post as aV, PostBuilder as aW, type PostInput as aX, type PostStats as aY, PostsResource as aZ, type PrivacySettings as a_, ItdConflictError as aa, ItdError as ab, ItdErrorCode as ac, ItdErrorKind as ad, type ItdFieldErrors as ae, ItdForbiddenError as af, ItdNetworkError as ag, ItdNotFoundError as ah, ItdPhoneVerificationError as ai, ItdRateLimitError as aj, ItdRealtime as ak, ItdServerError as al, ItdTimeoutError as am, ItdValidationError as an, LIBRARY_VERSION as ao, type LikeResult as ap, LikesVisibility as aq, type Listener as ar, LocalStorageTokenStorage as as, type Logger as at, type Loose as au, MAX_RECONNECT_ATTEMPTS as av, MemoryTokenStorage as aw, type MyProfile as ax, NOTIFICATION_TYPE_ALIASES as ay, type Notification as az, type ItdClientOptions as b, formatNotificationText as b$, type PublicProfile as b0, RECONNECT_BACKOFF as b1, RECONNECT_JITTER as b2, REFRESH_COOKIE as b3, REFRESH_COOKIE_PATH as b4, type RateLimitOptions as b5, type RawRequestOptions as b6, type RealtimeEvents as b7, type RealtimeOptions as b8, RealtimeStatus as b9, SubscriptionResource as bA, type SubscriptionState as bB, TURNSTILE_SITE_KEY as bC, TelemetryResource as bD, type TransportContext as bE, type TransportEvent as bF, UnauthorizedStreamError as bG, type Unsubscribe as bH, type UpdateNotificationSettingsInput as bI, type UpdatePrivacyInput as bJ, type UpdateProfileInput as bK, type UploadOptions as bL, type UploadedFile as bM, type UserId as bN, type UserListParams as bO, type UserPostsParams as bP, type UserRef as bQ, type UserSummary as bR, UsersResource as bS, VIDEO_MIME_TYPES as bT, VerificationResource as bU, type VerificationStatus as bV, type VideoMimeType as bW, WallAccess as bX, canonicalNotificationType as bY, comment as bZ, createTokenStorage as b_, type RealtimeTransport as ba, RealtimeTransportKind as bb, type ReconnectOptions as bc, type RepliesParams as bd, type Report as be, ReportBuilder as bf, type ReportInput as bg, ReportReason as bh, ReportTargetType as bi, ReportsResource as bj, type RequestContext as bk, type RequestOptions as bl, type ResetPasswordInput as bm, type ResponseContext as bn, type RetryContext as bo, type RetryOptions as bp, RuntimeMode as bq, STREAM_PATH as br, SearchResource as bs, type SearchResult as bt, type Session as bu, type SignInResult as bv, SignInStatus as bw, type Span as bx, type SseTransportOptions as by, type Subscription as bz, AUDIO_MIME_TYPES as c, isBuilder as c0, isItdApiError as c1, isItdAuthError as c2, isItdConflictError as c3, isItdError as c4, isItdForbiddenError as c5, isItdNotFoundError as c6, isItdPhoneVerificationError as c7, isItdRateLimitError as c8, isItdServerError as c9, isItdValidationError as ca, isKnownNotificationType as cb, isMyProfile as cc, normalizeNotification as cd, poll as ce, post as cf, readNotificationEvent as cg, readUnreadCountEvent as ch, report as ci, resolveNotificationUrl as cj, toDate as ck, createClient as cl, AUTH_FLAG_COOKIE as d, AUTH_PATHS as e, type Actor as f, type AllowedMimeType as g, type Announcement as h, type AnnouncementButton as i, type Attachment as j, AttachmentType as k, type AudioMimeType as l, type AuthInput as m, AuthResource as n, type Author as o, type ChangelogEntry as p, type Clan as q, type ClientHooks as r, type Comment as s, CommentBuilder as t, type CommentInput as u, type CommentReplyTo as v, CommentSort as w, type CommentsParams as x, CommentsResource as y, type CreateCommentInput as z };
|