itd-api 0.9.2 → 0.10.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.
Files changed (38) hide show
  1. package/README.md +9 -8
  2. package/dist/events/index.cjs +2 -2
  3. package/dist/events/index.d.cts +2 -2
  4. package/dist/events/index.d.ts +2 -2
  5. package/dist/events/index.js +2 -2
  6. package/dist/index.cjs +489 -92
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +186 -36
  9. package/dist/index.d.ts +186 -36
  10. package/dist/index.js +485 -94
  11. package/dist/index.js.map +1 -1
  12. package/dist/rest/index.cjs +2 -2
  13. package/dist/rest/index.d.cts +2 -2
  14. package/dist/rest/index.d.ts +2 -2
  15. package/dist/rest/index.js +2 -2
  16. package/dist/shared/{events-BIBO2Jif.js → events-B0Wtn4cF.js} +3 -3
  17. package/dist/shared/{events-BIBO2Jif.js.map → events-B0Wtn4cF.js.map} +1 -1
  18. package/dist/shared/{events-BsRm_Fba.cjs → events-BB791aPk.cjs} +8 -2
  19. package/dist/shared/{events-BsRm_Fba.cjs.map → events-BB791aPk.cjs.map} +1 -1
  20. package/dist/shared/{events-BCn5LRnT.d.cts → events-BNGjJVI3.d.cts} +2 -2
  21. package/dist/shared/{events-t1uGgpkf.d.ts → events-CJO6q93Z.d.ts} +2 -2
  22. package/dist/shared/{render-DqVzx68r.cjs → render-BimHjOhw.cjs} +2 -30
  23. package/dist/shared/render-BimHjOhw.cjs.map +1 -0
  24. package/dist/shared/{render-DA83gS0f.d.cts → render-C1A57W-5.d.cts} +2 -14
  25. package/dist/shared/{render--ZXmYEf-.js → render-CkhvH_yh.js} +2 -30
  26. package/dist/shared/render-CkhvH_yh.js.map +1 -0
  27. package/dist/shared/{render-BdnBV-aT.d.ts → render-DC5nvqcP.d.ts} +2 -14
  28. package/dist/shared/{url-i2f-X1hX.js → url-BA5hEwj2.js} +95 -16
  29. package/dist/shared/url-BA5hEwj2.js.map +1 -0
  30. package/dist/shared/{url-Doc0XXW_.cjs → url-CDVgMIq5.cjs} +130 -15
  31. package/dist/shared/url-CDVgMIq5.cjs.map +1 -0
  32. package/dist/shared/{url-Dbj6V6fk.d.cts → url-DkMueFAT.d.cts} +76 -17
  33. package/dist/shared/{url-Dbj6V6fk.d.ts → url-DkMueFAT.d.ts} +76 -17
  34. package/package.json +4 -3
  35. package/dist/shared/render--ZXmYEf-.js.map +0 -1
  36. package/dist/shared/render-DqVzx68r.cjs.map +0 -1
  37. package/dist/shared/url-Doc0XXW_.cjs.map +0 -1
  38. package/dist/shared/url-i2f-X1hX.js.map +0 -1
@@ -85,7 +85,7 @@ function requireOptionalBoolean(value, name) {
85
85
  //#endregion
86
86
  //#region src/core/version.ts
87
87
  /** Версия библиотеки. Попадает в `User-Agent`. */
88
- const LIBRARY_VERSION = "0.9.2";
88
+ const LIBRARY_VERSION = "0.10.0";
89
89
  //#endregion
90
90
  //#region src/core/config.ts
91
91
  /** Базовый URL API итд.com. Домен записан в punycode: `итд.com`. */
@@ -1364,7 +1364,10 @@ function requestAuthRecoveryState(request) {
1364
1364
  const internal = request;
1365
1365
  const current = internal[REQUEST_AUTH_RECOVERY_STATE];
1366
1366
  if (current) return current;
1367
- const state = { recovered: false };
1367
+ const state = {
1368
+ recovered: false,
1369
+ preparationErrors: /* @__PURE__ */ new Set()
1370
+ };
1368
1371
  internal[REQUEST_AUTH_RECOVERY_STATE] = state;
1369
1372
  return state;
1370
1373
  }
@@ -1802,6 +1805,19 @@ function createServicesMiddleware(registry) {
1802
1805
  return next(prepared);
1803
1806
  };
1804
1807
  }
1808
+ /** Однократная auth-подготовка вне retry исходного запроса. */
1809
+ function createAuthPreflightMiddleware(getAuth) {
1810
+ return async (request, next) => {
1811
+ if (!request.skipAuth) {
1812
+ const auth = getAuth();
1813
+ if (auth.preflight) {
1814
+ const pending = auth.preflight(request.skipAuthRefresh !== true);
1815
+ await (request.signal ? waitForRequest(pending, request.signal) : pending);
1816
+ }
1817
+ }
1818
+ return next(request);
1819
+ };
1820
+ }
1805
1821
  /**
1806
1822
  * Подготавливает auth state до входа транспортной попытки в очередь.
1807
1823
  *
@@ -1812,7 +1828,12 @@ function createAuthPreparationMiddleware(auth) {
1812
1828
  return async (request, next) => {
1813
1829
  if (!request.skipAuth) {
1814
1830
  const pending = auth.prepare();
1815
- await (request.signal ? waitForRequest(pending, request.signal) : pending);
1831
+ try {
1832
+ await (request.signal ? waitForRequest(pending, request.signal) : pending);
1833
+ } catch (error) {
1834
+ requestAuthRecoveryState(request).preparationErrors.add(error);
1835
+ throw error;
1836
+ }
1816
1837
  }
1817
1838
  return next(request);
1818
1839
  };
@@ -1852,7 +1873,8 @@ function createAuthRecoveryMiddleware(auth) {
1852
1873
  try {
1853
1874
  return await next(request);
1854
1875
  } catch (error) {
1855
- if (request.skipAuthRefresh || recovery.recovered || !require_errors.isItdApiError(error) || error.status !== 401) throw error;
1876
+ const preparationFailed = recovery.preparationErrors.delete(error);
1877
+ if (request.skipAuthRefresh || recovery.recovered || preparationFailed || !require_errors.isItdApiError(error) || error.status !== 401) throw error;
1856
1878
  const pending = auth.recover();
1857
1879
  if (!await (request.signal ? waitForRequest(pending, request.signal) : pending)) throw error;
1858
1880
  recovery.recovered = true;
@@ -2581,6 +2603,7 @@ var Transport = class {
2581
2603
  const ClientRuntimeStage = Object.freeze({
2582
2604
  OperationPlugins: "operation_plugins",
2583
2605
  Services: "services",
2606
+ AuthPreflight: "auth_preflight",
2584
2607
  Retry: "retry",
2585
2608
  AuthRecovery: "auth_recovery",
2586
2609
  AuthPreparation: "auth_preparation",
@@ -2656,6 +2679,10 @@ function createClientRuntime(options, internals) {
2656
2679
  name: ClientRuntimeStage.Services,
2657
2680
  middleware: createServicesMiddleware(services)
2658
2681
  },
2682
+ {
2683
+ name: ClientRuntimeStage.AuthPreflight,
2684
+ middleware: createAuthPreflightMiddleware(() => auth)
2685
+ },
2659
2686
  {
2660
2687
  name: ClientRuntimeStage.Retry,
2661
2688
  middleware: createRetryMiddleware({
@@ -2740,6 +2767,8 @@ function createClientRuntime(options, internals) {
2740
2767
  fetch: config.fetch,
2741
2768
  clock: config.clock,
2742
2769
  logger: config.logger,
2770
+ signal: lifetime.signal,
2771
+ assertActive: (action) => internals.assertActive?.(action),
2743
2772
  baseHeaders: async (url) => {
2744
2773
  const headers = await transport.platformHeaders(url);
2745
2774
  for (const [name, value] of Object.entries(service?.headers ?? {})) headers.set(name, value);
@@ -2784,6 +2813,8 @@ const BUCKET_LIMITS = Object.freeze({
2784
2813
  "files.get": 40,
2785
2814
  auth: 35,
2786
2815
  "auth.refresh": 25,
2816
+ "auth.qrStart": 40,
2817
+ "auth.qrClaim": 300,
2787
2818
  search: 25,
2788
2819
  "comments.like": 22,
2789
2820
  "files.upload": 15,
@@ -2837,6 +2868,11 @@ const OPERATIONS = freezeOperations({
2837
2868
  method: "GET",
2838
2869
  retrySafety: RetrySafety.Safe
2839
2870
  },
2871
+ "auth.captchaProvider": {
2872
+ method: "GET",
2873
+ retrySafety: RetrySafety.Safe,
2874
+ bucket: "auth"
2875
+ },
2840
2876
  "auth.signUp": {
2841
2877
  method: "POST",
2842
2878
  retrySafety: RetrySafety.Unsafe,
@@ -2897,6 +2933,16 @@ const OPERATIONS = freezeOperations({
2897
2933
  retrySafety: RetrySafety.Unsafe,
2898
2934
  bucket: "auth"
2899
2935
  },
2936
+ "auth.qrStart": {
2937
+ method: "POST",
2938
+ retrySafety: RetrySafety.Unsafe,
2939
+ bucket: "auth.qrStart"
2940
+ },
2941
+ "auth.qrClaim": {
2942
+ method: "POST",
2943
+ retrySafety: RetrySafety.Unsafe,
2944
+ bucket: "auth.qrClaim"
2945
+ },
2900
2946
  "users.me": {
2901
2947
  method: "GET",
2902
2948
  retrySafety: RetrySafety.Safe,
@@ -2929,11 +2975,6 @@ const OPERATIONS = freezeOperations({
2929
2975
  retrySafety: RetrySafety.Safe,
2930
2976
  bucket: "users"
2931
2977
  },
2932
- "users.search": {
2933
- method: "GET",
2934
- retrySafety: RetrySafety.Safe,
2935
- bucket: "users"
2936
- },
2937
2978
  "users.whoToFollow": {
2938
2979
  method: "GET",
2939
2980
  retrySafety: RetrySafety.Safe,
@@ -3170,11 +3211,6 @@ const OPERATIONS = freezeOperations({
3170
3211
  retrySafety: RetrySafety.Safe,
3171
3212
  bucket: "notifications"
3172
3213
  },
3173
- "hashtags.search": {
3174
- method: "GET",
3175
- retrySafety: RetrySafety.Safe,
3176
- bucket: "hashtags"
3177
- },
3178
3214
  "hashtags.trending": {
3179
3215
  method: "GET",
3180
3216
  retrySafety: RetrySafety.Safe,
@@ -3446,6 +3482,41 @@ const ReportReason = Object.freeze({
3446
3482
  Fraud: "fraud",
3447
3483
  Other: "other"
3448
3484
  });
3485
+ /**
3486
+ * Провайдер капчи, которую сервер требует пройти при входе. Тип открытый.
3487
+ *
3488
+ * Активного сообщает `itd.auth.captchaProvider()`.
3489
+ */
3490
+ const CaptchaType = Object.freeze({
3491
+ /** Собственная капча ИТД. */
3492
+ Itd: "itd",
3493
+ /** Cloudflare Turnstile. */
3494
+ Cloudflare: "cloudflare"
3495
+ });
3496
+ /**
3497
+ * Какую капчу решать при входе по логину и паролю.
3498
+ *
3499
+ * `CaptchaChoice.Auto` — спросить сервер перед каждым входом; названный провайдер
3500
+ * решается без этого запроса.
3501
+ */
3502
+ const CaptchaChoice = Object.freeze({
3503
+ /** Провайдера называет сервер. */
3504
+ Auto: "auto",
3505
+ Itd: CaptchaType.Itd,
3506
+ Cloudflare: CaptchaType.Cloudflare
3507
+ });
3508
+ /**
3509
+ * Поле тела запроса, в котором сервер ждёт токен капчи. Тип открытый.
3510
+ *
3511
+ * При `CaptchaChoice.Auto` имя берётся из ответа сервера; эти значения — умолчания
3512
+ * для явно выбранного провайдера.
3513
+ */
3514
+ const CaptchaField = Object.freeze({
3515
+ /** Поле собственной капчи ИТД. */
3516
+ Itd: "token",
3517
+ /** Поле Cloudflare Turnstile. */
3518
+ Cloudflare: "turnstileToken"
3519
+ });
3449
3520
  /** Состояние соединения событийного канала. */
3450
3521
  const EventChannelStatus = Object.freeze({
3451
3522
  Connecting: "connecting",
@@ -3599,6 +3670,8 @@ const ItdErrorCode = Object.freeze({
3599
3670
  CAPTCHA_FAILED: "CAPTCHA_FAILED",
3600
3671
  /** Капча не пройдена: токен Turnstile недействителен, просрочен или уже использован. */
3601
3672
  TURNSTILE_VERIFICATION_FAILED: "TURNSTILE_VERIFICATION_FAILED",
3673
+ /** Собственная captcha ИТД не подтвердила целостность проверки. */
3674
+ INTEGRITY_CHECK_FAILED: "INTEGRITY_CHECK_FAILED",
3602
3675
  OTP_INVALID: "OTP_INVALID",
3603
3676
  /** `flowToken` неизвестен или просрочен — поток подтверждения нужно начинать заново. */
3604
3677
  INVALID_FLOW_TOKEN: "INVALID_FLOW_TOKEN",
@@ -3615,6 +3688,12 @@ const ItdErrorCode = Object.freeze({
3615
3688
  /** Cookie `refresh_token` есть, но сессии за ней уже нет: отозвана или истекла. */
3616
3689
  SESSION_NOT_FOUND: "SESSION_NOT_FOUND",
3617
3690
  MISSING_FLOW_TOKEN: "MISSING_FLOW_TOKEN",
3691
+ QR_EXPIRED: "QR_EXPIRED",
3692
+ QR_TOKEN_MISMATCH: "QR_TOKEN_MISMATCH",
3693
+ QR_ALREADY_USED: "QR_ALREADY_USED",
3694
+ QR_NOT_SCANNED: "QR_NOT_SCANNED",
3695
+ USER_INACTIVE: "USER_INACTIVE",
3696
+ TOO_MANY_REQUESTS: "TOO_MANY_REQUESTS",
3618
3697
  PROFILE_USERNAME_TAKEN: "PROFILE_USERNAME_TAKEN",
3619
3698
  PROFILE_USERNAME_RESERVED: "PROFILE_USERNAME_RESERVED",
3620
3699
  PROFILE_RESTRICTION_ACTIVE: "PROFILE_RESTRICTION_ACTIVE",
@@ -4013,6 +4092,24 @@ Object.defineProperty(exports, "BUCKET_LIMITS", {
4013
4092
  return BUCKET_LIMITS;
4014
4093
  }
4015
4094
  });
4095
+ Object.defineProperty(exports, "CaptchaChoice", {
4096
+ enumerable: true,
4097
+ get: function() {
4098
+ return CaptchaChoice;
4099
+ }
4100
+ });
4101
+ Object.defineProperty(exports, "CaptchaField", {
4102
+ enumerable: true,
4103
+ get: function() {
4104
+ return CaptchaField;
4105
+ }
4106
+ });
4107
+ Object.defineProperty(exports, "CaptchaType", {
4108
+ enumerable: true,
4109
+ get: function() {
4110
+ return CaptchaType;
4111
+ }
4112
+ });
4016
4113
  Object.defineProperty(exports, "CommentSort", {
4017
4114
  enumerable: true,
4018
4115
  get: function() {
@@ -4187,6 +4284,12 @@ Object.defineProperty(exports, "canonicalNotificationType", {
4187
4284
  return canonicalNotificationType;
4188
4285
  }
4189
4286
  });
4287
+ Object.defineProperty(exports, "createApiError", {
4288
+ enumerable: true,
4289
+ get: function() {
4290
+ return createApiError;
4291
+ }
4292
+ });
4190
4293
  Object.defineProperty(exports, "createClientRuntime", {
4191
4294
  enumerable: true,
4192
4295
  get: function() {
@@ -4199,6 +4302,12 @@ Object.defineProperty(exports, "createDeadline", {
4199
4302
  return createDeadline;
4200
4303
  }
4201
4304
  });
4305
+ Object.defineProperty(exports, "createRequestAbortScope", {
4306
+ enumerable: true,
4307
+ get: function() {
4308
+ return createRequestAbortScope;
4309
+ }
4310
+ });
4202
4311
  Object.defineProperty(exports, "defineBuiltInOperation", {
4203
4312
  enumerable: true,
4204
4313
  get: function() {
@@ -4337,6 +4446,12 @@ Object.defineProperty(exports, "readUnreadCountEvent", {
4337
4446
  return readUnreadCountEvent;
4338
4447
  }
4339
4448
  });
4449
+ Object.defineProperty(exports, "requestAbortError", {
4450
+ enumerable: true,
4451
+ get: function() {
4452
+ return requestAbortError;
4453
+ }
4454
+ });
4340
4455
  Object.defineProperty(exports, "requireOptionalBoolean", {
4341
4456
  enumerable: true,
4342
4457
  get: function() {
@@ -4380,4 +4495,4 @@ Object.defineProperty(exports, "voidResult", {
4380
4495
  }
4381
4496
  });
4382
4497
 
4383
- //# sourceMappingURL=url-Doc0XXW_.cjs.map
4498
+ //# sourceMappingURL=url-CDVgMIq5.cjs.map