itd-api 0.0.10 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +8 -4
  2. package/dist/{chunk-SMV7TF5P.js → chunk-6FB4HTKH.js} +768 -194
  3. package/dist/chunk-6FB4HTKH.js.map +1 -0
  4. package/dist/{chunk-BN4AC3DP.cjs → chunk-73CISRBG.cjs} +768 -194
  5. package/dist/chunk-73CISRBG.cjs.map +1 -0
  6. package/dist/{index-CSjDNGCE.d.cts → index-BZF4K90s.d.cts} +169 -29
  7. package/dist/{index-CSjDNGCE.d.ts → index-BZF4K90s.d.ts} +169 -29
  8. package/dist/index.cjs +109 -109
  9. package/dist/index.d.cts +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/node.cjs +112 -112
  13. package/dist/node.d.cts +2 -2
  14. package/dist/node.d.ts +2 -2
  15. package/dist/node.js +2 -2
  16. package/guides/README.md +2 -0
  17. package/guides/multi-accounts/README.md +2 -1
  18. package/guides/plugins/README.md +93 -2
  19. package/guides/reference/README.md +67 -0
  20. package/guides/reference/accounts.md +101 -0
  21. package/guides/reference/auth.md +141 -0
  22. package/guides/reference/builders.md +135 -0
  23. package/guides/reference/client.md +184 -0
  24. package/guides/reference/comments.md +58 -0
  25. package/guides/reference/discovery.md +81 -0
  26. package/guides/reference/enums.md +103 -0
  27. package/guides/reference/errors.md +107 -0
  28. package/guides/reference/files.md +73 -0
  29. package/guides/reference/models.md +448 -0
  30. package/guides/reference/notifications.md +77 -0
  31. package/guides/reference/pagination.md +82 -0
  32. package/guides/reference/platform.md +47 -0
  33. package/guides/reference/posts.md +157 -0
  34. package/guides/reference/realtime.md +78 -0
  35. package/guides/reference/reports.md +28 -0
  36. package/guides/reference/subscription.md +41 -0
  37. package/guides/reference/users.md +146 -0
  38. package/guides/reference/verification.md +24 -0
  39. package/package.json +1 -1
  40. package/dist/chunk-BN4AC3DP.cjs.map +0 -1
  41. package/dist/chunk-SMV7TF5P.js.map +0 -1
package/dist/node.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { M as MultiTokenStorage, I as ItdSession, T as TokenStorage, a as ItdAccounts$1, b as ItdAccountsOptions, c as ItdClient$1, d as ItdClientOptions, e as ItdClientInternals, F as FileReader } from './index-CSjDNGCE.js';
2
- export { A as ALLOWED_MIME_TYPES, f as AUDIO_MIME_TYPES, g as AUTH_FLAG_COOKIE, h as AUTH_PATHS, i as AccessType, j as AccountEvents, k as Actor, l as AddAccountOptions, m as AllowedMimeType, n as Announcement, o as AnnouncementButton, p as Attachment, q as AttachmentType, r as AudioMimeType, s as AuthEvents, t as AuthInput, u as AuthResource, v as Author, w as AutoSpansOptions, B as BUILT_IN_SERVICES, x as BuilderInput, C as CaptchaCredentials, y as ChangelogEntry, z as Clan, D as ClientHooks, E as Comment, G as CommentBuilder, H as CommentInput, J as CommentReplyTo, K as CommentSort, L as CommentsParams, N as CommentsResource, O as CreateCommentInput, P as CreatePollInput, Q as CreatePostInput, R as CreateReportInput, S as Credentials, U as CredentialsAuth, V as DEFAULT_BASE_URL, W as DEFAULT_STATUS_BASE_URL, X as DEFAULT_TIMEOUT, Y as DEFAULT_UPLOAD_TIMEOUT, Z as DEFAULT_USER_AGENT, _ as DEVICE_ID_HEADER, $ as DetectedRuntime, a0 as DwellEntry, a1 as ErrorContextHook, a2 as FeedParams, a3 as FeedTab, a4 as FileInput, a5 as FilesResource, a6 as FollowResult, a7 as ForgotPasswordInput, a8 as Hashtag, a9 as HashtagPostsParams, aa as HashtagsResource, ab as IMAGE_MIME_TYPES, ac as ImageMimeType, ad as IncidentKind, ae as InteractionEntry, af as InteractionType, ag as IsoDate, ah as ItdAbortError, ai as ItdApiError, aj as ItdApiErrorInit, ak as ItdApiErrorKind, al as ItdAuthError, am as ItdBuilder, an as ItdConfigError, ao as ItdConflictError, ap as ItdError, aq as ItdErrorCode, ar as ItdErrorKind, as as ItdFieldErrors, at as ItdForbiddenError, au as ItdNetworkError, av as ItdNotFoundError, aw as ItdPhoneVerificationError, ax as ItdPlugin, ay as ItdRateLimitError, az as ItdRealtime, aA as ItdServerError, aB as ItdTimeoutError, aC as ItdValidationError, aD as LIBRARY_VERSION, aE as LikeResult, aF as LikesVisibility, aG as Listener, aH as LocalStorageTokenStorage, aI as Logger, aJ as Loose, aK as MAX_RECONNECT_ATTEMPTS, aL as MarkupBuilder, aM as MarkupContent, aN as MarkupInput, aO as MarkupSpan, aP as MemoryMultiTokenStorage, aQ as MemoryTokenStorage, aR as MyProfile, aS as NOTIFICATION_TYPE_ALIASES, aT as Notification, aU as NotificationEvent, aV as NotificationListParams, aW as NotificationSettings, aX as NotificationType, aY as NotificationsResource, aZ as OAuthProvider, a_ as Page, a$ as PageState, b0 as PaginationMode, b1 as Paginator, b2 as PaginatorOptions, b3 as PaymentMethod, b4 as Pin, b5 as PinPostResult, b6 as PinsResult, b7 as PlatformResource, b8 as PlatformStatus, b9 as PluginContext, ba as Poll, bb as PollBuilder, bc as PollInput, bd as PollOption, be as PollTransportOptions, bf as Portal, bg as Post, bh as PostBuilder, bi as PostInput, bj as PostStats, bk as PostUpdateInput, bl as PostsResource, bm as PrivacySettings, bn as Profile, bo as PublicProfile, bp as QueryParams, bq as QueryValue, br as RECONNECT_BACKOFF, bs as RECONNECT_JITTER, bt as REFRESH_COOKIE, bu as REFRESH_COOKIE_PATH, bv as REQUEST_OPTION_KEYS, bw as RateLimitOptions, bx as RateLimitScope, by as RawRequestOptions, bz as RealtimeDeps, bA as RealtimeEvents, bB as RealtimeOptions, bC as RealtimeStatus, bD as RealtimeTransport, bE as RealtimeTransportKind, bF as ReconnectOptions, bG as RecordStorageSource, bH as RemoveAccountOptions, bI as RenderSpansOptions, bJ as RepliesParams, bK as Report, bL as ReportBuilder, bM as ReportInput, bN as ReportReason, bO as ReportTargetType, bP as ReportsResource, bQ as RequestContext, bR as RequestOptions, bS as ResetPasswordInput, bT as ResponseContext, bU as RetryContext, bV as RetryOptions, bW as RuntimeMode, bX as STATUS_SERVICE, bY as STREAM_PATH, bZ as SearchResource, b_ as SearchResult, b$ as ServiceDefinition, c0 as ServiceRegistry, c1 as ServiceState, c2 as ServiceStatus, c3 as Session, c4 as SignInResult, c5 as SignInStatus, c6 as Span, c7 as SpanRenderFormat, c8 as SpanType, c9 as SseTransportOptions, ca as StatusDay, cb as StatusIncidentLine, cc as Subscription, cd as SubscriptionResource, ce as SubscriptionState, cf as TURNSTILE_SITE_KEY, cg as TelemetryOptions, ch as TelemetryResource, ci as TextMarkup, cj as Transformer, ck as TransportContext, cl as TransportEvent, cm as UnauthorizedStreamError, cn as Unsubscribe, co as UpdateNotificationSettingsInput, cp as UpdatePostInput, cq as UpdatePrivacyInput, cr as UpdateProfileInput, cs as UploadOptions, ct as UploadedFile, cu as UserId, cv as UserListParams, cw as UserPostsParams, cx as UserRef, cy as UserSummary, cz as UsersResource, cA as VIDEO_MIME_TYPES, cB as VerificationResource, cC as VerificationStatus, cD as VideoMimeType, cE as ViewReason, cF as ViewSource, cG as WallAccess, cH as autoSpans, cI as canonicalNotificationType, cJ as comment, cK as createMultiTokenStorage, cL as createRecordMultiStorage, cM as createTokenStorage, cN as formatNotificationText, cO as isBuilder, cP as isItdApiError, cQ as isItdAuthError, cR as isItdConflictError, cS as isItdError, cT as isItdForbiddenError, cU as isItdNotFoundError, cV as isItdPhoneVerificationError, cW as isItdRateLimitError, cX as isItdServerError, cY as isItdValidationError, cZ as isKnownNotificationType, c_ as isMyProfile, c$ as mapPage, d0 as markup, d1 as normalizeNotification, d2 as poll, d3 as post, d4 as readNotificationEvent, d5 as readUnreadCountEvent, d6 as renderSpans, d7 as report, d8 as resolveNotificationUrl, d9 as scopedTokenStorage, da as statusDays, db as toDate, dc as utcStampToIso } from './index-CSjDNGCE.js';
1
+ import { M as MultiTokenStorage, I as ItdSession, T as TokenStorage, a as ItdAccounts$1, b as ItdAccountsOptions, c as ItdClient$1, d as ItdClientOptions, e as ItdClientInternals, F as FileReader } from './index-BZF4K90s.js';
2
+ export { A as ALLOWED_MIME_TYPES, f as AUDIO_MIME_TYPES, g as AUTH_FLAG_COOKIE, h as AUTH_PATHS, i as AccessType, j as AccountEvents, k as Actor, l as AddAccountOptions, m as AllowedMimeType, n as Announcement, o as AnnouncementButton, p as Attachment, q as AttachmentType, r as AudioMimeType, s as AuthEvents, t as AuthIdentity, u as AuthInput, v as AuthResource, w as Author, x as AutoSpansOptions, B as BUILT_IN_SERVICES, y as BuilderInput, C as CaptchaCredentials, z as ChangelogEntry, D as Clan, E as ClientHooks, G as Comment, H as CommentBuilder, J as CommentInput, K as CommentReplyTo, L as CommentSort, N as CommentsParams, O as CommentsResource, P as CreateCommentInput, Q as CreatePollInput, R as CreatePostInput, S as CreateReportInput, U as Credentials, V as CredentialsAuth, W as DEFAULT_BASE_URL, X as DEFAULT_STATUS_BASE_URL, Y as DEFAULT_TIMEOUT, Z as DEFAULT_UPLOAD_TIMEOUT, _ as DEFAULT_USER_AGENT, $ as DEVICE_ID_HEADER, a0 as DetectedRuntime, a1 as DwellEntry, a2 as ErrorContextHook, a3 as FeedParams, a4 as FeedTab, a5 as FileInput, a6 as FilesResource, a7 as FollowResult, a8 as ForgotPasswordInput, a9 as Hashtag, aa as HashtagPostsParams, ab as HashtagsResource, ac as IMAGE_MIME_TYPES, ad as ImageMimeType, ae as IncidentKind, af as InteractionEntry, ag as InteractionType, ah as IsoDate, ai as ItdAbortError, aj as ItdApiError, ak as ItdApiErrorInit, al as ItdApiErrorKind, am as ItdAuthError, an as ItdBuilder, ao as ItdConfigError, ap as ItdConflictError, aq as ItdError, ar as ItdErrorCode, as as ItdErrorKind, at as ItdFieldErrors, au as ItdForbiddenError, av as ItdNetworkError, aw as ItdNotFoundError, ax as ItdPhoneVerificationError, ay as ItdPlugin, az as ItdRateLimitError, aA as ItdRealtime, aB as ItdServerError, aC as ItdTimeoutError, aD as ItdValidationError, aE as LIBRARY_VERSION, aF as LikeResult, aG as LikesVisibility, aH as Listener, aI as LocalStorageTokenStorage, aJ as Logger, aK as Loose, aL as MAX_RECONNECT_ATTEMPTS, aM as MarkupBuilder, aN as MarkupContent, aO as MarkupInput, aP as MarkupSpan, aQ as MemoryMultiTokenStorage, aR as MemoryTokenStorage, aS as MyProfile, aT as NOTIFICATION_TYPE_ALIASES, aU as Notification, aV as NotificationEvent, aW as NotificationListParams, aX as NotificationSettings, aY as NotificationType, aZ as NotificationsResource, a_ as OAuthProvider, a$ as Page, b0 as PageState, b1 as PaginationMode, b2 as Paginator, b3 as PaginatorOptions, b4 as PaymentMethod, b5 as Pin, b6 as PinPostResult, b7 as PinsResult, b8 as PlatformResource, b9 as PlatformStatus, ba as PluginContext, bb as PluginTeardown, bc as Poll, bd as PollBuilder, be as PollInput, bf as PollOption, bg as PollTransportOptions, bh as Portal, bi as Post, bj as PostBuilder, bk as PostInput, bl as PostStats, bm as PostUpdateInput, bn as PostsResource, bo as PrivacySettings, bp as Profile, bq as PublicProfile, br as QueryParams, bs as QueryValue, bt as RECONNECT_BACKOFF, bu as RECONNECT_JITTER, bv as REFRESH_COOKIE, bw as REFRESH_COOKIE_PATH, bx as REQUEST_OPTION_KEYS, by as RateLimitOptions, bz as RateLimitScope, bA as RawRequestOptions, bB as RealtimeDeps, bC as RealtimeEvents, bD as RealtimeOptions, bE as RealtimeStatus, bF as RealtimeTransport, bG as RealtimeTransportKind, bH as ReconnectOptions, bI as RecordStorageSource, bJ as RemoveAccountOptions, bK as RenderSpansOptions, bL as RepliesParams, bM as Report, bN as ReportBuilder, bO as ReportInput, bP as ReportReason, bQ as ReportTargetType, bR as ReportsResource, bS as RequestContext, bT as RequestOptions, bU as ResetPasswordInput, bV as ResponseContext, bW as RetryContext, bX as RetryOptions, bY as RuntimeMode, bZ as STATUS_SERVICE, b_ as STREAM_PATH, b$ as SearchResource, c0 as SearchResult, c1 as ServiceDefinition, c2 as ServiceRegistry, c3 as ServiceState, c4 as ServiceStatus, c5 as Session, c6 as SignInResult, c7 as SignInStatus, c8 as Span, c9 as SpanRenderFormat, ca as SpanType, cb as SseTransportOptions, cc as StatusDay, cd as StatusIncidentLine, ce as Subscription, cf as SubscriptionResource, cg as SubscriptionState, ch as TURNSTILE_SITE_KEY, ci as TelemetryOptions, cj as TelemetryResource, ck as TextMarkup, cl as Transformer, cm as TransportContext, cn as TransportEvent, co as UnauthorizedStreamError, cp as Unsubscribe, cq as UpdateNotificationSettingsInput, cr as UpdatePostInput, cs as UpdatePrivacyInput, ct as UpdateProfileInput, cu as UploadOptions, cv as UploadedFile, cw as UserId, cx as UserListParams, cy as UserPostsParams, cz as UserRef, cA as UserSummary, cB as UsersResource, cC as VIDEO_MIME_TYPES, cD as VerificationResource, cE as VerificationStatus, cF as VideoMimeType, cG as ViewReason, cH as ViewSource, cI as WallAccess, cJ as autoSpans, cK as canonicalNotificationType, cL as comment, cM as createMultiTokenStorage, cN as createRecordMultiStorage, cO as createTokenStorage, cP as formatNotificationText, cQ as isBuilder, cR as isItdApiError, cS as isItdAuthError, cT as isItdConflictError, cU as isItdError, cV as isItdForbiddenError, cW as isItdNotFoundError, cX as isItdPhoneVerificationError, cY as isItdRateLimitError, cZ as isItdServerError, c_ as isItdValidationError, c$ as isKnownNotificationType, d0 as isMyProfile, d1 as mapPage, d2 as markup, d3 as normalizeNotification, d4 as poll, d5 as post, d6 as readNotificationEvent, d7 as readUnreadCountEvent, d8 as renderSpans, d9 as report, da as resolveNotificationUrl, db as scopedTokenStorage, dc as statusDays, dd as toDate, de as utcStampToIso } from './index-BZF4K90s.js';
3
3
 
4
4
  /**
5
5
  * `itd-api/node` — то же, что `itd-api`, плюс работа с файловой системой.
package/dist/node.js CHANGED
@@ -1,5 +1,5 @@
1
- import { copySession, createRecordMultiStorage, ItdConfigError, ItdClient, ItdAccounts } from './chunk-SMV7TF5P.js';
2
- export { ALLOWED_MIME_TYPES, AUDIO_MIME_TYPES, AUTH_FLAG_COOKIE, AUTH_PATHS, AccessType, AttachmentType, BUILT_IN_SERVICES, CommentSort, DEFAULT_BASE_URL, DEFAULT_STATUS_BASE_URL, DEFAULT_TIMEOUT, DEFAULT_UPLOAD_TIMEOUT, DEFAULT_USER_AGENT, DEVICE_ID_HEADER, DetectedRuntime, FeedTab, IMAGE_MIME_TYPES, IncidentKind, InteractionType, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, ItdConfigError, ItdConflictError, ItdError, ItdErrorCode, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdPhoneVerificationError, ItdRateLimitError, ItdRealtime, ItdServerError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, LikesVisibility, LocalStorageTokenStorage, MAX_RECONNECT_ATTEMPTS, MemoryMultiTokenStorage, MemoryTokenStorage, NOTIFICATION_TYPE_ALIASES, NotificationType, OAuthProvider, PaginationMode, Paginator, RECONNECT_BACKOFF, RECONNECT_JITTER, REFRESH_COOKIE, REFRESH_COOKIE_PATH, REQUEST_OPTION_KEYS, RealtimeStatus, RealtimeTransportKind, ReportReason, ReportTargetType, RuntimeMode, STATUS_SERVICE, STREAM_PATH, ServiceRegistry, ServiceState, SignInStatus, SpanType, TURNSTILE_SITE_KEY, UnauthorizedStreamError, VIDEO_MIME_TYPES, ViewReason, ViewSource, WallAccess, autoSpans, canonicalNotificationType, comment, createMultiTokenStorage, createRecordMultiStorage, createTokenStorage, formatNotificationText, isBuilder, isItdApiError, isItdAuthError, isItdConflictError, isItdError, isItdForbiddenError, isItdNotFoundError, isItdPhoneVerificationError, isItdRateLimitError, isItdServerError, isItdValidationError, isKnownNotificationType, isMyProfile, mapPage, markup, normalizeNotification, poll, post, readNotificationEvent, readUnreadCountEvent, renderSpans, report, resolveNotificationUrl, scopedTokenStorage, statusDays, toDate, utcStampToIso } from './chunk-SMV7TF5P.js';
1
+ import { copySession, createRecordMultiStorage, ItdConfigError, ItdClient, ItdAccounts } from './chunk-6FB4HTKH.js';
2
+ export { ALLOWED_MIME_TYPES, AUDIO_MIME_TYPES, AUTH_FLAG_COOKIE, AUTH_PATHS, AccessType, AttachmentType, BUILT_IN_SERVICES, CommentSort, DEFAULT_BASE_URL, DEFAULT_STATUS_BASE_URL, DEFAULT_TIMEOUT, DEFAULT_UPLOAD_TIMEOUT, DEFAULT_USER_AGENT, DEVICE_ID_HEADER, DetectedRuntime, FeedTab, IMAGE_MIME_TYPES, IncidentKind, InteractionType, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, ItdConfigError, ItdConflictError, ItdError, ItdErrorCode, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdPhoneVerificationError, ItdRateLimitError, ItdRealtime, ItdServerError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, LikesVisibility, LocalStorageTokenStorage, MAX_RECONNECT_ATTEMPTS, MemoryMultiTokenStorage, MemoryTokenStorage, NOTIFICATION_TYPE_ALIASES, NotificationType, OAuthProvider, PaginationMode, Paginator, RECONNECT_BACKOFF, RECONNECT_JITTER, REFRESH_COOKIE, REFRESH_COOKIE_PATH, REQUEST_OPTION_KEYS, RealtimeStatus, RealtimeTransportKind, ReportReason, ReportTargetType, RuntimeMode, STATUS_SERVICE, STREAM_PATH, ServiceRegistry, ServiceState, SignInStatus, SpanType, TURNSTILE_SITE_KEY, UnauthorizedStreamError, VIDEO_MIME_TYPES, ViewReason, ViewSource, WallAccess, autoSpans, canonicalNotificationType, comment, createMultiTokenStorage, createRecordMultiStorage, createTokenStorage, formatNotificationText, isBuilder, isItdApiError, isItdAuthError, isItdConflictError, isItdError, isItdForbiddenError, isItdNotFoundError, isItdPhoneVerificationError, isItdRateLimitError, isItdServerError, isItdValidationError, isKnownNotificationType, isMyProfile, mapPage, markup, normalizeNotification, poll, post, readNotificationEvent, readUnreadCountEvent, renderSpans, report, resolveNotificationUrl, scopedTokenStorage, statusDays, toDate, utcStampToIso } from './chunk-6FB4HTKH.js';
3
3
 
4
4
  // src/node.ts
5
5
  function hasErrorCode(error, code) {
package/guides/README.md CHANGED
@@ -10,6 +10,8 @@
10
10
  | [Интеграции](./integrations/README.md) | proxy, Turnstile и точки подключения внешних возможностей |
11
11
  | [Плагины](./plugins/README.md) | Cache, Crypto, `ItdPlugin` и создание нового плагина |
12
12
 
13
+ Технический справочник всех методов и типов по категориям — в [`reference/`](./reference/README.md).
14
+
13
15
  ## Запуск примеров
14
16
 
15
17
  Установите зависимости и соберите библиотеку:
@@ -125,7 +125,8 @@ accounts.on('authError', ({ account, error }) => {
125
125
  ```
126
126
 
127
127
  Плагины, подключённые через `accounts.use(plugin)`, применяются ко всем существующим и
128
- будущим клиентам.
128
+ будущим клиентам. `await accounts.unuse(name)` отключает плагин у всех, а
129
+ `accounts.pluginNames()` показывает фактический общий порядок.
129
130
 
130
131
  ## Realtime
131
132
 
@@ -107,8 +107,97 @@ itd.use(timing);
107
107
  - вернуть результат без обращения к сети;
108
108
  - выбросить собственную ошибку.
109
109
 
110
- Подключённая раньше обёртка оказывается снаружи. Она выполняется один раз на логический
111
- запрос, независимо от внутренних повторов транспорта.
110
+ Без явных правил подключённая раньше обёртка оказывается снаружи. Она выполняется один раз
111
+ на логический запрос, независимо от внутренних повторов транспорта.
112
+
113
+ ## Порядок и зависимости
114
+
115
+ Плагин может описать отношения с другими плагинами:
116
+
117
+ ```ts
118
+ const tracing: ItdPlugin = {
119
+ name: 'tracing',
120
+ before: ['cache'], // обёртка tracing снаружи cache
121
+ requires: ['transport'], // без transport подключение завершится ошибкой
122
+ conflicts: ['legacy-tracing'],
123
+ install({ use }) {
124
+ use((request, next) => next(request));
125
+ },
126
+ };
127
+ ```
128
+
129
+ - `before` ставит плагин снаружи названных;
130
+ - `after` — внутри названных;
131
+ - `requires` требует уже подключённый плагин и ставит его раньше зависимого;
132
+ - `conflicts` запрещает совместное подключение, даже если конфликт объявлен только одной
133
+ стороной.
134
+
135
+ Ссылки `before` и `after` на ещё не подключённый плагин допустимы: порядок перестроится,
136
+ когда тот появится. Цикл отклоняется до вызова `install()`.
137
+
138
+ Фактический порядок можно проверить:
139
+
140
+ ```ts
141
+ itd.pluginNames();
142
+ itd.hasPlugin('cache');
143
+ ```
144
+
145
+ ## Хуки отдельных попыток
146
+
147
+ `use()` видит логический запрос один раз. Для метрик и трассировки есть `useHooks()`:
148
+
149
+ ```ts
150
+ const telemetry: ItdPlugin = {
151
+ name: 'telemetry',
152
+ install({ useHooks }) {
153
+ useHooks({
154
+ onRequest({ method, path, attempt }) {
155
+ console.log(`попытка ${attempt}: ${method} ${path}`);
156
+ },
157
+ onResponse({ status, duration }) {
158
+ console.log(status, duration);
159
+ },
160
+ onError({ error, duration }) {
161
+ console.error(error, duration);
162
+ },
163
+ onRetry({ attempt, delay }) {
164
+ console.log(`после попытки ${attempt} ждём ${delay} мс`);
165
+ },
166
+ });
167
+ },
168
+ };
169
+ ```
170
+
171
+ Хуки, заданные в конструкторе `ItdClient`, вызываются раньше хуков плагинов. Исключение
172
+ из хука прерывает запрос — плагину наблюдаемости лучше обрабатывать собственные ошибки
173
+ внутри.
174
+
175
+ ## Отключение и очистка
176
+
177
+ `install()` может вернуть синхронную или асинхронную функцию очистки:
178
+
179
+ ```ts
180
+ const plugin: ItdPlugin = {
181
+ name: 'connection',
182
+ install({ use }) {
183
+ const connection = openConnection();
184
+ use((request, next) => next(request));
185
+
186
+ return () => connection.close();
187
+ },
188
+ };
189
+
190
+ itd.use(plugin);
191
+ await itd.unuse('connection');
192
+ ```
193
+
194
+ Новые запросы перестают видеть плагин сразу, а teardown ждёт завершения запроса, который
195
+ уже проходит через его обёртку. Обязательную зависимость нельзя отключить раньше зависящего
196
+ от неё плагина.
197
+
198
+ `close()` по-прежнему временно останавливает очередь и realtime, не отключая плагины.
199
+ `dispose()` делает окончательную очистку и вызывает teardown всех плагинов изнутри наружу.
200
+ `await using` вызывает `dispose()` автоматически.
112
201
 
113
202
  ## Собственные опции метода
114
203
 
@@ -140,9 +229,11 @@ declare module 'itd-api' {
140
229
 
141
230
  ```ts
142
231
  accounts.use(plugin);
232
+ await accounts.unuse(plugin.name);
143
233
  ```
144
234
 
145
235
  Плагин установится всем существующим аккаунтам и будет автоматически применяться к новым.
236
+ `accounts.pluginNames()` и `accounts.hasPlugin()` описывают общий набор.
146
237
 
147
238
  ## Структура нового плагина
148
239
 
@@ -0,0 +1,67 @@
1
+ # Справочник API
2
+
3
+ Техническое описание всех методов и типов `itd-api`. В отличие от [руководств](../README.md),
4
+ здесь нет сценариев и рабочих примеров — только сигнатуры, параметры и возвращаемые типы,
5
+ разбитые по категориям.
6
+
7
+ ## Ресурсы клиента
8
+
9
+ | Категория | Доступ | О чём |
10
+ |---|---|---|
11
+ | [Клиент](./client.md) | `new ItdClient()` | конструктор, `request()`, `use()`, сервисы, события, `realtime()`, `close()` |
12
+ | [Авторизация](./auth.md) | `itd.auth` | вход, регистрация, OTP, пароли, OAuth, сессии |
13
+ | [Пользователи](./users.md) | `itd.users` | профили, подписки, блокировки, приватность, значки |
14
+ | [Посты](./posts.md) | `itd.posts` | лента, публикация, реакции, репосты, опросы, комментарии к постам |
15
+ | [Комментарии](./comments.md) | `itd.comments` | ответы на комментарии и действия над ними |
16
+ | [Уведомления](./notifications.md) | `itd.notifications` | список, счётчик, отметки о прочтении, настройки |
17
+ | [Файлы](./files.md) | `itd.files` | загрузка и удаление медиа |
18
+ | [Поиск и обнаружение](./discovery.md) | `itd.search`, `itd.hashtags` | глобальный поиск, хэштеги, тренды, рекомендации, кланы, портал |
19
+ | [Подписка](./subscription.md) | `itd.subscription` | состояние премиума, автопродление, способы оплаты |
20
+ | [Верификация](./verification.md) | `itd.verification` | статус и подача заявки |
21
+ | [Жалобы](./reports.md) | `itd.reports` | жалобы на контент и пользователей |
22
+ | [Платформа](./platform.md) | `itd.platform` | журнал изменений, анонсы, портал, статус сервисов |
23
+ | [Realtime](./realtime.md) | `itd.realtime()` | поток уведомлений, события, транспорт, переподключение |
24
+
25
+ ## Несколько аккаунтов
26
+
27
+ | Категория | Доступ | О чём |
28
+ |---|---|---|
29
+ | [Аккаунты](./accounts.md) | `new ItdAccounts()` | контейнер именованных клиентов с общим хранилищем |
30
+
31
+ ## Справочники типов
32
+
33
+ | Файл | О чём |
34
+ |---|---|
35
+ | [Модели данных](./models.md) | `Post`, `Comment`, `Profile`, `Notification`, `Attachment` и остальные ответы API |
36
+ | [Перечисления](./enums.md) | `FeedTab`, `SpanType`, `NotificationType`, `ReportReason` и прочие |
37
+ | [Ошибки](./errors.md) | иерархия `ItdError`, коды `ItdErrorCode`, функции-предикаты |
38
+ | [Билдеры](./builders.md) | `post()`, `comment()`, `poll()`, `report()`, `markup()`, `renderSpans()` |
39
+ | [Пагинация](./pagination.md) | `Page<T>`, `Paginator<T>`, три схемы под одним `for await` |
40
+
41
+ ## Общие соглашения
42
+
43
+ **`RequestOptions` в каждом методе.** Почти все методы ресурсов принимают необязательный
44
+ последний аргумент `options: RequestOptions` — он не повторяется в сигнатурах ниже:
45
+
46
+ ```ts
47
+ interface RequestOptions {
48
+ signal?: AbortSignal; // отмена запроса
49
+ timeout?: number; // таймаут только этого запроса, мс
50
+ headers?: Record<string, string>; // дополнительные заголовки
51
+ retry?: RetryOptions | false; // повторы только этого запроса
52
+ }
53
+ ```
54
+
55
+ **`UserRef` против `UserId`.** `UserRef` — это UUID **или** имя пользователя: подходят оба
56
+ (`itd.users.get('durov')` и `itd.users.get('9f1c…')`). `UserId` — строго UUID; имя
57
+ пользователя там не работает (например, `wallRecipientId`).
58
+
59
+ **Даты.** Все поля дат — строки ISO-8601 (`IsoDate`). Библиотека не превращает их в `Date`;
60
+ для разбора есть [`toDate()`](./models.md#вспомогательные-функции).
61
+
62
+ **Пагинация.** Методы-списки идут парами: `list()`/`comments()`/… возвращают одну
63
+ [`Page<T>`](./pagination.md), а `iterate()`/`iterateComments()`/… — [`Paginator<T>`](./pagination.md)
64
+ для `for await`. Подробнее — в [пагинации](./pagination.md).
65
+
66
+ **Снятие обёртки.** Сервер оборачивает ответы в `{ data: … }`; библиотека снимает обёртку
67
+ сама. Чтобы получить тело как есть, используйте `itd.request({ …, raw: true })`.
@@ -0,0 +1,101 @@
1
+ # Аккаунты — `ItdAccounts`
2
+
3
+ Контейнер именованных `ItdClient`: у каждого аккаунта свой токен, cookie и `deviceId`,
4
+ а сессии всех складываются в одно хранилище (`MultiTokenStorage`). Имя аккаунта выбираете вы;
5
+ сервер о нём ничего не знает. Полное руководство — [Несколько аккаунтов](../multi-accounts/README.md).
6
+
7
+ ```ts
8
+ new ItdAccounts(options?: ItdAccountsOptions)
9
+ createAccounts(options?: ItdAccountsOptions): ItdAccounts // фабрика
10
+ ```
11
+
12
+ ## Методы
13
+
14
+ ```ts
15
+ addAccount(name: string, options?: AddAccountOptions): ItdClient
16
+ ```
17
+ Заводит аккаунт. Возвращает обычный `ItdClient` со всеми ресурсами. Хранилище подставляется
18
+ само — срез общего по имени. `auth` не обязателен, если сессия уже в хранилище.
19
+
20
+ ```ts
21
+ account(name: string): ItdClient
22
+ ```
23
+ Клиент аккаунта. Бросает `ItdConfigError`, если аккаунта нет.
24
+
25
+ ```ts
26
+ restore(): Promise<string[]>
27
+ ```
28
+ Поднимает аккаунты, сессии которых уже лежат в хранилище (после перезапуска — без `auth` и
29
+ капчи). Возвращает имена добавленных.
30
+
31
+ ```ts
32
+ removeAccount(name: string, options?: RemoveAccountOptions): Promise<boolean>
33
+ ```
34
+ Убирает аккаунт: закрывает клиента и, при `forget: true`, забывает сессию. Сетевого запроса
35
+ не делает — для завершения сессии на сервере вызовите `itd.auth.logout()` до удаления.
36
+
37
+ ```ts
38
+ has(name: string): boolean
39
+ names(): string[]
40
+ get size: number
41
+ get storage: MultiTokenStorage
42
+ ```
43
+ Состав контейнера.
44
+
45
+ ```ts
46
+ use(plugin: ItdPlugin): this
47
+ pluginNames(): string[]
48
+ hasPlugin(name: string): boolean
49
+ unuse(name: string): Promise<boolean>
50
+ ```
51
+ Подключает плагин всем аккаунтам — и заведённым, и будущим; показывает общий набор или
52
+ отключает плагин сразу у всех клиентов.
53
+
54
+ ```ts
55
+ on<K>(event: K, listener): Unsubscribe
56
+ ```
57
+ Подписка на [события авторизации всех аккаунтов](#события) сразу.
58
+
59
+ ```ts
60
+ close(): Promise<void>
61
+ dispose(): Promise<void>
62
+ ```
63
+ `close()` временно закрывает все аккаунты и останавливает общую очередь, не отключая
64
+ плагины. `dispose()` дополнительно вызывает teardown плагинов. `await using` вызывает
65
+ `dispose()`.
66
+
67
+ ```ts
68
+ [Symbol.iterator](): IterableIterator<[string, ItdClient]>
69
+ ```
70
+ Перебор парами «имя — клиент»: `for (const [name, itd] of accounts) { … }`.
71
+
72
+ ## События (`AccountEvents`)
73
+
74
+ Те же, что у одиночного клиента, плюс имя аккаунта:
75
+
76
+ | Событие | Данные |
77
+ |---|---|
78
+ | `tokens` | `{ account, accessToken }` |
79
+ | `signIn` | `{ account, accessToken }` |
80
+ | `signOut` | `{ account }` |
81
+ | `authError` | `{ account, error }` |
82
+
83
+ ## Опции
84
+
85
+ ```ts
86
+ interface ItdAccountsOptions extends Omit<ItdClientOptions, 'auth' | 'storage' | 'deviceId'> {
87
+ storage?: MultiTokenStorage; // по умолчанию MemoryMultiTokenStorage
88
+ plugins?: readonly ItdPlugin[]; // подключаются каждому аккаунту
89
+ rateLimitScope?: 'account' | 'shared'; // очередь: своя у каждого / общая; по умолчанию 'account'
90
+ }
91
+
92
+ type AddAccountOptions = Omit<ItdClientOptions, 'storage'>;
93
+
94
+ interface RemoveAccountOptions {
95
+ forget?: boolean; // удалить и сохранённую сессию; по умолчанию false
96
+ }
97
+ ```
98
+
99
+ `rateLimitScope: 'shared'` нужен, когда все аккаунты сидят на одном IP и упираются в лимит по
100
+ адресу. Настройки самой очереди тогда задаются контейнеру опцией `rateLimit`; аккаунту можно
101
+ передать только `rateLimit: false`, чтобы вывести его из общей очереди.
@@ -0,0 +1,141 @@
1
+ # Авторизация — `itd.auth`
2
+
3
+ Вход, регистрация, подтверждение по коду, пароли, OAuth и управление сессиями. Обычно
4
+ клиент авторизуется сам через опцию `auth` конструктора; эти методы нужны для ручных
5
+ сценариев входа. Полное руководство — [Авторизация](../authentication/README.md).
6
+
7
+ Вход, регистрация и сброс пароля требуют одноразовый **Turnstile token**. Ключ виджета —
8
+ экспорт `TURNSTILE_SITE_KEY`.
9
+
10
+ ## Вход и регистрация
11
+
12
+ ```ts
13
+ signUp(credentials: CaptchaCredentials): Promise<string>
14
+ ```
15
+ Регистрирует аккаунт и запускает подтверждение по коду. Возвращает `flowToken` для `verifyOtp()`.
16
+
17
+ ```ts
18
+ signIn(credentials: CaptchaCredentials): Promise<SignInResult>
19
+ ```
20
+ Выполняет вход. При успехе токен сохраняется в клиенте автоматически. Если сервер потребовал
21
+ код, вернётся `{ status: 'otp_required', flowToken }`.
22
+
23
+ ```ts
24
+ signInWithOtp(input: CaptchaCredentials & { getOtp: () => string | Promise<string> }): Promise<string>
25
+ ```
26
+ Полный вход с подтверждением: код запрашивается функцией `getOtp`, остальное — само. Возвращает
27
+ `accessToken`.
28
+
29
+ ```ts
30
+ verifyOtp(input: Credentials & { otp: string; flowToken: string }): Promise<string>
31
+ ```
32
+ Подтверждает вход кодом из письма. Токен сохраняется автоматически.
33
+
34
+ ```ts
35
+ resendOtp(input: { email: string; flowToken: string }): Promise<void>
36
+ ```
37
+ Отправляет код подтверждения повторно.
38
+
39
+ ## Сессия
40
+
41
+ ```ts
42
+ refresh(): Promise<string>
43
+ ```
44
+ Обновляет токен доступа. Параллельные вызовы объединяются в один сетевой запрос. При включённом
45
+ `autoRefresh` вручную обычно не нужен.
46
+
47
+ ```ts
48
+ hasRefreshSession(): Promise<boolean>
49
+ ```
50
+ Есть ли признак живой сессии обновления (cookie `is_auth` или строковый refresh-токен).
51
+ В браузере всегда `true`. Читает хранилище — верен и до первого запроса.
52
+
53
+ ```ts
54
+ logout(): Promise<void>
55
+ ```
56
+ Завершает текущую сессию на сервере и очищает локальную.
57
+
58
+ ```ts
59
+ logoutAll(): Promise<void>
60
+ ```
61
+ Завершает все сессии пользователя и очищает локальную.
62
+
63
+ ```ts
64
+ signOut(): Promise<void>
65
+ ```
66
+ Забывает сессию локально, не обращаясь к серверу.
67
+
68
+ ## Пароли
69
+
70
+ ```ts
71
+ forgotPassword(input: ForgotPasswordInput): Promise<string>
72
+ ```
73
+ Запрашивает письмо с кодом для сброса. Возвращает `flowToken` для `resetPassword()`.
74
+
75
+ ```ts
76
+ resetPassword(input: ResetPasswordInput): Promise<void>
77
+ ```
78
+ Устанавливает новый пароль по коду. Нужны все четыре поля: `email`, `otp`, `flowToken`, `newPassword`.
79
+
80
+ ```ts
81
+ resetPasswordWithOtp(input: ForgotPasswordInput & { newPassword: string; getOtp: () => string | Promise<string> }): Promise<void>
82
+ ```
83
+ Полный сброс: код запрашивается функцией `getOtp`, остальное — само.
84
+
85
+ ```ts
86
+ changePassword(input: { currentPassword: string; newPassword: string }): Promise<void>
87
+ ```
88
+ Меняет пароль. Требует действующей сессии. При неверном текущем пароле — код
89
+ `ACCOUNT_CURRENT_PASSWORD_INCORRECT`.
90
+
91
+ ## Управление сессиями
92
+
93
+ ```ts
94
+ sessions(): Promise<Session[]>
95
+ ```
96
+ Список активных сессий. У текущей `isCurrent === true`. См. [`Session`](./models.md#session).
97
+
98
+ ```ts
99
+ revokeSession(sessionId: string): Promise<void>
100
+ ```
101
+ Завершает указанную сессию.
102
+
103
+ ```ts
104
+ revokeOtherSessions(): Promise<void>
105
+ ```
106
+ Завершает все сессии, кроме текущей.
107
+
108
+ ## Типы
109
+
110
+ ```ts
111
+ interface Credentials {
112
+ email: string;
113
+ password: string;
114
+ }
115
+
116
+ interface CaptchaCredentials extends Credentials {
117
+ turnstileToken: string; // одноразовый, живёт несколько минут
118
+ }
119
+
120
+ interface ForgotPasswordInput {
121
+ email: string;
122
+ turnstileToken: string;
123
+ }
124
+
125
+ interface ResetPasswordInput {
126
+ email: string;
127
+ otp: string;
128
+ flowToken: string;
129
+ newPassword: string;
130
+ }
131
+
132
+ type SignInResult =
133
+ | { status: 'authenticated'; accessToken: string }
134
+ | { status: 'otp_required'; flowToken: string | undefined };
135
+
136
+ const OAuthProvider = { Yandex: 'yandex', Google: 'google' } as const;
137
+ const SignInStatus = { Authenticated: 'authenticated', OtpRequired: 'otp_required' } as const;
138
+ ```
139
+
140
+ Связанные: [`AuthInput`](./client.md#авторизация-authinput) (как клиент получает доступ),
141
+ события авторизации `itd.on('tokens' | 'authError' | …)` — см. [Клиент](./client.md#события).
@@ -0,0 +1,135 @@
1
+ # Билдеры — `post()`, `comment()`, `poll()`, `report()`, `markup()`
2
+
3
+ Билдеры собирают данные для публикующих методов и проверяют их **до** обращения к сети
4
+ (бросают [`ItdConfigError`](./errors.md)). Все билдеры **неизменяемые**: каждый метод
5
+ возвращает новый экземпляр, поэтому заготовку можно переиспользовать.
6
+
7
+ Методы вроде `posts.create`, `posts.comment`, `comments.reply`, `reports.create` принимают три
8
+ равноправные формы: обычный объект, готовый билдер или функцию-настройщик.
9
+
10
+ ```ts
11
+ isBuilder(value: unknown): boolean // это билдер?
12
+ ```
13
+
14
+ ## Пост — `post()`
15
+
16
+ ```ts
17
+ post(content?: string): PostBuilder
18
+ ```
19
+
20
+ | Метод | Описание |
21
+ |---|---|
22
+ | `.content(text)` | задаёт текст, сбрасывая прежнюю разметку |
23
+ | `.append(text)` | дописывает текст к уже заданному |
24
+ | `.spans(spans)` | задаёт готовую разметку `Span[]` |
25
+ | `.markup(input)` | заменяет текст и разметку результатом `MarkupBuilder` |
26
+ | `.autoSpans(options?)` | находит ссылки, хэштеги и упоминания в тексте |
27
+ | `.onWall(userId)` | публикует на стене пользователя (**UUID**) |
28
+ | `.attach(file)` | прикладывает файл (загрузится перед публикацией) |
29
+ | `.attachId(id)` | прикладывает уже загруженное вложение |
30
+ | `.poll(input)` | добавляет опрос |
31
+ | `.build()` | возвращает проверенный `CreatePostInput` |
32
+
33
+ ## Комментарий — `comment()`
34
+
35
+ ```ts
36
+ comment(content?: string): CommentBuilder
37
+ ```
38
+
39
+ | Метод | Описание |
40
+ |---|---|
41
+ | `.content(text)` | задаёт текст |
42
+ | `.attach(file)` / `.attachId(id)` | прикладывает вложение |
43
+ | `.voice(audio)` | делает комментарий голосовым (без текста, одно аудио `audio/ogg`) |
44
+ | `.replyTo(userId)` | адресат ответа (только в `comments.reply()`) |
45
+ | `.build()` | возвращает проверенный `CreateCommentInput` |
46
+
47
+ ## Опрос — `poll()`
48
+
49
+ ```ts
50
+ poll(question?: string): PollBuilder
51
+ ```
52
+
53
+ | Метод | Описание |
54
+ |---|---|
55
+ | `.question(text)` | задаёт вопрос (≤ 200 символов) |
56
+ | `.option(text)` | добавляет один вариант (≤ 100 символов) |
57
+ | `.options(...texts)` | добавляет несколько вариантов сразу |
58
+ | `.multipleChoice(enabled?)` | разрешает выбор нескольких |
59
+ | `.build()` | возвращает проверенный `CreatePollInput` |
60
+
61
+ Требуется от 2 до 10 различных непустых вариантов.
62
+
63
+ ## Жалоба — `report`
64
+
65
+ Объект-фабрика: тип объекта выбирается точкой входа, поэтому рассогласовать тип и идентификатор
66
+ нельзя.
67
+
68
+ ```ts
69
+ report.post(postId: string): ReportBuilder
70
+ report.comment(commentId: string): ReportBuilder
71
+ report.user(userId: string): ReportBuilder
72
+ ```
73
+
74
+ | Метод | Описание |
75
+ |---|---|
76
+ | `.reason(reason)` | причина ([`ReportReason`](./enums.md#reportreason)) |
77
+ | `.description(text)` | пояснение в свободной форме |
78
+ | `.build()` | возвращает проверенный `CreateReportInput` |
79
+
80
+ ## Разметка текста — `markup()`
81
+
82
+ Собирает текст и сам считает `offset`/`length` в единицах UTF-16.
83
+
84
+ ```ts
85
+ markup(content?: string): MarkupBuilder
86
+ ```
87
+
88
+ | Метод | Описание |
89
+ |---|---|
90
+ | `.text(value)` | обычный текст без разметки |
91
+ | `.newline(count?)` | переводы строк |
92
+ | `.bold` · `.italic` · `.underline` · `.strike` · `.spoiler` · `.monospace` · `.quote` | стиль на фрагменте |
93
+ | `.hashtag(tag)` | `#хэштег` |
94
+ | `.mention(username)` | `@упоминание` |
95
+ | `.link(content, url?)` | ссылка |
96
+ | `.span(value, span)` | произвольный тип разметки |
97
+ | `.styled(value, ...types)` | несколько стилей на одном диапазоне |
98
+ | `.build()` | возвращает `{ content, spans }` |
99
+
100
+ Все методы контента принимают строку **или** вложенный билдер/разметку — так стили вкладываются
101
+ друг в друга.
102
+
103
+ ## Автоопределение сущностей
104
+
105
+ ```ts
106
+ autoSpans(text: string, options?: AutoSpansOptions): Span[]
107
+ ```
108
+ Находит HTTP(S)-ссылки, `#хэштеги` и `@упоминания` в готовом тексте.
109
+
110
+ ```ts
111
+ interface AutoSpansOptions {
112
+ hashtags?: boolean; // по умолчанию true
113
+ mentions?: boolean; // по умолчанию true
114
+ links?: boolean; // по умолчанию true
115
+ }
116
+ ```
117
+
118
+ ## Рендеринг разметки
119
+
120
+ ```ts
121
+ renderSpans(content: string, spans: Span[] | null | undefined, options?: RenderSpansOptions): string
122
+ ```
123
+ Превращает текст и spans в HTML (по умолчанию, безопасный), Markdown или ANSI.
124
+
125
+ ```ts
126
+ interface RenderSpansOptions {
127
+ format?: 'html' | 'markdown' | 'ansi'; // по умолчанию 'html'
128
+ mentionUrl?: (username: string) => string | null | undefined;
129
+ hashtagUrl?: (tag: string) => string | null | undefined;
130
+ classPrefix?: string | null; // префикс CSS-классов; по умолчанию 'itd'
131
+ }
132
+ ```
133
+
134
+ Подробное руководство по разметке — [Разметка текста](../text-markup/README.md).
135
+ См. [`Span`](./models.md#span), [`SpanType`](./enums.md#spantype).