itd-api 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +81 -8
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +22 -4
  5. package/dist/index.d.ts +22 -4
  6. package/dist/index.js +81 -8
  7. package/dist/index.js.map +1 -1
  8. package/dist/realtime/index.cjs +3 -3
  9. package/dist/realtime/index.d.cts +2 -2
  10. package/dist/realtime/index.d.ts +2 -2
  11. package/dist/realtime/index.js +3 -3
  12. package/dist/rest/index.cjs +70 -6
  13. package/dist/rest/index.cjs.map +1 -1
  14. package/dist/rest/index.d.cts +11 -3
  15. package/dist/rest/index.d.ts +11 -3
  16. package/dist/rest/index.js +70 -6
  17. package/dist/rest/index.js.map +1 -1
  18. package/dist/shared/{auth-provider-CTJkKfgy.cjs → auth-provider-CG8oCQ9F.cjs} +2 -2
  19. package/dist/shared/{auth-provider-CTJkKfgy.cjs.map → auth-provider-CG8oCQ9F.cjs.map} +1 -1
  20. package/dist/shared/{auth-provider-BfogACAb.js → auth-provider-mYqxsSVa.js} +2 -2
  21. package/dist/shared/{auth-provider-BfogACAb.js.map → auth-provider-mYqxsSVa.js.map} +1 -1
  22. package/dist/shared/{render-vtLixIiU.js → render-C6HRPs10.js} +353 -56
  23. package/dist/shared/render-C6HRPs10.js.map +1 -0
  24. package/dist/shared/{render-DZrxhC5_.d.ts → render-CgwKdOzu.d.ts} +101 -40
  25. package/dist/shared/{render-DMp_3Nzk.d.cts → render-DO0F5YSm.d.cts} +101 -40
  26. package/dist/shared/{render-DyeHJNBw.cjs → render-mcuELiYi.cjs} +369 -54
  27. package/dist/shared/render-mcuELiYi.cjs.map +1 -0
  28. package/dist/shared/{url-yjl2c8Ie.cjs → url-BaMCQpYH.cjs} +76 -24
  29. package/dist/shared/url-BaMCQpYH.cjs.map +1 -0
  30. package/dist/shared/{url-B6-bXHKt.d.ts → url-DTfZ2toq.d.cts} +6 -8
  31. package/dist/shared/{url-B6-bXHKt.d.cts → url-DTfZ2toq.d.ts} +6 -8
  32. package/dist/shared/{url-CYXgxqGx.js → url-IU0xN9wX.js} +65 -25
  33. package/dist/shared/url-IU0xN9wX.js.map +1 -0
  34. package/dist/shared/{websocket-CbzB1Leq.js → websocket-BLR8eVJV.js} +2 -2
  35. package/dist/shared/{websocket-CbzB1Leq.js.map → websocket-BLR8eVJV.js.map} +1 -1
  36. package/dist/shared/{websocket-sYlynrr0.cjs → websocket-C_eI4H2o.cjs} +2 -2
  37. package/dist/shared/{websocket-sYlynrr0.cjs.map → websocket-C_eI4H2o.cjs.map} +1 -1
  38. package/dist/shared/{websocket-D1p32SB2.d.cts → websocket-DF7XIMiX.d.cts} +2 -2
  39. package/dist/shared/{websocket-BMtihD56.d.ts → websocket-DYKBr8HF.d.ts} +2 -2
  40. package/package.json +1 -1
  41. package/dist/shared/render-DyeHJNBw.cjs.map +0 -1
  42. package/dist/shared/render-vtLixIiU.js.map +0 -1
  43. package/dist/shared/url-CYXgxqGx.js.map +0 -1
  44. package/dist/shared/url-yjl2c8Ie.cjs.map +0 -1
package/README.md CHANGED
@@ -14,6 +14,7 @@
14
14
  [![Node.js](https://img.shields.io/node/v/itd-api.svg)](https://www.npmjs.com/package/itd-api)
15
15
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0%2B-3178c6.svg)](./tsconfig.json)
16
16
  [![license](https://img.shields.io/npm/l/itd-api.svg)](./LICENSE)
17
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/KiowDev/itd-api)
17
18
 
18
19
  Независимый TypeScript-клиент REST и realtime API социальной сети **итд.com**.
19
20
  Проект не является официальным SDK и не аффилирован с итд.com.
@@ -145,8 +146,7 @@ TypeScript 5.0+. Пакет проверяется в Node.js 18, 20, 22, 24 и
145
146
 
146
147
  ## Проект
147
148
 
148
- - [DeepWiki по исходному коду](https://deepwiki.com/KiowDev/itd-api) — автоматический разбор
149
- репозитория с ответами на вопросы про внутреннее устройство
149
+ - [DeepWiki по исходному коду](https://deepwiki.com/KiowDev/itd-api) — можно задать любые вопросы нейронке
150
150
  - [CI](https://github.com/KiowDev/itd-api/actions/workflows/ci.yml)
151
151
  - [История релизов](https://github.com/KiowDev/itd-api/releases)
152
152
  - [Как внести вклад](./.github/CONTRIBUTING.md)
package/dist/index.cjs CHANGED
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_url = require("./shared/url-yjl2c8Ie.cjs");
2
+ const require_url = require("./shared/url-BaMCQpYH.cjs");
3
3
  const require_errors = require("./shared/errors-DfU8M5eS.cjs");
4
4
  const require_cookies = require("./shared/cookies-DZwFq6kr.cjs");
5
- const require_websocket = require("./shared/websocket-sYlynrr0.cjs");
5
+ const require_render = require("./shared/render-mcuELiYi.cjs");
6
+ const require_websocket = require("./shared/websocket-C_eI4H2o.cjs");
6
7
  const require_storage = require("./shared/storage-BPJR_k4-.cjs");
7
- const require_render = require("./shared/render-DyeHJNBw.cjs");
8
8
  const require_options = require("./shared/options-Dg5N3r1V.cjs");
9
9
  const require_multi_storage = require("./shared/multi-storage--yTEqiod.cjs");
10
10
  //#region src/session/jwt.ts
@@ -1013,6 +1013,7 @@ function createManagedClient(options, internals) {
1013
1013
  */
1014
1014
  var ItdClient = class ItdClient {
1015
1015
  #runtime;
1016
+ #features;
1016
1017
  /** Порождённые потоки уведомлений — чтобы `close()` мог закрыть их разом. */
1017
1018
  #streams = /* @__PURE__ */ new Set();
1018
1019
  /** Общий результат терминальной очистки для идемпотентных повторных вызовов. */
@@ -1076,8 +1077,9 @@ var ItdClient = class ItdClient {
1076
1077
  }
1077
1078
  constructor(options = {}) {
1078
1079
  const internals = CLIENT_INTERNALS.get(options) ?? {};
1080
+ const catalog = new require_render.ExtensibleOperationCatalog(require_url.ITD_CATALOG);
1079
1081
  this.#runtime = require_url.createClientRuntime(options, {
1080
- catalog: require_url.ITD_CATALOG,
1082
+ catalog,
1081
1083
  queues: internals.queues,
1082
1084
  assertActive: (action) => assertClientActive(this, action),
1083
1085
  auth: (deps) => createItdAuth(options, {
@@ -1085,9 +1087,22 @@ var ItdClient = class ItdClient {
1085
1087
  onAccountChange: () => this.#disconnectStreams()
1086
1088
  })
1087
1089
  });
1090
+ this.#features = new require_render.FeatureRegistry({
1091
+ http: this.#runtime.http,
1092
+ services: this.#runtime.services,
1093
+ serviceOverrides: this.#runtime.config.services,
1094
+ catalog,
1095
+ baseUrl: this.#runtime.config.baseUrl,
1096
+ clock: this.#runtime.config.clock,
1097
+ logger: this.#runtime.config.logger,
1098
+ assertActive: (action) => assertClientActive(this, action),
1099
+ registerBucket: (name, definition) => this.#runtime.registerRateLimitBucket(name, definition)
1100
+ });
1101
+ const status = this.#features.install(require_render.createStatusFeature());
1088
1102
  this.#resources = require_render.createResources({
1089
1103
  http: this.#runtime.http,
1090
- fetch: this.#runtime.config.fetch
1104
+ fetch: this.#runtime.config.fetch,
1105
+ status
1091
1106
  });
1092
1107
  CLIENT_PLUGIN_REGISTRIES.set(this, this.#runtime.plugins);
1093
1108
  }
@@ -1131,6 +1146,43 @@ var ItdClient = class ItdClient {
1131
1146
  return this.#runtime.rateLimitState();
1132
1147
  }
1133
1148
  /**
1149
+ * Устанавливает предметный модуль поверх общей сессии и request pipeline клиента.
1150
+ *
1151
+ * Сервисы, операции и бакеты feature регистрируются до синхронного `setup()`. Возвращаемое
1152
+ * значение — типизированный API модуля; повторное имя feature отклоняется.
1153
+ */
1154
+ install(feature) {
1155
+ return this.#features.install(feature);
1156
+ }
1157
+ /**
1158
+ * Устанавливает feature и публикует его API как readonly-свойство этого же клиента.
1159
+ *
1160
+ * Возвращаемое пересечение сохраняет тип уже подключённых свойств, поэтому вызовы можно
1161
+ * объединять в цепочку: `new ItdClient().withFeature('chats', chatsFeature)`.
1162
+ */
1163
+ withFeature(key, feature) {
1164
+ assertClientActive(this, "установить feature");
1165
+ if (typeof key !== "string" || key.trim() === "" || key !== key.trim()) throw new require_errors.ItdConfigError("Свойство feature должно иметь непустое имя без краевых пробелов");
1166
+ if (key === "then" || key in this) throw new require_errors.ItdConfigError(`Свойство клиента «${key}» уже занято или зарезервировано`);
1167
+ if (!Object.isExtensible(this)) throw new require_errors.ItdConfigError("Нельзя опубликовать feature на нерасширяемом клиенте");
1168
+ const api = this.install(feature);
1169
+ Object.defineProperty(this, key, {
1170
+ value: api,
1171
+ enumerable: true,
1172
+ configurable: false,
1173
+ writable: false
1174
+ });
1175
+ return this;
1176
+ }
1177
+ /** Имена установленных feature в порядке установки. */
1178
+ featureNames() {
1179
+ return this.#features.names();
1180
+ }
1181
+ /** Установлен ли feature с таким именем. */
1182
+ hasFeature(name) {
1183
+ return this.#features.has(name);
1184
+ }
1185
+ /**
1134
1186
  * Подключает плагин.
1135
1187
  *
1136
1188
  * Плагин может независимо регистрировать transformer логической операции и interceptor
@@ -1310,14 +1362,30 @@ var ItdClient = class ItdClient {
1310
1362
  const { shutdownTimeout, clock } = this.#runtime.config;
1311
1363
  const deadline = require_url.createDeadline(shutdownTimeout, clock);
1312
1364
  let stuck = [];
1365
+ const errors = [];
1313
1366
  try {
1314
- stuck = (await Promise.all(streams.map(async (stream) => await deadline.wait(stream.drain()) ? void 0 : stream))).filter((stream) => stream !== void 0);
1315
- await this.#resources.closeTelemetry(disposeCleanup);
1367
+ try {
1368
+ stuck = (await Promise.all(streams.map(async (stream) => await deadline.wait(stream.drain()) ? void 0 : stream))).filter((stream) => stream !== void 0);
1369
+ } catch (error) {
1370
+ errors.push(error);
1371
+ }
1372
+ try {
1373
+ await this.#features.close();
1374
+ } catch (error) {
1375
+ errors.push(error);
1376
+ }
1377
+ try {
1378
+ await this.#resources.closeTelemetry(disposeCleanup);
1379
+ } catch (error) {
1380
+ errors.push(error);
1381
+ }
1316
1382
  } finally {
1317
1383
  deadline.cancel();
1318
1384
  this.#runtime.close();
1319
1385
  }
1320
- if (stuck.length > 0) throw new require_errors.ItdStateError(`обработчики потоков (${stuck.map((stream) => stream.transport).join(", ")}) не завершились за ${shutdownTimeout} мс; ожидание прекращено`);
1386
+ if (stuck.length > 0) errors.push(new require_errors.ItdStateError(`обработчики потоков (${stuck.map((stream) => stream.transport).join(", ")}) не завершились за ${shutdownTimeout} мс; ожидание прекращено`));
1387
+ if (errors.length === 1) throw errors[0];
1388
+ if (errors.length > 1) throw new AggregateError(errors, "Не удалось закрыть клиент");
1321
1389
  }
1322
1390
  /**
1323
1391
  * Окончательно освобождает клиент: выполняет {@link close}, отменяет незавершённые
@@ -1350,6 +1418,11 @@ var ItdClient = class ItdClient {
1350
1418
  } catch (error) {
1351
1419
  errors.push(error);
1352
1420
  }
1421
+ try {
1422
+ await this.#features.dispose();
1423
+ } catch (error) {
1424
+ errors.push(error);
1425
+ }
1353
1426
  try {
1354
1427
  await this.#runtime.dispose();
1355
1428
  } catch (error) {