@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,402 @@
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 RateLimiter {
14
+ static {
15
+ __name(this, "RateLimiter");
16
+ }
17
+ #tokens;
18
+ #lastRefill;
19
+ #refillIntervalMs;
20
+ #config;
21
+ #lockQueue = [];
22
+ #originalConfig;
23
+ // Original configuration for recovery
24
+ #errorThreshold = 5;
25
+ // 60-second error threshold to reduce limits
26
+ #successThreshold = 20;
27
+ // Consecutive success threshold for restoring limits
28
+ #minDrainRate = 0.5;
29
+ // Minimum drain rate
30
+ #minBurstLimit = 5;
31
+ // Minimum burst limit
32
+ #errorTimestamps = [];
33
+ // Error timestamps (last 60 seconds)
34
+ #successTimestamps = [];
35
+ // Timestamps of successful requests
36
+ _logger;
37
+ constructor(config) {
38
+ this._logger = LoggerFactory.createNullLogger();
39
+ this.#config = config;
40
+ this.#originalConfig = { ...config };
41
+ this.#tokens = config.burstLimit;
42
+ this.#lastRefill = Date.now();
43
+ this.#refillIntervalMs = 1e3 / config.drainRate;
44
+ }
45
+ getTitle() {
46
+ return "rateLimiter";
47
+ }
48
+ // region Logger ////
49
+ setLogger(logger) {
50
+ this._logger = logger;
51
+ }
52
+ getLogger() {
53
+ return this._logger;
54
+ }
55
+ // endregion ////
56
+ /**
57
+ * @inheritDoc
58
+ */
59
+ async canProceed(requestId, _method, _params) {
60
+ await this.#acquireLock(requestId);
61
+ try {
62
+ const now = Date.now();
63
+ const timePassed = now - this.#lastRefill;
64
+ const refillAmount = timePassed * this.#config.drainRate / 1e3;
65
+ this.#tokens = Math.min(
66
+ this.#config.burstLimit,
67
+ this.#tokens + refillAmount
68
+ );
69
+ this.#lastRefill = now;
70
+ return this.#tokens >= 1;
71
+ } finally {
72
+ this.#releaseLock();
73
+ }
74
+ }
75
+ /**
76
+ * @inheritDoc
77
+ */
78
+ async waitIfNeeded(requestId, _method, _params) {
79
+ await this.#acquireLock(requestId);
80
+ try {
81
+ const now = Date.now();
82
+ const timePassed = now - this.#lastRefill;
83
+ const refillAmount = timePassed * this.#config.drainRate / 1e3;
84
+ this.#tokens = Math.min(
85
+ this.#config.burstLimit,
86
+ this.#tokens + refillAmount
87
+ );
88
+ this.#lastRefill = now;
89
+ if (this.#tokens >= 1) {
90
+ this.#tokens -= 1;
91
+ return 0;
92
+ }
93
+ const deficit = 1 - this.#tokens;
94
+ return Math.ceil(deficit * this.#refillIntervalMs);
95
+ } finally {
96
+ this.#releaseLock();
97
+ }
98
+ }
99
+ /**
100
+ * Error handler.
101
+ * If there are a lot of errors, we'll lower the limits.
102
+ */
103
+ async handleExceeded(requestId) {
104
+ await this.#acquireLock(requestId);
105
+ try {
106
+ this.#recordError();
107
+ if (this.#config.adaptiveEnabled && this.#shouldReduceLimits()) {
108
+ this.#reduceLimits(requestId);
109
+ }
110
+ this.#tokens = 0;
111
+ return this.#refillIntervalMs + 1e3;
112
+ } finally {
113
+ this.#releaseLock();
114
+ }
115
+ }
116
+ /**
117
+ * Successful request handler.
118
+ * If everything is OK, we'll restore the limits.
119
+ */
120
+ async updateStats(requestId, method, _data) {
121
+ if (method.startsWith("batch::")) {
122
+ return;
123
+ }
124
+ await this.#acquireLock(requestId);
125
+ try {
126
+ this.#recordSuccess();
127
+ if (this.#config.adaptiveEnabled) {
128
+ this.#logStat(requestId);
129
+ }
130
+ if (this.#config.adaptiveEnabled && this.#shouldRestoreLimits()) {
131
+ this.#restoreLimits(requestId);
132
+ }
133
+ } finally {
134
+ this.#releaseLock();
135
+ }
136
+ }
137
+ /**
138
+ * @inheritDoc
139
+ */
140
+ async reset() {
141
+ await this.#acquireLock("reset");
142
+ try {
143
+ this.#tokens = this.#config.burstLimit;
144
+ this.#lastRefill = Date.now();
145
+ this.#errorTimestamps = [];
146
+ this.#successTimestamps = [];
147
+ this.#config.drainRate = this.#originalConfig.drainRate;
148
+ this.#config.burstLimit = this.#originalConfig.burstLimit;
149
+ this.#refillIntervalMs = 1e3 / this.#config.drainRate;
150
+ } finally {
151
+ this.#releaseLock();
152
+ }
153
+ }
154
+ /**
155
+ * @inheritDoc
156
+ */
157
+ getStats() {
158
+ return {
159
+ tokens: this.#tokens,
160
+ burstLimit: this.#config.burstLimit,
161
+ originalBurstLimit: this.#originalConfig.burstLimit,
162
+ drainRate: this.#config.drainRate,
163
+ originalDrainRate: this.#originalConfig.drainRate,
164
+ refillIntervalMs: this.#refillIntervalMs,
165
+ lastRefill: this.#lastRefill,
166
+ pendingRequests: this.#lockQueue.length,
167
+ recentErrors: this.#errorTimestamps.length,
168
+ recentSuccesses: this.#successTimestamps.length
169
+ };
170
+ }
171
+ /**
172
+ * @inheritDoc
173
+ */
174
+ async setConfig(config) {
175
+ await this.#acquireLock("setConfig");
176
+ try {
177
+ this.#config = config;
178
+ this.#originalConfig = { ...config };
179
+ this.#refillIntervalMs = 1e3 / this.#config.drainRate;
180
+ if (config.burstLimit > this.#tokens) {
181
+ this.#tokens = Math.min(config.burstLimit, this.#tokens);
182
+ }
183
+ this.#errorTimestamps = [];
184
+ this.#successTimestamps = [];
185
+ } finally {
186
+ this.#releaseLock();
187
+ }
188
+ }
189
+ /**
190
+ * Acquire a lock for the critical section
191
+ * Uses a promise queue
192
+ */
193
+ async #acquireLock(requestId) {
194
+ return new Promise((resolve) => {
195
+ const queueLength = this.#lockQueue.push(resolve);
196
+ if (queueLength > 1) {
197
+ this.#logAcquireQueue(requestId, queueLength);
198
+ }
199
+ if (this.#lockQueue.length === 1) {
200
+ resolve();
201
+ }
202
+ });
203
+ }
204
+ /**
205
+ * Releases the lock and allows the next person in the queue to proceed
206
+ */
207
+ #releaseLock() {
208
+ this.#lockQueue.shift();
209
+ if (this.#lockQueue.length > 0) {
210
+ const nextResolve = this.#lockQueue[0];
211
+ nextResolve();
212
+ }
213
+ }
214
+ /**
215
+ * Checks whether the limits need to be reduced
216
+ */
217
+ #shouldReduceLimits() {
218
+ return this.#errorTimestamps.length >= this.#errorThreshold;
219
+ }
220
+ /**
221
+ * Checks whether limits need to be restored
222
+ * Restore if:
223
+ * 1. Many successful requests (more than the threshold)
224
+ * 2. Few errors (less than half the threshold)
225
+ * 3. Current limits are lower than the original ones
226
+ */
227
+ #shouldRestoreLimits() {
228
+ return this.#successTimestamps.length >= this.#successThreshold && this.#errorTimestamps.length < this.#errorThreshold / 2 && (this.#config.drainRate < this.#originalConfig.drainRate || this.#config.burstLimit < this.#originalConfig.burstLimit);
229
+ }
230
+ /**
231
+ * Reduces limits for frequent errors
232
+ */
233
+ #reduceLimits(requestId) {
234
+ const newDrainRate = Math.max(
235
+ this.#minDrainRate,
236
+ Number.parseFloat((this.#config.drainRate * 0.8).toFixed(2))
237
+ );
238
+ const newBurstLimit = Math.max(
239
+ this.#minBurstLimit,
240
+ Number.parseFloat((this.#config.burstLimit * 0.8).toFixed(2))
241
+ );
242
+ this.#config.drainRate = newDrainRate;
243
+ this.#config.burstLimit = newBurstLimit;
244
+ this.#refillIntervalMs = 1e3 / newDrainRate;
245
+ this.#logReduceLimits(requestId, newDrainRate, newBurstLimit);
246
+ this.#errorTimestamps = [];
247
+ this.#successTimestamps = [];
248
+ }
249
+ /**
250
+ * Restores limits during stable operation
251
+ */
252
+ #restoreLimits(requestId) {
253
+ if (this.#config.drainRate === this.#originalConfig.drainRate && this.#config.burstLimit === this.#originalConfig.burstLimit) {
254
+ return;
255
+ }
256
+ const newDrainRate = Math.min(
257
+ this.#originalConfig.drainRate,
258
+ Number.parseFloat((this.#config.drainRate * 1.1).toFixed(2))
259
+ );
260
+ const newBurstLimit = Math.min(
261
+ this.#originalConfig.burstLimit,
262
+ Number.parseFloat((this.#config.burstLimit * 1.1).toFixed(2))
263
+ );
264
+ this.#config.drainRate = newDrainRate;
265
+ this.#config.burstLimit = newBurstLimit;
266
+ this.#refillIntervalMs = 1e3 / newDrainRate;
267
+ this.#logRestoreLimits(requestId, newDrainRate, newBurstLimit);
268
+ this.#errorTimestamps = [];
269
+ this.#successTimestamps = [];
270
+ }
271
+ /**
272
+ * Writes an error to the temporary history
273
+ */
274
+ #recordError() {
275
+ const now = Date.now();
276
+ this.#errorTimestamps.push(now);
277
+ this.#successTimestamps = [];
278
+ this.#cleanupOldErrors(now);
279
+ }
280
+ /**
281
+ * Clears old errors (older than 60 seconds)
282
+ */
283
+ #cleanupOldErrors(now) {
284
+ const cutoff = now - 6e4;
285
+ this.#errorTimestamps = this.#errorTimestamps.filter((timestamp) => timestamp > cutoff);
286
+ }
287
+ /**
288
+ * Writes a successful request to the temporary history
289
+ */
290
+ #recordSuccess() {
291
+ const now = Date.now();
292
+ this.#successTimestamps.push(now);
293
+ this.#cleanupOldSuccesses();
294
+ this.#cleanupOldErrors(now);
295
+ }
296
+ /**
297
+ * Clears old progress
298
+ */
299
+ #cleanupOldSuccesses() {
300
+ this.#successTimestamps = this.#successTimestamps.slice(-1 * this.#successThreshold);
301
+ }
302
+ // region Log ////
303
+ #logReduceLimits(requestId, currentDrainRate, currentBurstLimit) {
304
+ const originalDrainRate = this.#originalConfig.drainRate;
305
+ const drainRateCondition = currentDrainRate < originalDrainRate;
306
+ const originalBurstLimit = this.#originalConfig.burstLimit;
307
+ const burstLimitCondition = currentBurstLimit < originalBurstLimit;
308
+ this.getLogger().warning(
309
+ `${this.getTitle()} is lowering limits due to frequent errors`,
310
+ {
311
+ requestId,
312
+ drainRate: {
313
+ current: currentDrainRate,
314
+ original: originalDrainRate,
315
+ condition: drainRateCondition,
316
+ formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`
317
+ },
318
+ burstLimit: {
319
+ current: currentBurstLimit,
320
+ original: originalBurstLimit,
321
+ condition: burstLimitCondition,
322
+ formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`
323
+ }
324
+ }
325
+ );
326
+ }
327
+ #logRestoreLimits(requestId, currentDrainRate, currentBurstLimit) {
328
+ const originalDrainRate = this.#originalConfig.drainRate;
329
+ const drainRateCondition = currentDrainRate < originalDrainRate;
330
+ const originalBurstLimit = this.#originalConfig.burstLimit;
331
+ const burstLimitCondition = currentBurstLimit < originalBurstLimit;
332
+ this.getLogger().warning(
333
+ `${this.getTitle()} increases limits during stable operation`,
334
+ {
335
+ requestId,
336
+ drainRate: {
337
+ current: currentDrainRate,
338
+ original: originalDrainRate,
339
+ condition: drainRateCondition,
340
+ formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`
341
+ },
342
+ burstLimit: {
343
+ current: currentBurstLimit,
344
+ original: originalBurstLimit,
345
+ condition: burstLimitCondition,
346
+ formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`
347
+ }
348
+ }
349
+ );
350
+ }
351
+ #logAcquireQueue(requestId, queueLength) {
352
+ this.getLogger().debug(`${this.getTitle()} request in queue`, {
353
+ requestId,
354
+ queueLength
355
+ });
356
+ }
357
+ #logStat(requestId) {
358
+ const successCount = this.#successTimestamps.length;
359
+ const successThreshold = this.#successThreshold;
360
+ const successCondition = successCount >= successThreshold;
361
+ const errorCount = this.#errorTimestamps.length;
362
+ const errorThreshold = this.#errorThreshold;
363
+ const failCondition = errorCount < errorThreshold / 2;
364
+ const currentDrainRate = this.#config.drainRate;
365
+ const originalDrainRate = this.#originalConfig.drainRate;
366
+ const drainRateCondition = currentDrainRate < originalDrainRate;
367
+ const currentBurstLimit = this.#config.burstLimit;
368
+ const originalBurstLimit = this.#originalConfig.burstLimit;
369
+ const burstLimitCondition = currentBurstLimit < originalBurstLimit;
370
+ this.getLogger().debug(`${this.getTitle()} state`, {
371
+ requestId,
372
+ success: {
373
+ count: successCount,
374
+ threshold: successThreshold,
375
+ condition: successCondition,
376
+ formatted: `(${successCount} >= ${successThreshold}) ${successCondition}`
377
+ },
378
+ fail: {
379
+ count: errorCount,
380
+ threshold: errorThreshold / 2,
381
+ condition: failCondition,
382
+ formatted: `(${errorCount} < ${errorThreshold / 2}) ${failCondition}`
383
+ },
384
+ drainRate: {
385
+ current: currentDrainRate,
386
+ original: originalDrainRate,
387
+ condition: drainRateCondition,
388
+ formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`
389
+ },
390
+ burstLimit: {
391
+ current: currentBurstLimit,
392
+ original: originalBurstLimit,
393
+ condition: burstLimitCondition,
394
+ formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`
395
+ }
396
+ });
397
+ }
398
+ // endregion ////
399
+ }
400
+
401
+ export { RateLimiter };
402
+ //# sourceMappingURL=rate-limiter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.mjs","sources":["../../../../../src/core/http/limiters/rate-limiter.ts"],"sourcesContent":["import type { ILimiter, RateLimitConfig } from '../../../types/limiters'\nimport type { LoggerInterface } from '../../../types/logger'\nimport { LoggerFactory } from '../../../logger'\n\n/**\n * Rate limiting (Leaky Bucket) with adaptive control\n */\nexport class RateLimiter implements ILimiter {\n #tokens: number\n #lastRefill: number\n #refillIntervalMs: number\n #config: RateLimitConfig\n #lockQueue: Array<() => void> = []\n\n #originalConfig: RateLimitConfig // Original configuration for recovery\n #errorThreshold: number = 5 // 60-second error threshold to reduce limits\n #successThreshold: number = 20 // Consecutive success threshold for restoring limits\n #minDrainRate: number = 0.5 // Minimum drain rate\n #minBurstLimit: number = 5 // Minimum burst limit\n #errorTimestamps: number[] = [] // Error timestamps (last 60 seconds)\n #successTimestamps: number[] = [] // Timestamps of successful requests\n\n private _logger: LoggerInterface\n\n constructor(config: RateLimitConfig) {\n this._logger = LoggerFactory.createNullLogger()\n this.#config = config\n this.#originalConfig = { ...config }\n this.#tokens = config.burstLimit\n this.#lastRefill = Date.now()\n this.#refillIntervalMs = 1000 / config.drainRate\n }\n\n getTitle(): string {\n return 'rateLimiter'\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 /**\n * @inheritDoc\n */\n async canProceed(requestId: string, _method: string, _params?: any): Promise<boolean> {\n await this.#acquireLock(requestId)\n try {\n const now = Date.now()\n const timePassed = now - this.#lastRefill\n\n // Refill tokens\n const refillAmount = timePassed * this.#config.drainRate / 1000\n this.#tokens = Math.min(\n this.#config.burstLimit,\n this.#tokens + refillAmount\n )\n this.#lastRefill = now\n\n return this.#tokens >= 1\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * @inheritDoc\n */\n async waitIfNeeded(requestId: string, _method: string, _params?: any): Promise<number> {\n await this.#acquireLock(requestId)\n\n try {\n const now = Date.now()\n const timePassed = now - this.#lastRefill\n\n // Replenishing tokens\n const refillAmount = timePassed * this.#config.drainRate / 1_000\n this.#tokens = Math.min(\n this.#config.burstLimit,\n this.#tokens + refillAmount\n )\n\n // We always update the time of the last replenishment\n this.#lastRefill = now\n\n // If there are enough tokens\n if (this.#tokens >= 1) {\n // Consume token\n this.#tokens -= 1\n return 0\n }\n\n // Calculating the waiting time for 1 token\n const deficit = 1 - this.#tokens\n return Math.ceil(deficit * this.#refillIntervalMs)\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * Error handler.\n * If there are a lot of errors, we'll lower the limits.\n */\n async handleExceeded(requestId: string): Promise<number> {\n await this.#acquireLock(requestId)\n\n try {\n this.#recordError()\n\n // Adaptive regulation: if there are many errors, we reduce the limits\n if (this.#config.adaptiveEnabled && this.#shouldReduceLimits()) {\n this.#reduceLimits(requestId)\n }\n\n this.#tokens = 0\n // Wait for the time to restore at least one token + 1sec\n return this.#refillIntervalMs + 1_000\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * Successful request handler.\n * If everything is OK, we'll restore the limits.\n */\n async updateStats(requestId: string, method: string, _data: any): Promise<void> {\n // skip accounting of `batch` subqueries\n if (method.startsWith('batch::')) {\n return\n }\n\n await this.#acquireLock(requestId)\n\n try {\n this.#recordSuccess()\n\n // Adaptive regulation: if we operate stably, we restore the limits\n if (this.#config.adaptiveEnabled) {\n this.#logStat(requestId)\n }\n\n if (this.#config.adaptiveEnabled && this.#shouldRestoreLimits()) {\n this.#restoreLimits(requestId)\n }\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * @inheritDoc\n */\n async reset(): Promise<void> {\n await this.#acquireLock('reset')\n\n try {\n this.#tokens = this.#config.burstLimit\n this.#lastRefill = Date.now()\n this.#errorTimestamps = []\n this.#successTimestamps = []\n\n // Restore original settings during reset\n this.#config.drainRate = this.#originalConfig.drainRate\n this.#config.burstLimit = this.#originalConfig.burstLimit\n this.#refillIntervalMs = 1000 / this.#config.drainRate\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * @inheritDoc\n */\n getStats() {\n return {\n tokens: this.#tokens,\n burstLimit: this.#config.burstLimit,\n originalBurstLimit: this.#originalConfig.burstLimit,\n drainRate: this.#config.drainRate,\n originalDrainRate: this.#originalConfig.drainRate,\n refillIntervalMs: this.#refillIntervalMs,\n lastRefill: this.#lastRefill,\n pendingRequests: this.#lockQueue.length,\n recentErrors: this.#errorTimestamps.length,\n recentSuccesses: this.#successTimestamps.length\n }\n }\n\n /**\n * @inheritDoc\n */\n async setConfig(config: RateLimitConfig): Promise<void> {\n await this.#acquireLock('setConfig')\n\n try {\n this.#config = config\n this.#originalConfig = { ...config }\n this.#refillIntervalMs = 1000 / this.#config.drainRate\n\n // If the new configuration increases burstLimit, we can increase the current number of tokens\n if (config.burstLimit > this.#tokens) {\n this.#tokens = Math.min(config.burstLimit, this.#tokens)\n }\n\n // Reset statistics when changing configuration\n this.#errorTimestamps = []\n this.#successTimestamps = []\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * Acquire a lock for the critical section\n * Uses a promise queue\n */\n async #acquireLock(requestId: string): Promise<void> {\n return new Promise<void>((resolve) => {\n // Add the resolution function to the queue\n const queueLength = this.#lockQueue.push(resolve)\n\n if (queueLength > 1) {\n this.#logAcquireQueue(requestId, queueLength)\n }\n // If it's the first one in the queue, we allow it immediately\n if (this.#lockQueue.length === 1) {\n resolve()\n }\n })\n }\n\n /**\n * Releases the lock and allows the next person in the queue to proceed\n */\n #releaseLock(): void {\n // Remove the current resolver from the front of the queue\n this.#lockQueue.shift()\n\n // If there are any waiting, resolve the next one\n if (this.#lockQueue.length > 0) {\n const nextResolve = this.#lockQueue[0]!\n nextResolve()\n }\n }\n\n /**\n * Checks whether the limits need to be reduced\n */\n #shouldReduceLimits(): boolean {\n // If there are more errors than the threshold in the last 60 seconds\n return this.#errorTimestamps.length >= this.#errorThreshold\n }\n\n /**\n * Checks whether limits need to be restored\n * Restore if:\n * 1. Many successful requests (more than the threshold)\n * 2. Few errors (less than half the threshold)\n * 3. Current limits are lower than the original ones\n */\n #shouldRestoreLimits(): boolean {\n return this.#successTimestamps.length >= this.#successThreshold\n && this.#errorTimestamps.length < (this.#errorThreshold / 2)\n && (\n this.#config.drainRate < this.#originalConfig.drainRate\n || this.#config.burstLimit < this.#originalConfig.burstLimit\n )\n }\n\n /**\n * Reduces limits for frequent errors\n */\n #reduceLimits(requestId: string): void {\n // Reduce drainRate by 20%, but not below the minimum\n const newDrainRate = Math.max(\n this.#minDrainRate,\n Number.parseFloat((this.#config.drainRate * 0.8).toFixed(2))\n )\n\n // Reduce burstLimit by 20%, but not below the minimum\n const newBurstLimit = Math.max(\n this.#minBurstLimit,\n Number.parseFloat((this.#config.burstLimit * 0.8).toFixed(2))\n )\n\n // Applying new limits\n this.#config.drainRate = newDrainRate\n this.#config.burstLimit = newBurstLimit\n this.#refillIntervalMs = 1000 / newDrainRate\n\n this.#logReduceLimits(requestId, newDrainRate, newBurstLimit)\n\n // Reset error statistics after reduction\n this.#errorTimestamps = []\n this.#successTimestamps = []\n }\n\n /**\n * Restores limits during stable operation\n */\n #restoreLimits(requestId: string): void {\n if (\n this.#config.drainRate === this.#originalConfig.drainRate\n && this.#config.burstLimit === this.#originalConfig.burstLimit\n ) {\n return\n }\n\n // Restore drainRate to 10% of its original value\n const newDrainRate = Math.min(\n this.#originalConfig.drainRate,\n Number.parseFloat((this.#config.drainRate * 1.1).toFixed(2))\n )\n\n // Restore burstLimit to 10% of its original value\n const newBurstLimit = Math.min(\n this.#originalConfig.burstLimit,\n Number.parseFloat((this.#config.burstLimit * 1.1).toFixed(2))\n )\n\n // Applying new limits\n this.#config.drainRate = newDrainRate\n this.#config.burstLimit = newBurstLimit\n this.#refillIntervalMs = 1000 / newDrainRate\n\n this.#logRestoreLimits(requestId, newDrainRate, newBurstLimit)\n\n // Reset success statistics after recovery\n this.#errorTimestamps = []\n this.#successTimestamps = []\n }\n\n /**\n * Writes an error to the temporary history\n */\n #recordError(): void {\n const now = Date.now()\n this.#errorTimestamps.push(now)\n\n // Clear ALL progress\n this.#successTimestamps = []\n this.#cleanupOldErrors(now)\n }\n\n /**\n * Clears old errors (older than 60 seconds)\n */\n #cleanupOldErrors(now: number): void {\n const cutoff = now - 60_000\n this.#errorTimestamps = this.#errorTimestamps.filter(timestamp => timestamp > cutoff)\n }\n\n /**\n * Writes a successful request to the temporary history\n */\n #recordSuccess(): void {\n const now = Date.now()\n this.#successTimestamps.push(now)\n\n this.#cleanupOldSuccesses()\n this.#cleanupOldErrors(now)\n }\n\n /**\n * Clears old progress\n */\n #cleanupOldSuccesses(): void {\n this.#successTimestamps = this.#successTimestamps.slice(-1 * this.#successThreshold)\n }\n\n // region Log ////\n #logReduceLimits(requestId: string, currentDrainRate: number, currentBurstLimit: number) {\n const originalDrainRate = this.#originalConfig.drainRate\n const drainRateCondition = currentDrainRate < originalDrainRate\n\n const originalBurstLimit = this.#originalConfig.burstLimit\n const burstLimitCondition = currentBurstLimit < originalBurstLimit\n\n this.getLogger().warning(\n `${this.getTitle()} is lowering limits due to frequent errors`, {\n requestId,\n drainRate: {\n current: currentDrainRate,\n original: originalDrainRate,\n condition: drainRateCondition,\n formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`\n },\n burstLimit: {\n current: currentBurstLimit,\n original: originalBurstLimit,\n condition: burstLimitCondition,\n formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`\n }\n }\n )\n }\n\n #logRestoreLimits(requestId: string, currentDrainRate: number, currentBurstLimit: number) {\n const originalDrainRate = this.#originalConfig.drainRate\n const drainRateCondition = currentDrainRate < originalDrainRate\n\n const originalBurstLimit = this.#originalConfig.burstLimit\n const burstLimitCondition = currentBurstLimit < originalBurstLimit\n\n this.getLogger().warning(\n `${this.getTitle()} increases limits during stable operation`, {\n requestId,\n drainRate: {\n current: currentDrainRate,\n original: originalDrainRate,\n condition: drainRateCondition,\n formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`\n },\n burstLimit: {\n current: currentBurstLimit,\n original: originalBurstLimit,\n condition: burstLimitCondition,\n formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`\n }\n }\n )\n }\n\n #logAcquireQueue(requestId: string, queueLength: number) {\n this.getLogger().debug(`${this.getTitle()} request in queue`, {\n requestId,\n queueLength\n })\n }\n\n #logStat(\n requestId: string\n ): void {\n const successCount = this.#successTimestamps.length\n const successThreshold = this.#successThreshold\n const successCondition = successCount >= successThreshold\n\n const errorCount = this.#errorTimestamps.length\n const errorThreshold = this.#errorThreshold\n const failCondition = errorCount < (errorThreshold / 2)\n\n const currentDrainRate = this.#config.drainRate\n const originalDrainRate = this.#originalConfig.drainRate\n const drainRateCondition = currentDrainRate < originalDrainRate\n\n const currentBurstLimit = this.#config.burstLimit\n const originalBurstLimit = this.#originalConfig.burstLimit\n const burstLimitCondition = currentBurstLimit < originalBurstLimit\n\n this.getLogger().debug(`${this.getTitle()} state`, {\n requestId,\n success: {\n count: successCount,\n threshold: successThreshold,\n condition: successCondition,\n formatted: `(${successCount} >= ${successThreshold}) ${successCondition}`\n },\n fail: {\n count: errorCount,\n threshold: errorThreshold / 2,\n condition: failCondition,\n formatted: `(${errorCount} < ${errorThreshold / 2}) ${failCondition}`\n },\n drainRate: {\n current: currentDrainRate,\n original: originalDrainRate,\n condition: drainRateCondition,\n formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`\n },\n burstLimit: {\n current: currentBurstLimit,\n original: originalBurstLimit,\n condition: burstLimitCondition,\n formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`\n }\n })\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
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 { AbstractHttp } from './abstract-http.mjs';
10
+ import { ApiVersion } from '../../types/b24.mjs';
11
+ import { InteractionBatchV2 } from '../interaction/batch/v2.mjs';
12
+ import { ProcessingAsArrayV2 } from '../interaction/batch/processing/v2/as-array.mjs';
13
+ import { ProcessingAsObjectV2 } from '../interaction/batch/processing/v2/as-object.mjs';
14
+ import { AjaxError } from './ajax-error.mjs';
15
+
16
+ var __defProp = Object.defineProperty;
17
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
18
+ class HttpV2 extends AbstractHttp {
19
+ static {
20
+ __name(this, "HttpV2");
21
+ }
22
+ constructor(authActions, options, restrictionParams) {
23
+ super(authActions, options, restrictionParams);
24
+ this._version = ApiVersion.v2;
25
+ }
26
+ // region batch ////
27
+ async batch(calls, options) {
28
+ const opts = {
29
+ isHaltOnError: true,
30
+ ...options
31
+ };
32
+ const requestId = opts.requestId ?? this._requestIdGenerator.getRequestId();
33
+ this._logBatchStart(requestId, calls, opts);
34
+ const interactionBatch = new InteractionBatchV2({
35
+ requestId,
36
+ parallelDefaultValue: !opts.isHaltOnError,
37
+ restrictionManager: this._restrictionManager
38
+ });
39
+ if (Array.isArray(calls)) {
40
+ interactionBatch.setProcessingStrategy(new ProcessingAsArrayV2());
41
+ } else {
42
+ interactionBatch.setProcessingStrategy(new ProcessingAsObjectV2());
43
+ }
44
+ interactionBatch.addCommands(calls);
45
+ if (interactionBatch.size > interactionBatch.maxSize) {
46
+ throw new AjaxError({
47
+ code: "JSSDK_BATCH_TOO_LARGE",
48
+ description: `Batch too large: ${interactionBatch.size} commands (max: ${interactionBatch.maxSize})`,
49
+ status: 400,
50
+ requestInfo: { method: "batch", params: { cmd: calls }, requestId },
51
+ originalError: null
52
+ });
53
+ }
54
+ if (interactionBatch.size === 0) {
55
+ throw new AjaxError({
56
+ code: "JSSDK_BATCH_EMPTY",
57
+ description: "Batch must contain at least one command",
58
+ status: 400,
59
+ requestInfo: { method: "batch", params: { cmd: calls }, requestId },
60
+ originalError: null
61
+ });
62
+ }
63
+ const responseBatch = await this.call(
64
+ "batch",
65
+ {
66
+ halt: opts.isHaltOnError ? 1 : 0,
67
+ cmd: interactionBatch.getCommandsForCall()
68
+ },
69
+ requestId
70
+ );
71
+ const response = await interactionBatch.prepareResponse(responseBatch);
72
+ this._logBatchCompletion(
73
+ requestId,
74
+ response.getData()?.result?.size ?? 0,
75
+ response.getErrorMessages().length
76
+ );
77
+ return response;
78
+ }
79
+ // endregion ////
80
+ // region Prepare ////
81
+ /**
82
+ * @inheritDoc
83
+ */
84
+ _prepareMethod(requestId, method, baseUrl) {
85
+ const methodUrl = `/${encodeURIComponent(method)}`;
86
+ if (method.includes("task.")) {
87
+ return `${baseUrl}${methodUrl}`;
88
+ }
89
+ const queryParams = new URLSearchParams({
90
+ [this._requestIdGenerator.getQueryStringParameterName()]: requestId,
91
+ [this._requestIdGenerator.getQueryStringSdkParameterName()]: "1.0.1",
92
+ [this._requestIdGenerator.getQueryStringSdkTypeParameterName()]: "b24-js-sdk"
93
+ });
94
+ return `${baseUrl}${methodUrl}?${queryParams.toString()}`;
95
+ }
96
+ // endregion ////
97
+ }
98
+
99
+ export { HttpV2 };
100
+ //# sourceMappingURL=v2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2.mjs","sources":["../../../../src/core/http/v2.ts"],"sourcesContent":["import type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal, ICallBatchOptions, ICallBatchResult,\n TypeHttp\n} from '../../types/http'\nimport type { AuthActions } from '../../types/auth'\nimport type { RestrictionParams } from '../../types/limiters'\nimport type { Result } from '../result'\nimport type { BatchPayload } from '../../types/payloads'\nimport { AbstractHttp } from './abstract-http'\nimport { ApiVersion } from '../../types/b24'\nimport { InteractionBatchV2 } from '../interaction/batch/v2'\nimport { ProcessingAsArrayV2 } from '../interaction/batch/processing/v2/as-array'\nimport { ProcessingAsObjectV2 } from '../interaction/batch/processing/v2/as-object'\nimport { AjaxError } from './ajax-error'\n\n/**\n * Class for working with RestApi v2 requests via http\n *\n * @link https://bitrix24.github.io/b24jssdk/\n *\n * @todo docs\n */\nexport class HttpV2 extends AbstractHttp implements TypeHttp {\n constructor(\n authActions: AuthActions,\n options?: null | object,\n restrictionParams?: Partial<RestrictionParams>\n ) {\n super(authActions, options, restrictionParams)\n this._version = ApiVersion.v2\n }\n\n // region batch ////\n public async batch<T = unknown>(\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal,\n options?: ICallBatchOptions\n ): Promise<Result<ICallBatchResult<T>>> {\n const opts = {\n isHaltOnError: true,\n ...options\n }\n\n const requestId = opts.requestId ?? this._requestIdGenerator.getRequestId()\n\n this._logBatchStart(requestId, calls, opts)\n\n const interactionBatch = new InteractionBatchV2({\n requestId,\n parallelDefaultValue: !(opts.isHaltOnError),\n restrictionManager: this._restrictionManager\n })\n\n if (Array.isArray(calls)) {\n interactionBatch.setProcessingStrategy(new ProcessingAsArrayV2())\n } else {\n interactionBatch.setProcessingStrategy(new ProcessingAsObjectV2())\n }\n\n interactionBatch.addCommands(calls)\n\n if (interactionBatch.size > interactionBatch.maxSize) {\n throw new AjaxError({\n code: 'JSSDK_BATCH_TOO_LARGE',\n description: `Batch too large: ${interactionBatch.size} commands (max: ${interactionBatch.maxSize})`,\n status: 400,\n requestInfo: { method: 'batch', params: { cmd: calls }, requestId },\n originalError: null\n })\n }\n\n if (interactionBatch.size === 0) {\n throw new AjaxError({\n code: 'JSSDK_BATCH_EMPTY',\n description: 'Batch must contain at least one command',\n status: 400,\n requestInfo: { method: 'batch', params: { cmd: calls }, requestId },\n originalError: null\n })\n }\n\n const responseBatch = await this.call<BatchPayload<T>>(\n 'batch',\n {\n halt: opts.isHaltOnError ? 1 : 0,\n cmd: interactionBatch.getCommandsForCall()\n },\n requestId\n )\n\n const response = await interactionBatch.prepareResponse<T>(responseBatch)\n\n // Log the results\n this._logBatchCompletion(\n requestId,\n response.getData()?.result?.size ?? 0,\n response.getErrorMessages().length\n )\n\n return response\n }\n // endregion ////\n\n // region Prepare ////\n /**\n * @inheritDoc\n */\n protected override _prepareMethod(requestId: string, method: string, baseUrl: string): string {\n const methodUrl = `/${encodeURIComponent(method)}`\n\n /**\n * @memo For task methods, skip telemetry\n * @see https://apidocs.bitrix24.com/settings/how-to-call-rest-api/data-encoding.html#order-of-parameters\n */\n if (method.includes('task.')) {\n return `${baseUrl}${methodUrl}`\n }\n\n const queryParams = new URLSearchParams({\n [this._requestIdGenerator.getQueryStringParameterName()]: requestId,\n [this._requestIdGenerator.getQueryStringSdkParameterName()]: '__SDK_VERSION__',\n [this._requestIdGenerator.getQueryStringSdkTypeParameterName()]: '__SDK_USER_AGENT__'\n })\n return `${baseUrl}${methodUrl}?${queryParams.toString()}`\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
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 { AbstractHttp } from './abstract-http.mjs';
10
+ import { ApiVersion } from '../../types/b24.mjs';
11
+ import { AjaxError } from './ajax-error.mjs';
12
+ import { InteractionBatchV3 } from '../interaction/batch/v3.mjs';
13
+ import { ProcessingAsArrayV3 } from '../interaction/batch/processing/v3/as-array.mjs';
14
+ import { ProcessingAsObjectV3 } from '../interaction/batch/processing/v3/as-object.mjs';
15
+
16
+ var __defProp = Object.defineProperty;
17
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
18
+ class HttpV3 extends AbstractHttp {
19
+ static {
20
+ __name(this, "HttpV3");
21
+ }
22
+ constructor(authActions, options, restrictionParams) {
23
+ super(authActions, options, restrictionParams);
24
+ this._version = ApiVersion.v3;
25
+ }
26
+ // region batch ////
27
+ async batch(calls, options) {
28
+ const opts = {
29
+ isHaltOnError: true,
30
+ ...options
31
+ };
32
+ const requestId = opts.requestId ?? this._requestIdGenerator.getRequestId();
33
+ this._logBatchStart(requestId, calls, opts);
34
+ const interactionBatch = new InteractionBatchV3({
35
+ requestId,
36
+ parallelDefaultValue: !opts.isHaltOnError,
37
+ restrictionManager: this._restrictionManager
38
+ });
39
+ if (Array.isArray(calls)) {
40
+ interactionBatch.setProcessingStrategy(new ProcessingAsArrayV3());
41
+ } else {
42
+ interactionBatch.setProcessingStrategy(new ProcessingAsObjectV3());
43
+ }
44
+ interactionBatch.addCommands(calls);
45
+ if (interactionBatch.size > interactionBatch.maxSize) {
46
+ throw new AjaxError({
47
+ code: "JSSDK_BATCH_TOO_LARGE",
48
+ description: `Batch too large: ${interactionBatch.size} commands (max: ${interactionBatch.maxSize})`,
49
+ status: 400,
50
+ requestInfo: { method: "batch", params: { cmd: calls }, requestId },
51
+ originalError: null
52
+ });
53
+ }
54
+ if (interactionBatch.size === 0) {
55
+ throw new AjaxError({
56
+ code: "JSSDK_BATCH_EMPTY",
57
+ description: "Batch must contain at least one command",
58
+ status: 400,
59
+ requestInfo: { method: "batch", params: { cmd: calls }, requestId },
60
+ originalError: null
61
+ });
62
+ }
63
+ const responseBatch = await this.call(
64
+ "batch",
65
+ interactionBatch.getCommandsForCall(),
66
+ requestId
67
+ );
68
+ const response = await interactionBatch.prepareResponse(responseBatch);
69
+ this._logBatchCompletion(
70
+ requestId,
71
+ response.getData()?.result?.size ?? 0,
72
+ response.getErrorMessages().length
73
+ );
74
+ return response;
75
+ }
76
+ // endregion ////
77
+ // region Prepare ////
78
+ /**
79
+ * @inheritDoc
80
+ */
81
+ _prepareMethod(requestId, method, baseUrl) {
82
+ const methodUrl = `/${encodeURIComponent(method)}`;
83
+ const queryParams = new URLSearchParams({
84
+ [this._requestIdGenerator.getQueryStringParameterName()]: requestId,
85
+ [this._requestIdGenerator.getQueryStringSdkParameterName()]: "1.0.1",
86
+ [this._requestIdGenerator.getQueryStringSdkTypeParameterName()]: "b24-js-sdk"
87
+ });
88
+ return `${baseUrl}${methodUrl}?${queryParams.toString()}`;
89
+ }
90
+ // endregion ////
91
+ }
92
+
93
+ export { HttpV3 };
94
+ //# sourceMappingURL=v3.mjs.map