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.
- package/dist/events/index.cjs +3 -4
- package/dist/events/index.d.cts +3 -3
- package/dist/events/index.d.ts +3 -3
- package/dist/events/index.js +4 -4
- package/dist/index.cjs +283 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -72
- package/dist/index.d.ts +16 -72
- package/dist/index.js +284 -90
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +3 -3
- package/dist/node/index.js +3 -3
- package/dist/rest/index.cjs +4 -5
- package/dist/rest/index.d.cts +3 -3
- package/dist/rest/index.d.ts +3 -3
- package/dist/rest/index.js +5 -5
- package/dist/shared/{events-BDdJyH2p.d.ts → events-BPxBF0gQ.d.cts} +3 -5
- package/dist/shared/{events-D6y0Hxyz.js → events-BzjI6pn5.js} +4 -4
- package/dist/shared/{events-D6y0Hxyz.js.map → events-BzjI6pn5.js.map} +1 -1
- package/dist/shared/{events-BqFkwwTw.cjs → events-C1FudmSe.cjs} +3 -9
- package/dist/shared/{events-BqFkwwTw.cjs.map → events-C1FudmSe.cjs.map} +1 -1
- package/dist/shared/{events-BQyH5-S0.d.cts → events-DnwfcLxS.d.ts} +3 -5
- package/dist/shared/{multi-storage-SoW05uzO.js → multi-storage-C3Ngtop1.js} +13 -8
- package/dist/shared/multi-storage-C3Ngtop1.js.map +1 -0
- package/dist/shared/{multi-storage-CDKLa956.cjs → multi-storage-s-fPtjoy.cjs} +13 -8
- package/dist/shared/multi-storage-s-fPtjoy.cjs.map +1 -0
- package/dist/shared/{options-DOJYtoti.cjs → options-DjEtbVaf.cjs} +2 -2
- package/dist/shared/{options-DOJYtoti.cjs.map → options-DjEtbVaf.cjs.map} +1 -1
- package/dist/shared/{options-DhgGg7Ms.js → options-i4LrKfqx.js} +2 -2
- package/dist/shared/{options-DhgGg7Ms.js.map → options-i4LrKfqx.js.map} +1 -1
- package/dist/shared/{redact-Ba5iSVYZ.js → redact-DJV0XM3n.js} +40 -15
- package/dist/shared/redact-DJV0XM3n.js.map +1 -0
- package/dist/shared/{redact-BP00URmQ.cjs → redact-lAmck1Z6.cjs} +45 -14
- package/dist/shared/redact-lAmck1Z6.cjs.map +1 -0
- package/dist/shared/{render-BU1_wex8.d.cts → render-C1F_QWYD.d.cts} +82 -19
- package/dist/shared/{render-sb1VJhUA.js → render-CtOpp9Pm.js} +127 -124
- package/dist/shared/render-CtOpp9Pm.js.map +1 -0
- package/dist/shared/{render-DAEeCMk9.cjs → render-Omy1drH1.cjs} +125 -128
- package/dist/shared/render-Omy1drH1.cjs.map +1 -0
- package/dist/shared/{render-CZ_-F2Tl.d.ts → render-uFW2kDxp.d.ts} +82 -19
- package/dist/shared/{storage-QNVxzpDB.cjs → storage-CZJZoaz9.cjs} +4 -2
- package/dist/shared/storage-CZJZoaz9.cjs.map +1 -0
- package/dist/shared/{storage-CfHKzVHf.js → storage-DiDe0PZM.js} +4 -2
- package/dist/shared/storage-DiDe0PZM.js.map +1 -0
- package/dist/shared/{url-Dsr4c5r5.js → url-3Ts6EEHQ.js} +301 -96
- package/dist/shared/url-3Ts6EEHQ.js.map +1 -0
- package/dist/shared/{url-CzHqE-Fg.cjs → url-D6wsXm1T.cjs} +301 -96
- package/dist/shared/url-D6wsXm1T.cjs.map +1 -0
- package/dist/shared/{url-CZZcyPI0.d.cts → url-DubjkRR9.d.cts} +10 -16
- package/dist/shared/{url-CZZcyPI0.d.ts → url-DubjkRR9.d.ts} +10 -16
- package/dist/web/index.cjs +1 -1
- package/dist/web/index.js +1 -1
- package/package.json +5 -5
- package/dist/shared/multi-storage-CDKLa956.cjs.map +0 -1
- package/dist/shared/multi-storage-SoW05uzO.js.map +0 -1
- package/dist/shared/redact-BP00URmQ.cjs.map +0 -1
- package/dist/shared/redact-Ba5iSVYZ.js.map +0 -1
- package/dist/shared/render-DAEeCMk9.cjs.map +0 -1
- package/dist/shared/render-sb1VJhUA.js.map +0 -1
- package/dist/shared/storage-CfHKzVHf.js.map +0 -1
- package/dist/shared/storage-QNVxzpDB.cjs.map +0 -1
- package/dist/shared/url-CzHqE-Fg.cjs.map +0 -1
- 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-
|
|
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
|
|
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
|
|
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 {
|
|
2794
|
-
//# sourceMappingURL=render-
|
|
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
|
-
...
|
|
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-
|
|
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
|
-
...
|
|
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-
|
|
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"}
|