itd-api 0.0.11 → 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.
- package/README.md +8 -4
- package/dist/{chunk-TB7HW3VX.js → chunk-6FB4HTKH.js} +660 -174
- package/dist/chunk-6FB4HTKH.js.map +1 -0
- package/dist/{chunk-QD4UHJFF.cjs → chunk-73CISRBG.cjs} +660 -174
- package/dist/chunk-73CISRBG.cjs.map +1 -0
- package/dist/{index-CrlTO7sR.d.cts → index-BZF4K90s.d.cts} +125 -22
- package/dist/{index-CrlTO7sR.d.ts → index-BZF4K90s.d.ts} +125 -22
- package/dist/index.cjs +109 -109
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.cjs +112 -112
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +2 -2
- package/guides/README.md +2 -0
- package/guides/multi-accounts/README.md +2 -1
- package/guides/plugins/README.md +93 -2
- package/guides/reference/README.md +67 -0
- package/guides/reference/accounts.md +101 -0
- package/guides/reference/auth.md +141 -0
- package/guides/reference/builders.md +135 -0
- package/guides/reference/client.md +184 -0
- package/guides/reference/comments.md +58 -0
- package/guides/reference/discovery.md +81 -0
- package/guides/reference/enums.md +103 -0
- package/guides/reference/errors.md +107 -0
- package/guides/reference/files.md +73 -0
- package/guides/reference/models.md +448 -0
- package/guides/reference/notifications.md +77 -0
- package/guides/reference/pagination.md +82 -0
- package/guides/reference/platform.md +47 -0
- package/guides/reference/posts.md +157 -0
- package/guides/reference/realtime.md +78 -0
- package/guides/reference/reports.md +28 -0
- package/guides/reference/subscription.md +41 -0
- package/guides/reference/users.md +146 -0
- package/guides/reference/verification.md +24 -0
- package/package.json +1 -1
- package/dist/chunk-QD4UHJFF.cjs.map +0 -1
- package/dist/chunk-TB7HW3VX.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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
package/guides/plugins/README.md
CHANGED
|
@@ -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).
|