itd-api 0.8.0 → 0.9.1

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 (80) hide show
  1. package/README.md +66 -21
  2. package/dist/events/index.cjs +3 -3
  3. package/dist/events/index.d.cts +2 -2
  4. package/dist/events/index.d.ts +2 -2
  5. package/dist/events/index.js +3 -3
  6. package/dist/index.cjs +26 -13
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +9 -6
  9. package/dist/index.d.ts +9 -6
  10. package/dist/index.js +13 -8
  11. package/dist/index.js.map +1 -1
  12. package/dist/node/index.cjs +5 -4
  13. package/dist/node/index.cjs.map +1 -1
  14. package/dist/node/index.d.cts +2 -2
  15. package/dist/node/index.d.ts +2 -2
  16. package/dist/node/index.js +4 -3
  17. package/dist/node/index.js.map +1 -1
  18. package/dist/rest/index.cjs +16 -4
  19. package/dist/rest/index.cjs.map +1 -1
  20. package/dist/rest/index.d.cts +5 -3
  21. package/dist/rest/index.d.ts +5 -3
  22. package/dist/rest/index.js +9 -5
  23. package/dist/rest/index.js.map +1 -1
  24. package/dist/shared/{events-QyhQZrnC.d.ts → events-BDdJyH2p.d.ts} +2 -2
  25. package/dist/shared/{events-Br2r7coi.d.cts → events-BQyH5-S0.d.cts} +2 -2
  26. package/dist/shared/{events-iTteVsd_.cjs → events-BqFkwwTw.cjs} +3 -3
  27. package/dist/shared/{events-iTteVsd_.cjs.map → events-BqFkwwTw.cjs.map} +1 -1
  28. package/dist/shared/{events-TfhKh26b.js → events-D6y0Hxyz.js} +3 -3
  29. package/dist/shared/{events-TfhKh26b.js.map → events-D6y0Hxyz.js.map} +1 -1
  30. package/dist/shared/{storage-BLmXmzKF.cjs → key-value-store-B5GYVEYZ.cjs} +1 -85
  31. package/dist/shared/key-value-store-B5GYVEYZ.cjs.map +1 -0
  32. package/dist/shared/{storage-CCxn0Kkv.js → key-value-store-Bt2PSMxY.js} +2 -68
  33. package/dist/shared/key-value-store-Bt2PSMxY.js.map +1 -0
  34. package/dist/shared/key-value-store-COZaNHZS.d.cts +69 -0
  35. package/dist/shared/key-value-store-COZaNHZS.d.ts +69 -0
  36. package/dist/shared/{multi-storage-DccjD7Ww.d.ts → multi-storage-BEL7tcKn.d.cts} +3 -2
  37. package/dist/shared/{multi-storage-CCUgkqvI.cjs → multi-storage-CDKLa956.cjs} +8 -7
  38. package/dist/shared/{multi-storage-CCUgkqvI.cjs.map → multi-storage-CDKLa956.cjs.map} +1 -1
  39. package/dist/shared/{multi-storage-CjAPB5Kq.d.cts → multi-storage-LkljOSzA.d.ts} +3 -2
  40. package/dist/shared/{multi-storage-1AEZTczk.js → multi-storage-SoW05uzO.js} +4 -3
  41. package/dist/shared/{multi-storage-1AEZTczk.js.map → multi-storage-SoW05uzO.js.map} +1 -1
  42. package/dist/shared/{options-BUfoHE9G.cjs → options-DOJYtoti.cjs} +2 -2
  43. package/dist/shared/{options-BUfoHE9G.cjs.map → options-DOJYtoti.cjs.map} +1 -1
  44. package/dist/shared/{options-BNP633A5.js → options-DhgGg7Ms.js} +2 -2
  45. package/dist/shared/{options-BNP633A5.js.map → options-DhgGg7Ms.js.map} +1 -1
  46. package/dist/shared/{redact-DB9EMGJx.cjs → redact-BP00URmQ.cjs} +15 -4
  47. package/dist/shared/{redact-DB9EMGJx.cjs.map → redact-BP00URmQ.cjs.map} +1 -1
  48. package/dist/shared/{redact-FNK29Fv-.js → redact-Ba5iSVYZ.js} +15 -4
  49. package/dist/shared/{redact-FNK29Fv-.js.map → redact-Ba5iSVYZ.js.map} +1 -1
  50. package/dist/shared/{render-BszcKF7S.d.cts → render-BU1_wex8.d.cts} +378 -12
  51. package/dist/shared/{render-DVB7T8pm.d.ts → render-CZ_-F2Tl.d.ts} +378 -12
  52. package/dist/shared/{render-DNTESBSl.cjs → render-DAEeCMk9.cjs} +461 -8
  53. package/dist/shared/render-DAEeCMk9.cjs.map +1 -0
  54. package/dist/shared/{render-CiL1VS0b.js → render-sb1VJhUA.js} +415 -10
  55. package/dist/shared/render-sb1VJhUA.js.map +1 -0
  56. package/dist/shared/storage-BQrtKon9.d.cts +86 -0
  57. package/dist/shared/storage-CTRGT5wF.d.ts +86 -0
  58. package/dist/shared/storage-CfHKzVHf.js +71 -0
  59. package/dist/shared/storage-CfHKzVHf.js.map +1 -0
  60. package/dist/shared/storage-QNVxzpDB.cjs +88 -0
  61. package/dist/shared/storage-QNVxzpDB.cjs.map +1 -0
  62. package/dist/shared/{url-Be9jlWRv.d.ts → url-CZZcyPI0.d.cts} +92 -5
  63. package/dist/shared/{url-Be9jlWRv.d.cts → url-CZZcyPI0.d.ts} +92 -5
  64. package/dist/shared/{url-CFN1sT9S.cjs → url-CzHqE-Fg.cjs} +83 -4
  65. package/dist/shared/{url-CFN1sT9S.cjs.map → url-CzHqE-Fg.cjs.map} +1 -1
  66. package/dist/shared/{url-B3ocFlHj.js → url-Dsr4c5r5.js} +78 -5
  67. package/dist/shared/{url-B3ocFlHj.js.map → url-Dsr4c5r5.js.map} +1 -1
  68. package/dist/web/index.cjs +4 -3
  69. package/dist/web/index.cjs.map +1 -1
  70. package/dist/web/index.d.cts +1 -1
  71. package/dist/web/index.d.ts +1 -1
  72. package/dist/web/index.js +2 -1
  73. package/dist/web/index.js.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/shared/render-CiL1VS0b.js.map +0 -1
  76. package/dist/shared/render-DNTESBSl.cjs.map +0 -1
  77. package/dist/shared/storage-BLmXmzKF.cjs.map +0 -1
  78. package/dist/shared/storage-CCxn0Kkv.js.map +0 -1
  79. package/dist/shared/storage-C_eICCep.d.cts +0 -152
  80. package/dist/shared/storage-C_eICCep.d.ts +0 -152
@@ -0,0 +1,86 @@
1
+ import { r as KeyValueStore } from "./key-value-store-COZaNHZS.cjs";
2
+ //#region src/session/storage.d.ts
3
+ /**
4
+ * Сохранённая сессия.
5
+ *
6
+ * Кроме токенов сюда попадают cookie: refresh-токен итд.com живёт именно в cookie, и без них
7
+ * восстановить сессию после перезапуска процесса невозможно.
8
+ */
9
+ interface ItdSession {
10
+ /** Токен доступа для заголовка `Authorization: Bearer`. */
11
+ accessToken?: string | undefined;
12
+ /**
13
+ * Refresh-токен, если удалось получить его явным значением.
14
+ *
15
+ * Обычно сервер держит его в httpOnly-cookie и наружу не отдаёт — тогда поле останется
16
+ * пустым, а обновление пойдёт через {@link ItdSession.cookies}.
17
+ */
18
+ refreshToken?: string | undefined;
19
+ /** Сырые cookie в форме `имя=значение`, привязанные к origin API. */
20
+ cookies?: string[] | undefined;
21
+ /**
22
+ * Идентификатор устройства для заголовка `X-Device-Id`.
23
+ *
24
+ * Сервер различает по нему записи в списке сессий, поэтому значение должно пережить
25
+ * перезапуск процесса — иначе каждый старт бота порождает новую сессию. Библиотека
26
+ * заводит его сама при первом запросе и хранит здесь.
27
+ */
28
+ deviceId?: string | undefined;
29
+ /** Когда сессия получена, мс с начала эпохи. Нужно для диагностики. */
30
+ obtainedAt?: number | undefined;
31
+ }
32
+ /**
33
+ * Хранилище сессии.
34
+ *
35
+ * Подключаемый компонент: библиотека не знает, где вы держите токены, и обращается к ним
36
+ * только через этот интерфейс. Все методы могут быть как синхронными, так и асинхронными.
37
+ *
38
+ * @example Своё хранилище поверх AsyncStorage в React Native
39
+ * ```ts
40
+ * const backend = withCodec(createKeyValueStore({
41
+ * get: (key) => AsyncStorage.getItem(key).then((value) => value ?? undefined),
42
+ * set: (key, value) => AsyncStorage.setItem(key, value),
43
+ * delete: (key) => AsyncStorage.removeItem(key),
44
+ * }), { encode: JSON.stringify, decode: JSON.parse });
45
+ * const storage = createTokenStorage(withNamespace(backend, 'my-app'));
46
+ * ```
47
+ */
48
+ interface TokenStorage {
49
+ /** Прочитать сессию. `null`, если её нет. */
50
+ get(): ItdSession | null | Promise<ItdSession | null>;
51
+ /** Сохранить сессию целиком. */
52
+ set(session: ItdSession): void | Promise<void>;
53
+ /** Удалить сессию. Вызывается при выходе и при неудачном обновлении токена. */
54
+ clear(): void | Promise<void>;
55
+ }
56
+ /**
57
+ * Хранилище в памяти процесса — вариант по умолчанию.
58
+ *
59
+ * Сессия теряется при перезапуске. Для долгоживущих ботов возьмите `FileTokenStorage`
60
+ * из `itd-api/node`, для браузера — `LocalStorageTokenStorage` или
61
+ * `SessionStorageTokenStorage` из `itd-api/web`.
62
+ */
63
+ declare class MemoryTokenStorage implements TokenStorage {
64
+ #private;
65
+ constructor(initial?: ItdSession | null);
66
+ get(): ItdSession | null;
67
+ set(session: ItdSession): void;
68
+ clear(): void;
69
+ }
70
+ /** Настройки доменного адаптера одной сессии. */
71
+ interface TokenStorageAdapterOptions {
72
+ /** Ключ сессии в backend. По умолчанию `session`. */
73
+ key?: string | undefined;
74
+ }
75
+ /**
76
+ * Создаёт доменное хранилище сессии поверх общего {@link KeyValueStore}.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const storage = createTokenStorage(withNamespace(redisStore, 'itd'));
81
+ * ```
82
+ */
83
+ declare function createTokenStorage(store: KeyValueStore<ItdSession>, options?: TokenStorageAdapterOptions): TokenStorage;
84
+ //#endregion
85
+ export { createTokenStorage as a, TokenStorageAdapterOptions as i, MemoryTokenStorage as n, TokenStorage as r, ItdSession as t };
86
+ //# sourceMappingURL=storage-BQrtKon9.d.cts.map
@@ -0,0 +1,86 @@
1
+ import { r as KeyValueStore } from "./key-value-store-COZaNHZS.js";
2
+ //#region src/session/storage.d.ts
3
+ /**
4
+ * Сохранённая сессия.
5
+ *
6
+ * Кроме токенов сюда попадают cookie: refresh-токен итд.com живёт именно в cookie, и без них
7
+ * восстановить сессию после перезапуска процесса невозможно.
8
+ */
9
+ interface ItdSession {
10
+ /** Токен доступа для заголовка `Authorization: Bearer`. */
11
+ accessToken?: string | undefined;
12
+ /**
13
+ * Refresh-токен, если удалось получить его явным значением.
14
+ *
15
+ * Обычно сервер держит его в httpOnly-cookie и наружу не отдаёт — тогда поле останется
16
+ * пустым, а обновление пойдёт через {@link ItdSession.cookies}.
17
+ */
18
+ refreshToken?: string | undefined;
19
+ /** Сырые cookie в форме `имя=значение`, привязанные к origin API. */
20
+ cookies?: string[] | undefined;
21
+ /**
22
+ * Идентификатор устройства для заголовка `X-Device-Id`.
23
+ *
24
+ * Сервер различает по нему записи в списке сессий, поэтому значение должно пережить
25
+ * перезапуск процесса — иначе каждый старт бота порождает новую сессию. Библиотека
26
+ * заводит его сама при первом запросе и хранит здесь.
27
+ */
28
+ deviceId?: string | undefined;
29
+ /** Когда сессия получена, мс с начала эпохи. Нужно для диагностики. */
30
+ obtainedAt?: number | undefined;
31
+ }
32
+ /**
33
+ * Хранилище сессии.
34
+ *
35
+ * Подключаемый компонент: библиотека не знает, где вы держите токены, и обращается к ним
36
+ * только через этот интерфейс. Все методы могут быть как синхронными, так и асинхронными.
37
+ *
38
+ * @example Своё хранилище поверх AsyncStorage в React Native
39
+ * ```ts
40
+ * const backend = withCodec(createKeyValueStore({
41
+ * get: (key) => AsyncStorage.getItem(key).then((value) => value ?? undefined),
42
+ * set: (key, value) => AsyncStorage.setItem(key, value),
43
+ * delete: (key) => AsyncStorage.removeItem(key),
44
+ * }), { encode: JSON.stringify, decode: JSON.parse });
45
+ * const storage = createTokenStorage(withNamespace(backend, 'my-app'));
46
+ * ```
47
+ */
48
+ interface TokenStorage {
49
+ /** Прочитать сессию. `null`, если её нет. */
50
+ get(): ItdSession | null | Promise<ItdSession | null>;
51
+ /** Сохранить сессию целиком. */
52
+ set(session: ItdSession): void | Promise<void>;
53
+ /** Удалить сессию. Вызывается при выходе и при неудачном обновлении токена. */
54
+ clear(): void | Promise<void>;
55
+ }
56
+ /**
57
+ * Хранилище в памяти процесса — вариант по умолчанию.
58
+ *
59
+ * Сессия теряется при перезапуске. Для долгоживущих ботов возьмите `FileTokenStorage`
60
+ * из `itd-api/node`, для браузера — `LocalStorageTokenStorage` или
61
+ * `SessionStorageTokenStorage` из `itd-api/web`.
62
+ */
63
+ declare class MemoryTokenStorage implements TokenStorage {
64
+ #private;
65
+ constructor(initial?: ItdSession | null);
66
+ get(): ItdSession | null;
67
+ set(session: ItdSession): void;
68
+ clear(): void;
69
+ }
70
+ /** Настройки доменного адаптера одной сессии. */
71
+ interface TokenStorageAdapterOptions {
72
+ /** Ключ сессии в backend. По умолчанию `session`. */
73
+ key?: string | undefined;
74
+ }
75
+ /**
76
+ * Создаёт доменное хранилище сессии поверх общего {@link KeyValueStore}.
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * const storage = createTokenStorage(withNamespace(redisStore, 'itd'));
81
+ * ```
82
+ */
83
+ declare function createTokenStorage(store: KeyValueStore<ItdSession>, options?: TokenStorageAdapterOptions): TokenStorage;
84
+ //#endregion
85
+ export { createTokenStorage as a, TokenStorageAdapterOptions as i, MemoryTokenStorage as n, TokenStorage as r, ItdSession as t };
86
+ //# sourceMappingURL=storage-CTRGT5wF.d.ts.map
@@ -0,0 +1,71 @@
1
+ import { a as ItdConfigError } from "./errors-GI10kZxk.js";
2
+ import { r as createKeyValueStore, t as MemoryKeyValueStore } from "./key-value-store-Bt2PSMxY.js";
3
+ //#region src/session/storage.ts
4
+ /**
5
+ * Создаёт независимый снимок сессии.
6
+ *
7
+ * Сессии пересекают границу пользовательского кода и внутреннего состояния клиента.
8
+ * Возвращать или сохранять их по ссылке нельзя: последующая мутация объекта или массива
9
+ * cookie меняла бы уже сохранённую сессию без вызова `set()`.
10
+ *
11
+ * @internal
12
+ */
13
+ function copySession(session) {
14
+ return {
15
+ ...session,
16
+ ...session.cookies ? { cookies: [...session.cookies] } : {}
17
+ };
18
+ }
19
+ /**
20
+ * Хранилище в памяти процесса — вариант по умолчанию.
21
+ *
22
+ * Сессия теряется при перезапуске. Для долгоживущих ботов возьмите `FileTokenStorage`
23
+ * из `itd-api/node`, для браузера — `LocalStorageTokenStorage` или
24
+ * `SessionStorageTokenStorage` из `itd-api/web`.
25
+ */
26
+ var MemoryTokenStorage = class {
27
+ #store = new MemoryKeyValueStore();
28
+ constructor(initial) {
29
+ if (initial) this.#store.set(TOKEN_STORAGE_KEY, copySession(initial));
30
+ }
31
+ get() {
32
+ const session = this.#store.get(TOKEN_STORAGE_KEY);
33
+ return session ? copySession(session) : null;
34
+ }
35
+ set(session) {
36
+ this.#store.set(TOKEN_STORAGE_KEY, copySession(session));
37
+ }
38
+ clear() {
39
+ this.#store.delete(TOKEN_STORAGE_KEY);
40
+ }
41
+ };
42
+ const TOKEN_STORAGE_KEY = "session";
43
+ function isPromise(value) {
44
+ return typeof value === "object" && value !== null && typeof value.then === "function";
45
+ }
46
+ /**
47
+ * Создаёт доменное хранилище сессии поверх общего {@link KeyValueStore}.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * const storage = createTokenStorage(withNamespace(redisStore, 'itd'));
52
+ * ```
53
+ */
54
+ function createTokenStorage(store, options = {}) {
55
+ const key = options.key ?? TOKEN_STORAGE_KEY;
56
+ if (typeof key !== "string") throw new ItdConfigError("key TokenStorage должен быть строкой");
57
+ const backend = createKeyValueStore(store);
58
+ return {
59
+ get() {
60
+ const value = backend.get(key);
61
+ if (isPromise(value)) return value.then((session) => session ? copySession(session) : null);
62
+ return value ? copySession(value) : null;
63
+ },
64
+ set: (session) => backend.set(key, copySession(session)),
65
+ clear: () => backend.delete(key)
66
+ };
67
+ }
68
+ //#endregion
69
+ export { copySession as n, createTokenStorage as r, MemoryTokenStorage as t };
70
+
71
+ //# sourceMappingURL=storage-CfHKzVHf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-CfHKzVHf.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 return {\n ...session,\n ...(session.cookies ? { cookies: [...session.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;CAC3D,OAAO;EACL,GAAG;EACH,GAAI,QAAQ,UAAU,EAAE,SAAS,CAAC,GAAG,QAAQ,OAAO,EAAE,IAAI,CAAC;CAC7D;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"}
@@ -0,0 +1,88 @@
1
+ const require_errors = require("./errors-BmP3TKoW.cjs");
2
+ const require_key_value_store = require("./key-value-store-B5GYVEYZ.cjs");
3
+ //#region src/session/storage.ts
4
+ /**
5
+ * Создаёт независимый снимок сессии.
6
+ *
7
+ * Сессии пересекают границу пользовательского кода и внутреннего состояния клиента.
8
+ * Возвращать или сохранять их по ссылке нельзя: последующая мутация объекта или массива
9
+ * cookie меняла бы уже сохранённую сессию без вызова `set()`.
10
+ *
11
+ * @internal
12
+ */
13
+ function copySession(session) {
14
+ return {
15
+ ...session,
16
+ ...session.cookies ? { cookies: [...session.cookies] } : {}
17
+ };
18
+ }
19
+ /**
20
+ * Хранилище в памяти процесса — вариант по умолчанию.
21
+ *
22
+ * Сессия теряется при перезапуске. Для долгоживущих ботов возьмите `FileTokenStorage`
23
+ * из `itd-api/node`, для браузера — `LocalStorageTokenStorage` или
24
+ * `SessionStorageTokenStorage` из `itd-api/web`.
25
+ */
26
+ var MemoryTokenStorage = class {
27
+ #store = new require_key_value_store.MemoryKeyValueStore();
28
+ constructor(initial) {
29
+ if (initial) this.#store.set(TOKEN_STORAGE_KEY, copySession(initial));
30
+ }
31
+ get() {
32
+ const session = this.#store.get(TOKEN_STORAGE_KEY);
33
+ return session ? copySession(session) : null;
34
+ }
35
+ set(session) {
36
+ this.#store.set(TOKEN_STORAGE_KEY, copySession(session));
37
+ }
38
+ clear() {
39
+ this.#store.delete(TOKEN_STORAGE_KEY);
40
+ }
41
+ };
42
+ const TOKEN_STORAGE_KEY = "session";
43
+ function isPromise(value) {
44
+ return typeof value === "object" && value !== null && typeof value.then === "function";
45
+ }
46
+ /**
47
+ * Создаёт доменное хранилище сессии поверх общего {@link KeyValueStore}.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * const storage = createTokenStorage(withNamespace(redisStore, 'itd'));
52
+ * ```
53
+ */
54
+ function createTokenStorage(store, options = {}) {
55
+ const key = options.key ?? TOKEN_STORAGE_KEY;
56
+ if (typeof key !== "string") throw new require_errors.ItdConfigError("key TokenStorage должен быть строкой");
57
+ const backend = require_key_value_store.createKeyValueStore(store);
58
+ return {
59
+ get() {
60
+ const value = backend.get(key);
61
+ if (isPromise(value)) return value.then((session) => session ? copySession(session) : null);
62
+ return value ? copySession(value) : null;
63
+ },
64
+ set: (session) => backend.set(key, copySession(session)),
65
+ clear: () => backend.delete(key)
66
+ };
67
+ }
68
+ //#endregion
69
+ Object.defineProperty(exports, "MemoryTokenStorage", {
70
+ enumerable: true,
71
+ get: function() {
72
+ return MemoryTokenStorage;
73
+ }
74
+ });
75
+ Object.defineProperty(exports, "copySession", {
76
+ enumerable: true,
77
+ get: function() {
78
+ return copySession;
79
+ }
80
+ });
81
+ Object.defineProperty(exports, "createTokenStorage", {
82
+ enumerable: true,
83
+ get: function() {
84
+ return createTokenStorage;
85
+ }
86
+ });
87
+
88
+ //# sourceMappingURL=storage-QNVxzpDB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-QNVxzpDB.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 return {\n ...session,\n ...(session.cookies ? { cookies: [...session.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;CAC3D,OAAO;EACL,GAAG;EACH,GAAI,QAAQ,UAAU,EAAE,SAAS,CAAC,GAAG,QAAQ,OAAO,EAAE,IAAI,CAAC;CAC7D;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"}
@@ -312,6 +312,7 @@ declare const ItdErrorCode: Readonly<{
312
312
  readonly SESSION_NOT_FOUND: "SESSION_NOT_FOUND";
313
313
  readonly MISSING_FLOW_TOKEN: "MISSING_FLOW_TOKEN";
314
314
  readonly PROFILE_USERNAME_TAKEN: "PROFILE_USERNAME_TAKEN";
315
+ readonly PROFILE_USERNAME_RESERVED: "PROFILE_USERNAME_RESERVED";
315
316
  readonly PROFILE_RESTRICTION_ACTIVE: "PROFILE_RESTRICTION_ACTIVE";
316
317
  readonly PROFILE_MODIFICATION_RESTRICTED: "PROFILE_MODIFICATION_RESTRICTED";
317
318
  readonly CONTENT_MODERATION_FAILED: "CONTENT_MODERATION_FAILED";
@@ -403,6 +404,15 @@ declare const BUCKET_LIMITS: Readonly<{
403
404
  readonly 'users.updateMe': 3;
404
405
  readonly 'reports.create': 3;
405
406
  readonly 'verification.submit': 3;
407
+ readonly shop: 150;
408
+ readonly 'shop.delivery.cities': 60;
409
+ readonly 'shop.delivery.calculate': 45;
410
+ readonly 'shop.delivery.points': 30;
411
+ readonly 'shop.consents.record': 15;
412
+ readonly 'shop.orders.pay': 13;
413
+ readonly 'shop.orders.verifyAccessCode': 13;
414
+ readonly 'shop.orders.create': 12;
415
+ readonly 'shop.orders.requestAccessCode': 4;
406
416
  }>;
407
417
  /** Имя встроенного бакета. */
408
418
  type RateLimitBucket = keyof typeof BUCKET_LIMITS;
@@ -845,6 +855,69 @@ declare const OPERATIONS: Readonly<{
845
855
  readonly method: "POST";
846
856
  readonly retrySafety: "unsafe";
847
857
  }>;
858
+ readonly 'shop.products.list': Readonly<{
859
+ readonly method: "GET";
860
+ readonly retrySafety: "safe";
861
+ readonly bucket: "shop";
862
+ }>;
863
+ readonly 'shop.products.get': Readonly<{
864
+ readonly method: "GET";
865
+ readonly retrySafety: "safe";
866
+ readonly bucket: "shop";
867
+ }>;
868
+ readonly 'shop.delivery.countries': Readonly<{
869
+ readonly method: "GET";
870
+ readonly retrySafety: "safe";
871
+ readonly bucket: "shop";
872
+ }>;
873
+ readonly 'shop.delivery.cities': Readonly<{
874
+ readonly method: "GET";
875
+ readonly retrySafety: "safe";
876
+ readonly bucket: "shop.delivery.cities";
877
+ }>;
878
+ readonly 'shop.delivery.points': Readonly<{
879
+ readonly method: "GET";
880
+ readonly retrySafety: "safe";
881
+ readonly bucket: "shop.delivery.points";
882
+ }>;
883
+ readonly 'shop.delivery.calculate': Readonly<{
884
+ readonly method: "POST";
885
+ readonly retrySafety: "safe";
886
+ readonly bucket: "shop.delivery.calculate";
887
+ }>;
888
+ readonly 'shop.orders.create': Readonly<{
889
+ readonly method: "POST";
890
+ readonly retrySafety: "idempotent";
891
+ readonly bucket: "shop.orders.create";
892
+ }>;
893
+ readonly 'shop.orders.list': Readonly<{
894
+ readonly method: "GET";
895
+ readonly retrySafety: "safe";
896
+ }>;
897
+ readonly 'shop.orders.get': Readonly<{
898
+ readonly method: "GET";
899
+ readonly retrySafety: "safe";
900
+ }>;
901
+ readonly 'shop.orders.pay': Readonly<{
902
+ readonly method: "POST";
903
+ readonly retrySafety: "unsafe";
904
+ readonly bucket: "shop.orders.pay";
905
+ }>;
906
+ readonly 'shop.orders.requestAccessCode': Readonly<{
907
+ readonly method: "POST";
908
+ readonly retrySafety: "unsafe";
909
+ readonly bucket: "shop.orders.requestAccessCode";
910
+ }>;
911
+ readonly 'shop.orders.verifyAccessCode': Readonly<{
912
+ readonly method: "POST";
913
+ readonly retrySafety: "unsafe";
914
+ readonly bucket: "shop.orders.verifyAccessCode";
915
+ }>;
916
+ readonly 'shop.consents.record': Readonly<{
917
+ readonly method: "POST";
918
+ readonly retrySafety: "unsafe";
919
+ readonly bucket: "shop.consents.record";
920
+ }>;
848
921
  }>;
849
922
  /** Стабильный ID встроенной операции. */
850
923
  type BuiltInOperationId = keyof typeof OPERATIONS;
@@ -1289,7 +1362,7 @@ interface OperationDefinition extends OperationMetadata {
1289
1362
  //#endregion
1290
1363
  //#region src/core/version.d.ts
1291
1364
  /** Версия библиотеки. Попадает в `User-Agent`. */
1292
- declare const LIBRARY_VERSION = "0.8.0";
1365
+ declare const LIBRARY_VERSION = "0.9.1";
1293
1366
  //#endregion
1294
1367
  //#region src/core/config.d.ts
1295
1368
  /** Базовый URL API итд.com. Домен записан в punycode: `итд.com`. */
@@ -1905,13 +1978,25 @@ interface MyProfile extends ProfileBase {
1905
1978
  * Endpoint доступен без сессии: в этом случае `authenticated` равен `false`,
1906
1979
  * а `user` — `null`.
1907
1980
  */
1981
+ interface AuthUser {
1982
+ id: UserId;
1983
+ username: string;
1984
+ displayName: string;
1985
+ /** Эмодзи-аватар, см. {@link Author.avatar}. */
1986
+ avatar: string;
1987
+ bio: string;
1988
+ verified: boolean;
1989
+ isPhoneVerified: boolean;
1990
+ /** Роли текущего пользователя, например `user`. */
1991
+ roles: string[];
1992
+ }
1908
1993
  interface AuthState {
1909
1994
  /** Есть ли действующая сессия. */
1910
1995
  authenticated: boolean;
1911
1996
  /** Заблокирован ли текущий аккаунт. */
1912
1997
  banned: boolean;
1913
- /** Текущий пользователь либо `null` без действующей сессии. */
1914
- user: MyProfile | null;
1998
+ /** Компактные данные текущего пользователя либо `null` без действующей сессии. */
1999
+ user: AuthUser | null;
1915
2000
  }
1916
2001
  /**
1917
2002
  * Чужой профиль — ответ `GET /api/users/{id|username}`.
@@ -1926,6 +2011,8 @@ interface PublicProfile extends ProfileBase {
1926
2011
  isFollowing: boolean;
1927
2012
  /** Подписан ли он на вас. */
1928
2013
  isFollowedBy: boolean;
2014
+ /** Может ли текущий пользователь написать этому профилю личное сообщение. */
2015
+ canMessage: boolean;
1929
2016
  /** Сейчас ли пользователь в сети. */
1930
2017
  online: boolean;
1931
2018
  /** Когда был в сети. `null`, если скрыто настройками приватности. */
@@ -2117,5 +2204,5 @@ declare function isKnownNotificationType(type: string): boolean;
2117
2204
  */
2118
2205
  declare function resolveNotificationUrl(notification: Notification): string;
2119
2206
  //#endregion
2120
- export { isItdValidationError as $, RateLimitBucket as $t, ItdFieldErrors as A, ResponseContext as At, ItdTimeoutError as B, ItdClock as Bt, ItdApiErrorInit as C, RateLimitBucketContext as Ct, ItdConflictError as D, RequestContext as Dt, ItdConfigError as E, RawRequestOptions as Et, ItdNotFoundError as F, QueryParams as Ft, isItdError as G, OPERATIONS as Gt, isItdApiError as H, BuiltInOperationId as Ht, ItdPhoneVerificationError as I, QueryValue as It, isItdNotFoundError as J, operationBucket as Jt, isItdFileError as K, OperationId as Kt, ItdRateLimitError as L, ServiceDefinition as Lt, ItdFileErrorReason as M, RetryDecisionContext as Mt, ItdForbiddenError as N, RetryOptions as Nt, ItdError as O, RequestExtensions as Ot, ItdNetworkError as P, RuntimeOptions as Pt, isItdStateError as Q, DEFAULT_RATE_LIMIT_BUCKET as Qt, ItdServerError as R, RateLimitPacing as Rt, ItdApiError as S, PaginationOptions as St, ItdAuthError as T, RateLimitOptions as Tt, isItdAuthError as U, CustomOperationId as Ut, ItdValidationError as V, systemClock as Vt, isItdConflictError as W, ItdOperationDefinition as Wt, isItdRateLimitError as X, operationRetrySafety as Xt, isItdPhoneVerificationError as Y, operationMethod as Yt, isItdServerError as Z, BUCKET_LIMITS as Zt, Profile as _, ServiceState as _n, RetrySafety as _t, NotificationEvent as a, AttachmentType as an, tokenProvider as at, UserSummary as b, ViewSource as bn, Logger as bt, NotificationSettings as c, FeedTab as cn, Unsubscribe as ct, Author as d, ItdErrorCode as dn, LIBRARY_VERSION as dt, IsoDate as en, ClientConnection as et, FollowResult as f, LikesVisibility as fn, FeatureOperationId as ft, PrivacySettings as g, ReportTargetType as gn, OperationMethod as gt, PinsResult as h, ReportReason as hn, OperationMetadata as ht, formatNotificationText as i, AccessType as in, bearerToken as it, ItdFileError as j, RetryContext as jt, ItdErrorKind as k, RequestOptions as kt, Actor as l, IncidentKind as ln, DEFAULT_BASE_URL as lt, Pin as m, NotificationType as mn, OperationContract as mt, canonicalNotificationType as n, UserId as nn, AuthProvider as nt, normalizeNotification as o, CommentSort as on, Emitter as ot, MyProfile as p, Loose as pn, OperationAnnotations as pt, isItdForbiddenError as q, isBuiltInOperationId as qt, isKnownNotificationType as r, UserRef as rn, anonymousAuth as rt, Notification as s, EventChannelStatus as sn, Listener as st, resolveNotificationUrl as t, Span as tn, AuthIdentity as tt, AuthState as u, InteractionType as un, STATUS_SERVICE as ut, PublicProfile as v, SpanType as vn, ClientHooks as vt, ItdApiErrorKind as w, RateLimitBucketOverride as wt, ItdAbortError as x, WallAccess as xn, OperationRequestOptions as xt, SubscriptionState as y, ViewReason as yn, ErrorContextHook as yt, ItdStateError as z, RuntimeMode as zt };
2121
- //# sourceMappingURL=url-Be9jlWRv.d.ts.map
2207
+ export { isItdStateError as $, DEFAULT_RATE_LIMIT_BUCKET as $t, ItdErrorKind as A, RequestOptions as At, ItdStateError as B, RuntimeMode as Bt, ItdApiError as C, PaginationOptions as Ct, ItdConfigError as D, RawRequestOptions as Dt, ItdAuthError as E, RateLimitOptions as Et, ItdNetworkError as F, RuntimeOptions as Ft, isItdConflictError as G, ItdOperationDefinition as Gt, ItdValidationError as H, systemClock as Ht, ItdNotFoundError as I, QueryParams as It, isItdForbiddenError as J, isBuiltInOperationId as Jt, isItdError as K, OPERATIONS as Kt, ItdPhoneVerificationError as L, QueryValue as Lt, ItdFileError as M, RetryContext as Mt, ItdFileErrorReason as N, RetryDecisionContext as Nt, ItdConflictError as O, RequestContext as Ot, ItdForbiddenError as P, RetryOptions as Pt, isItdServerError as Q, BUCKET_LIMITS as Qt, ItdRateLimitError as R, ServiceDefinition as Rt, ItdAbortError as S, WallAccess as Sn, OperationRequestOptions as St, ItdApiErrorKind as T, RateLimitBucketOverride as Tt, isItdApiError as U, BuiltInOperationId as Ut, ItdTimeoutError as V, ItdClock as Vt, isItdAuthError as W, CustomOperationId as Wt, isItdPhoneVerificationError as X, operationMethod as Xt, isItdNotFoundError as Y, operationBucket as Yt, isItdRateLimitError as Z, operationRetrySafety as Zt, PrivacySettings as _, ReportTargetType as _n, OperationMethod as _t, NotificationEvent as a, AccessType as an, bearerToken as at, SubscriptionState as b, ViewReason as bn, ErrorContextHook as bt, NotificationSettings as c, EventChannelStatus as cn, Listener as ct, AuthUser as d, InteractionType as dn, STATUS_SERVICE as dt, RateLimitBucket as en, isItdValidationError as et, Author as f, ItdErrorCode as fn, LIBRARY_VERSION as ft, PinsResult as g, ReportReason as gn, OperationMetadata as gt, Pin as h, NotificationType as hn, OperationContract as ht, formatNotificationText as i, UserRef as in, anonymousAuth as it, ItdFieldErrors as j, ResponseContext as jt, ItdError as k, RequestExtensions as kt, Actor as l, FeedTab as ln, Unsubscribe as lt, MyProfile as m, Loose as mn, OperationAnnotations as mt, canonicalNotificationType as n, Span as nn, AuthIdentity as nt, normalizeNotification as o, AttachmentType as on, tokenProvider as ot, FollowResult as p, LikesVisibility as pn, FeatureOperationId as pt, isItdFileError as q, OperationId as qt, isKnownNotificationType as r, UserId as rn, AuthProvider as rt, Notification as s, CommentSort as sn, Emitter as st, resolveNotificationUrl as t, IsoDate as tn, ClientConnection as tt, AuthState as u, IncidentKind as un, DEFAULT_BASE_URL as ut, Profile as v, ServiceState as vn, RetrySafety as vt, ItdApiErrorInit as w, RateLimitBucketContext as wt, UserSummary as x, ViewSource as xn, Logger as xt, PublicProfile as y, SpanType as yn, ClientHooks as yt, ItdServerError as z, RateLimitPacing as zt };
2208
+ //# sourceMappingURL=url-CZZcyPI0.d.cts.map