itd-api 0.9.1 → 0.9.3

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 (63) hide show
  1. package/dist/events/index.cjs +3 -4
  2. package/dist/events/index.d.cts +3 -3
  3. package/dist/events/index.d.ts +3 -3
  4. package/dist/events/index.js +4 -4
  5. package/dist/index.cjs +283 -90
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +16 -72
  8. package/dist/index.d.ts +16 -72
  9. package/dist/index.js +284 -90
  10. package/dist/index.js.map +1 -1
  11. package/dist/node/index.cjs +3 -3
  12. package/dist/node/index.js +3 -3
  13. package/dist/rest/index.cjs +4 -5
  14. package/dist/rest/index.d.cts +3 -3
  15. package/dist/rest/index.d.ts +3 -3
  16. package/dist/rest/index.js +5 -5
  17. package/dist/shared/{events-BDdJyH2p.d.ts → events-BPxBF0gQ.d.cts} +3 -5
  18. package/dist/shared/{events-D6y0Hxyz.js → events-BzjI6pn5.js} +4 -4
  19. package/dist/shared/{events-D6y0Hxyz.js.map → events-BzjI6pn5.js.map} +1 -1
  20. package/dist/shared/{events-BqFkwwTw.cjs → events-C1FudmSe.cjs} +3 -9
  21. package/dist/shared/{events-BqFkwwTw.cjs.map → events-C1FudmSe.cjs.map} +1 -1
  22. package/dist/shared/{events-BQyH5-S0.d.cts → events-DnwfcLxS.d.ts} +3 -5
  23. package/dist/shared/{multi-storage-SoW05uzO.js → multi-storage-C3Ngtop1.js} +13 -8
  24. package/dist/shared/multi-storage-C3Ngtop1.js.map +1 -0
  25. package/dist/shared/{multi-storage-CDKLa956.cjs → multi-storage-s-fPtjoy.cjs} +13 -8
  26. package/dist/shared/multi-storage-s-fPtjoy.cjs.map +1 -0
  27. package/dist/shared/{options-DOJYtoti.cjs → options-DjEtbVaf.cjs} +2 -2
  28. package/dist/shared/{options-DOJYtoti.cjs.map → options-DjEtbVaf.cjs.map} +1 -1
  29. package/dist/shared/{options-DhgGg7Ms.js → options-i4LrKfqx.js} +2 -2
  30. package/dist/shared/{options-DhgGg7Ms.js.map → options-i4LrKfqx.js.map} +1 -1
  31. package/dist/shared/{redact-Ba5iSVYZ.js → redact-DJV0XM3n.js} +40 -15
  32. package/dist/shared/redact-DJV0XM3n.js.map +1 -0
  33. package/dist/shared/{redact-BP00URmQ.cjs → redact-lAmck1Z6.cjs} +45 -14
  34. package/dist/shared/redact-lAmck1Z6.cjs.map +1 -0
  35. package/dist/shared/{render-BU1_wex8.d.cts → render-C1F_QWYD.d.cts} +82 -19
  36. package/dist/shared/{render-sb1VJhUA.js → render-CtOpp9Pm.js} +127 -124
  37. package/dist/shared/render-CtOpp9Pm.js.map +1 -0
  38. package/dist/shared/{render-DAEeCMk9.cjs → render-Omy1drH1.cjs} +125 -128
  39. package/dist/shared/render-Omy1drH1.cjs.map +1 -0
  40. package/dist/shared/{render-CZ_-F2Tl.d.ts → render-uFW2kDxp.d.ts} +82 -19
  41. package/dist/shared/{storage-QNVxzpDB.cjs → storage-CZJZoaz9.cjs} +4 -2
  42. package/dist/shared/storage-CZJZoaz9.cjs.map +1 -0
  43. package/dist/shared/{storage-CfHKzVHf.js → storage-DiDe0PZM.js} +4 -2
  44. package/dist/shared/storage-DiDe0PZM.js.map +1 -0
  45. package/dist/shared/{url-Dsr4c5r5.js → url-3Ts6EEHQ.js} +301 -96
  46. package/dist/shared/url-3Ts6EEHQ.js.map +1 -0
  47. package/dist/shared/{url-CzHqE-Fg.cjs → url-D6wsXm1T.cjs} +301 -96
  48. package/dist/shared/url-D6wsXm1T.cjs.map +1 -0
  49. package/dist/shared/{url-CZZcyPI0.d.cts → url-DubjkRR9.d.cts} +10 -16
  50. package/dist/shared/{url-CZZcyPI0.d.ts → url-DubjkRR9.d.ts} +10 -16
  51. package/dist/web/index.cjs +1 -1
  52. package/dist/web/index.js +1 -1
  53. package/package.json +5 -5
  54. package/dist/shared/multi-storage-CDKLa956.cjs.map +0 -1
  55. package/dist/shared/multi-storage-SoW05uzO.js.map +0 -1
  56. package/dist/shared/redact-BP00URmQ.cjs.map +0 -1
  57. package/dist/shared/redact-Ba5iSVYZ.js.map +0 -1
  58. package/dist/shared/render-DAEeCMk9.cjs.map +0 -1
  59. package/dist/shared/render-sb1VJhUA.js.map +0 -1
  60. package/dist/shared/storage-CfHKzVHf.js.map +0 -1
  61. package/dist/shared/storage-QNVxzpDB.cjs.map +0 -1
  62. package/dist/shared/url-CzHqE-Fg.cjs.map +0 -1
  63. package/dist/shared/url-Dsr4c5r5.js.map +0 -1
@@ -1,6 +1,70 @@
1
- import { At as RequestOptions, Ct as PaginationOptions, Dt as RawRequestOptions, It as QueryParams, Rt as ServiceDefinition, St as OperationRequestOptions, Tt as RateLimitBucketOverride, Ut as BuiltInOperationId, Vt as ItdClock, _ as PrivacySettings, _n as ReportTargetType, _t as OperationMethod, bn as ViewReason, c as NotificationSettings, dn as InteractionType, f as Author, g as PinsResult, gn as ReportReason, gt as OperationMetadata, ht as OperationContract, in as UserRef, ln as FeedTab, lt as Unsubscribe, m as MyProfile, mn as Loose, mt as OperationAnnotations, nn as Span, nt as AuthIdentity, on as AttachmentType, p as FollowResult, qt as OperationId, rn as UserId, s as Notification, sn as CommentSort, tn as IsoDate, tt as ClientConnection, un as IncidentKind, v as Profile, vn as ServiceState, vt as RetrySafety, x as UserSummary, xn as ViewSource, xt as Logger, y as PublicProfile } from "./url-CZZcyPI0.js";
1
+ import { At as RequestOptions, Ct as PaginationOptions, Dt as RawRequestOptions, It as QueryParams, Rt as ServiceDefinition, St as OperationRequestOptions, Tt as RateLimitBucketOverride, Ut as BuiltInOperationId, Vt as ItdClock, _ as PrivacySettings, _n as ReportTargetType, _t as OperationMethod, bn as ViewReason, c as NotificationSettings, dn as InteractionType, f as Author, g as PinsResult, gn as ReportReason, gt as OperationMetadata, ht as OperationContract, in as UserRef, ln as FeedTab, lt as Unsubscribe, m as MyProfile, mn as Loose, mt as OperationAnnotations, nn as Span, nt as AuthIdentity, on as AttachmentType, p as FollowResult, qt as OperationId, rn as UserId, s as Notification, sn as CommentSort, tn as IsoDate, tt as ClientConnection, un as IncidentKind, v as Profile, vn as ServiceState, vt as RetrySafety, x as UserSummary, xn as ViewSource, xt as Logger, y as PublicProfile, yt as ClientHooks } from "./url-DubjkRR9.js";
2
2
  import { c as LazyFile, d as UrlFileOptions, i as FileStreamContent, l as StreamFile, n as FileContext, o as FileTransferMode, r as FileInput, s as FromStreamOptions } from "./contracts-BoT7msmq.js";
3
3
  import { r as KeyValueStore } from "./key-value-store-COZaNHZS.js";
4
+ //#region src/core/cookies.d.ts
5
+ /**
6
+ * Минимальное хранилище cookie для сред без своего.
7
+ *
8
+ * Refresh-токен итд.com приходит в `Set-Cookie`, а `fetch` вне браузера cookie не хранит —
9
+ * без jar сессию не продлить. В браузере и React Native не используется: там cookie ведёт
10
+ * сама среда.
11
+ *
12
+ * Реализована практическая часть RFC 6265: origin, путь, срок жизни, флаг `Secure`.
13
+ * Доменные cookie для поддоменов намеренно не поддерживаются — API работает с одного хоста.
14
+ */
15
+ declare class CookieJar {
16
+ #private;
17
+ /** Независимая копия для auth-flow, который ещё не получил право на commit. */
18
+ clone(): CookieJar;
19
+ /** Атомарно с точки зрения синхронных читателей заменяет содержимое снимком другого jar. */
20
+ replaceWith(source: CookieJar): void;
21
+ /**
22
+ * Забирает `Set-Cookie` из ответа.
23
+ *
24
+ * Использует `Headers.getSetCookie()`, где он есть (Node 20+, undici). В остальных средах
25
+ * заголовки склеены в одну строку, и её нельзя резать по запятой напрямую: запятая есть
26
+ * внутри `Expires=Wed, 09 Jun 2027 …`. Разделением занимается `set-cookie-parser`.
27
+ */
28
+ setFromResponse(url: string, response: Response): void;
29
+ /**
30
+ * Кладёт cookie напрямую, минуя `Set-Cookie`.
31
+ *
32
+ * Нужно ровно в одном случае: пользователь передал refresh-токен строкой, а сервер читает
33
+ * его только из cookie. Значение не кодируется — оно уходит в заголовок как есть.
34
+ */
35
+ set(url: string, name: string, value: string, path?: string): void;
36
+ /** Сохраняет cookie из готовых строк `Set-Cookie`. */
37
+ setFromStrings(url: string, setCookieStrings: string[]): void;
38
+ /**
39
+ * Собирает значение заголовка `Cookie` для запроса.
40
+ *
41
+ * @returns строка вида `a=1; b=2` либо `undefined`, если подходящих cookie нет
42
+ */
43
+ getHeader(url: string): string | undefined;
44
+ /**
45
+ * Значение действующей cookie.
46
+ *
47
+ * Нужно, чтобы забрать обновлённый refresh-токен: сервер ротирует его при каждом
48
+ * продлении сессии, и сохранять надо именно новое значение.
49
+ *
50
+ * @param url если указан, учитываются origin, путь и флаг `Secure`
51
+ */
52
+ getValue(name: string, url?: string): string | undefined;
53
+ /**
54
+ * Есть ли действующая cookie с таким именем.
55
+ *
56
+ * Используется для проверки флага {@link AUTH_FLAG_COOKIE} перед запросом обновления
57
+ * токена: у анонима refresh-сессии нет, и дёргать API незачем.
58
+ */
59
+ has(name: string, url?: string): boolean;
60
+ /** Сохраняет содержимое jar для записи в {@link TokenStorage}. */
61
+ serialize(): string[];
62
+ /** Восстанавливает jar из результата {@link serialize}. Некорректные записи молча пропускаются. */
63
+ deserialize(entries: readonly string[] | undefined): void;
64
+ /** Удаляет все cookie. */
65
+ clear(): void;
66
+ }
67
+ //#endregion
4
68
  //#region src/core/plugins/contracts.d.ts
5
69
  /**
6
70
  * Обёртка одной логической операции.
@@ -13,6 +77,7 @@ import { r as KeyValueStore } from "./key-value-store-COZaNHZS.js";
13
77
  * @param next следующая обёртка либо выполнение операции
14
78
  * `next()` возвращает результат публичного метода. Если обёртка не вызывает `next`, её
15
79
  * собственный результат считается готовым и повторно не нормализуется.
80
+ * @param context общий lifecycle операции; его signal учитывает timeout и `dispose()` клиента
16
81
  *
17
82
  * @returns результат в том виде, в котором его получит вызывающий код
18
83
  *
@@ -22,7 +87,12 @@ import { r as KeyValueStore } from "./key-value-store-COZaNHZS.js";
22
87
  * next({ ...request, headers: { ...request.headers, 'X-Trace': trace() } });
23
88
  * ```
24
89
  */
25
- type OperationTransformer = (request: OperationRequestOptions, next: (request: OperationRequestOptions) => Promise<unknown>) => Promise<unknown>;
90
+ type OperationTransformer = (request: OperationRequestOptions, next: (request: OperationRequestOptions) => Promise<unknown>, context: OperationTransformContext) => Promise<unknown>;
91
+ /** Состояние времени жизни логической операции, не влияющее на её семантические параметры. */
92
+ interface OperationTransformContext {
93
+ /** Общий сигнал пользовательской отмены, timeout и освобождения клиента. */
94
+ readonly signal: AbortSignal;
95
+ }
26
96
  /** Финальные данные одной транспортной попытки. */
27
97
  interface AttemptContext {
28
98
  /** Постоянный идентификатор операции. */
@@ -224,7 +294,7 @@ declare class PluginRegistry {
224
294
  *
225
295
  * @param execute выполнение логической операции, вызываемое самым внутренним transformer
226
296
  */
227
- run(request: OperationRequestOptions, execute: (request: OperationRequestOptions) => Promise<unknown>): Promise<unknown>;
297
+ run(request: OperationRequestOptions, execute: (request: OperationRequestOptions) => Promise<unknown>, signal: AbortSignal): Promise<unknown>;
228
298
  }
229
299
  //#endregion
230
300
  //#region src/core/execution/pipeline.d.ts
@@ -252,6 +322,8 @@ type RequestBodyFactory = (context: RequestBodyContext) => PreparedRequestBody |
252
322
  * `Authorization`, заданный вызывающим кодом вручную.
253
323
  */
254
324
  interface PipelineRequest extends OperationRequestOptions {
325
+ /** Изолированный cookie jar конкретного auth-flow. @internal */
326
+ cookieJar?: CookieJar | undefined;
255
327
  /** Повторяемое тело. Используется внутренними ресурсами вместо `body`. @internal */
256
328
  bodyFactory?: RequestBodyFactory | undefined;
257
329
  /**
@@ -283,6 +355,11 @@ interface HttpClientDeps {
283
355
  handler: RequestHandler;
284
356
  plugins: PluginRegistry;
285
357
  baseUrl: string;
358
+ timeout: number;
359
+ clock: ItdClock;
360
+ lifetimeSignal?: AbortSignal | undefined;
361
+ hooks: ClientHooks;
362
+ assertActive?: (() => void) | undefined;
286
363
  }
287
364
  /** Параметры операции без ID и метода, заданных её контрактом. @internal */
288
365
  type HttpOperationOptions = Omit<PipelineRequest, 'operationId' | 'method'>;
@@ -1216,14 +1293,6 @@ interface HashtagPostsParams {
1216
1293
  */
1217
1294
  declare class HashtagsResource extends BaseResource {
1218
1295
  #private;
1219
- /**
1220
- * Ищет хэштеги.
1221
- *
1222
- * Без строки запроса возвращает общий список.
1223
- */
1224
- search(query?: string, params?: {
1225
- limit?: number;
1226
- }, options?: RequestOptions): Promise<Hashtag[]>;
1227
1296
  /** Загружает трендовые хэштеги. */
1228
1297
  trending(params?: {
1229
1298
  limit?: number;
@@ -2534,10 +2603,6 @@ declare class UsersResource extends BaseResource {
2534
2603
  get(user: UserRef, options?: RequestOptions): Promise<PublicProfile>;
2535
2604
  /** Проверяет, свободно ли имя пользователя. */
2536
2605
  checkUsername(username: string, options?: RequestOptions): Promise<boolean>;
2537
- /** Ищет пользователей по строке запроса. */
2538
- search(query: string, params?: {
2539
- limit?: number;
2540
- }, options?: RequestOptions): Promise<UserSummary[]>;
2541
2606
  /** Загружает рекомендации, на кого подписаться. */
2542
2607
  whoToFollow(options?: RequestOptions): Promise<UserSummary[]>;
2543
2608
  /** Загружает рейтинг кланов. */
@@ -2728,8 +2793,6 @@ interface ShopOrderAccessStorageAdapterOptions {
2728
2793
  }
2729
2794
  /** Создаёт хранилище доступа к заказам поверх `KeyValueStore`. */
2730
2795
  declare function createShopOrderAccessStorage(store: KeyValueStore<ShopOrderAccessSession>, options?: ShopOrderAccessStorageAdapterOptions): ShopOrderAccessStorage;
2731
- /** Создаёт независимое хранилище доступа к заказам в памяти. */
2732
- declare function createMemoryShopOrderAccessStorage(): ShopOrderAccessStorage;
2733
2796
  //#endregion
2734
2797
  //#region src/shop/feature.d.ts
2735
2798
  /** Настройки подключаемого модуля доступа к заказам по коду из письма. */
@@ -2790,5 +2853,5 @@ interface RenderSpansOptions {
2790
2853
  */
2791
2854
  declare function renderSpans(content: string, spans?: readonly Span[] | null | undefined, options?: RenderSpansOptions): string;
2792
2855
  //#endregion
2793
- export { ShopConsent as $, PageState as $n, autoSpans as $t, UsersResource as A, PollOption as An, ReportInput as At, ViewTracker as B, CreateCommentInput as Bn, post as Bt, VideoMimeType as C, Comment as Cn, ClientPlugin as Cr, ShopRecipient as Ct, UpdatePrivacyInput as D, LikeResult as Dn, PluginTeardown as Dr, SearchResult as Dt, VerificationResource as E, Hashtag as En, PluginApi as Er, SearchResource as Et, TelemetryBatchOptions as F, CommentInput as Fn, UserPostsParams as Ft, PayShopOrderOptions as G, PaymentMethod as Gn, parseHtml as Gt, ViewTrackerOptions as H, CreatePostData as Hn, PollInput as Ht, TelemetryClock as I, comment as In, CreatePostInput as It, ShopOrderRequestOptions as J, NotificationListParams as Jn, MarkupBuilder as Jt, ShopConsentsResource as K, Session as Kn, parseMarkdown as Kt, TelemetryOptions as L, BuilderInput as Ln, PostBuilder as Lt, InteractionEntry as M, PostStats as Mn, CommentsParams as Mt, PhotoOpenInput as N, PostUpdateResult as Nn, FeedParams as Nt, UpdateProfileInput as O, PinPostResult as On, ReportsResource as Ot, TelemetryBatch as P, CommentBuilder as Pn, PostsResource as Pt, CreateShopOrderInput as Q, Page as Qn, TextMarkup as Qt, TelemetryResource as R, ItdBuilder as Rn, PostInput as Rt, VIDEO_MIME_TYPES as S, Attachment as Sn, AttemptNext as Sr, ShopProductStatus as St, fromUrl as T, CommentUpdateResult as Tn, OperationTransformer as Tr, ShopSizeChartRow as Tt, SubscriptionResource as U, CreateReportInput as Un, poll as Ut, ViewTrackerInput as V, CreatePollInput as Vn, PollBuilder as Vt, CreateShopOrderOptions as W, UpdatePostInput as Wn, ParseMarkupOptions as Wt, ShopProductsResource as X, UpdateNotificationSettingsInput as Xn, MarkupInput as Xt, ShopOrdersResource as Y, NotificationsResource as Yn, MarkupContent as Yt, ShopResource as Z, BaseResource as Zn, MarkupSpan as Zt, AUDIO_MIME_TYPES as _, FilesResource as _n, ResolveFileOptions as _r, ShopPayment as _t, ShopFeatureOptions as a, ServiceStatus as an, ClientFeature as ar, ShopDeliveryCountry as at, IMAGE_MIME_TYPES as b, CommentsResource as bn, AttemptExtensions as br, ShopProductColor as bt, ShopOrderAccessStorage as c, Announcement as cn, FeatureInstallation as cr, ShopOrder as ct, createShopOrderAccessStorage as d, Clan as dn, ManagedClientResource as dr, ShopOrderDelivery as dt, markup as en, PaginationMode as er, ShopConsentContext as et, statusDays as f, Portal as fn, FileResolver as fr, ShopOrderItem as ft, ALLOWED_MIME_TYPES as g, HashtagsResource as gn, ResolveFileContext as gr, ShopOrderSupport as gt, utcStampToIso as h, HashtagPostsParams as hn, PreparedStreamSource as hr, ShopOrderSummary as ht, ShopFeatureApi as i, PlatformStatus as in, RateLimitBucketState as ir, ShopDeliveryCity as it, DwellEntry as j, Post as jn, report as jt, UserListParams as k, Poll as kn, ReportBuilder as kt, ShopOrderAccessStorageAdapterOptions as l, AnnouncementButton as ln, FeatureOperationDefinition as lr, ShopOrderAccessSession as lt, toDate as m, VerificationStatus as mn, PreparedFileSource as mr, ShopOrderStatus as mt, SpanRenderFormat as n, PlatformResource as nn, PaginatorOptions as nr, ShopCreatedOrder as nt, createShopFeature as o, StatusDay as on, FeatureBucketDefinition as or, ShopDeliveryDestination as ot, isMyProfile as p, Report as pn, PreparedBufferSource as pr, ShopOrderItemInput as pt, ShopDeliveryResource as q, Subscription as qn, AutoSpansOptions as qt, renderSpans as r, PlatformVersions as rn, mapPage as rr, ShopDeliveryCalculation as rt, MemoryShopOrderAccessStorage as s, StatusIncidentLine as sn, FeatureContext as sr, ShopDeliveryPoint as st, RenderSpansOptions as t, PlatformClientVersion as tn, Paginator as tr, ShopConsentKind as tt, createMemoryShopOrderAccessStorage as u, ChangelogEntry as un, FeatureRequestOptions as ur, ShopOrderAccessVerification as ut, AllowedMimeType as v, UploadOptions as vn, HttpClient as vr, ShopProduct as vt, fromStream as w, CommentReplyTo as wn, OperationExtensions as wr, ShopSizeChart as wt, ImageMimeType as x, RepliesParams as xn, AttemptInterceptor as xr, ShopProductSpec as xt, AudioMimeType as y, UploadedFile as yn, AttemptContext as yr, ShopProductCategory as yt, VideoProgressInput as z, isBuilder as zn, PostUpdateInput as zt };
2794
- //# sourceMappingURL=render-CZ_-F2Tl.d.ts.map
2856
+ export { ShopConsentContext as $, PaginationMode as $n, markup as $t, DwellEntry as A, Post as An, report as At, ViewTrackerInput as B, CreatePollInput as Bn, PollBuilder as Bt, fromStream as C, CommentReplyTo as Cn, OperationExtensions as Cr, ShopSizeChart as Ct, UpdateProfileInput as D, PinPostResult as Dn, PluginTeardown as Dr, ReportsResource as Dt, UpdatePrivacyInput as E, LikeResult as En, PluginApi as Er, SearchResult as Et, TelemetryClock as F, comment as Fn, CreatePostInput as Ft, ShopConsentsResource as G, Session as Gn, parseMarkdown as Gt, SubscriptionResource as H, CreateReportInput as Hn, poll as Ht, TelemetryOptions as I, BuilderInput as In, PostBuilder as It, ShopOrdersResource as J, NotificationsResource as Jn, MarkupContent as Jt, ShopDeliveryResource as K, Subscription as Kn, AutoSpansOptions as Kt, TelemetryResource as L, ItdBuilder as Ln, PostInput as Lt, PhotoOpenInput as M, PostUpdateResult as Mn, FeedParams as Mt, TelemetryBatch as N, CommentBuilder as Nn, PostsResource as Nt, UserListParams as O, Poll as On, CookieJar as Or, ReportBuilder as Ot, TelemetryBatchOptions as P, CommentInput as Pn, UserPostsParams as Pt, ShopConsent as Q, PageState as Qn, autoSpans as Qt, VideoProgressInput as R, isBuilder as Rn, PostUpdateInput as Rt, VideoMimeType as S, Comment as Sn, ClientPlugin as Sr, ShopRecipient as St, VerificationResource as T, Hashtag as Tn, OperationTransformer as Tr, SearchResource as Tt, CreateShopOrderOptions as U, UpdatePostInput as Un, ParseMarkupOptions as Ut, ViewTrackerOptions as V, CreatePostData as Vn, PollInput as Vt, PayShopOrderOptions as W, PaymentMethod as Wn, parseHtml as Wt, ShopResource as X, BaseResource as Xn, MarkupSpan as Xt, ShopProductsResource as Y, UpdateNotificationSettingsInput as Yn, MarkupInput as Yt, CreateShopOrderInput as Z, Page as Zn, TextMarkup as Zt, AllowedMimeType as _, UploadOptions as _n, HttpClient as _r, ShopProduct as _t, ShopFeatureOptions as a, StatusDay as an, FeatureBucketDefinition as ar, ShopDeliveryDestination as at, ImageMimeType as b, RepliesParams as bn, AttemptInterceptor as br, ShopProductSpec as bt, ShopOrderAccessStorage as c, AnnouncementButton as cn, FeatureOperationDefinition as cr, ShopOrderAccessSession as ct, statusDays as d, Portal as dn, FileResolver as dr, ShopOrderItem as dt, PlatformClientVersion as en, Paginator as er, ShopConsentKind as et, isMyProfile as f, Report as fn, PreparedBufferSource as fr, ShopOrderItemInput as ft, AUDIO_MIME_TYPES as g, FilesResource as gn, ResolveFileOptions as gr, ShopPayment as gt, ALLOWED_MIME_TYPES as h, HashtagsResource as hn, ResolveFileContext as hr, ShopOrderSupport as ht, ShopFeatureApi as i, ServiceStatus as in, ClientFeature as ir, ShopDeliveryCountry as it, InteractionEntry as j, PostStats as jn, CommentsParams as jt, UsersResource as k, PollOption as kn, ReportInput as kt, ShopOrderAccessStorageAdapterOptions as l, ChangelogEntry as ln, FeatureRequestOptions as lr, ShopOrderAccessVerification as lt, utcStampToIso as m, HashtagPostsParams as mn, PreparedStreamSource as mr, ShopOrderSummary as mt, SpanRenderFormat as n, PlatformVersions as nn, mapPage as nr, ShopDeliveryCalculation as nt, createShopFeature as o, StatusIncidentLine as on, FeatureContext as or, ShopDeliveryPoint as ot, toDate as p, VerificationStatus as pn, PreparedFileSource as pr, ShopOrderStatus as pt, ShopOrderRequestOptions as q, NotificationListParams as qn, MarkupBuilder as qt, renderSpans as r, PlatformStatus as rn, RateLimitBucketState as rr, ShopDeliveryCity as rt, MemoryShopOrderAccessStorage as s, Announcement as sn, FeatureInstallation as sr, ShopOrder as st, RenderSpansOptions as t, PlatformResource as tn, PaginatorOptions as tr, ShopCreatedOrder as tt, createShopOrderAccessStorage as u, Clan as un, ManagedClientResource as ur, ShopOrderDelivery as ut, AudioMimeType as v, UploadedFile as vn, AttemptContext as vr, ShopProductCategory as vt, fromUrl as w, CommentUpdateResult as wn, OperationTransformContext as wr, ShopSizeChartRow as wt, VIDEO_MIME_TYPES as x, Attachment as xn, AttemptNext as xr, ShopProductStatus as xt, IMAGE_MIME_TYPES as y, CommentsResource as yn, AttemptExtensions as yr, ShopProductColor as yt, ViewTracker as z, CreateCommentInput as zn, post as zt };
2857
+ //# sourceMappingURL=render-uFW2kDxp.d.ts.map
@@ -11,9 +11,11 @@ const require_key_value_store = require("./key-value-store-B5GYVEYZ.cjs");
11
11
  * @internal
12
12
  */
13
13
  function copySession(session) {
14
+ if (typeof session !== "object" || session === null || Array.isArray(session)) return session;
15
+ const cookies = session.cookies;
14
16
  return {
15
17
  ...session,
16
- ...session.cookies ? { cookies: [...session.cookies] } : {}
18
+ ...Array.isArray(cookies) ? { cookies: [...cookies] } : {}
17
19
  };
18
20
  }
19
21
  /**
@@ -85,4 +87,4 @@ Object.defineProperty(exports, "createTokenStorage", {
85
87
  }
86
88
  });
87
89
 
88
- //# sourceMappingURL=storage-QNVxzpDB.cjs.map
90
+ //# sourceMappingURL=storage-CZJZoaz9.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-CZJZoaz9.cjs","names":["#store","MemoryKeyValueStore","ItdConfigError","createKeyValueStore"],"sources":["../../src/session/storage.ts"],"sourcesContent":["import { ItdConfigError } from '../core/errors.js';\nimport {\n createKeyValueStore,\n type KeyValueStore,\n MemoryKeyValueStore,\n} from '../core/key-value-store.js';\n\n/**\n * Сохранённая сессия.\n *\n * Кроме токенов сюда попадают cookie: refresh-токен итд.com живёт именно в cookie, и без них\n * восстановить сессию после перезапуска процесса невозможно.\n */\nexport interface ItdSession {\n /** Токен доступа для заголовка `Authorization: Bearer`. */\n accessToken?: string | undefined;\n /**\n * Refresh-токен, если удалось получить его явным значением.\n *\n * Обычно сервер держит его в httpOnly-cookie и наружу не отдаёт — тогда поле останется\n * пустым, а обновление пойдёт через {@link ItdSession.cookies}.\n */\n refreshToken?: string | undefined;\n /** Сырые cookie в форме `имя=значение`, привязанные к origin API. */\n cookies?: string[] | undefined;\n /**\n * Идентификатор устройства для заголовка `X-Device-Id`.\n *\n * Сервер различает по нему записи в списке сессий, поэтому значение должно пережить\n * перезапуск процесса — иначе каждый старт бота порождает новую сессию. Библиотека\n * заводит его сама при первом запросе и хранит здесь.\n */\n deviceId?: string | undefined;\n /** Когда сессия получена, мс с начала эпохи. Нужно для диагностики. */\n obtainedAt?: number | undefined;\n}\n\n/**\n * Создаёт независимый снимок сессии.\n *\n * Сессии пересекают границу пользовательского кода и внутреннего состояния клиента.\n * Возвращать или сохранять их по ссылке нельзя: последующая мутация объекта или массива\n * cookie меняла бы уже сохранённую сессию без вызова `set()`.\n *\n * @internal\n */\nexport function copySession(session: ItdSession): ItdSession {\n // Storage — runtime-граница: декодированный backend может нарушить TypeScript-контракт.\n // Не преобразуем такое значение до проверки AuthManager и клонируем cookies только как массив.\n if (typeof session !== 'object' || session === null || Array.isArray(session)) return session;\n const cookies = (session as { cookies?: unknown }).cookies;\n return {\n ...session,\n ...(Array.isArray(cookies) ? { cookies: [...cookies] } : {}),\n };\n}\n\n/**\n * Хранилище сессии.\n *\n * Подключаемый компонент: библиотека не знает, где вы держите токены, и обращается к ним\n * только через этот интерфейс. Все методы могут быть как синхронными, так и асинхронными.\n *\n * @example Своё хранилище поверх AsyncStorage в React Native\n * ```ts\n * const backend = withCodec(createKeyValueStore({\n * get: (key) => AsyncStorage.getItem(key).then((value) => value ?? undefined),\n * set: (key, value) => AsyncStorage.setItem(key, value),\n * delete: (key) => AsyncStorage.removeItem(key),\n * }), { encode: JSON.stringify, decode: JSON.parse });\n * const storage = createTokenStorage(withNamespace(backend, 'my-app'));\n * ```\n */\nexport interface TokenStorage {\n /** Прочитать сессию. `null`, если её нет. */\n get(): ItdSession | null | Promise<ItdSession | null>;\n /** Сохранить сессию целиком. */\n set(session: ItdSession): void | Promise<void>;\n /** Удалить сессию. Вызывается при выходе и при неудачном обновлении токена. */\n clear(): void | Promise<void>;\n}\n\n/**\n * Хранилище в памяти процесса — вариант по умолчанию.\n *\n * Сессия теряется при перезапуске. Для долгоживущих ботов возьмите `FileTokenStorage`\n * из `itd-api/node`, для браузера — `LocalStorageTokenStorage` или\n * `SessionStorageTokenStorage` из `itd-api/web`.\n */\nexport class MemoryTokenStorage implements TokenStorage {\n readonly #store = new MemoryKeyValueStore<ItdSession>();\n\n constructor(initial?: ItdSession | null) {\n if (initial) this.#store.set(TOKEN_STORAGE_KEY, copySession(initial));\n }\n\n get(): ItdSession | null {\n const session = this.#store.get(TOKEN_STORAGE_KEY);\n return session ? copySession(session) : null;\n }\n\n set(session: ItdSession): void {\n this.#store.set(TOKEN_STORAGE_KEY, copySession(session));\n }\n\n clear(): void {\n this.#store.delete(TOKEN_STORAGE_KEY);\n }\n}\n\nconst TOKEN_STORAGE_KEY = 'session';\n\n/** Настройки доменного адаптера одной сессии. */\nexport interface TokenStorageAdapterOptions {\n /** Ключ сессии в backend. По умолчанию `session`. */\n key?: string | undefined;\n}\n\nfunction isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' && value !== null && typeof (value as Promise<T>).then === 'function'\n );\n}\n\n/**\n * Создаёт доменное хранилище сессии поверх общего {@link KeyValueStore}.\n *\n * @example\n * ```ts\n * const storage = createTokenStorage(withNamespace(redisStore, 'itd'));\n * ```\n */\nexport function createTokenStorage(\n store: KeyValueStore<ItdSession>,\n options: TokenStorageAdapterOptions = {},\n): TokenStorage {\n const key = options.key ?? TOKEN_STORAGE_KEY;\n if (typeof key !== 'string') throw new ItdConfigError('key TokenStorage должен быть строкой');\n const backend = createKeyValueStore(store);\n return {\n get() {\n const value = backend.get(key);\n if (isPromise(value)) {\n return value.then((session) => (session ? copySession(session) : null));\n }\n return value ? copySession(value) : null;\n },\n set: (session) => backend.set(key, copySession(session)),\n clear: () => backend.delete(key),\n };\n}\n"],"mappings":";;;;;;;;;;;;AA8CA,SAAgB,YAAY,SAAiC;CAG3D,IAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO;CACtF,MAAM,UAAW,QAAkC;CACnD,OAAO;EACL,GAAG;EACH,GAAI,MAAM,QAAQ,OAAO,IAAI,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC;CAC5D;AACF;;;;;;;;AAkCA,IAAa,qBAAb,MAAwD;CACtD,SAAkB,IAAIC,wBAAAA,oBAAgC;CAEtD,YAAY,SAA6B;EACvC,IAAI,SAAS,KAAKD,OAAO,IAAI,mBAAmB,YAAY,OAAO,CAAC;CACtE;CAEA,MAAyB;EACvB,MAAM,UAAU,KAAKA,OAAO,IAAI,iBAAiB;EACjD,OAAO,UAAU,YAAY,OAAO,IAAI;CAC1C;CAEA,IAAI,SAA2B;EAC7B,KAAKA,OAAO,IAAI,mBAAmB,YAAY,OAAO,CAAC;CACzD;CAEA,QAAc;EACZ,KAAKA,OAAO,OAAO,iBAAiB;CACtC;AACF;AAEA,MAAM,oBAAoB;AAQ1B,SAAS,UAAa,OAA4C;CAChE,OACE,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAQ,MAAqB,SAAS;AAEzF;;;;;;;;;AAUA,SAAgB,mBACd,OACA,UAAsC,CAAC,GACzB;CACd,MAAM,MAAM,QAAQ,OAAO;CAC3B,IAAI,OAAO,QAAQ,UAAU,MAAM,IAAIE,eAAAA,eAAe,sCAAsC;CAC5F,MAAM,UAAUC,wBAAAA,oBAAoB,KAAK;CACzC,OAAO;EACL,MAAM;GACJ,MAAM,QAAQ,QAAQ,IAAI,GAAG;GAC7B,IAAI,UAAU,KAAK,GACjB,OAAO,MAAM,MAAM,YAAa,UAAU,YAAY,OAAO,IAAI,IAAK;GAExE,OAAO,QAAQ,YAAY,KAAK,IAAI;EACtC;EACA,MAAM,YAAY,QAAQ,IAAI,KAAK,YAAY,OAAO,CAAC;EACvD,aAAa,QAAQ,OAAO,GAAG;CACjC;AACF"}
@@ -11,9 +11,11 @@ import { r as createKeyValueStore, t as MemoryKeyValueStore } from "./key-value-
11
11
  * @internal
12
12
  */
13
13
  function copySession(session) {
14
+ if (typeof session !== "object" || session === null || Array.isArray(session)) return session;
15
+ const cookies = session.cookies;
14
16
  return {
15
17
  ...session,
16
- ...session.cookies ? { cookies: [...session.cookies] } : {}
18
+ ...Array.isArray(cookies) ? { cookies: [...cookies] } : {}
17
19
  };
18
20
  }
19
21
  /**
@@ -68,4 +70,4 @@ function createTokenStorage(store, options = {}) {
68
70
  //#endregion
69
71
  export { copySession as n, createTokenStorage as r, MemoryTokenStorage as t };
70
72
 
71
- //# sourceMappingURL=storage-CfHKzVHf.js.map
73
+ //# sourceMappingURL=storage-DiDe0PZM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-DiDe0PZM.js","names":["#store"],"sources":["../../src/session/storage.ts"],"sourcesContent":["import { ItdConfigError } from '../core/errors.js';\nimport {\n createKeyValueStore,\n type KeyValueStore,\n MemoryKeyValueStore,\n} from '../core/key-value-store.js';\n\n/**\n * Сохранённая сессия.\n *\n * Кроме токенов сюда попадают cookie: refresh-токен итд.com живёт именно в cookie, и без них\n * восстановить сессию после перезапуска процесса невозможно.\n */\nexport interface ItdSession {\n /** Токен доступа для заголовка `Authorization: Bearer`. */\n accessToken?: string | undefined;\n /**\n * Refresh-токен, если удалось получить его явным значением.\n *\n * Обычно сервер держит его в httpOnly-cookie и наружу не отдаёт — тогда поле останется\n * пустым, а обновление пойдёт через {@link ItdSession.cookies}.\n */\n refreshToken?: string | undefined;\n /** Сырые cookie в форме `имя=значение`, привязанные к origin API. */\n cookies?: string[] | undefined;\n /**\n * Идентификатор устройства для заголовка `X-Device-Id`.\n *\n * Сервер различает по нему записи в списке сессий, поэтому значение должно пережить\n * перезапуск процесса — иначе каждый старт бота порождает новую сессию. Библиотека\n * заводит его сама при первом запросе и хранит здесь.\n */\n deviceId?: string | undefined;\n /** Когда сессия получена, мс с начала эпохи. Нужно для диагностики. */\n obtainedAt?: number | undefined;\n}\n\n/**\n * Создаёт независимый снимок сессии.\n *\n * Сессии пересекают границу пользовательского кода и внутреннего состояния клиента.\n * Возвращать или сохранять их по ссылке нельзя: последующая мутация объекта или массива\n * cookie меняла бы уже сохранённую сессию без вызова `set()`.\n *\n * @internal\n */\nexport function copySession(session: ItdSession): ItdSession {\n // Storage — runtime-граница: декодированный backend может нарушить TypeScript-контракт.\n // Не преобразуем такое значение до проверки AuthManager и клонируем cookies только как массив.\n if (typeof session !== 'object' || session === null || Array.isArray(session)) return session;\n const cookies = (session as { cookies?: unknown }).cookies;\n return {\n ...session,\n ...(Array.isArray(cookies) ? { cookies: [...cookies] } : {}),\n };\n}\n\n/**\n * Хранилище сессии.\n *\n * Подключаемый компонент: библиотека не знает, где вы держите токены, и обращается к ним\n * только через этот интерфейс. Все методы могут быть как синхронными, так и асинхронными.\n *\n * @example Своё хранилище поверх AsyncStorage в React Native\n * ```ts\n * const backend = withCodec(createKeyValueStore({\n * get: (key) => AsyncStorage.getItem(key).then((value) => value ?? undefined),\n * set: (key, value) => AsyncStorage.setItem(key, value),\n * delete: (key) => AsyncStorage.removeItem(key),\n * }), { encode: JSON.stringify, decode: JSON.parse });\n * const storage = createTokenStorage(withNamespace(backend, 'my-app'));\n * ```\n */\nexport interface TokenStorage {\n /** Прочитать сессию. `null`, если её нет. */\n get(): ItdSession | null | Promise<ItdSession | null>;\n /** Сохранить сессию целиком. */\n set(session: ItdSession): void | Promise<void>;\n /** Удалить сессию. Вызывается при выходе и при неудачном обновлении токена. */\n clear(): void | Promise<void>;\n}\n\n/**\n * Хранилище в памяти процесса — вариант по умолчанию.\n *\n * Сессия теряется при перезапуске. Для долгоживущих ботов возьмите `FileTokenStorage`\n * из `itd-api/node`, для браузера — `LocalStorageTokenStorage` или\n * `SessionStorageTokenStorage` из `itd-api/web`.\n */\nexport class MemoryTokenStorage implements TokenStorage {\n readonly #store = new MemoryKeyValueStore<ItdSession>();\n\n constructor(initial?: ItdSession | null) {\n if (initial) this.#store.set(TOKEN_STORAGE_KEY, copySession(initial));\n }\n\n get(): ItdSession | null {\n const session = this.#store.get(TOKEN_STORAGE_KEY);\n return session ? copySession(session) : null;\n }\n\n set(session: ItdSession): void {\n this.#store.set(TOKEN_STORAGE_KEY, copySession(session));\n }\n\n clear(): void {\n this.#store.delete(TOKEN_STORAGE_KEY);\n }\n}\n\nconst TOKEN_STORAGE_KEY = 'session';\n\n/** Настройки доменного адаптера одной сессии. */\nexport interface TokenStorageAdapterOptions {\n /** Ключ сессии в backend. По умолчанию `session`. */\n key?: string | undefined;\n}\n\nfunction isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' && value !== null && typeof (value as Promise<T>).then === 'function'\n );\n}\n\n/**\n * Создаёт доменное хранилище сессии поверх общего {@link KeyValueStore}.\n *\n * @example\n * ```ts\n * const storage = createTokenStorage(withNamespace(redisStore, 'itd'));\n * ```\n */\nexport function createTokenStorage(\n store: KeyValueStore<ItdSession>,\n options: TokenStorageAdapterOptions = {},\n): TokenStorage {\n const key = options.key ?? TOKEN_STORAGE_KEY;\n if (typeof key !== 'string') throw new ItdConfigError('key TokenStorage должен быть строкой');\n const backend = createKeyValueStore(store);\n return {\n get() {\n const value = backend.get(key);\n if (isPromise(value)) {\n return value.then((session) => (session ? copySession(session) : null));\n }\n return value ? copySession(value) : null;\n },\n set: (session) => backend.set(key, copySession(session)),\n clear: () => backend.delete(key),\n };\n}\n"],"mappings":";;;;;;;;;;;;AA8CA,SAAgB,YAAY,SAAiC;CAG3D,IAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,GAAG,OAAO;CACtF,MAAM,UAAW,QAAkC;CACnD,OAAO;EACL,GAAG;EACH,GAAI,MAAM,QAAQ,OAAO,IAAI,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC;CAC5D;AACF;;;;;;;;AAkCA,IAAa,qBAAb,MAAwD;CACtD,SAAkB,IAAI,oBAAgC;CAEtD,YAAY,SAA6B;EACvC,IAAI,SAAS,KAAKA,OAAO,IAAI,mBAAmB,YAAY,OAAO,CAAC;CACtE;CAEA,MAAyB;EACvB,MAAM,UAAU,KAAKA,OAAO,IAAI,iBAAiB;EACjD,OAAO,UAAU,YAAY,OAAO,IAAI;CAC1C;CAEA,IAAI,SAA2B;EAC7B,KAAKA,OAAO,IAAI,mBAAmB,YAAY,OAAO,CAAC;CACzD;CAEA,QAAc;EACZ,KAAKA,OAAO,OAAO,iBAAiB;CACtC;AACF;AAEA,MAAM,oBAAoB;AAQ1B,SAAS,UAAa,OAA4C;CAChE,OACE,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAQ,MAAqB,SAAS;AAEzF;;;;;;;;;AAUA,SAAgB,mBACd,OACA,UAAsC,CAAC,GACzB;CACd,MAAM,MAAM,QAAQ,OAAO;CAC3B,IAAI,OAAO,QAAQ,UAAU,MAAM,IAAI,eAAe,sCAAsC;CAC5F,MAAM,UAAU,oBAAoB,KAAK;CACzC,OAAO;EACL,MAAM;GACJ,MAAM,QAAQ,QAAQ,IAAI,GAAG;GAC7B,IAAI,UAAU,KAAK,GACjB,OAAO,MAAM,MAAM,YAAa,UAAU,YAAY,OAAO,IAAI,IAAK;GAExE,OAAO,QAAQ,YAAY,KAAK,IAAI;EACtC;EACA,MAAM,YAAY,QAAQ,IAAI,KAAK,YAAY,OAAO,CAAC;EACvD,aAAa,QAAQ,OAAO,GAAG;CACjC;AACF"}