itd-api 0.0.3 → 0.0.5
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 -25
- package/dist/{chunk-JIT55WDH.js → chunk-RUPF4X5L.js} +351 -184
- package/dist/chunk-RUPF4X5L.js.map +1 -0
- package/dist/{chunk-3ODOEKQO.cjs → chunk-YM2YUO4D.cjs} +364 -183
- package/dist/chunk-YM2YUO4D.cjs.map +1 -0
- package/dist/{index-BCuk8jNA.d.cts → index-Dv0LXpMf.d.cts} +216 -42
- package/dist/{index-BCuk8jNA.d.ts → index-Dv0LXpMf.d.ts} +216 -42
- package/dist/index.cjs +126 -70
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.cjs +125 -69
- 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 +7 -3
- package/dist/chunk-3ODOEKQO.cjs.map +0 -1
- package/dist/chunk-JIT55WDH.js.map +0 -1
|
@@ -1075,7 +1075,23 @@ type ReportInput = BuilderInput<CreateReportInput, ReportBuilder>;
|
|
|
1075
1075
|
* - `server` — cookie ведёт встроенный jar, заголовок `Cookie` подставляется вручную;
|
|
1076
1076
|
* - `auto` — определяется по среде исполнения (значение по умолчанию).
|
|
1077
1077
|
*/
|
|
1078
|
-
|
|
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];
|
|
1079
1095
|
|
|
1080
1096
|
/**
|
|
1081
1097
|
* Сохранённая сессия.
|
|
@@ -1197,8 +1213,12 @@ interface CredentialsAuth {
|
|
|
1197
1213
|
/**
|
|
1198
1214
|
* Как клиент получает доступ к API.
|
|
1199
1215
|
*
|
|
1200
|
-
*
|
|
1201
|
-
*
|
|
1216
|
+
* Четыре формы — от разового вызова с готовым токеном до полноценной сессии, которую
|
|
1217
|
+
* библиотека заводит и продлевает сама.
|
|
1218
|
+
*
|
|
1219
|
+
* Опция необязательна: если {@link ItdClientOptions.storage} уже содержит сессию, доступ
|
|
1220
|
+
* берётся оттуда. Когда заданы обе, хранилище главнее — оно отражает текущее состояние
|
|
1221
|
+
* сессии, — а недостающие поля берутся отсюда.
|
|
1202
1222
|
*
|
|
1203
1223
|
* @example
|
|
1204
1224
|
* ```ts
|
|
@@ -1400,6 +1420,14 @@ interface RawRequestOptions extends RequestOptions {
|
|
|
1400
1420
|
skipAuth?: boolean | undefined;
|
|
1401
1421
|
/** Не пытаться обновить токен при `401` — используется самими эндпоинтами авторизации. */
|
|
1402
1422
|
skipAuthRefresh?: boolean | undefined;
|
|
1423
|
+
/**
|
|
1424
|
+
* Выполнить запрос мимо очереди.
|
|
1425
|
+
*
|
|
1426
|
+
* Нужно запросам, которые слой авторизации делает **изнутри** другого запроса: продление
|
|
1427
|
+
* токена и отложенный вход. Такой запрос обязан стартовать, пока исходный держит место
|
|
1428
|
+
* в очереди и ждёт его результата, — иначе оба ждут друг друга и не завершатся никогда.
|
|
1429
|
+
*/
|
|
1430
|
+
skipQueue?: boolean | undefined;
|
|
1403
1431
|
/** Вернуть тело ответа без снятия обёртки `{ data: … }`. */
|
|
1404
1432
|
raw?: boolean | undefined;
|
|
1405
1433
|
}
|
|
@@ -1408,8 +1436,10 @@ interface RawRequestOptions extends RequestOptions {
|
|
|
1408
1436
|
declare const DEFAULT_BASE_URL = "https://xn--d1ah4a.com";
|
|
1409
1437
|
/** Таймаут запроса по умолчанию. Столько же использует официальный клиент итд.com. */
|
|
1410
1438
|
declare const DEFAULT_TIMEOUT = 30000;
|
|
1411
|
-
/**
|
|
1412
|
-
|
|
1439
|
+
/**
|
|
1440
|
+
* Версия библиотеки — попадает в `User-Agent`.
|
|
1441
|
+
*/
|
|
1442
|
+
declare const LIBRARY_VERSION = "0.0.5";
|
|
1413
1443
|
/**
|
|
1414
1444
|
* `User-Agent` по умолчанию.
|
|
1415
1445
|
*
|
|
@@ -1420,7 +1450,7 @@ declare const LIBRARY_VERSION = "0.0.2";
|
|
|
1420
1450
|
* В браузере заголовок не выставляется — `User-Agent` там запрещён к изменению, и среда
|
|
1421
1451
|
* молча его игнорирует.
|
|
1422
1452
|
*/
|
|
1423
|
-
declare const DEFAULT_USER_AGENT = "Mozilla/5.0 (compatible; itd-api/0.0.
|
|
1453
|
+
declare const DEFAULT_USER_AGENT = "Mozilla/5.0 (compatible; itd-api/0.0.5; +https://github.com/KiowDev/itd-api)";
|
|
1424
1454
|
/**
|
|
1425
1455
|
* Настройки повторов со всеми значениями по умолчанию.
|
|
1426
1456
|
*
|
|
@@ -1712,11 +1742,14 @@ declare class AuthManager {
|
|
|
1712
1742
|
/**
|
|
1713
1743
|
* Есть ли признак живой refresh-сессии.
|
|
1714
1744
|
*
|
|
1715
|
-
*
|
|
1716
|
-
*
|
|
1745
|
+
* Рядом с refresh-токеном сервер ставит незакрытую cookie `is_auth` — по ней видно,
|
|
1746
|
+
* что продлевать сессию вообще есть смысл, и API не дёргается у анонимов.
|
|
1717
1747
|
* В браузере cookie ведёт сама среда, поэтому там ответ всегда `true`.
|
|
1748
|
+
*
|
|
1749
|
+
* Асинхронный, потому что признак может лежать в {@link TokenStorage}: до чтения оттуда
|
|
1750
|
+
* ответ был бы `false` даже при полностью рабочей сохранённой сессии.
|
|
1718
1751
|
*/
|
|
1719
|
-
hasRefreshSession(): boolean
|
|
1752
|
+
hasRefreshSession(): Promise<boolean>;
|
|
1720
1753
|
/** Заголовки авторизации для очередного запроса. Пустой объект, если токена нет. */
|
|
1721
1754
|
getAuthHeaders(): Promise<Record<string, string>>;
|
|
1722
1755
|
/**
|
|
@@ -1883,6 +1916,10 @@ interface RealtimeTransport {
|
|
|
1883
1916
|
*/
|
|
1884
1917
|
connect(context: TransportContext): Promise<void>;
|
|
1885
1918
|
}
|
|
1919
|
+
/** Ошибка, по которой видно, что сервер отверг авторизацию потока. */
|
|
1920
|
+
declare class UnauthorizedStreamError extends Error {
|
|
1921
|
+
constructor();
|
|
1922
|
+
}
|
|
1886
1923
|
|
|
1887
1924
|
/** События потока уведомлений. */
|
|
1888
1925
|
interface RealtimeEvents {
|
|
@@ -1930,7 +1967,15 @@ interface RealtimeEvents {
|
|
|
1930
1967
|
};
|
|
1931
1968
|
}
|
|
1932
1969
|
/** Способ получения событий. */
|
|
1933
|
-
|
|
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];
|
|
1934
1979
|
/** Настройки потока уведомлений. */
|
|
1935
1980
|
interface RealtimeOptions extends ReconnectOptions {
|
|
1936
1981
|
/**
|
|
@@ -2055,7 +2100,15 @@ interface Page<T> {
|
|
|
2055
2100
|
raw: unknown;
|
|
2056
2101
|
}
|
|
2057
2102
|
/** Схема пагинации эндпоинта. */
|
|
2058
|
-
|
|
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];
|
|
2059
2112
|
/** Позиция, с которой запрашивается очередная страница. */
|
|
2060
2113
|
interface PageState {
|
|
2061
2114
|
cursor?: string | undefined;
|
|
@@ -2067,6 +2120,13 @@ interface PaginatorOptions<T> {
|
|
|
2067
2120
|
mode: PaginationMode;
|
|
2068
2121
|
/** Загружает одну страницу для указанной позиции. */
|
|
2069
2122
|
load: (state: PageState) => Promise<Page<T>>;
|
|
2123
|
+
/**
|
|
2124
|
+
* С какой позиции начать. По умолчанию с начала списка.
|
|
2125
|
+
*
|
|
2126
|
+
* Нужно, чтобы перебор можно было продолжить с сохранённого курсора, а не только
|
|
2127
|
+
* начать заново.
|
|
2128
|
+
*/
|
|
2129
|
+
start?: PageState | undefined;
|
|
2070
2130
|
/**
|
|
2071
2131
|
* Предохранитель от бесконечного перебора. По умолчанию 1000.
|
|
2072
2132
|
*
|
|
@@ -2083,6 +2143,10 @@ interface PaginatorOptions<T> {
|
|
|
2083
2143
|
* Скрывает различия трёх схем пагинации: перебор элементов, страниц и сбор в массив
|
|
2084
2144
|
* выглядят одинаково независимо от эндпоинта.
|
|
2085
2145
|
*
|
|
2146
|
+
* **Одноразовый.** Позиция хранится внутри, поэтому повторный перебор того же объекта
|
|
2147
|
+
* ничего не вернёт: он продолжится с места, где закончился прошлый. Нужен второй проход —
|
|
2148
|
+
* возьмите новый перебор у того же метода ресурса.
|
|
2149
|
+
*
|
|
2086
2150
|
* @example Перебор элементов
|
|
2087
2151
|
* ```ts
|
|
2088
2152
|
* for await (const post of itd.posts.iterate({ tab: 'following' })) {
|
|
@@ -2139,9 +2203,11 @@ declare class BaseResource {
|
|
|
2139
2203
|
*
|
|
2140
2204
|
* @param mode схема пагинации эндпоинта
|
|
2141
2205
|
* @param load загружает одну страницу для указанной позиции
|
|
2206
|
+
* @param options `maxPages` и `signal`, а также `start` — позиция, с которой продолжить
|
|
2142
2207
|
*/
|
|
2143
2208
|
protected paginate<T>(mode: PaginationMode, load: (state: PageState) => Promise<Page<T>>, options?: RequestOptions & {
|
|
2144
2209
|
maxPages?: number;
|
|
2210
|
+
start?: PageState;
|
|
2145
2211
|
}): Paginator<T>;
|
|
2146
2212
|
}
|
|
2147
2213
|
|
|
@@ -2177,6 +2243,18 @@ interface ResetPasswordInput {
|
|
|
2177
2243
|
flowToken: string;
|
|
2178
2244
|
newPassword: string;
|
|
2179
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];
|
|
2180
2258
|
/**
|
|
2181
2259
|
* Результат входа.
|
|
2182
2260
|
*
|
|
@@ -2184,14 +2262,12 @@ interface ResetPasswordInput {
|
|
|
2184
2262
|
* объединение делает оба случая явными.
|
|
2185
2263
|
*/
|
|
2186
2264
|
type SignInResult = {
|
|
2187
|
-
status:
|
|
2265
|
+
status: typeof SignInStatus.Authenticated;
|
|
2188
2266
|
accessToken: string;
|
|
2189
2267
|
} | {
|
|
2190
|
-
status:
|
|
2268
|
+
status: typeof SignInStatus.OtpRequired;
|
|
2191
2269
|
flowToken: string | undefined;
|
|
2192
2270
|
};
|
|
2193
|
-
/** Провайдер внешнего входа. */
|
|
2194
|
-
type OAuthProvider = 'yandex' | 'google';
|
|
2195
2271
|
/**
|
|
2196
2272
|
* Авторизация, сессии и пароли.
|
|
2197
2273
|
*
|
|
@@ -2264,11 +2340,20 @@ declare class AuthResource extends BaseResource {
|
|
|
2264
2340
|
/**
|
|
2265
2341
|
* Есть ли признак живой сессии обновления.
|
|
2266
2342
|
*
|
|
2267
|
-
* Проверяет cookie `is_auth`, которую сервер ставит рядом с refresh
|
|
2268
|
-
* не дёргать API у неавторизованного
|
|
2269
|
-
* 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
|
+
* ```
|
|
2270
2355
|
*/
|
|
2271
|
-
hasRefreshSession(): boolean
|
|
2356
|
+
hasRefreshSession(): Promise<boolean>;
|
|
2272
2357
|
/** Завершает текущую сессию на сервере и очищает локальную. */
|
|
2273
2358
|
logout(options?: RequestOptions): Promise<void>;
|
|
2274
2359
|
/**
|
|
@@ -2469,8 +2554,6 @@ declare class FilesResource extends BaseResource {
|
|
|
2469
2554
|
get(fileId: string, options?: RequestOptions): Promise<unknown>;
|
|
2470
2555
|
/** Удаляет загруженный файл. */
|
|
2471
2556
|
remove(fileId: string, options?: RequestOptions): Promise<void>;
|
|
2472
|
-
/** Приводит любой поддерживаемый вход к `Blob` с именем и проверенным типом. */
|
|
2473
|
-
private prepare;
|
|
2474
2557
|
}
|
|
2475
2558
|
|
|
2476
2559
|
/** Параметры запроса постов по хэштегу. */
|
|
@@ -2662,6 +2745,7 @@ type UpdateNotificationSettingsInput = Partial<NotificationSettings>;
|
|
|
2662
2745
|
* объекты отсюда и из потока событий можно складывать в один список.
|
|
2663
2746
|
*/
|
|
2664
2747
|
declare class NotificationsResource extends BaseResource {
|
|
2748
|
+
#private;
|
|
2665
2749
|
/**
|
|
2666
2750
|
* Загружает страницу уведомлений.
|
|
2667
2751
|
*
|
|
@@ -2834,9 +2918,18 @@ declare class PostsResource extends BaseResource {
|
|
|
2834
2918
|
vote(postId: string, optionIds: string[], options?: RequestOptions): Promise<Poll>;
|
|
2835
2919
|
/** Запрашивает счётчики сразу для нескольких постов. */
|
|
2836
2920
|
stats(ids: string[], options?: RequestOptions): Promise<PostStats[]>;
|
|
2837
|
-
/**
|
|
2921
|
+
/**
|
|
2922
|
+
* Загружает страницу стены пользователя.
|
|
2923
|
+
*
|
|
2924
|
+
* Это **не только его собственные посты**: сюда попадают и записи, которые другие
|
|
2925
|
+
* оставили на его стене — у них `author` чужой, а `wallRecipient` указывает на владельца
|
|
2926
|
+
* стены. Поэтому число записей обычно больше, чем `postsCount` из профиля; чтобы
|
|
2927
|
+
* получить только авторские посты, отфильтруйте по `post.author.id`.
|
|
2928
|
+
*
|
|
2929
|
+
* Принимает и UUID, и имя пользователя.
|
|
2930
|
+
*/
|
|
2838
2931
|
byUser(user: UserRef, params?: UserPostsParams): Promise<Page<Post>>;
|
|
2839
|
-
/** Перебирает
|
|
2932
|
+
/** Перебирает стену пользователя. Что именно в неё входит — см. {@link byUser}. */
|
|
2840
2933
|
iterateByUser(user: UserRef, params?: UserPostsParams): Paginator<Post>;
|
|
2841
2934
|
/** Загружает страницу постов, которые пользователь отметил реакцией. */
|
|
2842
2935
|
likedByUser(user: UserRef, params?: UserPostsParams): Promise<Page<Post>>;
|
|
@@ -2875,9 +2968,16 @@ declare class PostsResource extends BaseResource {
|
|
|
2875
2968
|
voiceComment(postId: string, audio: FileInput, options?: RequestOptions): Promise<Comment>;
|
|
2876
2969
|
}
|
|
2877
2970
|
|
|
2878
|
-
/**
|
|
2971
|
+
/**
|
|
2972
|
+
* Параметры списков пользователей.
|
|
2973
|
+
*
|
|
2974
|
+
* ⚠️ Списки подписчиков, подписок и заблокированных на сервере **не листаются**:
|
|
2975
|
+
* `page` он игнорирует, а `limit` зажимает на 20. Подробности — в {@link UsersResource.followers}.
|
|
2976
|
+
*/
|
|
2879
2977
|
interface UserListParams extends RequestOptions {
|
|
2978
|
+
/** Сколько записей вернуть. Значения больше 20 сервер молча уменьшает до 20. */
|
|
2880
2979
|
limit?: number;
|
|
2980
|
+
/** Номер страницы. Сервер его игнорирует — оставлен на случай, если пагинацию починят. */
|
|
2881
2981
|
page?: number;
|
|
2882
2982
|
maxPages?: number;
|
|
2883
2983
|
}
|
|
@@ -2935,10 +3035,7 @@ declare class UsersResource extends BaseResource {
|
|
|
2935
3035
|
/** Загружает рекомендации, на кого подписаться. */
|
|
2936
3036
|
whoToFollow(options?: RequestOptions): Promise<UserSummary[]>;
|
|
2937
3037
|
/** Загружает рейтинг кланов. */
|
|
2938
|
-
topClans(options?: RequestOptions): Promise<
|
|
2939
|
-
avatar: string;
|
|
2940
|
-
memberCount: number;
|
|
2941
|
-
}[]>;
|
|
3038
|
+
topClans(options?: RequestOptions): Promise<Clan[]>;
|
|
2942
3039
|
/**
|
|
2943
3040
|
* Подписывается на пользователя.
|
|
2944
3041
|
*
|
|
@@ -2947,13 +3044,28 @@ declare class UsersResource extends BaseResource {
|
|
|
2947
3044
|
follow(user: UserRef, options?: RequestOptions): Promise<FollowResult>;
|
|
2948
3045
|
/** Отписывается от пользователя. */
|
|
2949
3046
|
unfollow(user: UserRef, options?: RequestOptions): Promise<void>;
|
|
2950
|
-
/**
|
|
3047
|
+
/**
|
|
3048
|
+
* Загружает подписчиков пользователя.
|
|
3049
|
+
*
|
|
3050
|
+
* ⚠️ **Сервер этот список не листает.** Возвращаются первые 20 записей и только они:
|
|
3051
|
+
* параметр `page` игнорируется (любая страница отдаёт те же записи и `pagination.page: 1`),
|
|
3052
|
+
* `limit` больше 20 молча уменьшается, а `hasMore` всегда `false`. Последнее честно —
|
|
3053
|
+
* получить продолжение нечем.
|
|
3054
|
+
*
|
|
3055
|
+
* Числу `total` доверять тоже не стоит: оно расходится с `followersCount` из профиля —
|
|
3056
|
+
* на проверенных аккаунтах занижено примерно на 1–4%.
|
|
3057
|
+
*/
|
|
2951
3058
|
followers(user: UserRef, params?: UserListParams): Promise<Page<UserSummary>>;
|
|
2952
|
-
/**
|
|
3059
|
+
/**
|
|
3060
|
+
* Перебирает подписчиков.
|
|
3061
|
+
*
|
|
3062
|
+
* ⚠️ Перебор закончится после первых 20 записей: сервер список не листает —
|
|
3063
|
+
* см. {@link followers}. Метод оставлен на случай, если пагинацию починят.
|
|
3064
|
+
*/
|
|
2953
3065
|
iterateFollowers(user: UserRef, params?: UserListParams): Paginator<UserSummary>;
|
|
2954
|
-
/** Загружает
|
|
3066
|
+
/** Загружает подписки пользователя. Ограничения те же, что у {@link followers}. */
|
|
2955
3067
|
following(user: UserRef, params?: UserListParams): Promise<Page<UserSummary>>;
|
|
2956
|
-
/** Перебирает подписки. */
|
|
3068
|
+
/** Перебирает подписки. Закончится после первых 20 записей — см. {@link followers}. */
|
|
2957
3069
|
iterateFollowing(user: UserRef, params?: UserListParams): Paginator<UserSummary>;
|
|
2958
3070
|
/**
|
|
2959
3071
|
* Проверяет, подписаны ли вы, сразу для нескольких пользователей.
|
|
@@ -2971,9 +3083,9 @@ declare class UsersResource extends BaseResource {
|
|
|
2971
3083
|
block(user: UserRef, options?: RequestOptions): Promise<void>;
|
|
2972
3084
|
/** Снимает блокировку. */
|
|
2973
3085
|
unblock(user: UserRef, options?: RequestOptions): Promise<void>;
|
|
2974
|
-
/** Загружает
|
|
3086
|
+
/** Загружает заблокированных пользователей. Ограничения те же, что у {@link followers}. */
|
|
2975
3087
|
blocked(params?: UserListParams): Promise<Page<UserSummary>>;
|
|
2976
|
-
/** Перебирает
|
|
3088
|
+
/** Перебирает заблокированных. Закончится после первых 20 записей — см. {@link followers}. */
|
|
2977
3089
|
iterateBlocked(params?: UserListParams): Paginator<UserSummary>;
|
|
2978
3090
|
/** Загружает настройки приватности. */
|
|
2979
3091
|
getPrivacy(options?: RequestOptions): Promise<PrivacySettings>;
|
|
@@ -3009,6 +3121,8 @@ declare class UsersResource extends BaseResource {
|
|
|
3009
3121
|
* import { FileTokenStorage } from 'itd-api/node';
|
|
3010
3122
|
*
|
|
3011
3123
|
* const itd = new ItdClient({
|
|
3124
|
+
* // `auth` не обязателен: когда хранилище уже содержит сессию, токен берётся оттуда,
|
|
3125
|
+
* // а истёкший продлевается сам. Здесь он нужен на первый запуск.
|
|
3012
3126
|
* // Вход по паролю требует токена капчи — см. AuthInput и TURNSTILE_SITE_KEY.
|
|
3013
3127
|
* auth: { email, password, getTurnstileToken },
|
|
3014
3128
|
* storage: new FileTokenStorage('./.itd-session.json'),
|
|
@@ -3128,8 +3242,44 @@ declare function createClient(options?: ItdClientOptions): ItdClient;
|
|
|
3128
3242
|
|
|
3129
3243
|
/** Бренд, по которому ошибки библиотеки распознаются надёжнее, чем через `instanceof`. */
|
|
3130
3244
|
declare const ITD_ERROR: unique symbol;
|
|
3131
|
-
/**
|
|
3132
|
-
|
|
3245
|
+
/**
|
|
3246
|
+
* Категория ошибки. Определяет, какие поля у неё есть.
|
|
3247
|
+
*
|
|
3248
|
+
* Значение, а не только тип: категорию нужно с чем-то сравнивать в рантайме.
|
|
3249
|
+
*/
|
|
3250
|
+
declare const ItdErrorKind: Readonly<{
|
|
3251
|
+
/** Сервер ответил статусом ≥ 400. */
|
|
3252
|
+
readonly Api: "api";
|
|
3253
|
+
/** Запрос не дошёл до сервера. */
|
|
3254
|
+
readonly Network: "network";
|
|
3255
|
+
/** Истёк таймаут запроса. */
|
|
3256
|
+
readonly Timeout: "timeout";
|
|
3257
|
+
/** Запрос отменён через `AbortSignal`. */
|
|
3258
|
+
readonly Abort: "abort";
|
|
3259
|
+
/** Некорректная конфигурация или аргументы — обнаружено до обращения к сети. */
|
|
3260
|
+
readonly Config: "config";
|
|
3261
|
+
}>;
|
|
3262
|
+
type ItdErrorKind = (typeof ItdErrorKind)[keyof typeof ItdErrorKind];
|
|
3263
|
+
/**
|
|
3264
|
+
* Разновидность ошибки API — то же, что класс ошибки, но в виде данных.
|
|
3265
|
+
*
|
|
3266
|
+
* Существует потому, что `instanceof` подводит, когда в дереве зависимостей оказались
|
|
3267
|
+
* две копии пакета или смешаны сборки ESM и CJS: классы тогда разные, хотя ошибка та же.
|
|
3268
|
+
* Проверки {@link isItdValidationError} и соседние опираются на это поле, а не на класс.
|
|
3269
|
+
*/
|
|
3270
|
+
declare const ItdApiErrorKind: Readonly<{
|
|
3271
|
+
/** Ни одна из специализаций не подошла. */
|
|
3272
|
+
readonly Generic: "generic";
|
|
3273
|
+
readonly Validation: "validation";
|
|
3274
|
+
readonly Auth: "auth";
|
|
3275
|
+
readonly Forbidden: "forbidden";
|
|
3276
|
+
readonly NotFound: "not_found";
|
|
3277
|
+
readonly Conflict: "conflict";
|
|
3278
|
+
readonly RateLimit: "rate_limit";
|
|
3279
|
+
readonly PhoneVerification: "phone_verification";
|
|
3280
|
+
readonly Server: "server";
|
|
3281
|
+
}>;
|
|
3282
|
+
type ItdApiErrorKind = (typeof ItdApiErrorKind)[keyof typeof ItdApiErrorKind];
|
|
3133
3283
|
/** Ошибки по полям формы: `{ email: ['уже занят'] }`. */
|
|
3134
3284
|
type ItdFieldErrors = Record<string, string[]>;
|
|
3135
3285
|
/**
|
|
@@ -3206,6 +3356,13 @@ interface ItdApiErrorInit {
|
|
|
3206
3356
|
* ```
|
|
3207
3357
|
*/
|
|
3208
3358
|
declare class ItdApiError extends ItdError {
|
|
3359
|
+
/**
|
|
3360
|
+
* Разновидность ошибки: та же информация, что и класс, но пригодная для сравнения.
|
|
3361
|
+
*
|
|
3362
|
+
* Позволяет разбирать ошибку через `switch`, а проверкам вроде {@link isItdAuthError} —
|
|
3363
|
+
* работать даже когда в проекте оказались две копии библиотеки.
|
|
3364
|
+
*/
|
|
3365
|
+
readonly apiKind: ItdApiErrorKind;
|
|
3209
3366
|
/** HTTP-статус ответа. */
|
|
3210
3367
|
readonly status: number;
|
|
3211
3368
|
/** Строковый код ошибки, например `VALIDATION_ERROR`. */
|
|
@@ -3236,7 +3393,10 @@ declare class ItdApiError extends ItdError {
|
|
|
3236
3393
|
readonly rateLimit: number | undefined;
|
|
3237
3394
|
/** Сколько запросов осталось в окне — заголовок `x-ratelimit-remaining`. */
|
|
3238
3395
|
readonly rateLimitRemaining: number | undefined;
|
|
3239
|
-
|
|
3396
|
+
/**
|
|
3397
|
+
* @param apiKind разновидность; подставляется подклассами, снаружи задавать не нужно
|
|
3398
|
+
*/
|
|
3399
|
+
constructor(init: ItdApiErrorInit, apiKind?: ItdApiErrorKind);
|
|
3240
3400
|
/**
|
|
3241
3401
|
* Проверяет код ошибки. Удобнее, чем сравнивать строки вручную.
|
|
3242
3402
|
*
|
|
@@ -3341,17 +3501,31 @@ declare function isItdApiError(value: unknown): value is ItdApiError;
|
|
|
3341
3501
|
declare function isItdValidationError(value: unknown): value is ItdValidationError;
|
|
3342
3502
|
/** Ошибка авторизации: истёкший или отозванный токен. */
|
|
3343
3503
|
declare function isItdAuthError(value: unknown): value is ItdAuthError;
|
|
3504
|
+
/** Доступ запрещён либо действие ограничено настройками приватности. */
|
|
3505
|
+
declare function isItdForbiddenError(value: unknown): value is ItdForbiddenError;
|
|
3506
|
+
/** Сущность не найдена. */
|
|
3507
|
+
declare function isItdNotFoundError(value: unknown): value is ItdNotFoundError;
|
|
3508
|
+
/** Сущность уже существует. */
|
|
3509
|
+
declare function isItdConflictError(value: unknown): value is ItdConflictError;
|
|
3344
3510
|
/** Превышен лимит запросов. */
|
|
3345
3511
|
declare function isItdRateLimitError(value: unknown): value is ItdRateLimitError;
|
|
3512
|
+
/** Действие требует подтверждённого телефона. Ссылка — в `verificationUrl`. */
|
|
3513
|
+
declare function isItdPhoneVerificationError(value: unknown): value is ItdPhoneVerificationError;
|
|
3514
|
+
/** Ошибка на стороне сервера (`5xx`). */
|
|
3515
|
+
declare function isItdServerError(value: unknown): value is ItdServerError;
|
|
3346
3516
|
|
|
3347
3517
|
/** Изображения, которые принимает `POST /api/files/upload`. */
|
|
3348
|
-
declare const IMAGE_MIME_TYPES: readonly
|
|
3518
|
+
declare const IMAGE_MIME_TYPES: readonly ["image/jpeg", "image/png", "image/gif", "image/webp", "image/avif", "image/heic", "image/heif"];
|
|
3519
|
+
type ImageMimeType = (typeof IMAGE_MIME_TYPES)[number];
|
|
3349
3520
|
/** Видео, которые принимает `POST /api/files/upload`. */
|
|
3350
|
-
declare const VIDEO_MIME_TYPES: readonly
|
|
3521
|
+
declare const VIDEO_MIME_TYPES: readonly ["video/mp4", "video/webm", "video/quicktime"];
|
|
3522
|
+
type VideoMimeType = (typeof VIDEO_MIME_TYPES)[number];
|
|
3351
3523
|
/** Аудио для голосовых комментариев. */
|
|
3352
|
-
declare const AUDIO_MIME_TYPES: readonly
|
|
3524
|
+
declare const AUDIO_MIME_TYPES: readonly ["audio/ogg"];
|
|
3525
|
+
type AudioMimeType = (typeof AUDIO_MIME_TYPES)[number];
|
|
3353
3526
|
/** Все типы, которые принимает загрузка. */
|
|
3354
|
-
declare const ALLOWED_MIME_TYPES: readonly
|
|
3527
|
+
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"];
|
|
3528
|
+
type AllowedMimeType = (typeof ALLOWED_MIME_TYPES)[number];
|
|
3355
3529
|
|
|
3356
3530
|
/**
|
|
3357
3531
|
* Собирает текст уведомления на русском.
|
|
@@ -3437,4 +3611,4 @@ interface SseTransportOptions {
|
|
|
3437
3611
|
idleTimeout?: number;
|
|
3438
3612
|
}
|
|
3439
3613
|
|
|
3440
|
-
export {
|
|
3614
|
+
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 };
|