itd-api 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -14
- package/dist/events/index.cjs +53 -0
- package/dist/events/index.d.cts +3 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.js +5 -0
- package/dist/index.cjs +269 -175
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +77 -56
- package/dist/index.d.ts +77 -56
- package/dist/index.js +251 -160
- package/dist/index.js.map +1 -1
- package/dist/node/index.cjs +4 -4
- package/dist/node/index.d.cts +1 -1
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.js +4 -4
- package/dist/rest/index.cjs +72 -14
- package/dist/rest/index.cjs.map +1 -1
- package/dist/rest/index.d.cts +11 -3
- package/dist/rest/index.d.ts +11 -3
- package/dist/rest/index.js +66 -8
- package/dist/rest/index.js.map +1 -1
- package/dist/shared/{errors-DfU8M5eS.cjs → errors-BmP3TKoW.cjs} +3 -3
- package/dist/shared/{errors-DfU8M5eS.cjs.map → errors-BmP3TKoW.cjs.map} +1 -1
- package/dist/shared/{errors-Bhrd2fJd.js → errors-GI10kZxk.js} +3 -3
- package/dist/shared/{errors-Bhrd2fJd.js.map → errors-GI10kZxk.js.map} +1 -1
- package/dist/shared/events-Br2r7coi.d.cts +698 -0
- package/dist/shared/events-QyhQZrnC.d.ts +698 -0
- package/dist/shared/{websocket-CbzB1Leq.js → events-TfhKh26b.js} +770 -490
- package/dist/shared/events-TfhKh26b.js.map +1 -0
- package/dist/shared/{websocket-sYlynrr0.cjs → events-iTteVsd_.cjs} +834 -518
- package/dist/shared/events-iTteVsd_.cjs.map +1 -0
- package/dist/shared/{multi-storage-CkvTUC5m.js → multi-storage-1AEZTczk.js} +4 -4
- package/dist/shared/{multi-storage-CkvTUC5m.js.map → multi-storage-1AEZTczk.js.map} +1 -1
- package/dist/shared/{multi-storage--yTEqiod.cjs → multi-storage-CCUgkqvI.cjs} +6 -6
- package/dist/shared/{multi-storage--yTEqiod.cjs.map → multi-storage-CCUgkqvI.cjs.map} +1 -1
- package/dist/shared/{options-DtATYdLr.js → options-BNP633A5.js} +8 -6
- package/dist/shared/options-BNP633A5.js.map +1 -0
- package/dist/shared/{options-Dg5N3r1V.cjs → options-BUfoHE9G.cjs} +8 -6
- package/dist/shared/options-BUfoHE9G.cjs.map +1 -0
- package/dist/shared/{cookies-DZwFq6kr.cjs → redact-DB9EMGJx.cjs} +301 -2
- package/dist/shared/redact-DB9EMGJx.cjs.map +1 -0
- package/dist/shared/{cookies-tX2sNwxb.js → redact-FNK29Fv-.js} +224 -3
- package/dist/shared/redact-FNK29Fv-.js.map +1 -0
- package/dist/shared/{render-DMp_3Nzk.d.cts → render-BszcKF7S.d.cts} +432 -254
- package/dist/shared/{render-vtLixIiU.js → render-CiL1VS0b.js} +1261 -621
- package/dist/shared/render-CiL1VS0b.js.map +1 -0
- package/dist/shared/{render-DyeHJNBw.cjs → render-DNTESBSl.cjs} +1335 -671
- package/dist/shared/render-DNTESBSl.cjs.map +1 -0
- package/dist/shared/{render-DZrxhC5_.d.ts → render-DVB7T8pm.d.ts} +432 -254
- package/dist/shared/{storage-BPJR_k4-.cjs → storage-BLmXmzKF.cjs} +2 -2
- package/dist/shared/{storage-BPJR_k4-.cjs.map → storage-BLmXmzKF.cjs.map} +1 -1
- package/dist/shared/{storage-D86edNCB.js → storage-CCxn0Kkv.js} +2 -2
- package/dist/shared/{storage-D86edNCB.js.map → storage-CCxn0Kkv.js.map} +1 -1
- package/dist/shared/{url-CYXgxqGx.js → url-B3ocFlHj.js} +491 -425
- package/dist/shared/url-B3ocFlHj.js.map +1 -0
- package/dist/shared/{url-B6-bXHKt.d.ts → url-Be9jlWRv.d.cts} +1233 -1195
- package/dist/shared/{url-B6-bXHKt.d.cts → url-Be9jlWRv.d.ts} +1233 -1195
- package/dist/shared/{url-yjl2c8Ie.cjs → url-CFN1sT9S.cjs} +562 -478
- package/dist/shared/url-CFN1sT9S.cjs.map +1 -0
- package/dist/web/index.cjs +2 -2
- package/dist/web/index.js +2 -2
- package/package.json +16 -15
- package/dist/realtime/index.cjs +0 -165
- package/dist/realtime/index.cjs.map +0 -1
- package/dist/realtime/index.d.cts +0 -51
- package/dist/realtime/index.d.ts +0 -51
- package/dist/realtime/index.js +0 -120
- package/dist/realtime/index.js.map +0 -1
- package/dist/shared/auth-provider-BfogACAb.js +0 -91
- package/dist/shared/auth-provider-BfogACAb.js.map +0 -1
- package/dist/shared/auth-provider-CTJkKfgy.cjs +0 -108
- package/dist/shared/auth-provider-CTJkKfgy.cjs.map +0 -1
- package/dist/shared/cookies-DZwFq6kr.cjs.map +0 -1
- package/dist/shared/cookies-tX2sNwxb.js.map +0 -1
- package/dist/shared/options-Dg5N3r1V.cjs.map +0 -1
- package/dist/shared/options-DtATYdLr.js.map +0 -1
- package/dist/shared/render-DyeHJNBw.cjs.map +0 -1
- package/dist/shared/render-vtLixIiU.js.map +0 -1
- package/dist/shared/url-CYXgxqGx.js.map +0 -1
- package/dist/shared/url-yjl2c8Ie.cjs.map +0 -1
- package/dist/shared/websocket-BMtihD56.d.ts +0 -562
- package/dist/shared/websocket-CbzB1Leq.js.map +0 -1
- package/dist/shared/websocket-D1p32SB2.d.cts +0 -562
- package/dist/shared/websocket-sYlynrr0.cjs.map +0 -1
package/dist/web/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_errors = require("../shared/errors-
|
|
3
|
-
const require_storage = require("../shared/storage-
|
|
2
|
+
const require_errors = require("../shared/errors-BmP3TKoW.cjs");
|
|
3
|
+
const require_storage = require("../shared/storage-BLmXmzKF.cjs");
|
|
4
4
|
//#region src/web.ts
|
|
5
5
|
/**
|
|
6
6
|
* `itd-api/web` — хранилища для браузера.
|
package/dist/web/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as ItdConfigError } from "../shared/errors-
|
|
2
|
-
import { i as MemoryKeyValueStore, r as createTokenStorage } from "../shared/storage-
|
|
1
|
+
import { a as ItdConfigError } from "../shared/errors-GI10kZxk.js";
|
|
2
|
+
import { i as MemoryKeyValueStore, r as createTokenStorage } from "../shared/storage-CCxn0Kkv.js";
|
|
3
3
|
//#region src/web.ts
|
|
4
4
|
/**
|
|
5
5
|
* `itd-api/web` — хранилища для браузера.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "itd-api",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "JS/TS SDK & API клиент для соцсети ИТД (итд.com)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/KiowDev/itd-api.git"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"rest-api",
|
|
19
19
|
"client",
|
|
20
20
|
"sdk",
|
|
21
|
-
"
|
|
21
|
+
"events",
|
|
22
22
|
"social",
|
|
23
23
|
"typescript"
|
|
24
24
|
],
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"rest": [
|
|
49
49
|
"./dist/rest/index.d.ts"
|
|
50
50
|
],
|
|
51
|
-
"
|
|
52
|
-
"./dist/
|
|
51
|
+
"events": [
|
|
52
|
+
"./dist/events/index.d.ts"
|
|
53
53
|
],
|
|
54
54
|
"node": [
|
|
55
55
|
"./dist/node/index.d.ts"
|
|
@@ -80,14 +80,14 @@
|
|
|
80
80
|
"default": "./dist/rest/index.cjs"
|
|
81
81
|
}
|
|
82
82
|
},
|
|
83
|
-
"./
|
|
83
|
+
"./events": {
|
|
84
84
|
"import": {
|
|
85
|
-
"types": "./dist/
|
|
86
|
-
"default": "./dist/
|
|
85
|
+
"types": "./dist/events/index.d.ts",
|
|
86
|
+
"default": "./dist/events/index.js"
|
|
87
87
|
},
|
|
88
88
|
"require": {
|
|
89
|
-
"types": "./dist/
|
|
90
|
-
"default": "./dist/
|
|
89
|
+
"types": "./dist/events/index.d.cts",
|
|
90
|
+
"default": "./dist/events/index.cjs"
|
|
91
91
|
}
|
|
92
92
|
},
|
|
93
93
|
"./node": {
|
|
@@ -125,6 +125,7 @@
|
|
|
125
125
|
"lint": "biome check src test packages",
|
|
126
126
|
"lint:fix": "biome check --write src test packages",
|
|
127
127
|
"check:layers": "node scripts/check-imports.mjs",
|
|
128
|
+
"check:public-feature": "tsc --project test/fixtures/tsconfig.public-feature.json && node scripts/check-public-feature.mjs",
|
|
128
129
|
"measure:size": "node scripts/measure-bundles.mjs",
|
|
129
130
|
"docs": "npm run docs:build",
|
|
130
131
|
"docs:api": "node scripts/build-docs.mjs",
|
|
@@ -134,15 +135,15 @@
|
|
|
134
135
|
"docs:check": "npm run docs:build",
|
|
135
136
|
"check:pack": "publint && attw --pack .",
|
|
136
137
|
"version": "npm run sync-version && git add src/core/version.ts",
|
|
137
|
-
"prepublishOnly": "npm run typecheck && npm run check:layers && npm run test && npm run build && npm run check:pack"
|
|
138
|
+
"prepublishOnly": "npm run typecheck && npm run check:layers && npm run test && npm run build && npm run check:public-feature && npm run check:pack"
|
|
138
139
|
},
|
|
139
140
|
"devDependencies": {
|
|
140
141
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
141
|
-
"@biomejs/biome": "^2.5.
|
|
142
|
-
"@types/node": "^26.
|
|
142
|
+
"@biomejs/biome": "^2.5.7",
|
|
143
|
+
"@types/node": "^26.2.0",
|
|
143
144
|
"@vitest/coverage-v8": "^4.1.10",
|
|
144
|
-
"eventsource-parser": "^3.1.
|
|
145
|
-
"publint": "^0.3.
|
|
145
|
+
"eventsource-parser": "^3.1.1",
|
|
146
|
+
"publint": "^0.3.23",
|
|
146
147
|
"set-cookie-parser": "^3.1.2",
|
|
147
148
|
"tsdown": "^0.22.14",
|
|
148
149
|
"typedoc": "^0.28.20",
|
package/dist/realtime/index.cjs
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_url = require("../shared/url-yjl2c8Ie.cjs");
|
|
3
|
-
const require_errors = require("../shared/errors-DfU8M5eS.cjs");
|
|
4
|
-
const require_websocket = require("../shared/websocket-sYlynrr0.cjs");
|
|
5
|
-
const require_auth_provider = require("../shared/auth-provider-CTJkKfgy.cjs");
|
|
6
|
-
//#region src/realtime/client.ts
|
|
7
|
-
/**
|
|
8
|
-
* Поток уведомлений с собственным конвейером запросов.
|
|
9
|
-
*
|
|
10
|
-
* Тот же {@link ItdRealtime}, что отдаёт `itd.realtime()`, но собранный без полного клиента:
|
|
11
|
-
* ресурсы, билдеры и сессия сюда не входят. Нужен приложениям, которым от API нужны только
|
|
12
|
-
* события, — виджетам, счётчикам непрочитанного, фоновым слушателям.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```ts
|
|
16
|
-
* import { createRealtimeClient } from 'itd-api/realtime';
|
|
17
|
-
*
|
|
18
|
-
* await using stream = createRealtimeClient({ auth: token });
|
|
19
|
-
* stream.on('notification', ({ notification }) => console.log(notification.type));
|
|
20
|
-
* await stream.connect();
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
var ItdRealtimeClient = class ItdRealtimeClient extends require_websocket.ItdRealtime {
|
|
24
|
-
#runtime;
|
|
25
|
-
/** Общий результат терминальной очистки для идемпотентных повторных вызовов. */
|
|
26
|
-
#disposePromise;
|
|
27
|
-
#disposed = false;
|
|
28
|
-
constructor(options = {}) {
|
|
29
|
-
const runtime = require_url.createClientRuntime(options, {
|
|
30
|
-
catalog: require_url.ITD_CATALOG,
|
|
31
|
-
auth: () => resolveAuthProvider(options.auth)
|
|
32
|
-
});
|
|
33
|
-
super(realtimeDeps(runtime), options);
|
|
34
|
-
this.#runtime = runtime;
|
|
35
|
-
require_websocket.setRealtimeConnectGuard(this, () => {
|
|
36
|
-
if (!this.#disposed) return;
|
|
37
|
-
throw new require_errors.ItdStateError("Поток уже окончательно освобождён через dispose(); нельзя подключить его снова. Создайте новый");
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Окончательно освобождает поток и его конвейер: отключает соединение, дожидается
|
|
42
|
-
* обработчиков и останавливает очередь запросов.
|
|
43
|
-
*
|
|
44
|
-
* Повторные вызовы возвращают тот же результат очистки.
|
|
45
|
-
*/
|
|
46
|
-
dispose() {
|
|
47
|
-
if (this.#disposePromise) return this.#disposePromise;
|
|
48
|
-
this.#disposed = true;
|
|
49
|
-
this.#disposePromise = this.#dispose();
|
|
50
|
-
return this.#disposePromise;
|
|
51
|
-
}
|
|
52
|
-
async #dispose() {
|
|
53
|
-
const errors = [];
|
|
54
|
-
this.disconnect();
|
|
55
|
-
try {
|
|
56
|
-
await this.drain();
|
|
57
|
-
} catch (error) {
|
|
58
|
-
errors.push(error);
|
|
59
|
-
}
|
|
60
|
-
try {
|
|
61
|
-
this.#runtime.close();
|
|
62
|
-
await this.#runtime.dispose();
|
|
63
|
-
} catch (error) {
|
|
64
|
-
errors.push(error);
|
|
65
|
-
}
|
|
66
|
-
if (errors.length > 0) throw new AggregateError(errors, "Не удалось освободить поток");
|
|
67
|
-
}
|
|
68
|
-
/** Позволяет использовать поток с `await using`. */
|
|
69
|
-
[Symbol.asyncDispose]() {
|
|
70
|
-
return this.dispose();
|
|
71
|
-
}
|
|
72
|
-
static {
|
|
73
|
-
require_url.installAsyncDisposeFallback(ItdRealtimeClient);
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
/** Приводит опцию `auth` к провайдеру конвейера. */
|
|
77
|
-
function resolveAuthProvider(auth) {
|
|
78
|
-
if (auth === void 0) return require_auth_provider.anonymousAuth();
|
|
79
|
-
return typeof auth === "string" ? require_auth_provider.bearerToken(auth) : auth;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Связывает поток с собранным конвейером.
|
|
83
|
-
*
|
|
84
|
-
* Начальный счётчик непрочитанных берётся той же операцией, что и при опросе
|
|
85
|
-
* (`realtime.poll.unread`): ресурс уведомлений потоку для этого не нужен.
|
|
86
|
-
*/
|
|
87
|
-
function realtimeDeps(runtime) {
|
|
88
|
-
const request = ({ operationId, path, query, signal }) => runtime.http.operation(operationId, {
|
|
89
|
-
path,
|
|
90
|
-
query,
|
|
91
|
-
signal
|
|
92
|
-
});
|
|
93
|
-
return {
|
|
94
|
-
baseUrl: runtime.config.baseUrl,
|
|
95
|
-
fetch: runtime.config.fetch,
|
|
96
|
-
clock: runtime.config.clock,
|
|
97
|
-
logger: runtime.config.logger,
|
|
98
|
-
request,
|
|
99
|
-
baseHeaders: (url) => runtime.platformHeaders(url),
|
|
100
|
-
getToken: () => runtime.auth.token(),
|
|
101
|
-
refresh: () => runtime.auth.recover(),
|
|
102
|
-
fetchUnreadCount: async () => {
|
|
103
|
-
const payload = await request({
|
|
104
|
-
operationId: "realtime.poll.unread",
|
|
105
|
-
path: "/api/notifications/count"
|
|
106
|
-
});
|
|
107
|
-
return require_url.pickNumber(payload, "count", 0);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Создаёт поток уведомлений с собственным конвейером. Равнозначно конструктору
|
|
113
|
-
* {@link ItdRealtimeClient}.
|
|
114
|
-
*/
|
|
115
|
-
function createRealtimeClient(options = {}) {
|
|
116
|
-
return new ItdRealtimeClient(options);
|
|
117
|
-
}
|
|
118
|
-
//#endregion
|
|
119
|
-
exports.DEFAULT_BASE_URL = require_url.DEFAULT_BASE_URL;
|
|
120
|
-
exports.ItdAbortError = require_errors.ItdAbortError;
|
|
121
|
-
exports.ItdApiError = require_errors.ItdApiError;
|
|
122
|
-
exports.ItdApiErrorKind = require_errors.ItdApiErrorKind;
|
|
123
|
-
exports.ItdAuthError = require_errors.ItdAuthError;
|
|
124
|
-
exports.ItdConfigError = require_errors.ItdConfigError;
|
|
125
|
-
exports.ItdError = require_errors.ItdError;
|
|
126
|
-
exports.ItdErrorKind = require_errors.ItdErrorKind;
|
|
127
|
-
exports.ItdForbiddenError = require_errors.ItdForbiddenError;
|
|
128
|
-
exports.ItdNetworkError = require_errors.ItdNetworkError;
|
|
129
|
-
exports.ItdNotFoundError = require_errors.ItdNotFoundError;
|
|
130
|
-
exports.ItdRateLimitError = require_errors.ItdRateLimitError;
|
|
131
|
-
exports.ItdRealtime = require_websocket.ItdRealtime;
|
|
132
|
-
exports.ItdRealtimeClient = ItdRealtimeClient;
|
|
133
|
-
exports.ItdServerError = require_errors.ItdServerError;
|
|
134
|
-
exports.ItdStateError = require_errors.ItdStateError;
|
|
135
|
-
exports.ItdTimeoutError = require_errors.ItdTimeoutError;
|
|
136
|
-
exports.ItdValidationError = require_errors.ItdValidationError;
|
|
137
|
-
exports.LIBRARY_VERSION = require_url.LIBRARY_VERSION;
|
|
138
|
-
exports.NotificationType = require_url.NotificationType;
|
|
139
|
-
exports.RealtimeComposer = require_websocket.RealtimeComposer;
|
|
140
|
-
exports.RealtimeRouter = require_websocket.RealtimeRouter;
|
|
141
|
-
exports.RealtimeStatus = require_url.RealtimeStatus;
|
|
142
|
-
exports.RealtimeTransportKind = require_websocket.RealtimeTransportKind;
|
|
143
|
-
exports.RealtimeUpdateOrigin = require_websocket.RealtimeUpdateOrigin;
|
|
144
|
-
exports.RealtimeUpdateType = require_websocket.RealtimeUpdateType;
|
|
145
|
-
exports.RuntimeMode = require_url.RuntimeMode;
|
|
146
|
-
exports.UnauthorizedStreamError = require_websocket.UnauthorizedStreamError;
|
|
147
|
-
exports.WebSocketTransport = require_websocket.WebSocketTransport;
|
|
148
|
-
exports.anonymousAuth = require_auth_provider.anonymousAuth;
|
|
149
|
-
exports.bearerToken = require_auth_provider.bearerToken;
|
|
150
|
-
exports.canonicalNotificationType = require_url.canonicalNotificationType;
|
|
151
|
-
exports.createRealtimeClient = createRealtimeClient;
|
|
152
|
-
exports.formatNotificationText = require_url.formatNotificationText;
|
|
153
|
-
exports.isItdApiError = require_errors.isItdApiError;
|
|
154
|
-
exports.isItdAuthError = require_errors.isItdAuthError;
|
|
155
|
-
exports.isItdError = require_errors.isItdError;
|
|
156
|
-
exports.isItdRateLimitError = require_errors.isItdRateLimitError;
|
|
157
|
-
exports.isItdStateError = require_errors.isItdStateError;
|
|
158
|
-
exports.isKnownNotificationType = require_url.isKnownNotificationType;
|
|
159
|
-
exports.normalizeNotification = require_url.normalizeNotification;
|
|
160
|
-
exports.resolveNotificationUrl = require_url.resolveNotificationUrl;
|
|
161
|
-
exports.runRealtimeMiddleware = require_websocket.runRealtimeMiddleware;
|
|
162
|
-
exports.systemClock = require_url.systemClock;
|
|
163
|
-
exports.tokenProvider = require_auth_provider.tokenProvider;
|
|
164
|
-
|
|
165
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["ItdRealtime","#runtime","createClientRuntime","ITD_CATALOG","#disposed","ItdStateError","#disposePromise","#dispose","anonymousAuth","bearerToken","pickNumber"],"sources":["../../src/realtime/client.ts"],"sourcesContent":["import { installAsyncDisposeFallback } from '../core/async-dispose.js';\nimport { type AuthProvider, anonymousAuth, bearerToken } from '../core/auth-provider.js';\nimport { ItdStateError } from '../core/errors.js';\nimport { type ClientRuntime, createClientRuntime } from '../core/execution/client-runtime.js';\nimport type { RuntimeOptions } from '../core/options.js';\nimport { pickNumber } from '../core/unwrap.js';\nimport { ITD_CATALOG } from '../domain/catalog.js';\nimport {\n ItdRealtime,\n type RealtimeDeps,\n type RealtimeOptions,\n setRealtimeConnectGuard,\n} from './stream.js';\nimport type { RealtimeContext } from './updates.js';\n\n/** Опции конструктора {@link ItdRealtimeClient}. */\nexport interface RealtimeClientOptions<C extends RealtimeContext = RealtimeContext>\n extends RuntimeOptions,\n RealtimeOptions<C> {\n /**\n * Авторизация. Строка — сокращение для {@link bearerToken}.\n *\n * Без неё поток идёт анонимно. Токен считается готовым: продлевать его клиент не умеет,\n * а на отказ авторизации переподключение спрашивает токен заново. Сессия, которая входит\n * по паролю и продлевает себя сама, живёт в полном `ItdClient`.\n */\n auth?: string | AuthProvider | undefined;\n}\n\n/**\n * Поток уведомлений с собственным конвейером запросов.\n *\n * Тот же {@link ItdRealtime}, что отдаёт `itd.realtime()`, но собранный без полного клиента:\n * ресурсы, билдеры и сессия сюда не входят. Нужен приложениям, которым от API нужны только\n * события, — виджетам, счётчикам непрочитанного, фоновым слушателям.\n *\n * @example\n * ```ts\n * import { createRealtimeClient } from 'itd-api/realtime';\n *\n * await using stream = createRealtimeClient({ auth: token });\n * stream.on('notification', ({ notification }) => console.log(notification.type));\n * await stream.connect();\n * ```\n */\nexport class ItdRealtimeClient<C extends RealtimeContext = RealtimeContext> extends ItdRealtime<C> {\n readonly #runtime: ClientRuntime;\n /** Общий результат терминальной очистки для идемпотентных повторных вызовов. */\n #disposePromise: Promise<void> | undefined;\n #disposed = false;\n\n constructor(options: RealtimeClientOptions<C> = {}) {\n const runtime = createClientRuntime(options, {\n catalog: ITD_CATALOG,\n auth: () => resolveAuthProvider(options.auth),\n });\n\n super(realtimeDeps(runtime), options);\n this.#runtime = runtime;\n\n setRealtimeConnectGuard<C>(this, () => {\n if (!this.#disposed) return;\n throw new ItdStateError(\n 'Поток уже окончательно освобождён через dispose(); нельзя подключить его снова. ' +\n 'Создайте новый',\n );\n });\n }\n\n /**\n * Окончательно освобождает поток и его конвейер: отключает соединение, дожидается\n * обработчиков и останавливает очередь запросов.\n *\n * Повторные вызовы возвращают тот же результат очистки.\n */\n dispose(): Promise<void> {\n if (this.#disposePromise) return this.#disposePromise;\n this.#disposed = true;\n this.#disposePromise = this.#dispose();\n return this.#disposePromise;\n }\n\n async #dispose(): Promise<void> {\n const errors: unknown[] = [];\n this.disconnect();\n try {\n await this.drain();\n } catch (error) {\n errors.push(error);\n }\n try {\n this.#runtime.close();\n await this.#runtime.dispose();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length > 0) throw new AggregateError(errors, 'Не удалось освободить поток');\n }\n\n /** Позволяет использовать поток с `await using`. */\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n\n static {\n installAsyncDisposeFallback(ItdRealtimeClient);\n }\n}\n\n/** Приводит опцию `auth` к провайдеру конвейера. */\nfunction resolveAuthProvider(auth: RealtimeClientOptions['auth']): AuthProvider {\n if (auth === undefined) return anonymousAuth();\n return typeof auth === 'string' ? bearerToken(auth) : auth;\n}\n\n/**\n * Связывает поток с собранным конвейером.\n *\n * Начальный счётчик непрочитанных берётся той же операцией, что и при опросе\n * (`realtime.poll.unread`): ресурс уведомлений потоку для этого не нужен.\n */\nfunction realtimeDeps(runtime: ClientRuntime): RealtimeDeps {\n const request: NonNullable<RealtimeDeps['request']> = ({ operationId, path, query, signal }) =>\n runtime.http.operation(operationId, { path, query, signal });\n\n return {\n baseUrl: runtime.config.baseUrl,\n fetch: runtime.config.fetch,\n clock: runtime.config.clock,\n logger: runtime.config.logger,\n request,\n baseHeaders: (url) => runtime.platformHeaders(url),\n getToken: () => runtime.auth.token(),\n refresh: () => runtime.auth.recover(),\n fetchUnreadCount: async () => {\n const payload = await request({\n operationId: 'realtime.poll.unread',\n path: '/api/notifications/count',\n });\n return pickNumber(payload, 'count', 0);\n },\n };\n}\n\n/**\n * Создаёт поток уведомлений с собственным конвейером. Равнозначно конструктору\n * {@link ItdRealtimeClient}.\n */\nexport function createRealtimeClient<C extends RealtimeContext = RealtimeContext>(\n options: RealtimeClientOptions<C> = {},\n): ItdRealtimeClient<C> {\n return new ItdRealtimeClient<C>(options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6CA,IAAa,oBAAb,MAAa,0BAAuEA,kBAAAA,YAAe;CACjG;;CAEA;CACA,YAAY;CAEZ,YAAY,UAAoC,CAAC,GAAG;EAClD,MAAM,UAAUE,YAAAA,oBAAoB,SAAS;GAC3C,SAASC,YAAAA;GACT,YAAY,oBAAoB,QAAQ,IAAI;EAC9C,CAAC;EAED,MAAM,aAAa,OAAO,GAAG,OAAO;EACpC,KAAKF,WAAW;EAEhB,kBAAA,wBAA2B,YAAY;GACrC,IAAI,CAAC,KAAKG,WAAW;GACrB,MAAM,IAAIC,eAAAA,cACR,gGAEF;EACF,CAAC;CACH;;;;;;;CAQA,UAAyB;EACvB,IAAI,KAAKC,iBAAiB,OAAO,KAAKA;EACtC,KAAKF,YAAY;EACjB,KAAKE,kBAAkB,KAAKC,SAAS;EACrC,OAAO,KAAKD;CACd;CAEA,MAAMC,WAA0B;EAC9B,MAAM,SAAoB,CAAC;EAC3B,KAAK,WAAW;EAChB,IAAI;GACF,MAAM,KAAK,MAAM;EACnB,SAAS,OAAO;GACd,OAAO,KAAK,KAAK;EACnB;EACA,IAAI;GACF,KAAKN,SAAS,MAAM;GACpB,MAAM,KAAKA,SAAS,QAAQ;EAC9B,SAAS,OAAO;GACd,OAAO,KAAK,KAAK;EACnB;EACA,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,eAAe,QAAQ,6BAA6B;CACvF;;CAGA,CAAC,OAAO,gBAA+B;EACrC,OAAO,KAAK,QAAQ;CACtB;CAEA;EACE,YAAA,4BAA4B,iBAAiB;CAC/C;AACF;;AAGA,SAAS,oBAAoB,MAAmD;CAC9E,IAAI,SAAS,KAAA,GAAW,OAAOO,sBAAAA,cAAc;CAC7C,OAAO,OAAO,SAAS,WAAWC,sBAAAA,YAAY,IAAI,IAAI;AACxD;;;;;;;AAQA,SAAS,aAAa,SAAsC;CAC1D,MAAM,WAAiD,EAAE,aAAa,MAAM,OAAO,aACjF,QAAQ,KAAK,UAAU,aAAa;EAAE;EAAM;EAAO;CAAO,CAAC;CAE7D,OAAO;EACL,SAAS,QAAQ,OAAO;EACxB,OAAO,QAAQ,OAAO;EACtB,OAAO,QAAQ,OAAO;EACtB,QAAQ,QAAQ,OAAO;EACvB;EACA,cAAc,QAAQ,QAAQ,gBAAgB,GAAG;EACjD,gBAAgB,QAAQ,KAAK,MAAM;EACnC,eAAe,QAAQ,KAAK,QAAQ;EACpC,kBAAkB,YAAY;GAC5B,MAAM,UAAU,MAAM,QAAQ;IAC5B,aAAa;IACb,MAAM;GACR,CAAC;GACD,OAAOC,YAAAA,WAAW,SAAS,SAAS,CAAC;EACvC;CACF;AACF;;;;;AAMA,SAAgB,qBACd,UAAoC,CAAC,GACf;CACtB,OAAO,IAAI,kBAAqB,OAAO;AACzC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { B as Notification, C as ItdStateError, D as isItdAuthError, E as isItdApiError, Ft as Logger, I as isItdStateError, Mt as Unsubscribe, Nt as ClientHooks, P as isItdRateLimitError, R as NotificationEvent, S as ItdServerError, St as RealtimeStatus, T as ItdValidationError, V as NotificationSettings, Yt as RuntimeOptions, _ as ItdForbiddenError, a as ItdAbortError, at as DEFAULT_BASE_URL, bt as Loose, c as ItdApiErrorKind, en as RuntimeMode, et as AuthIdentity, f as ItdError, i as formatNotificationText, it as tokenProvider, jt as Listener, k as isItdError, l as ItdAuthError, n as canonicalNotificationType, nn as systemClock, nt as anonymousAuth, o as ItdApiError, p as ItdErrorKind, r as isKnownNotificationType, rt as bearerToken, st as LIBRARY_VERSION, t as resolveNotificationUrl, tn as ItdClock, tt as AuthProvider, u as ItdConfigError, v as ItdNetworkError, w as ItdTimeoutError, x as ItdRateLimitError, xt as NotificationType, y as ItdNotFoundError, z as normalizeNotification } from "../shared/url-B6-bXHKt.cjs";
|
|
2
|
-
import { A as NotificationOfType, B as RealtimeUpdateOfType, C as RealtimeMiddlewareObj, D as RealtimeTypeGuard, E as RealtimeSequentializer, F as RealtimeNotificationSelector, G as RealtimeTransport, H as RealtimeUpdateType, I as RealtimeNotificationUpdate, J as UnauthorizedStreamError, K as TransportContext, L as RealtimeUnknownUpdate, M as RealtimeContextBase, N as RealtimeNotificationContext, O as runRealtimeMiddleware, P as RealtimeNotificationFilter, R as RealtimeUnreadCountUpdate, S as RealtimeMiddleware, T as RealtimePredicate, U as RealtimeRequest, V as RealtimeUpdateOrigin, W as RealtimeRequestInput, _ as RealtimeOptions, a as WebSocketTransportOptions, b as ReconnectOptions, c as RealtimeErrorContext, d as RealtimeMiddlewareLike, f as RealtimeRouteTable, g as RealtimeEvents, h as ItdRealtime, i as WebSocketTransport, j as RealtimeContext, k as NotificationEventOfType, l as RealtimeFilter, m as RealtimeRouter, n as WebSocketLike, o as RealtimeComposer, p as RealtimeRouteSelector, q as TransportEvent, r as WebSocketOpenFailureClassifier, s as RealtimeErrorBoundary, t as WebSocketImplementationOptions, u as RealtimeMiddlewareGroup, v as RealtimeTransportKind, w as RealtimeNext, x as RealtimeHandler, y as RealtimeEngineEvents, z as RealtimeUpdate } from "../shared/websocket-D1p32SB2.cjs";
|
|
3
|
-
//#region src/realtime/client.d.ts
|
|
4
|
-
/** Опции конструктора {@link ItdRealtimeClient}. */
|
|
5
|
-
interface RealtimeClientOptions<C extends RealtimeContext = RealtimeContext> extends RuntimeOptions, RealtimeOptions<C> {
|
|
6
|
-
/**
|
|
7
|
-
* Авторизация. Строка — сокращение для {@link bearerToken}.
|
|
8
|
-
*
|
|
9
|
-
* Без неё поток идёт анонимно. Токен считается готовым: продлевать его клиент не умеет,
|
|
10
|
-
* а на отказ авторизации переподключение спрашивает токен заново. Сессия, которая входит
|
|
11
|
-
* по паролю и продлевает себя сама, живёт в полном `ItdClient`.
|
|
12
|
-
*/
|
|
13
|
-
auth?: string | AuthProvider | undefined;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Поток уведомлений с собственным конвейером запросов.
|
|
17
|
-
*
|
|
18
|
-
* Тот же {@link ItdRealtime}, что отдаёт `itd.realtime()`, но собранный без полного клиента:
|
|
19
|
-
* ресурсы, билдеры и сессия сюда не входят. Нужен приложениям, которым от API нужны только
|
|
20
|
-
* события, — виджетам, счётчикам непрочитанного, фоновым слушателям.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```ts
|
|
24
|
-
* import { createRealtimeClient } from 'itd-api/realtime';
|
|
25
|
-
*
|
|
26
|
-
* await using stream = createRealtimeClient({ auth: token });
|
|
27
|
-
* stream.on('notification', ({ notification }) => console.log(notification.type));
|
|
28
|
-
* await stream.connect();
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
declare class ItdRealtimeClient<C extends RealtimeContext = RealtimeContext> extends ItdRealtime<C> {
|
|
32
|
-
#private;
|
|
33
|
-
constructor(options?: RealtimeClientOptions<C>);
|
|
34
|
-
/**
|
|
35
|
-
* Окончательно освобождает поток и его конвейер: отключает соединение, дожидается
|
|
36
|
-
* обработчиков и останавливает очередь запросов.
|
|
37
|
-
*
|
|
38
|
-
* Повторные вызовы возвращают тот же результат очистки.
|
|
39
|
-
*/
|
|
40
|
-
dispose(): Promise<void>;
|
|
41
|
-
/** Позволяет использовать поток с `await using`. */
|
|
42
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Создаёт поток уведомлений с собственным конвейером. Равнозначно конструктору
|
|
46
|
-
* {@link ItdRealtimeClient}.
|
|
47
|
-
*/
|
|
48
|
-
declare function createRealtimeClient<C extends RealtimeContext = RealtimeContext>(options?: RealtimeClientOptions<C>): ItdRealtimeClient<C>;
|
|
49
|
-
//#endregion
|
|
50
|
-
export { type AuthIdentity, type AuthProvider, type ClientHooks, DEFAULT_BASE_URL, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, type ItdClock, ItdConfigError, ItdError, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdRateLimitError, ItdRealtime, ItdRealtimeClient, ItdServerError, ItdStateError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, type Listener, type Logger, type Loose, type Notification, type NotificationEvent, type NotificationEventOfType, type NotificationOfType, type NotificationSettings, NotificationType, type RealtimeClientOptions, RealtimeComposer, type RealtimeContext, type RealtimeContextBase, type RealtimeEngineEvents, type RealtimeErrorBoundary, type RealtimeErrorContext, type RealtimeEvents, type RealtimeFilter, type RealtimeHandler, type RealtimeMiddleware, type RealtimeMiddlewareGroup, type RealtimeMiddlewareLike, type RealtimeMiddlewareObj, type RealtimeNext, type RealtimeNotificationContext, type RealtimeNotificationFilter, type RealtimeNotificationSelector, type RealtimeNotificationUpdate, type RealtimeOptions, type RealtimePredicate, type RealtimeRequest, type RealtimeRequestInput, type RealtimeRouteSelector, type RealtimeRouteTable, RealtimeRouter, type RealtimeSequentializer, RealtimeStatus, type RealtimeTransport, RealtimeTransportKind, type RealtimeTypeGuard, type RealtimeUnknownUpdate, type RealtimeUnreadCountUpdate, type RealtimeUpdate, type RealtimeUpdateOfType, RealtimeUpdateOrigin, RealtimeUpdateType, type ReconnectOptions, RuntimeMode, type RuntimeOptions, type TransportContext, type TransportEvent, UnauthorizedStreamError, type Unsubscribe, type WebSocketImplementationOptions, type WebSocketLike, type WebSocketOpenFailureClassifier, WebSocketTransport, type WebSocketTransportOptions, anonymousAuth, bearerToken, canonicalNotificationType, createRealtimeClient, formatNotificationText, isItdApiError, isItdAuthError, isItdError, isItdRateLimitError, isItdStateError, isKnownNotificationType, normalizeNotification, resolveNotificationUrl, runRealtimeMiddleware, systemClock, tokenProvider };
|
|
51
|
-
//# sourceMappingURL=index.d.cts.map
|
package/dist/realtime/index.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { B as Notification, C as ItdStateError, D as isItdAuthError, E as isItdApiError, Ft as Logger, I as isItdStateError, Mt as Unsubscribe, Nt as ClientHooks, P as isItdRateLimitError, R as NotificationEvent, S as ItdServerError, St as RealtimeStatus, T as ItdValidationError, V as NotificationSettings, Yt as RuntimeOptions, _ as ItdForbiddenError, a as ItdAbortError, at as DEFAULT_BASE_URL, bt as Loose, c as ItdApiErrorKind, en as RuntimeMode, et as AuthIdentity, f as ItdError, i as formatNotificationText, it as tokenProvider, jt as Listener, k as isItdError, l as ItdAuthError, n as canonicalNotificationType, nn as systemClock, nt as anonymousAuth, o as ItdApiError, p as ItdErrorKind, r as isKnownNotificationType, rt as bearerToken, st as LIBRARY_VERSION, t as resolveNotificationUrl, tn as ItdClock, tt as AuthProvider, u as ItdConfigError, v as ItdNetworkError, w as ItdTimeoutError, x as ItdRateLimitError, xt as NotificationType, y as ItdNotFoundError, z as normalizeNotification } from "../shared/url-B6-bXHKt.js";
|
|
2
|
-
import { A as NotificationOfType, B as RealtimeUpdateOfType, C as RealtimeMiddlewareObj, D as RealtimeTypeGuard, E as RealtimeSequentializer, F as RealtimeNotificationSelector, G as RealtimeTransport, H as RealtimeUpdateType, I as RealtimeNotificationUpdate, J as UnauthorizedStreamError, K as TransportContext, L as RealtimeUnknownUpdate, M as RealtimeContextBase, N as RealtimeNotificationContext, O as runRealtimeMiddleware, P as RealtimeNotificationFilter, R as RealtimeUnreadCountUpdate, S as RealtimeMiddleware, T as RealtimePredicate, U as RealtimeRequest, V as RealtimeUpdateOrigin, W as RealtimeRequestInput, _ as RealtimeOptions, a as WebSocketTransportOptions, b as ReconnectOptions, c as RealtimeErrorContext, d as RealtimeMiddlewareLike, f as RealtimeRouteTable, g as RealtimeEvents, h as ItdRealtime, i as WebSocketTransport, j as RealtimeContext, k as NotificationEventOfType, l as RealtimeFilter, m as RealtimeRouter, n as WebSocketLike, o as RealtimeComposer, p as RealtimeRouteSelector, q as TransportEvent, r as WebSocketOpenFailureClassifier, s as RealtimeErrorBoundary, t as WebSocketImplementationOptions, u as RealtimeMiddlewareGroup, v as RealtimeTransportKind, w as RealtimeNext, x as RealtimeHandler, y as RealtimeEngineEvents, z as RealtimeUpdate } from "../shared/websocket-BMtihD56.js";
|
|
3
|
-
//#region src/realtime/client.d.ts
|
|
4
|
-
/** Опции конструктора {@link ItdRealtimeClient}. */
|
|
5
|
-
interface RealtimeClientOptions<C extends RealtimeContext = RealtimeContext> extends RuntimeOptions, RealtimeOptions<C> {
|
|
6
|
-
/**
|
|
7
|
-
* Авторизация. Строка — сокращение для {@link bearerToken}.
|
|
8
|
-
*
|
|
9
|
-
* Без неё поток идёт анонимно. Токен считается готовым: продлевать его клиент не умеет,
|
|
10
|
-
* а на отказ авторизации переподключение спрашивает токен заново. Сессия, которая входит
|
|
11
|
-
* по паролю и продлевает себя сама, живёт в полном `ItdClient`.
|
|
12
|
-
*/
|
|
13
|
-
auth?: string | AuthProvider | undefined;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Поток уведомлений с собственным конвейером запросов.
|
|
17
|
-
*
|
|
18
|
-
* Тот же {@link ItdRealtime}, что отдаёт `itd.realtime()`, но собранный без полного клиента:
|
|
19
|
-
* ресурсы, билдеры и сессия сюда не входят. Нужен приложениям, которым от API нужны только
|
|
20
|
-
* события, — виджетам, счётчикам непрочитанного, фоновым слушателям.
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```ts
|
|
24
|
-
* import { createRealtimeClient } from 'itd-api/realtime';
|
|
25
|
-
*
|
|
26
|
-
* await using stream = createRealtimeClient({ auth: token });
|
|
27
|
-
* stream.on('notification', ({ notification }) => console.log(notification.type));
|
|
28
|
-
* await stream.connect();
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
declare class ItdRealtimeClient<C extends RealtimeContext = RealtimeContext> extends ItdRealtime<C> {
|
|
32
|
-
#private;
|
|
33
|
-
constructor(options?: RealtimeClientOptions<C>);
|
|
34
|
-
/**
|
|
35
|
-
* Окончательно освобождает поток и его конвейер: отключает соединение, дожидается
|
|
36
|
-
* обработчиков и останавливает очередь запросов.
|
|
37
|
-
*
|
|
38
|
-
* Повторные вызовы возвращают тот же результат очистки.
|
|
39
|
-
*/
|
|
40
|
-
dispose(): Promise<void>;
|
|
41
|
-
/** Позволяет использовать поток с `await using`. */
|
|
42
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Создаёт поток уведомлений с собственным конвейером. Равнозначно конструктору
|
|
46
|
-
* {@link ItdRealtimeClient}.
|
|
47
|
-
*/
|
|
48
|
-
declare function createRealtimeClient<C extends RealtimeContext = RealtimeContext>(options?: RealtimeClientOptions<C>): ItdRealtimeClient<C>;
|
|
49
|
-
//#endregion
|
|
50
|
-
export { type AuthIdentity, type AuthProvider, type ClientHooks, DEFAULT_BASE_URL, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, type ItdClock, ItdConfigError, ItdError, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdRateLimitError, ItdRealtime, ItdRealtimeClient, ItdServerError, ItdStateError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, type Listener, type Logger, type Loose, type Notification, type NotificationEvent, type NotificationEventOfType, type NotificationOfType, type NotificationSettings, NotificationType, type RealtimeClientOptions, RealtimeComposer, type RealtimeContext, type RealtimeContextBase, type RealtimeEngineEvents, type RealtimeErrorBoundary, type RealtimeErrorContext, type RealtimeEvents, type RealtimeFilter, type RealtimeHandler, type RealtimeMiddleware, type RealtimeMiddlewareGroup, type RealtimeMiddlewareLike, type RealtimeMiddlewareObj, type RealtimeNext, type RealtimeNotificationContext, type RealtimeNotificationFilter, type RealtimeNotificationSelector, type RealtimeNotificationUpdate, type RealtimeOptions, type RealtimePredicate, type RealtimeRequest, type RealtimeRequestInput, type RealtimeRouteSelector, type RealtimeRouteTable, RealtimeRouter, type RealtimeSequentializer, RealtimeStatus, type RealtimeTransport, RealtimeTransportKind, type RealtimeTypeGuard, type RealtimeUnknownUpdate, type RealtimeUnreadCountUpdate, type RealtimeUpdate, type RealtimeUpdateOfType, RealtimeUpdateOrigin, RealtimeUpdateType, type ReconnectOptions, RuntimeMode, type RuntimeOptions, type TransportContext, type TransportEvent, UnauthorizedStreamError, type Unsubscribe, type WebSocketImplementationOptions, type WebSocketLike, type WebSocketOpenFailureClassifier, WebSocketTransport, type WebSocketTransportOptions, anonymousAuth, bearerToken, canonicalNotificationType, createRealtimeClient, formatNotificationText, isItdApiError, isItdAuthError, isItdError, isItdRateLimitError, isItdStateError, isKnownNotificationType, normalizeNotification, resolveNotificationUrl, runRealtimeMiddleware, systemClock, tokenProvider };
|
|
51
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/realtime/index.js
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { $ as RuntimeMode, K as DEFAULT_BASE_URL, L as pickNumber, N as createClientRuntime, T as ITD_CATALOG, Y as LIBRARY_VERSION, _ as RealtimeStatus, at as systemClock, g as NotificationType, n as formatNotificationText, o as canonicalNotificationType, ot as installAsyncDisposeFallback, r as normalizeNotification, s as isKnownNotificationType, t as resolveNotificationUrl } from "../shared/url-CYXgxqGx.js";
|
|
2
|
-
import { A as isItdStateError, C as isItdError, O as isItdRateLimitError, _ as ItdStateError, a as ItdConfigError, b as isItdApiError, c as ItdErrorKind, d as ItdForbiddenError, f as ItdNetworkError, g as ItdServerError, h as ItdRateLimitError, i as ItdAuthError, n as ItdApiError, p as ItdNotFoundError, r as ItdApiErrorKind, s as ItdError, t as ItdAbortError, v as ItdTimeoutError, x as isItdAuthError, y as ItdValidationError } from "../shared/errors-Bhrd2fJd.js";
|
|
3
|
-
import { a as RealtimeTransportKind, c as RealtimeUpdateType, i as ItdRealtime, l as UnauthorizedStreamError, n as RealtimeComposer, o as setRealtimeConnectGuard, r as RealtimeRouter, s as RealtimeUpdateOrigin, t as WebSocketTransport, u as runRealtimeMiddleware } from "../shared/websocket-CbzB1Leq.js";
|
|
4
|
-
import { n as bearerToken, r as tokenProvider, t as anonymousAuth } from "../shared/auth-provider-BfogACAb.js";
|
|
5
|
-
//#region src/realtime/client.ts
|
|
6
|
-
/**
|
|
7
|
-
* Поток уведомлений с собственным конвейером запросов.
|
|
8
|
-
*
|
|
9
|
-
* Тот же {@link ItdRealtime}, что отдаёт `itd.realtime()`, но собранный без полного клиента:
|
|
10
|
-
* ресурсы, билдеры и сессия сюда не входят. Нужен приложениям, которым от API нужны только
|
|
11
|
-
* события, — виджетам, счётчикам непрочитанного, фоновым слушателям.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```ts
|
|
15
|
-
* import { createRealtimeClient } from 'itd-api/realtime';
|
|
16
|
-
*
|
|
17
|
-
* await using stream = createRealtimeClient({ auth: token });
|
|
18
|
-
* stream.on('notification', ({ notification }) => console.log(notification.type));
|
|
19
|
-
* await stream.connect();
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
var ItdRealtimeClient = class ItdRealtimeClient extends ItdRealtime {
|
|
23
|
-
#runtime;
|
|
24
|
-
/** Общий результат терминальной очистки для идемпотентных повторных вызовов. */
|
|
25
|
-
#disposePromise;
|
|
26
|
-
#disposed = false;
|
|
27
|
-
constructor(options = {}) {
|
|
28
|
-
const runtime = createClientRuntime(options, {
|
|
29
|
-
catalog: ITD_CATALOG,
|
|
30
|
-
auth: () => resolveAuthProvider(options.auth)
|
|
31
|
-
});
|
|
32
|
-
super(realtimeDeps(runtime), options);
|
|
33
|
-
this.#runtime = runtime;
|
|
34
|
-
setRealtimeConnectGuard(this, () => {
|
|
35
|
-
if (!this.#disposed) return;
|
|
36
|
-
throw new ItdStateError("Поток уже окончательно освобождён через dispose(); нельзя подключить его снова. Создайте новый");
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Окончательно освобождает поток и его конвейер: отключает соединение, дожидается
|
|
41
|
-
* обработчиков и останавливает очередь запросов.
|
|
42
|
-
*
|
|
43
|
-
* Повторные вызовы возвращают тот же результат очистки.
|
|
44
|
-
*/
|
|
45
|
-
dispose() {
|
|
46
|
-
if (this.#disposePromise) return this.#disposePromise;
|
|
47
|
-
this.#disposed = true;
|
|
48
|
-
this.#disposePromise = this.#dispose();
|
|
49
|
-
return this.#disposePromise;
|
|
50
|
-
}
|
|
51
|
-
async #dispose() {
|
|
52
|
-
const errors = [];
|
|
53
|
-
this.disconnect();
|
|
54
|
-
try {
|
|
55
|
-
await this.drain();
|
|
56
|
-
} catch (error) {
|
|
57
|
-
errors.push(error);
|
|
58
|
-
}
|
|
59
|
-
try {
|
|
60
|
-
this.#runtime.close();
|
|
61
|
-
await this.#runtime.dispose();
|
|
62
|
-
} catch (error) {
|
|
63
|
-
errors.push(error);
|
|
64
|
-
}
|
|
65
|
-
if (errors.length > 0) throw new AggregateError(errors, "Не удалось освободить поток");
|
|
66
|
-
}
|
|
67
|
-
/** Позволяет использовать поток с `await using`. */
|
|
68
|
-
[Symbol.asyncDispose]() {
|
|
69
|
-
return this.dispose();
|
|
70
|
-
}
|
|
71
|
-
static {
|
|
72
|
-
installAsyncDisposeFallback(ItdRealtimeClient);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
/** Приводит опцию `auth` к провайдеру конвейера. */
|
|
76
|
-
function resolveAuthProvider(auth) {
|
|
77
|
-
if (auth === void 0) return anonymousAuth();
|
|
78
|
-
return typeof auth === "string" ? bearerToken(auth) : auth;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Связывает поток с собранным конвейером.
|
|
82
|
-
*
|
|
83
|
-
* Начальный счётчик непрочитанных берётся той же операцией, что и при опросе
|
|
84
|
-
* (`realtime.poll.unread`): ресурс уведомлений потоку для этого не нужен.
|
|
85
|
-
*/
|
|
86
|
-
function realtimeDeps(runtime) {
|
|
87
|
-
const request = ({ operationId, path, query, signal }) => runtime.http.operation(operationId, {
|
|
88
|
-
path,
|
|
89
|
-
query,
|
|
90
|
-
signal
|
|
91
|
-
});
|
|
92
|
-
return {
|
|
93
|
-
baseUrl: runtime.config.baseUrl,
|
|
94
|
-
fetch: runtime.config.fetch,
|
|
95
|
-
clock: runtime.config.clock,
|
|
96
|
-
logger: runtime.config.logger,
|
|
97
|
-
request,
|
|
98
|
-
baseHeaders: (url) => runtime.platformHeaders(url),
|
|
99
|
-
getToken: () => runtime.auth.token(),
|
|
100
|
-
refresh: () => runtime.auth.recover(),
|
|
101
|
-
fetchUnreadCount: async () => {
|
|
102
|
-
const payload = await request({
|
|
103
|
-
operationId: "realtime.poll.unread",
|
|
104
|
-
path: "/api/notifications/count"
|
|
105
|
-
});
|
|
106
|
-
return pickNumber(payload, "count", 0);
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Создаёт поток уведомлений с собственным конвейером. Равнозначно конструктору
|
|
112
|
-
* {@link ItdRealtimeClient}.
|
|
113
|
-
*/
|
|
114
|
-
function createRealtimeClient(options = {}) {
|
|
115
|
-
return new ItdRealtimeClient(options);
|
|
116
|
-
}
|
|
117
|
-
//#endregion
|
|
118
|
-
export { DEFAULT_BASE_URL, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, ItdConfigError, ItdError, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdRateLimitError, ItdRealtime, ItdRealtimeClient, ItdServerError, ItdStateError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, NotificationType, RealtimeComposer, RealtimeRouter, RealtimeStatus, RealtimeTransportKind, RealtimeUpdateOrigin, RealtimeUpdateType, RuntimeMode, UnauthorizedStreamError, WebSocketTransport, anonymousAuth, bearerToken, canonicalNotificationType, createRealtimeClient, formatNotificationText, isItdApiError, isItdAuthError, isItdError, isItdRateLimitError, isItdStateError, isKnownNotificationType, normalizeNotification, resolveNotificationUrl, runRealtimeMiddleware, systemClock, tokenProvider };
|
|
119
|
-
|
|
120
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#runtime","#disposed","#disposePromise","#dispose"],"sources":["../../src/realtime/client.ts"],"sourcesContent":["import { installAsyncDisposeFallback } from '../core/async-dispose.js';\nimport { type AuthProvider, anonymousAuth, bearerToken } from '../core/auth-provider.js';\nimport { ItdStateError } from '../core/errors.js';\nimport { type ClientRuntime, createClientRuntime } from '../core/execution/client-runtime.js';\nimport type { RuntimeOptions } from '../core/options.js';\nimport { pickNumber } from '../core/unwrap.js';\nimport { ITD_CATALOG } from '../domain/catalog.js';\nimport {\n ItdRealtime,\n type RealtimeDeps,\n type RealtimeOptions,\n setRealtimeConnectGuard,\n} from './stream.js';\nimport type { RealtimeContext } from './updates.js';\n\n/** Опции конструктора {@link ItdRealtimeClient}. */\nexport interface RealtimeClientOptions<C extends RealtimeContext = RealtimeContext>\n extends RuntimeOptions,\n RealtimeOptions<C> {\n /**\n * Авторизация. Строка — сокращение для {@link bearerToken}.\n *\n * Без неё поток идёт анонимно. Токен считается готовым: продлевать его клиент не умеет,\n * а на отказ авторизации переподключение спрашивает токен заново. Сессия, которая входит\n * по паролю и продлевает себя сама, живёт в полном `ItdClient`.\n */\n auth?: string | AuthProvider | undefined;\n}\n\n/**\n * Поток уведомлений с собственным конвейером запросов.\n *\n * Тот же {@link ItdRealtime}, что отдаёт `itd.realtime()`, но собранный без полного клиента:\n * ресурсы, билдеры и сессия сюда не входят. Нужен приложениям, которым от API нужны только\n * события, — виджетам, счётчикам непрочитанного, фоновым слушателям.\n *\n * @example\n * ```ts\n * import { createRealtimeClient } from 'itd-api/realtime';\n *\n * await using stream = createRealtimeClient({ auth: token });\n * stream.on('notification', ({ notification }) => console.log(notification.type));\n * await stream.connect();\n * ```\n */\nexport class ItdRealtimeClient<C extends RealtimeContext = RealtimeContext> extends ItdRealtime<C> {\n readonly #runtime: ClientRuntime;\n /** Общий результат терминальной очистки для идемпотентных повторных вызовов. */\n #disposePromise: Promise<void> | undefined;\n #disposed = false;\n\n constructor(options: RealtimeClientOptions<C> = {}) {\n const runtime = createClientRuntime(options, {\n catalog: ITD_CATALOG,\n auth: () => resolveAuthProvider(options.auth),\n });\n\n super(realtimeDeps(runtime), options);\n this.#runtime = runtime;\n\n setRealtimeConnectGuard<C>(this, () => {\n if (!this.#disposed) return;\n throw new ItdStateError(\n 'Поток уже окончательно освобождён через dispose(); нельзя подключить его снова. ' +\n 'Создайте новый',\n );\n });\n }\n\n /**\n * Окончательно освобождает поток и его конвейер: отключает соединение, дожидается\n * обработчиков и останавливает очередь запросов.\n *\n * Повторные вызовы возвращают тот же результат очистки.\n */\n dispose(): Promise<void> {\n if (this.#disposePromise) return this.#disposePromise;\n this.#disposed = true;\n this.#disposePromise = this.#dispose();\n return this.#disposePromise;\n }\n\n async #dispose(): Promise<void> {\n const errors: unknown[] = [];\n this.disconnect();\n try {\n await this.drain();\n } catch (error) {\n errors.push(error);\n }\n try {\n this.#runtime.close();\n await this.#runtime.dispose();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length > 0) throw new AggregateError(errors, 'Не удалось освободить поток');\n }\n\n /** Позволяет использовать поток с `await using`. */\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n\n static {\n installAsyncDisposeFallback(ItdRealtimeClient);\n }\n}\n\n/** Приводит опцию `auth` к провайдеру конвейера. */\nfunction resolveAuthProvider(auth: RealtimeClientOptions['auth']): AuthProvider {\n if (auth === undefined) return anonymousAuth();\n return typeof auth === 'string' ? bearerToken(auth) : auth;\n}\n\n/**\n * Связывает поток с собранным конвейером.\n *\n * Начальный счётчик непрочитанных берётся той же операцией, что и при опросе\n * (`realtime.poll.unread`): ресурс уведомлений потоку для этого не нужен.\n */\nfunction realtimeDeps(runtime: ClientRuntime): RealtimeDeps {\n const request: NonNullable<RealtimeDeps['request']> = ({ operationId, path, query, signal }) =>\n runtime.http.operation(operationId, { path, query, signal });\n\n return {\n baseUrl: runtime.config.baseUrl,\n fetch: runtime.config.fetch,\n clock: runtime.config.clock,\n logger: runtime.config.logger,\n request,\n baseHeaders: (url) => runtime.platformHeaders(url),\n getToken: () => runtime.auth.token(),\n refresh: () => runtime.auth.recover(),\n fetchUnreadCount: async () => {\n const payload = await request({\n operationId: 'realtime.poll.unread',\n path: '/api/notifications/count',\n });\n return pickNumber(payload, 'count', 0);\n },\n };\n}\n\n/**\n * Создаёт поток уведомлений с собственным конвейером. Равнозначно конструктору\n * {@link ItdRealtimeClient}.\n */\nexport function createRealtimeClient<C extends RealtimeContext = RealtimeContext>(\n options: RealtimeClientOptions<C> = {},\n): ItdRealtimeClient<C> {\n return new ItdRealtimeClient<C>(options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6CA,IAAa,oBAAb,MAAa,0BAAuE,YAAe;CACjG;;CAEA;CACA,YAAY;CAEZ,YAAY,UAAoC,CAAC,GAAG;EAClD,MAAM,UAAU,oBAAoB,SAAS;GAC3C,SAAS;GACT,YAAY,oBAAoB,QAAQ,IAAI;EAC9C,CAAC;EAED,MAAM,aAAa,OAAO,GAAG,OAAO;EACpC,KAAKA,WAAW;EAEhB,wBAA2B,YAAY;GACrC,IAAI,CAAC,KAAKC,WAAW;GACrB,MAAM,IAAI,cACR,gGAEF;EACF,CAAC;CACH;;;;;;;CAQA,UAAyB;EACvB,IAAI,KAAKC,iBAAiB,OAAO,KAAKA;EACtC,KAAKD,YAAY;EACjB,KAAKC,kBAAkB,KAAKC,SAAS;EACrC,OAAO,KAAKD;CACd;CAEA,MAAMC,WAA0B;EAC9B,MAAM,SAAoB,CAAC;EAC3B,KAAK,WAAW;EAChB,IAAI;GACF,MAAM,KAAK,MAAM;EACnB,SAAS,OAAO;GACd,OAAO,KAAK,KAAK;EACnB;EACA,IAAI;GACF,KAAKH,SAAS,MAAM;GACpB,MAAM,KAAKA,SAAS,QAAQ;EAC9B,SAAS,OAAO;GACd,OAAO,KAAK,KAAK;EACnB;EACA,IAAI,OAAO,SAAS,GAAG,MAAM,IAAI,eAAe,QAAQ,6BAA6B;CACvF;;CAGA,CAAC,OAAO,gBAA+B;EACrC,OAAO,KAAK,QAAQ;CACtB;CAEA;EACE,4BAA4B,iBAAiB;CAC/C;AACF;;AAGA,SAAS,oBAAoB,MAAmD;CAC9E,IAAI,SAAS,KAAA,GAAW,OAAO,cAAc;CAC7C,OAAO,OAAO,SAAS,WAAW,YAAY,IAAI,IAAI;AACxD;;;;;;;AAQA,SAAS,aAAa,SAAsC;CAC1D,MAAM,WAAiD,EAAE,aAAa,MAAM,OAAO,aACjF,QAAQ,KAAK,UAAU,aAAa;EAAE;EAAM;EAAO;CAAO,CAAC;CAE7D,OAAO;EACL,SAAS,QAAQ,OAAO;EACxB,OAAO,QAAQ,OAAO;EACtB,OAAO,QAAQ,OAAO;EACtB,QAAQ,QAAQ,OAAO;EACvB;EACA,cAAc,QAAQ,QAAQ,gBAAgB,GAAG;EACjD,gBAAgB,QAAQ,KAAK,MAAM;EACnC,eAAe,QAAQ,KAAK,QAAQ;EACpC,kBAAkB,YAAY;GAC5B,MAAM,UAAU,MAAM,QAAQ;IAC5B,aAAa;IACb,MAAM;GACR,CAAC;GACD,OAAO,WAAW,SAAS,SAAS,CAAC;EACvC;CACF;AACF;;;;;AAMA,SAAgB,qBACd,UAAoC,CAAC,GACf;CACtB,OAAO,IAAI,kBAAqB,OAAO;AACzC"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { et as createDeviceId } from "./url-CYXgxqGx.js";
|
|
2
|
-
//#region src/core/auth-provider.ts
|
|
3
|
-
/**
|
|
4
|
-
* Идентификатор устройства, общий для провайдеров без сессии.
|
|
5
|
-
*
|
|
6
|
-
* Значение своё у каждого провайдера: сервер различает по нему записи в списке сессий,
|
|
7
|
-
* поэтому делить его между клиентами нельзя. Хранилища нет, так что перезапуск процесса
|
|
8
|
-
* значение не переживает — в этом и разница с полноценной сессией.
|
|
9
|
-
*/
|
|
10
|
-
function localDeviceId() {
|
|
11
|
-
let deviceId;
|
|
12
|
-
return () => {
|
|
13
|
-
deviceId ??= createDeviceId();
|
|
14
|
-
return Promise.resolve(deviceId);
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Авторизации нет: заголовок не подставляется, ответ `401` не восстанавливается.
|
|
19
|
-
*
|
|
20
|
-
* @example
|
|
21
|
-
* ```ts
|
|
22
|
-
* const api = createRestClient(); // публичные эндпоинты доступны и без токена
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
function anonymousAuth() {
|
|
26
|
-
return {
|
|
27
|
-
token: () => Promise.resolve(null),
|
|
28
|
-
prepare: () => Promise.resolve(),
|
|
29
|
-
currentHeaders: () => ({}),
|
|
30
|
-
recover: () => Promise.resolve(false),
|
|
31
|
-
deviceId: localDeviceId(),
|
|
32
|
-
dispose: () => {}
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Готовый Bearer-токен: ни хранилища, ни продления.
|
|
37
|
-
*
|
|
38
|
-
* Ответ `401` уходит вызывающему коду как есть — обновить токен провайдеру нечем.
|
|
39
|
-
* Для сессии, которая продлевает себя сама, нужен полный клиент.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```ts
|
|
43
|
-
* const api = createRestClient({ auth: bearerToken(process.env.ITD_TOKEN) });
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
function bearerToken(accessToken) {
|
|
47
|
-
const headers = { Authorization: `Bearer ${accessToken}` };
|
|
48
|
-
return {
|
|
49
|
-
token: () => Promise.resolve(accessToken),
|
|
50
|
-
prepare: () => Promise.resolve(),
|
|
51
|
-
currentHeaders: () => headers,
|
|
52
|
-
recover: () => Promise.resolve(false),
|
|
53
|
-
deviceId: localDeviceId(),
|
|
54
|
-
dispose: () => {}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Токен из внешнего источника — хранилища секретов, кэша, соседнего сервиса.
|
|
59
|
-
*
|
|
60
|
-
* Источник спрашивается на стадии подготовки, до входа в очередь: там ожидание безопасно,
|
|
61
|
-
* а слот транспорта ещё не занят. Значение держится до следующей подготовки, потому что
|
|
62
|
-
* подстановка заголовков обязана быть синхронной.
|
|
63
|
-
*
|
|
64
|
-
* @example
|
|
65
|
-
* ```ts
|
|
66
|
-
* const api = createRestClient({ auth: tokenProvider(() => vault.read('itd')) });
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
function tokenProvider(getToken) {
|
|
70
|
-
let cached = null;
|
|
71
|
-
const read = async () => {
|
|
72
|
-
cached = await getToken();
|
|
73
|
-
return cached;
|
|
74
|
-
};
|
|
75
|
-
return {
|
|
76
|
-
token: read,
|
|
77
|
-
prepare: async () => {
|
|
78
|
-
await read();
|
|
79
|
-
},
|
|
80
|
-
currentHeaders: () => cached ? { Authorization: `Bearer ${cached}` } : {},
|
|
81
|
-
recover: () => Promise.resolve(false),
|
|
82
|
-
deviceId: localDeviceId(),
|
|
83
|
-
dispose: () => {
|
|
84
|
-
cached = null;
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
//#endregion
|
|
89
|
-
export { bearerToken as n, tokenProvider as r, anonymousAuth as t };
|
|
90
|
-
|
|
91
|
-
//# sourceMappingURL=auth-provider-BfogACAb.js.map
|