@bitrix24/b24jssdk 0.4.10 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README-AI.md +2 -1
  2. package/dist/esm/_virtual/_commonjsHelpers.mjs +16 -0
  3. package/dist/esm/_virtual/_commonjsHelpers.mjs.map +1 -0
  4. package/dist/esm/_virtual/protobuf.mjs +16 -0
  5. package/dist/esm/_virtual/protobuf.mjs.map +1 -0
  6. package/dist/esm/_virtual/protobuf2.mjs +12 -0
  7. package/dist/esm/_virtual/protobuf2.mjs.map +1 -0
  8. package/dist/esm/core/abstract-b24.mjs +355 -0
  9. package/dist/esm/core/abstract-b24.mjs.map +1 -0
  10. package/dist/esm/core/actions/abstract-action.mjs +24 -0
  11. package/dist/esm/core/actions/abstract-action.mjs.map +1 -0
  12. package/dist/esm/core/actions/abstract-batch.mjs +95 -0
  13. package/dist/esm/core/actions/abstract-batch.mjs.map +1 -0
  14. package/dist/esm/core/actions/manager.mjs +53 -0
  15. package/dist/esm/core/actions/manager.mjs.map +1 -0
  16. package/dist/esm/core/actions/v2/batch-by-chunk.mjs +92 -0
  17. package/dist/esm/core/actions/v2/batch-by-chunk.mjs.map +1 -0
  18. package/dist/esm/core/actions/v2/batch.mjs +126 -0
  19. package/dist/esm/core/actions/v2/batch.mjs.map +1 -0
  20. package/dist/esm/core/actions/v2/call-list.mjs +131 -0
  21. package/dist/esm/core/actions/v2/call-list.mjs.map +1 -0
  22. package/dist/esm/core/actions/v2/call.mjs +68 -0
  23. package/dist/esm/core/actions/v2/call.mjs.map +1 -0
  24. package/dist/esm/core/actions/v2/fetch-list.mjs +132 -0
  25. package/dist/esm/core/actions/v2/fetch-list.mjs.map +1 -0
  26. package/dist/esm/core/actions/v2/manager-v2.mjs +74 -0
  27. package/dist/esm/core/actions/v2/manager-v2.mjs.map +1 -0
  28. package/dist/esm/core/actions/v3/batch-by-chunk.mjs +91 -0
  29. package/dist/esm/core/actions/v3/batch-by-chunk.mjs.map +1 -0
  30. package/dist/esm/core/actions/v3/batch.mjs +129 -0
  31. package/dist/esm/core/actions/v3/batch.mjs.map +1 -0
  32. package/dist/esm/core/actions/v3/call-list.mjs +127 -0
  33. package/dist/esm/core/actions/v3/call-list.mjs.map +1 -0
  34. package/dist/esm/core/actions/v3/call.mjs +58 -0
  35. package/dist/esm/core/actions/v3/call.mjs.map +1 -0
  36. package/dist/esm/core/actions/v3/fetch-list.mjs +125 -0
  37. package/dist/esm/core/actions/v3/fetch-list.mjs.map +1 -0
  38. package/dist/esm/core/actions/v3/manager-v3.mjs +74 -0
  39. package/dist/esm/core/actions/v3/manager-v3.mjs.map +1 -0
  40. package/dist/esm/core/http/abstract-http.mjs +563 -0
  41. package/dist/esm/core/http/abstract-http.mjs.map +1 -0
  42. package/dist/esm/core/http/ajax-error.mjs +107 -0
  43. package/dist/esm/core/http/ajax-error.mjs.map +1 -0
  44. package/dist/esm/core/http/ajax-result.mjs +176 -0
  45. package/dist/esm/core/http/ajax-result.mjs.map +1 -0
  46. package/dist/esm/core/http/limiters/adaptive-delayer.mjs +135 -0
  47. package/dist/esm/core/http/limiters/adaptive-delayer.mjs.map +1 -0
  48. package/dist/esm/core/http/limiters/manager.mjs +308 -0
  49. package/dist/esm/core/http/limiters/manager.mjs.map +1 -0
  50. package/dist/esm/core/http/limiters/operating-limiter.mjs +171 -0
  51. package/dist/esm/core/http/limiters/operating-limiter.mjs.map +1 -0
  52. package/dist/esm/core/http/limiters/params-factory.mjs +121 -0
  53. package/dist/esm/core/http/limiters/params-factory.mjs.map +1 -0
  54. package/dist/esm/core/http/limiters/rate-limiter.mjs +402 -0
  55. package/dist/esm/core/http/limiters/rate-limiter.mjs.map +1 -0
  56. package/dist/esm/core/http/v2.mjs +100 -0
  57. package/dist/esm/core/http/v2.mjs.map +1 -0
  58. package/dist/esm/core/http/v3.mjs +94 -0
  59. package/dist/esm/core/http/v3.mjs.map +1 -0
  60. package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs +69 -0
  61. package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs.map +1 -0
  62. package/dist/esm/core/interaction/batch/parse-row.mjs +67 -0
  63. package/dist/esm/core/interaction/batch/parse-row.mjs.map +1 -0
  64. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs +42 -0
  65. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs.map +1 -0
  66. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs +121 -0
  67. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs.map +1 -0
  68. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs +32 -0
  69. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs.map +1 -0
  70. package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs +32 -0
  71. package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs.map +1 -0
  72. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs +118 -0
  73. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs.map +1 -0
  74. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs +32 -0
  75. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs.map +1 -0
  76. package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs +32 -0
  77. package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs.map +1 -0
  78. package/dist/esm/core/interaction/batch/v2.mjs +44 -0
  79. package/dist/esm/core/interaction/batch/v2.mjs.map +1 -0
  80. package/dist/esm/core/interaction/batch/v3.mjs +42 -0
  81. package/dist/esm/core/interaction/batch/v3.mjs.map +1 -0
  82. package/dist/esm/core/language/list.mjs +56 -0
  83. package/dist/esm/core/language/list.mjs.map +1 -0
  84. package/dist/esm/core/request-id-generator.mjs +42 -0
  85. package/dist/esm/core/request-id-generator.mjs.map +1 -0
  86. package/dist/esm/core/result.mjs +101 -0
  87. package/dist/esm/core/result.mjs.map +1 -0
  88. package/dist/esm/core/sdk-error.mjs +83 -0
  89. package/dist/esm/core/sdk-error.mjs.map +1 -0
  90. package/dist/esm/core/tools/abstract-tool.mjs +24 -0
  91. package/dist/esm/core/tools/abstract-tool.mjs.map +1 -0
  92. package/dist/esm/core/tools/healthcheck.mjs +48 -0
  93. package/dist/esm/core/tools/healthcheck.mjs.map +1 -0
  94. package/dist/esm/core/tools/manager.mjs +50 -0
  95. package/dist/esm/core/tools/manager.mjs.map +1 -0
  96. package/dist/esm/core/tools/ping.mjs +56 -0
  97. package/dist/esm/core/tools/ping.mjs.map +1 -0
  98. package/dist/esm/core/version-manager.mjs +116 -0
  99. package/dist/esm/core/version-manager.mjs.map +1 -0
  100. package/dist/esm/frame/auth.mjs +98 -0
  101. package/dist/esm/frame/auth.mjs.map +1 -0
  102. package/dist/esm/frame/b24.mjs +170 -0
  103. package/dist/esm/frame/b24.mjs.map +1 -0
  104. package/dist/esm/frame/dialog.mjs +78 -0
  105. package/dist/esm/frame/dialog.mjs.map +1 -0
  106. package/dist/esm/frame/frame.mjs +101 -0
  107. package/dist/esm/frame/frame.mjs.map +1 -0
  108. package/dist/esm/frame/message/commands.mjs +37 -0
  109. package/dist/esm/frame/message/commands.mjs.map +1 -0
  110. package/dist/esm/frame/message/controller.mjs +177 -0
  111. package/dist/esm/frame/message/controller.mjs.map +1 -0
  112. package/dist/esm/frame/options.mjs +106 -0
  113. package/dist/esm/frame/options.mjs.map +1 -0
  114. package/dist/esm/frame/parent.mjs +250 -0
  115. package/dist/esm/frame/parent.mjs.map +1 -0
  116. package/dist/esm/frame/placement.mjs +131 -0
  117. package/dist/esm/frame/placement.mjs.map +1 -0
  118. package/dist/esm/frame/slider.mjs +156 -0
  119. package/dist/esm/frame/slider.mjs.map +1 -0
  120. package/dist/esm/helper/abstract-helper.mjs +52 -0
  121. package/dist/esm/helper/abstract-helper.mjs.map +1 -0
  122. package/dist/esm/helper/app-manager.mjs +37 -0
  123. package/dist/esm/helper/app-manager.mjs.map +1 -0
  124. package/dist/esm/helper/currency-manager.mjs +207 -0
  125. package/dist/esm/helper/currency-manager.mjs.map +1 -0
  126. package/dist/esm/helper/helper-manager.mjs +388 -0
  127. package/dist/esm/helper/helper-manager.mjs.map +1 -0
  128. package/dist/esm/helper/license-manager.mjs +50 -0
  129. package/dist/esm/helper/license-manager.mjs.map +1 -0
  130. package/dist/esm/helper/options-manager.mjs +196 -0
  131. package/dist/esm/helper/options-manager.mjs.map +1 -0
  132. package/dist/esm/helper/payment-manager.mjs +33 -0
  133. package/dist/esm/helper/payment-manager.mjs.map +1 -0
  134. package/dist/esm/helper/profile-manager.mjs +33 -0
  135. package/dist/esm/helper/profile-manager.mjs.map +1 -0
  136. package/dist/esm/helper/use-b24-helper.mjs +84 -0
  137. package/dist/esm/helper/use-b24-helper.mjs.map +1 -0
  138. package/dist/esm/hook/auth.mjs +77 -0
  139. package/dist/esm/hook/auth.mjs.map +1 -0
  140. package/dist/esm/hook/b24.mjs +115 -0
  141. package/dist/esm/hook/b24.mjs.map +1 -0
  142. package/dist/esm/index.d.mts +2757 -525
  143. package/dist/esm/index.d.ts +2757 -525
  144. package/dist/esm/index.mjs +70 -14111
  145. package/dist/esm/index.mjs.map +1 -1
  146. package/dist/esm/loader-b24frame.mjs +101 -0
  147. package/dist/esm/loader-b24frame.mjs.map +1 -0
  148. package/dist/esm/logger/abstract-logger.mjs +69 -0
  149. package/dist/esm/logger/abstract-logger.mjs.map +1 -0
  150. package/dist/esm/logger/browser.mjs +162 -0
  151. package/dist/esm/logger/browser.mjs.map +1 -0
  152. package/dist/esm/logger/formatter/abstract-formatter.mjs +34 -0
  153. package/dist/esm/logger/formatter/abstract-formatter.mjs.map +1 -0
  154. package/dist/esm/logger/formatter/json-formatter.mjs +34 -0
  155. package/dist/esm/logger/formatter/json-formatter.mjs.map +1 -0
  156. package/dist/esm/logger/formatter/line-formatter.mjs +41 -0
  157. package/dist/esm/logger/formatter/line-formatter.mjs.map +1 -0
  158. package/dist/esm/logger/formatter/telegram-formatter.mjs +103 -0
  159. package/dist/esm/logger/formatter/telegram-formatter.mjs.map +1 -0
  160. package/dist/esm/logger/handler/abstract-handler.mjs +39 -0
  161. package/dist/esm/logger/handler/abstract-handler.mjs.map +1 -0
  162. package/dist/esm/logger/handler/consola-adapter.mjs +62 -0
  163. package/dist/esm/logger/handler/consola-adapter.mjs.map +1 -0
  164. package/dist/esm/logger/handler/console-handler.mjs +98 -0
  165. package/dist/esm/logger/handler/console-handler.mjs.map +1 -0
  166. package/dist/esm/logger/handler/console-v2-handler.mjs +51 -0
  167. package/dist/esm/logger/handler/console-v2-handler.mjs.map +1 -0
  168. package/dist/esm/logger/handler/memory-handler.mjs +48 -0
  169. package/dist/esm/logger/handler/memory-handler.mjs.map +1 -0
  170. package/dist/esm/logger/handler/stream-handler.mjs +73 -0
  171. package/dist/esm/logger/handler/stream-handler.mjs.map +1 -0
  172. package/dist/esm/logger/handler/telegram-handler.mjs +157 -0
  173. package/dist/esm/logger/handler/telegram-handler.mjs.map +1 -0
  174. package/dist/esm/logger/handler/winston-adapter.mjs +57 -0
  175. package/dist/esm/logger/handler/winston-adapter.mjs.map +1 -0
  176. package/dist/esm/logger/logger-factory.mjs +67 -0
  177. package/dist/esm/logger/logger-factory.mjs.map +1 -0
  178. package/dist/esm/logger/logger.mjs +76 -0
  179. package/dist/esm/logger/logger.mjs.map +1 -0
  180. package/dist/esm/logger/null-logger.mjs +32 -0
  181. package/dist/esm/logger/null-logger.mjs.map +1 -0
  182. package/dist/esm/logger/processor/memory-usage-processor.mjs +20 -0
  183. package/dist/esm/logger/processor/memory-usage-processor.mjs.map +1 -0
  184. package/dist/esm/logger/processor/pid-processor.mjs +20 -0
  185. package/dist/esm/logger/processor/pid-processor.mjs.map +1 -0
  186. package/dist/esm/oauth/auth.mjs +211 -0
  187. package/dist/esm/oauth/auth.mjs.map +1 -0
  188. package/dist/esm/oauth/b24.mjs +117 -0
  189. package/dist/esm/oauth/b24.mjs.map +1 -0
  190. package/dist/esm/oauth/refresh-token-error.mjs +20 -0
  191. package/dist/esm/oauth/refresh-token-error.mjs.map +1 -0
  192. package/dist/esm/pullClient/abstract-connector.mjs +78 -0
  193. package/dist/esm/pullClient/abstract-connector.mjs.map +1 -0
  194. package/dist/esm/pullClient/channel-manager.mjs +89 -0
  195. package/dist/esm/pullClient/channel-manager.mjs.map +1 -0
  196. package/dist/esm/pullClient/client.mjs +2064 -0
  197. package/dist/esm/pullClient/client.mjs.map +1 -0
  198. package/dist/esm/pullClient/errors.mjs +31 -0
  199. package/dist/esm/pullClient/errors.mjs.map +1 -0
  200. package/dist/esm/pullClient/json-rpc.mjs +210 -0
  201. package/dist/esm/pullClient/json-rpc.mjs.map +1 -0
  202. package/dist/esm/pullClient/long-polling-connector.mjs +157 -0
  203. package/dist/esm/pullClient/long-polling-connector.mjs.map +1 -0
  204. package/dist/esm/pullClient/protobuf/index.mjs +17 -0
  205. package/dist/esm/pullClient/protobuf/index.mjs.map +1 -0
  206. package/dist/esm/pullClient/protobuf/model.mjs +1058 -0
  207. package/dist/esm/pullClient/protobuf/model.mjs.map +1 -0
  208. package/dist/esm/pullClient/protobuf/protobuf.mjs +4653 -0
  209. package/dist/esm/pullClient/protobuf/protobuf.mjs.map +1 -0
  210. package/dist/esm/pullClient/shared-config.mjs +133 -0
  211. package/dist/esm/pullClient/shared-config.mjs.map +1 -0
  212. package/dist/esm/pullClient/storage-manager.mjs +72 -0
  213. package/dist/esm/pullClient/storage-manager.mjs.map +1 -0
  214. package/dist/esm/pullClient/web-socket-connector.mjs +129 -0
  215. package/dist/esm/pullClient/web-socket-connector.mjs.map +1 -0
  216. package/dist/esm/tools/browser.mjs +154 -0
  217. package/dist/esm/tools/browser.mjs.map +1 -0
  218. package/dist/esm/tools/environment.mjs +29 -0
  219. package/dist/esm/tools/environment.mjs.map +1 -0
  220. package/dist/esm/tools/formatters/iban.mjs +304 -0
  221. package/dist/esm/tools/formatters/iban.mjs.map +1 -0
  222. package/dist/esm/tools/formatters/numbers.mjs +64 -0
  223. package/dist/esm/tools/formatters/numbers.mjs.map +1 -0
  224. package/dist/esm/tools/index.mjs +37 -0
  225. package/dist/esm/tools/index.mjs.map +1 -0
  226. package/dist/esm/tools/scroll-size.mjs +25 -0
  227. package/dist/esm/tools/scroll-size.mjs.map +1 -0
  228. package/dist/esm/tools/text.mjs +208 -0
  229. package/dist/esm/tools/text.mjs.map +1 -0
  230. package/dist/esm/tools/type.mjs +337 -0
  231. package/dist/esm/tools/type.mjs.map +1 -0
  232. package/dist/esm/tools/use-formatters.mjs +460 -0
  233. package/dist/esm/tools/use-formatters.mjs.map +1 -0
  234. package/dist/esm/tools/uuidv7.mjs +54 -0
  235. package/dist/esm/tools/uuidv7.mjs.map +1 -0
  236. package/dist/esm/types/b24-helper.mjs +56 -0
  237. package/dist/esm/types/b24-helper.mjs.map +1 -0
  238. package/dist/esm/types/b24.mjs +16 -0
  239. package/dist/esm/types/b24.mjs.map +1 -0
  240. package/dist/esm/types/bizproc/index.mjs +187 -0
  241. package/dist/esm/types/bizproc/index.mjs.map +1 -0
  242. package/dist/esm/types/catalog/index.mjs +35 -0
  243. package/dist/esm/types/catalog/index.mjs.map +1 -0
  244. package/dist/esm/types/common.mjs +31 -0
  245. package/dist/esm/types/common.mjs.map +1 -0
  246. package/dist/esm/types/crm/entity-type.mjs +57 -0
  247. package/dist/esm/types/crm/entity-type.mjs.map +1 -0
  248. package/dist/esm/types/crm/productrow.mjs +17 -0
  249. package/dist/esm/types/crm/productrow.mjs.map +1 -0
  250. package/dist/esm/types/logger.mjs +22 -0
  251. package/dist/esm/types/logger.mjs.map +1 -0
  252. package/dist/esm/types/pull.mjs +83 -0
  253. package/dist/esm/types/pull.mjs.map +1 -0
  254. package/dist/umd/index.js +31216 -26905
  255. package/dist/umd/index.js.map +1 -1
  256. package/dist/umd/index.min.js +63 -40
  257. package/dist/umd/index.min.js.map +1 -1
  258. package/package.json +36 -31
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
4
+ * @copyright (c) 2026 Bitrix24
5
+ * @license MIT
6
+ * @see https://github.com/bitrix24/b24jssdk
7
+ * @see https://bitrix24.github.io/b24jssdk/
8
+ */
9
+ import { SdkError } from '../sdk-error.mjs';
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ class AjaxError extends SdkError {
14
+ static {
15
+ __name(this, "AjaxError");
16
+ }
17
+ requestInfo;
18
+ constructor(params) {
19
+ if (params.code === "AUTHORIZE_ERROR" || params.code === "WRONG_AUTH_TYPE") {
20
+ params.status = 403;
21
+ }
22
+ params.description = AjaxError.formatErrorMessage(params);
23
+ super(params);
24
+ this.name = "AjaxError";
25
+ this.requestInfo = params.requestInfo;
26
+ this.cleanErrorStack();
27
+ }
28
+ /**
29
+ * Creates AjaxError from HTTP response
30
+ * @todo add support v3
31
+ */
32
+ static fromResponse(response) {
33
+ return new AjaxError({
34
+ code: response.data?.error || "JSSDK_INTERNAL_AJAX_ERROR",
35
+ description: response.data?.error_description,
36
+ status: response.status,
37
+ requestInfo: response.config
38
+ });
39
+ }
40
+ /**
41
+ * @inheritDoc
42
+ */
43
+ static fromException(error, context) {
44
+ if (error instanceof AjaxError) return error;
45
+ return new AjaxError({
46
+ code: context?.code || "JSSDK_INTERNAL_AJAX_ERROR",
47
+ status: context?.status || 500,
48
+ description: error instanceof Error ? error.message : String(error),
49
+ requestInfo: context?.requestInfo,
50
+ originalError: error
51
+ });
52
+ }
53
+ /**
54
+ * @inheritDoc
55
+ */
56
+ toJSON() {
57
+ return {
58
+ name: this.name,
59
+ code: this.code,
60
+ message: this.message,
61
+ status: this._status,
62
+ timestamp: this.timestamp.toISOString(),
63
+ requestInfo: this.requestInfo,
64
+ stack: this.stack
65
+ };
66
+ }
67
+ /**
68
+ * @inheritDoc
69
+ */
70
+ toString() {
71
+ let output = `[${this.name}] ${this.code} (${this._status}): ${this.message}`;
72
+ if (this.requestInfo) {
73
+ output += `
74
+ Request: ${this.requestInfo?.requestId ? `[${this.requestInfo.requestId}] ` : ""}${this.requestInfo.method} ${this.requestInfo.url}`;
75
+ }
76
+ if (this.stack) {
77
+ output += `
78
+ Stack trace:
79
+ ${this.stack}`;
80
+ }
81
+ return output;
82
+ }
83
+ /**
84
+ * @inheritDoc
85
+ */
86
+ static formatErrorMessage(params) {
87
+ if (!params?.description) {
88
+ if (params.requestInfo?.method && params.requestInfo.url) {
89
+ return `${params.code} (on ${params.requestInfo.method}${params.requestInfo?.url ? " " + params.requestInfo.url : ""})`;
90
+ } else {
91
+ return `Internal ajax error`;
92
+ }
93
+ }
94
+ return `${params.description}`;
95
+ }
96
+ /**
97
+ * @inheritDoc
98
+ */
99
+ cleanErrorStack() {
100
+ if (typeof this.stack === "string") {
101
+ this.stack = this.stack.split("\n").filter((line) => !line.includes("AjaxError.constructor")).join("\n");
102
+ }
103
+ }
104
+ }
105
+
106
+ export { AjaxError };
107
+ //# sourceMappingURL=ajax-error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajax-error.mjs","sources":["../../../../src/core/http/ajax-error.ts"],"sourcesContent":["import type { AjaxQuery } from './ajax-result'\nimport type { SdkErrorDetails } from '../sdk-error'\nimport { SdkError } from '../sdk-error'\n\nexport type AnswerError = {\n error: string\n errorDescription: string\n}\n\nexport type AjaxErrorParams = {\n status: number\n answerError: AnswerError\n cause?: Error\n}\n\ntype AjaxErrorDetails = SdkErrorDetails & {\n requestInfo?: Partial<AjaxQuery> & { url?: string }\n}\n\n/**\n * Error requesting RestApi\n */\nexport class AjaxError extends SdkError {\n public readonly requestInfo?: AjaxErrorDetails['requestInfo']\n\n constructor(params: AjaxErrorDetails) {\n // @todo test this\n // @memo get from PullClient.loadConfig\n if (params.code === 'AUTHORIZE_ERROR' || params.code === 'WRONG_AUTH_TYPE') {\n params.status = 403\n }\n\n params.description = AjaxError.formatErrorMessage(params)\n super(params)\n\n this.name = 'AjaxError' as const\n this.requestInfo = params.requestInfo\n\n this.cleanErrorStack()\n }\n\n /**\n * Creates AjaxError from HTTP response\n * @todo add support v3\n */\n static fromResponse(response: {\n status: number\n data?: { error?: string, error_description?: string }\n config?: AjaxErrorDetails['requestInfo']\n }): AjaxError {\n return new AjaxError({\n code: response.data?.error || 'JSSDK_INTERNAL_AJAX_ERROR',\n description: response.data?.error_description,\n status: response.status,\n requestInfo: response.config\n })\n }\n\n /**\n * @inheritDoc\n */\n static override fromException(error: unknown, context?: {\n code?: string\n status?: number\n requestInfo?: AjaxErrorDetails['requestInfo']\n }): AjaxError {\n if (error instanceof AjaxError) return error\n\n return new AjaxError({\n code: context?.code || 'JSSDK_INTERNAL_AJAX_ERROR',\n status: context?.status || 500,\n description: error instanceof Error ? error.message : String(error),\n requestInfo: context?.requestInfo,\n originalError: error\n })\n }\n\n /**\n * @inheritDoc\n */\n override toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this._status,\n timestamp: this.timestamp.toISOString(),\n requestInfo: this.requestInfo,\n stack: this.stack\n }\n }\n\n /**\n * @inheritDoc\n */\n override toString(): string {\n let output = `[${this.name}] ${this.code} (${this._status}): ${this.message}`\n\n if (this.requestInfo) {\n output += `\\nRequest: ${this.requestInfo?.requestId ? `[${this.requestInfo.requestId}] ` : ''}${this.requestInfo.method} ${this.requestInfo.url}`\n }\n\n if (this.stack) {\n output += `\\nStack trace:\\n${this.stack}`\n }\n\n return output\n }\n\n /**\n * @inheritDoc\n */\n protected static override formatErrorMessage(params: AjaxErrorDetails): string {\n if (!params?.description) {\n if (\n params.requestInfo?.method\n && params.requestInfo.url\n ) {\n return `${params.code} (on ${params.requestInfo.method}${params.requestInfo?.url ? ' ' + params.requestInfo.url : ''})`\n } else {\n return `Internal ajax error`\n }\n }\n\n return `${params.description}`\n }\n\n /**\n * @inheritDoc\n */\n protected override cleanErrorStack() {\n if (typeof this.stack === 'string') {\n this.stack = this.stack\n .split('\\n')\n .filter(line => !line.includes('AjaxError.constructor'))\n .join('\\n')\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
4
+ * @copyright (c) 2026 Bitrix24
5
+ * @license MIT
6
+ * @see https://github.com/bitrix24/b24jssdk
7
+ * @see https://bitrix24.github.io/b24jssdk/
8
+ */
9
+ import { Type } from '../../tools/type.mjs';
10
+ import { Text } from '../../tools/text.mjs';
11
+ import { Result } from '../result.mjs';
12
+ import { AjaxError } from './ajax-error.mjs';
13
+ import { ApiVersion } from '../../types/b24.mjs';
14
+ import { SdkError } from '../sdk-error.mjs';
15
+
16
+ var __defProp = Object.defineProperty;
17
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
18
+ class AjaxResult extends Result {
19
+ static {
20
+ __name(this, "AjaxResult");
21
+ }
22
+ _status;
23
+ _query;
24
+ _data;
25
+ constructor(options) {
26
+ super();
27
+ this._data = options.answer ? Object.freeze(options.answer) : void 0;
28
+ this._query = Object.freeze(structuredClone(options.query));
29
+ this._status = options.status;
30
+ this.#processErrors();
31
+ }
32
+ get isSuccess() {
33
+ return this.#getIsSuccess();
34
+ }
35
+ /**
36
+ * @todo test this predicate
37
+ */
38
+ #getIsSuccess() {
39
+ return this._errors.size === 0;
40
+ }
41
+ getData() {
42
+ if (!this.isSuccess) {
43
+ return void 0;
44
+ }
45
+ const payload = this._data;
46
+ return Object.freeze({
47
+ result: payload.result,
48
+ next: "next" in payload ? payload.next : void 0,
49
+ total: "total" in payload ? payload.total : void 0,
50
+ time: payload.time
51
+ });
52
+ }
53
+ /**
54
+ * If the response contains error data, we'll restore it to an error.
55
+ *
56
+ * @todo make single function
57
+ * @see AbstractHttp._convertAxiosErrorToAjaxError()
58
+ */
59
+ #processErrors() {
60
+ if (this._data && typeof this._data === "object" && "error" in this._data) {
61
+ const responseData = this._data;
62
+ if (responseData.error && typeof responseData.error === "object" && "code" in responseData.error) {
63
+ const errorCode = responseData.error.code;
64
+ let errorDescription = responseData.error.message.trimEnd();
65
+ if (responseData.error.validation) {
66
+ if (errorDescription.length > 0) {
67
+ if (!errorDescription.endsWith(".")) {
68
+ errorDescription += `.`;
69
+ }
70
+ errorDescription += ` `;
71
+ }
72
+ responseData.error.validation.forEach((row) => {
73
+ errorDescription += `${row?.message || JSON.stringify(row)}`;
74
+ });
75
+ }
76
+ this.addError(this.#createAjaxError({
77
+ code: errorCode,
78
+ description: errorDescription,
79
+ status: this._status
80
+ }), "base-error");
81
+ } else if (responseData.error && typeof responseData.error === "string") {
82
+ const errorCode = responseData.error !== "0" ? responseData.error : "JSSDK_RESPONSE_ERROR";
83
+ const errorDescription = responseData?.error_description ?? "Some error in response";
84
+ this.addError(this.#createAjaxError({
85
+ code: errorCode,
86
+ description: errorDescription,
87
+ status: this._status
88
+ }), "base-error");
89
+ }
90
+ }
91
+ }
92
+ #createAjaxError(errorData) {
93
+ return new AjaxError({
94
+ code: errorData.code,
95
+ description: errorData.description,
96
+ status: errorData.status,
97
+ requestInfo: {
98
+ method: this._query.method,
99
+ params: this._query.params,
100
+ requestId: this._query.requestId
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Alias for isMore
106
+ */
107
+ hasMore() {
108
+ return this.isMore();
109
+ }
110
+ isMore() {
111
+ if (!this.isSuccess) {
112
+ return false;
113
+ }
114
+ const payload = this._data;
115
+ const nextValue = "next" in payload ? payload.next : void 0;
116
+ return Type.isNumber(nextValue);
117
+ }
118
+ getTotal() {
119
+ if (!this.isSuccess) {
120
+ return 0;
121
+ }
122
+ const payload = this._data;
123
+ const totalValue = "total" in payload ? payload.total : void 0;
124
+ return Text.toInteger(totalValue);
125
+ }
126
+ getStatus() {
127
+ return this._status;
128
+ }
129
+ getQuery() {
130
+ return this._query;
131
+ }
132
+ /**
133
+ * Alias for getNext
134
+ * @param http
135
+ *
136
+ * @todo !fix api version
137
+ */
138
+ async fetchNext(http) {
139
+ const data = await this.getNext(http);
140
+ if (data === false) {
141
+ return null;
142
+ }
143
+ return data;
144
+ }
145
+ async getNext(http) {
146
+ if (http.apiVersion === ApiVersion.v3) {
147
+ throw new SdkError({
148
+ code: "JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3",
149
+ description: `restApi:v3 not support method getNext`,
150
+ status: 500
151
+ });
152
+ }
153
+ if (!this.isSuccess || !this.isMore()) {
154
+ return false;
155
+ }
156
+ const nextPageQuery = this.#buildNextPageQuery();
157
+ return http.call(
158
+ nextPageQuery.method,
159
+ nextPageQuery.params
160
+ );
161
+ }
162
+ #buildNextPageQuery() {
163
+ const result = { ...this._query };
164
+ const payload = this._data;
165
+ const nextValue = "next" in payload ? payload.next : void 0;
166
+ result.params.start = Text.toInteger(Text.toInteger(nextValue));
167
+ return result;
168
+ }
169
+ // Immutable API
170
+ setData() {
171
+ throw new ReferenceError("AjaxResult does not allow data modification");
172
+ }
173
+ }
174
+
175
+ export { AjaxResult };
176
+ //# sourceMappingURL=ajax-result.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ajax-result.mjs","sources":["../../../../src/core/http/ajax-result.ts"],"sourcesContent":["import type { IResult } from '../result'\nimport type { Payload, SuccessPayload } from '../../types/payloads'\nimport type { TypeCallParams, TypeHttp } from '../../types/http'\nimport type { TypeDescriptionError, TypeDescriptionErrorV3 } from '../../types/auth'\nimport { Type } from '../../tools/type'\nimport { Text } from '../../tools/text'\nimport { Result } from '../result'\nimport { AjaxError } from './ajax-error'\nimport { ApiVersion } from '../../types/b24'\nimport { SdkError } from '../sdk-error'\n\nexport type AjaxQuery = Readonly<{\n method: string\n params: TypeCallParams\n requestId: string\n}>\n\ntype AjaxResultOptions<T> = Readonly<{\n answer: Payload<T>\n query: AjaxQuery\n status: number\n}>\n\ntype ErrorData = {\n code: string\n description: string\n status: number\n}\n\n/**\n * Result of request to Rest Api\n *\n * @todo docs\n */\nexport class AjaxResult<T = unknown> extends Result<Payload<T>> implements IResult<Payload<T>> {\n private readonly _status: number\n private readonly _query: AjaxQuery\n protected override _data: Payload<T> | null | undefined\n\n constructor(options: AjaxResultOptions<T>) {\n super()\n\n this._data = options.answer ? Object.freeze(options.answer) : undefined\n this._query = Object.freeze(structuredClone(options.query))\n this._status = options.status\n\n this.#processErrors()\n }\n\n override get isSuccess(): boolean {\n return this.#getIsSuccess()\n }\n\n /**\n * @todo test this predicate\n */\n #getIsSuccess(): this is { getData: () => SuccessPayload<T> } {\n return this._errors.size === 0\n }\n\n override getData(): undefined | SuccessPayload<T> {\n if (!this.isSuccess) {\n return undefined\n }\n\n const payload = this._data as SuccessPayload<T>\n\n return Object.freeze({\n result: payload.result,\n next: 'next' in payload ? payload.next : undefined,\n total: 'total' in payload ? payload.total : undefined,\n time: payload.time\n }) as SuccessPayload<T>\n }\n\n /**\n * If the response contains error data, we'll restore it to an error.\n *\n * @todo make single function\n * @see AbstractHttp._convertAxiosErrorToAjaxError()\n */\n #processErrors(): void {\n if (this._data && typeof this._data === 'object' && 'error' in this._data) {\n const responseData = this._data as TypeDescriptionError | TypeDescriptionErrorV3\n\n if (\n responseData.error\n && typeof responseData.error === 'object'\n && 'code' in responseData.error\n ) {\n const errorCode = responseData.error.code\n let errorDescription = responseData.error.message.trimEnd()\n if (responseData.error.validation) {\n if (errorDescription.length > 0) {\n if (!errorDescription.endsWith('.')) {\n errorDescription += `.`\n }\n errorDescription += ` `\n }\n responseData.error.validation.forEach((row) => {\n errorDescription += `${row?.message || JSON.stringify(row)}`\n })\n }\n\n this.addError(this.#createAjaxError({\n code: errorCode,\n description: errorDescription,\n status: this._status\n }), 'base-error')\n } else if (responseData.error && typeof responseData.error === 'string') {\n const errorCode = responseData.error !== '0' ? responseData.error : 'JSSDK_RESPONSE_ERROR'\n const errorDescription = (responseData as TypeDescriptionError)?.error_description ?? 'Some error in response'\n\n this.addError(this.#createAjaxError({\n code: errorCode,\n description: errorDescription,\n status: this._status\n }), 'base-error')\n }\n }\n }\n\n #createAjaxError(errorData: ErrorData): AjaxError {\n return new AjaxError({\n code: errorData.code,\n description: errorData.description,\n status: errorData.status,\n requestInfo: {\n method: this._query.method,\n params: this._query.params,\n requestId: this._query.requestId\n }\n })\n }\n\n /**\n * Alias for isMore\n */\n hasMore(): boolean {\n return this.isMore()\n }\n\n isMore(): boolean {\n if (!this.isSuccess) {\n return false\n }\n const payload = this._data as SuccessPayload<T>\n const nextValue = 'next' in payload ? payload.next : undefined\n\n return Type.isNumber(nextValue)\n }\n\n getTotal(): number {\n if (!this.isSuccess) {\n return 0\n }\n const payload = this._data as SuccessPayload<T>\n const totalValue = 'total' in payload ? payload.total : undefined\n\n return Text.toInteger(totalValue)\n }\n\n getStatus(): number {\n return this._status\n }\n\n getQuery(): Readonly<AjaxQuery> {\n return this._query\n }\n\n /**\n * Alias for getNext\n * @param http\n *\n * @todo !fix api version\n */\n async fetchNext(http: TypeHttp): Promise<AjaxResult<T> | null> {\n const data = await this.getNext(http)\n if (data === false) {\n return null\n }\n\n return data\n }\n\n async getNext(http: TypeHttp): Promise<AjaxResult<T> | false> {\n // @todo ! Correction -> we can use pagination to navigate to the next page\n if (http.apiVersion === ApiVersion.v3) {\n throw new SdkError({\n code: 'JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3',\n description: `restApi:v3 not support method getNext`,\n status: 500\n })\n }\n if (\n !this.isSuccess\n || !this.isMore()\n ) {\n return false\n }\n\n const nextPageQuery = this.#buildNextPageQuery()\n return http.call(\n nextPageQuery.method,\n nextPageQuery.params\n ) as Promise<AjaxResult<T>>\n }\n\n #buildNextPageQuery(): AjaxQuery {\n const result = { ...this._query }\n\n const payload = this._data as SuccessPayload<T>\n const nextValue = 'next' in payload ? payload.next : undefined\n\n result.params.start = Text.toInteger(Text.toInteger(nextValue))\n\n return result\n }\n\n // Immutable API\n override setData(): never {\n throw new ReferenceError('AjaxResult does not allow data modification')\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * @package @bitrix24/b24jssdk
3
+ * @version 1.0.1
4
+ * @copyright (c) 2026 Bitrix24
5
+ * @license MIT
6
+ * @see https://github.com/bitrix24/b24jssdk
7
+ * @see https://bitrix24.github.io/b24jssdk/
8
+ */
9
+ import { LoggerFactory } from '../../../logger/logger-factory.mjs';
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ class AdaptiveDelayer {
14
+ static {
15
+ __name(this, "AdaptiveDelayer");
16
+ }
17
+ #config;
18
+ #operatingLimiter;
19
+ #stats = {
20
+ adaptiveDelays: 0,
21
+ totalAdaptiveDelay: 0
22
+ };
23
+ _logger;
24
+ getTitle() {
25
+ return "adaptiveDelayer";
26
+ }
27
+ constructor(config, operatingLimiter) {
28
+ this._logger = LoggerFactory.createNullLogger();
29
+ this.#config = config;
30
+ this.#operatingLimiter = operatingLimiter;
31
+ }
32
+ // region Logger ////
33
+ setLogger(logger) {
34
+ this._logger = logger;
35
+ }
36
+ getLogger() {
37
+ return this._logger;
38
+ }
39
+ // endregion ////
40
+ async canProceed(_requestId, _method, _params) {
41
+ return true;
42
+ }
43
+ /**
44
+ * Returns an adaptive delay based on previous experience
45
+ */
46
+ async waitIfNeeded(requestId, method, params) {
47
+ if (!this.#config.enabled) {
48
+ return 0;
49
+ }
50
+ const delay = this.#calculateDelay(requestId, method, params);
51
+ if (delay > 0) {
52
+ this.incrementAdaptiveDelays();
53
+ this.#stats.totalAdaptiveDelay += delay;
54
+ }
55
+ return delay;
56
+ }
57
+ /**
58
+ * Calculates adaptive delay based on previous experience
59
+ */
60
+ #calculateDelay(requestId, method, params) {
61
+ if (method === "batch") {
62
+ return this.#calculateBatchDelay(requestId, params);
63
+ }
64
+ const stats = this.#operatingLimiter.getMethodStat(method);
65
+ if (typeof stats === "undefined") {
66
+ return 0;
67
+ }
68
+ const usagePercent = stats.operating / this.#operatingLimiter.limitMs * 100;
69
+ if (usagePercent > this.#config.thresholdPercent) {
70
+ let adaptiveDelay = 0;
71
+ const now = Date.now();
72
+ if (stats.operating_reset_at > now) {
73
+ adaptiveDelay += (stats.operating_reset_at - now) * this.#config.coefficient;
74
+ } else {
75
+ adaptiveDelay += 7e3;
76
+ }
77
+ const waitDelay = Number.parseInt(Math.min(adaptiveDelay, this.#config.maxDelay).toFixed(0));
78
+ this.#logStat(requestId, method, usagePercent, adaptiveDelay, waitDelay);
79
+ return waitDelay;
80
+ }
81
+ return 0;
82
+ }
83
+ /**
84
+ * For `batch`, applies adaptive delay based on previous experience from commands
85
+ */
86
+ #calculateBatchDelay(requestId, params) {
87
+ let maxDelay = 0;
88
+ if (!params?.cmd || !Array.isArray(params.cmd)) {
89
+ return maxDelay;
90
+ }
91
+ const batchMethods = params.cmd.map((row) => row.split("?")[0]).filter(Boolean);
92
+ const batchMethodsUnique = [...new Set(batchMethods)];
93
+ for (const methodName of batchMethodsUnique) {
94
+ const delay = this.#calculateDelay(requestId, `batch::${methodName}`, {});
95
+ maxDelay = Math.max(maxDelay, delay);
96
+ }
97
+ return maxDelay;
98
+ }
99
+ async updateStats(_requestId, _method, _data) {
100
+ }
101
+ async reset() {
102
+ this.#stats = {
103
+ adaptiveDelays: 0,
104
+ totalAdaptiveDelay: 0
105
+ };
106
+ }
107
+ getStats() {
108
+ return {
109
+ ...this.#stats,
110
+ adaptiveDelayAvg: this.#stats.adaptiveDelays > 0 ? this.#stats.totalAdaptiveDelay / this.#stats.adaptiveDelays : 0
111
+ };
112
+ }
113
+ async setConfig(config) {
114
+ this.#config = config;
115
+ }
116
+ incrementAdaptiveDelays() {
117
+ this.#stats.adaptiveDelays++;
118
+ }
119
+ // region Log ////
120
+ #logStat(requestId, method, percent, adaptiveDelay, waitDelay) {
121
+ this.getLogger().debug(`${this.getTitle()} state for method ${method}`, {
122
+ requestId,
123
+ method,
124
+ percent: Number.parseFloat(percent.toFixed(2)),
125
+ delays: {
126
+ calculated: adaptiveDelay,
127
+ actual: waitDelay
128
+ }
129
+ });
130
+ }
131
+ // endregion ////
132
+ }
133
+
134
+ export { AdaptiveDelayer };
135
+ //# sourceMappingURL=adaptive-delayer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-delayer.mjs","sources":["../../../../../src/core/http/limiters/adaptive-delayer.ts"],"sourcesContent":["import type { AdaptiveConfig, ILimiter } from '../../../types/limiters'\nimport type { OperatingLimiter } from './operating-limiter'\nimport type { LoggerInterface } from '../../../types/logger'\nimport { LoggerFactory } from '../../../logger'\n\n/**\n * Adaptive delayer\n *\n * @todo docs\n */\nexport class AdaptiveDelayer implements ILimiter {\n #config: AdaptiveConfig\n #operatingLimiter: OperatingLimiter\n #stats = {\n adaptiveDelays: 0,\n totalAdaptiveDelay: 0\n }\n\n private _logger: LoggerInterface\n\n getTitle(): string {\n return 'adaptiveDelayer'\n }\n\n constructor(config: AdaptiveConfig, operatingLimiter: OperatingLimiter) {\n this._logger = LoggerFactory.createNullLogger()\n this.#config = config\n this.#operatingLimiter = operatingLimiter\n }\n\n // region Logger ////\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n // endregion ////\n\n async canProceed(_requestId: string, _method: string, _params?: any): Promise<boolean> {\n return true // Adaptive delay doesn't block, only delays\n }\n\n /**\n * Returns an adaptive delay based on previous experience\n */\n async waitIfNeeded(requestId: string, method: string, params?: any): Promise<number> {\n if (!this.#config.enabled) {\n return 0\n }\n\n const delay = this.#calculateDelay(requestId, method, params)\n if (delay > 0) {\n this.incrementAdaptiveDelays()\n this.#stats.totalAdaptiveDelay += delay\n }\n\n return delay\n }\n\n /**\n * Calculates adaptive delay based on previous experience\n */\n #calculateDelay(requestId: string, method: string, params?: any): number {\n if (method === 'batch') {\n return this.#calculateBatchDelay(requestId, params)\n }\n\n const stats = this.#operatingLimiter.getMethodStat(method)\n\n if (typeof stats === 'undefined') {\n return 0\n }\n\n const usagePercent = (stats.operating / this.#operatingLimiter.limitMs) * 100\n\n if (usagePercent > this.#config.thresholdPercent) {\n let adaptiveDelay = 0\n\n // Calculate based on previous delay or default\n const now = Date.now()\n if (stats.operating_reset_at > now) {\n adaptiveDelay += (stats.operating_reset_at - now) * this.#config.coefficient\n } else {\n adaptiveDelay += 7_000 // 7 seconds by default\n }\n\n const waitDelay = Number.parseInt(Math.min(adaptiveDelay, this.#config.maxDelay).toFixed(0))\n\n this.#logStat(requestId, method, usagePercent, adaptiveDelay, waitDelay)\n return waitDelay\n }\n\n return 0\n }\n\n /**\n * For `batch`, applies adaptive delay based on previous experience from commands\n */\n #calculateBatchDelay(requestId: string, params: any): number {\n let maxDelay = 0\n\n if (!params?.cmd || !Array.isArray(params.cmd)) {\n return maxDelay\n }\n\n const batchMethods = params.cmd\n .map((row: string) => row.split('?')[0])\n .filter(Boolean)\n\n const batchMethodsUnique = [...new Set(batchMethods)]\n\n for (const methodName of batchMethodsUnique) {\n const delay = this.#calculateDelay(requestId, `batch::${methodName}`, {})\n maxDelay = Math.max(maxDelay, delay)\n }\n\n return maxDelay\n }\n\n async updateStats(_requestId: string, _method: string, _data: any): Promise<void> {\n // Adaptive delayer updates based on operating limiter\n }\n\n async reset(): Promise<void> {\n this.#stats = {\n adaptiveDelays: 0,\n totalAdaptiveDelay: 0\n }\n }\n\n getStats(): {\n adaptiveDelays: number\n totalAdaptiveDelay: number\n adaptiveDelayAvg: number\n } {\n return {\n ...this.#stats,\n adaptiveDelayAvg: this.#stats.adaptiveDelays > 0\n ? this.#stats.totalAdaptiveDelay / this.#stats.adaptiveDelays\n : 0\n }\n }\n\n async setConfig(config: AdaptiveConfig): Promise<void> {\n this.#config = config\n }\n\n incrementAdaptiveDelays(): void {\n this.#stats.adaptiveDelays++\n }\n\n // region Log ////\n #logStat(requestId: string, method: string, percent: number, adaptiveDelay: number, waitDelay: number) {\n this.getLogger().debug(`${this.getTitle()} state for method ${method}`, {\n requestId,\n method,\n percent: Number.parseFloat(percent.toFixed(2)),\n delays: {\n calculated: adaptiveDelay,\n actual: waitDelay\n }\n })\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}