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.
- package/README.md +66 -21
- package/dist/events/index.cjs +3 -3
- package/dist/events/index.d.cts +2 -2
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.js +3 -3
- package/dist/index.cjs +26 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +5 -4
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +2 -2
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.js +4 -3
- package/dist/node/index.js.map +1 -1
- package/dist/rest/index.cjs +16 -4
- package/dist/rest/index.cjs.map +1 -1
- package/dist/rest/index.d.cts +5 -3
- package/dist/rest/index.d.ts +5 -3
- package/dist/rest/index.js +9 -5
- package/dist/rest/index.js.map +1 -1
- package/dist/shared/{events-QyhQZrnC.d.ts → events-BDdJyH2p.d.ts} +2 -2
- package/dist/shared/{events-Br2r7coi.d.cts → events-BQyH5-S0.d.cts} +2 -2
- package/dist/shared/{events-iTteVsd_.cjs → events-BqFkwwTw.cjs} +3 -3
- package/dist/shared/{events-iTteVsd_.cjs.map → events-BqFkwwTw.cjs.map} +1 -1
- package/dist/shared/{events-TfhKh26b.js → events-D6y0Hxyz.js} +3 -3
- package/dist/shared/{events-TfhKh26b.js.map → events-D6y0Hxyz.js.map} +1 -1
- package/dist/shared/{storage-BLmXmzKF.cjs → key-value-store-B5GYVEYZ.cjs} +1 -85
- package/dist/shared/key-value-store-B5GYVEYZ.cjs.map +1 -0
- package/dist/shared/{storage-CCxn0Kkv.js → key-value-store-Bt2PSMxY.js} +2 -68
- package/dist/shared/key-value-store-Bt2PSMxY.js.map +1 -0
- package/dist/shared/key-value-store-COZaNHZS.d.cts +69 -0
- package/dist/shared/key-value-store-COZaNHZS.d.ts +69 -0
- package/dist/shared/{multi-storage-DccjD7Ww.d.ts → multi-storage-BEL7tcKn.d.cts} +3 -2
- package/dist/shared/{multi-storage-CCUgkqvI.cjs → multi-storage-CDKLa956.cjs} +8 -7
- package/dist/shared/{multi-storage-CCUgkqvI.cjs.map → multi-storage-CDKLa956.cjs.map} +1 -1
- package/dist/shared/{multi-storage-CjAPB5Kq.d.cts → multi-storage-LkljOSzA.d.ts} +3 -2
- package/dist/shared/{multi-storage-1AEZTczk.js → multi-storage-SoW05uzO.js} +4 -3
- package/dist/shared/{multi-storage-1AEZTczk.js.map → multi-storage-SoW05uzO.js.map} +1 -1
- package/dist/shared/{options-BUfoHE9G.cjs → options-DOJYtoti.cjs} +2 -2
- package/dist/shared/{options-BUfoHE9G.cjs.map → options-DOJYtoti.cjs.map} +1 -1
- package/dist/shared/{options-BNP633A5.js → options-DhgGg7Ms.js} +2 -2
- package/dist/shared/{options-BNP633A5.js.map → options-DhgGg7Ms.js.map} +1 -1
- package/dist/shared/{redact-DB9EMGJx.cjs → redact-BP00URmQ.cjs} +15 -4
- package/dist/shared/{redact-DB9EMGJx.cjs.map → redact-BP00URmQ.cjs.map} +1 -1
- package/dist/shared/{redact-FNK29Fv-.js → redact-Ba5iSVYZ.js} +15 -4
- package/dist/shared/{redact-FNK29Fv-.js.map → redact-Ba5iSVYZ.js.map} +1 -1
- package/dist/shared/{render-BszcKF7S.d.cts → render-BU1_wex8.d.cts} +378 -12
- package/dist/shared/{render-DVB7T8pm.d.ts → render-CZ_-F2Tl.d.ts} +378 -12
- package/dist/shared/{render-DNTESBSl.cjs → render-DAEeCMk9.cjs} +461 -8
- package/dist/shared/render-DAEeCMk9.cjs.map +1 -0
- package/dist/shared/{render-CiL1VS0b.js → render-sb1VJhUA.js} +415 -10
- package/dist/shared/render-sb1VJhUA.js.map +1 -0
- package/dist/shared/storage-BQrtKon9.d.cts +86 -0
- package/dist/shared/storage-CTRGT5wF.d.ts +86 -0
- package/dist/shared/storage-CfHKzVHf.js +71 -0
- package/dist/shared/storage-CfHKzVHf.js.map +1 -0
- package/dist/shared/storage-QNVxzpDB.cjs +88 -0
- package/dist/shared/storage-QNVxzpDB.cjs.map +1 -0
- package/dist/shared/{url-Be9jlWRv.d.ts → url-CZZcyPI0.d.cts} +92 -5
- package/dist/shared/{url-Be9jlWRv.d.cts → url-CZZcyPI0.d.ts} +92 -5
- package/dist/shared/{url-CFN1sT9S.cjs → url-CzHqE-Fg.cjs} +83 -4
- package/dist/shared/{url-CFN1sT9S.cjs.map → url-CzHqE-Fg.cjs.map} +1 -1
- package/dist/shared/{url-B3ocFlHj.js → url-Dsr4c5r5.js} +78 -5
- package/dist/shared/{url-B3ocFlHj.js.map → url-Dsr4c5r5.js.map} +1 -1
- package/dist/web/index.cjs +4 -3
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.js +2 -1
- package/dist/web/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/shared/render-CiL1VS0b.js.map +0 -1
- package/dist/shared/render-DNTESBSl.cjs.map +0 -1
- package/dist/shared/storage-BLmXmzKF.cjs.map +0 -1
- package/dist/shared/storage-CCxn0Kkv.js.map +0 -1
- package/dist/shared/storage-C_eICCep.d.cts +0 -152
- 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.
|
|
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
|
-
/**
|
|
1914
|
-
user:
|
|
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 {
|
|
2121
|
-
//# sourceMappingURL=url-
|
|
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
|