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.
@@ -1075,7 +1075,23 @@ type ReportInput = BuilderInput<CreateReportInput, ReportBuilder>;
1075
1075
  * - `server` — cookie ведёт встроенный jar, заголовок `Cookie` подставляется вручную;
1076
1076
  * - `auto` — определяется по среде исполнения (значение по умолчанию).
1077
1077
  */
1078
- type RuntimeMode = 'auto' | 'browser' | 'server';
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
- /** Версия библиотеки. Держится в синхронизации с `package.json` вручную — см. `npm version`. */
1412
- declare const LIBRARY_VERSION = "0.0.2";
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.2; +https://github.com/KiowDev/itd-api)";
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
- * Сайт итд.com ставит рядом с refresh-токеном незакрытую cookie `is_auth` — по ней клиент
1716
- * понимает, что обновление вообще имеет смысл, и не дёргает API у анонимов.
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
- type RealtimeTransportKind = 'auto' | 'sse' | 'poll';
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
- type PaginationMode = 'cursor' | 'page' | 'offset';
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: 'authenticated';
2265
+ status: typeof SignInStatus.Authenticated;
2188
2266
  accessToken: string;
2189
2267
  } | {
2190
- status: 'otp_required';
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 у неавторизованного пользователя. В браузере всегда `true`:
2269
- * cookie ведёт сама среда, и прочитать её из JS нельзя.
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
- type ItdErrorKind = 'api' | 'network' | 'timeout' | 'abort' | 'config';
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
- constructor(init: ItdApiErrorInit);
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 string[];
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 string[];
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 string[];
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 string[];
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 { ItdAbortError as $, ALLOWED_MIME_TYPES as A, type BuilderInput as B, type CaptchaCredentials as C, type CreateReportInput as D, type Credentials as E, type FileReader as F, type CredentialsAuth as G, DEFAULT_BASE_URL as H, type ItdSession as I, DEFAULT_TIMEOUT as J, DEFAULT_USER_AGENT as K, DEVICE_ID_HEADER as L, type DwellEntry as M, type ErrorContextHook as N, type FeedParams as O, FeedTab as P, type FileInput as Q, FilesResource as R, type FollowResult as S, type TokenStorage as T, type ForgotPasswordInput as U, type Hashtag as V, type HashtagPostsParams as W, HashtagsResource as X, IMAGE_MIME_TYPES as Y, type InteractionEntry as Z, type IsoDate as _, ItdClient as a, REFRESH_COOKIE_PATH as a$, ItdApiError as a0, type ItdApiErrorInit as a1, ItdAuthError as a2, type ItdBuilder as a3, ItdConfigError as a4, ItdConflictError as a5, ItdError as a6, ItdErrorCode as a7, type ItdErrorKind as a8, type ItdFieldErrors as a9, type OAuthProvider as aA, type Page as aB, type PageState as aC, type PaginationMode as aD, Paginator as aE, type PaymentMethod as aF, type Pin as aG, type PinPostResult as aH, type PinsResult as aI, PlatformResource as aJ, type Poll as aK, PollBuilder as aL, type PollInput as aM, type PollOption as aN, type PollTransportOptions as aO, type Portal as aP, type Post as aQ, PostBuilder as aR, type PostInput as aS, type PostStats as aT, PostsResource as aU, type PrivacySettings as aV, type Profile as aW, type PublicProfile as aX, RECONNECT_BACKOFF as aY, RECONNECT_JITTER as aZ, REFRESH_COOKIE as a_, ItdForbiddenError as aa, ItdNetworkError as ab, ItdNotFoundError as ac, ItdPhoneVerificationError as ad, ItdRateLimitError as ae, ItdRealtime as af, ItdServerError as ag, ItdTimeoutError as ah, ItdValidationError as ai, LIBRARY_VERSION as aj, type LikeResult as ak, LikesVisibility as al, type Listener as am, LocalStorageTokenStorage as an, type Logger as ao, type Loose as ap, MAX_RECONNECT_ATTEMPTS as aq, MemoryTokenStorage as ar, type MyProfile as as, NOTIFICATION_TYPE_ALIASES as at, type Notification as au, type NotificationEvent as av, type NotificationListParams as aw, type NotificationSettings as ax, NotificationType as ay, NotificationsResource as az, type ItdClientOptions as b, isMyProfile as b$, type RateLimitOptions as b0, type RawRequestOptions as b1, type RealtimeEvents as b2, type RealtimeOptions as b3, RealtimeStatus as b4, type RealtimeTransport as b5, type RealtimeTransportKind as b6, type ReconnectOptions as b7, type RepliesParams as b8, type Report as b9, type Unsubscribe as bA, type UpdateNotificationSettingsInput as bB, type UpdatePrivacyInput as bC, type UpdateProfileInput as bD, type UploadOptions as bE, type UploadedFile as bF, type UserId as bG, type UserListParams as bH, type UserPostsParams as bI, type UserRef as bJ, type UserSummary as bK, UsersResource as bL, VIDEO_MIME_TYPES as bM, VerificationResource as bN, type VerificationStatus as bO, WallAccess as bP, canonicalNotificationType as bQ, comment as bR, createTokenStorage as bS, formatNotificationText as bT, isBuilder as bU, isItdApiError as bV, isItdAuthError as bW, isItdError as bX, isItdRateLimitError as bY, isItdValidationError as bZ, isKnownNotificationType as b_, ReportBuilder as ba, type ReportInput as bb, ReportReason as bc, ReportTargetType as bd, ReportsResource as be, type RequestContext as bf, type RequestOptions as bg, type ResetPasswordInput as bh, type ResponseContext as bi, type RetryContext as bj, type RetryOptions as bk, type RuntimeMode as bl, STREAM_PATH as bm, SearchResource as bn, type SearchResult as bo, type Session as bp, type SignInResult as bq, type Span as br, type SseTransportOptions as bs, type Subscription as bt, SubscriptionResource as bu, type SubscriptionState as bv, TURNSTILE_SITE_KEY as bw, TelemetryResource as bx, type TransportContext as by, type TransportEvent as bz, AUDIO_MIME_TYPES as c, normalizeNotification as c0, poll as c1, post as c2, readNotificationEvent as c3, readUnreadCountEvent as c4, report as c5, resolveNotificationUrl as c6, toDate as c7, createClient as c8, AUTH_FLAG_COOKIE as d, AUTH_PATHS as e, type Actor as f, type Announcement as g, type AnnouncementButton as h, type Attachment as i, AttachmentType as j, type AuthInput as k, AuthResource as l, type Author as m, type ChangelogEntry as n, type Clan as o, type ClientHooks as p, type Comment as q, CommentBuilder as r, type CommentInput as s, type CommentReplyTo as t, CommentSort as u, type CommentsParams as v, CommentsResource as w, type CreateCommentInput as x, type CreatePollInput as y, type CreatePostInput as z };
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 };