@bitrix24/b24jssdk 0.5.1 → 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 -526
  143. package/dist/esm/index.d.ts +2757 -526
  144. package/dist/esm/index.mjs +70 -14118
  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 -26912
  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,563 @@
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 axios, { AxiosError } from 'axios';
10
+ import { RequestIdGenerator } from '../request-id-generator.mjs';
11
+ import { ParamsFactory } from './limiters/params-factory.mjs';
12
+ import { RestrictionManager } from './limiters/manager.mjs';
13
+ import { AjaxError } from './ajax-error.mjs';
14
+ import { AjaxResult } from './ajax-result.mjs';
15
+ import { Type } from '../../tools/type.mjs';
16
+ import { getEnvironment, Environment } from '../../tools/environment.mjs';
17
+ import { ApiVersion } from '../../types/b24.mjs';
18
+ import { LoggerFactory } from '../../logger/logger-factory.mjs';
19
+
20
+ var __defProp = Object.defineProperty;
21
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
22
+ class AbstractHttp {
23
+ static {
24
+ __name(this, "AbstractHttp");
25
+ }
26
+ _clientAxios;
27
+ _authActions;
28
+ _requestIdGenerator;
29
+ _restrictionManager;
30
+ _logger;
31
+ _isClientSideWarning = false;
32
+ _clientSideWarningMessage = "";
33
+ _version;
34
+ _metrics = {
35
+ totalRequests: 0,
36
+ successfulRequests: 0,
37
+ failedRequests: 0,
38
+ totalDuration: 0,
39
+ byMethod: /* @__PURE__ */ new Map(),
40
+ lastErrors: []
41
+ };
42
+ constructor(authActions, options, restrictionParams) {
43
+ this._version = ApiVersion.v2;
44
+ this._logger = LoggerFactory.createNullLogger();
45
+ const defaultHeaders = {};
46
+ if (this.isServerSide()) {
47
+ defaultHeaders["User-Agent"] = "b24-js-sdk/1.0.1";
48
+ }
49
+ this._authActions = authActions;
50
+ this._requestIdGenerator = new RequestIdGenerator();
51
+ this._clientAxios = axios.create({
52
+ headers: {
53
+ ...defaultHeaders,
54
+ ...options ? options.headers : {}
55
+ },
56
+ timeout: 3e4,
57
+ timeoutErrorMessage: "Request timeout exceeded",
58
+ ...options && { ...options, headers: void 0 }
59
+ });
60
+ const params = {
61
+ ...ParamsFactory.getDefault(),
62
+ ...restrictionParams
63
+ };
64
+ this._restrictionManager = new RestrictionManager(params);
65
+ }
66
+ get apiVersion() {
67
+ return this._version;
68
+ }
69
+ get ajaxClient() {
70
+ return this._clientAxios;
71
+ }
72
+ // region Logger ////
73
+ setLogger(logger) {
74
+ this._logger = logger;
75
+ this._restrictionManager.setLogger(this._logger);
76
+ }
77
+ getLogger() {
78
+ return this._logger;
79
+ }
80
+ // endregion ////
81
+ // region RestrictionManager ////
82
+ async setRestrictionManagerParams(params) {
83
+ await this._restrictionManager.setConfig(params);
84
+ }
85
+ getRestrictionManagerParams() {
86
+ return this._restrictionManager.getParams();
87
+ }
88
+ /**
89
+ * @inheritDoc
90
+ */
91
+ getStats() {
92
+ return {
93
+ ...this._restrictionManager.getStats(),
94
+ totalRequests: this._metrics.totalDuration,
95
+ successfulRequests: this._metrics.successfulRequests,
96
+ failedRequests: this._metrics.failedRequests,
97
+ totalDuration: this._metrics.totalDuration,
98
+ byMethod: this._metrics.byMethod,
99
+ lastErrors: this._metrics.lastErrors
100
+ };
101
+ }
102
+ /**
103
+ * @inheritDoc
104
+ */
105
+ async reset() {
106
+ this._metrics.totalDuration = 0;
107
+ this._metrics.successfulRequests = 0;
108
+ this._metrics.failedRequests = 0;
109
+ this._metrics.totalDuration = 0;
110
+ this._metrics.byMethod.clear();
111
+ this._metrics.lastErrors = [];
112
+ return this._restrictionManager.reset();
113
+ }
114
+ // endregion ////
115
+ // region Metrics ////
116
+ _updateMetrics(method, isSuccess, duration, error) {
117
+ this._metrics.totalRequests++;
118
+ if (isSuccess) {
119
+ this._metrics.successfulRequests++;
120
+ } else {
121
+ this._metrics.failedRequests++;
122
+ if (error instanceof AjaxError) {
123
+ this._metrics.lastErrors.push({
124
+ method,
125
+ error: error.message,
126
+ timestamp: Date.now()
127
+ });
128
+ if (this._metrics.lastErrors.length > 100) {
129
+ this._metrics.lastErrors = this._metrics.lastErrors.slice(-100);
130
+ }
131
+ }
132
+ }
133
+ if (!this._metrics.byMethod.has(method)) {
134
+ this._metrics.byMethod.set(method, { count: 0, totalDuration: 0 });
135
+ }
136
+ const methodMetrics = this._metrics.byMethod.get(method);
137
+ methodMetrics.count++;
138
+ methodMetrics.totalDuration += duration;
139
+ }
140
+ // endregion ////
141
+ _validateParams(requestId, method, params) {
142
+ try {
143
+ JSON.stringify(params);
144
+ } catch (error) {
145
+ throw new AjaxError({
146
+ code: "JSSDK_INVALID_PARAMS",
147
+ description: "Parameters contain circular references",
148
+ status: 400,
149
+ requestInfo: { method, params, requestId },
150
+ originalError: error
151
+ });
152
+ }
153
+ }
154
+ /**
155
+ * Calling the RestApi function
156
+ * @param method - REST API method name
157
+ * @param params - Parameters for the method.
158
+ * @param requestId - Request id
159
+ * @returns Promise with AjaxResult
160
+ */
161
+ async call(method, params, requestId) {
162
+ requestId = requestId ?? this._requestIdGenerator.getRequestId();
163
+ const maxRetries = this._restrictionManager.getParams().maxRetries;
164
+ this._validateParams(requestId, method, params);
165
+ this._logRequest(requestId, method, params);
166
+ let lastError = null;
167
+ const startTime = Date.now();
168
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
169
+ try {
170
+ this._logAttempt(requestId, method, attempt + 1, maxRetries);
171
+ await this._restrictionManager.applyOperatingLimits(requestId, method, params);
172
+ const result = await this._executeSingleCall(requestId, method, params);
173
+ const duration = Date.now() - startTime;
174
+ this._restrictionManager.resetErrors(method);
175
+ this._updateMetrics(method, true, duration);
176
+ this._logSuccessfulRequest(requestId, method, duration);
177
+ return result;
178
+ } catch (error) {
179
+ lastError = this._convertToAjaxError(requestId, error, method, params);
180
+ const duration = Date.now() - startTime;
181
+ this._restrictionManager.incrementError(method);
182
+ this._updateMetrics(method, false, duration, lastError);
183
+ this._logFailedRequest(requestId, method, attempt + 1, maxRetries, lastError);
184
+ if (attempt < maxRetries) {
185
+ const waitTime = await this._restrictionManager.handleError(requestId, method, params, lastError, attempt);
186
+ if (waitTime > 0) {
187
+ this._restrictionManager.incrementStats("limitHits");
188
+ this._logAttemptRetryWaiteDelay(requestId, method, waitTime, attempt + 1, maxRetries);
189
+ await this._restrictionManager.waiteDelay(waitTime);
190
+ this._restrictionManager.incrementStats("retries");
191
+ continue;
192
+ }
193
+ }
194
+ if (attempt + 1 === maxRetries) {
195
+ this._logAllAttemptsExhausted(requestId, method, attempt + 1, maxRetries);
196
+ }
197
+ if (this._restrictionManager.exceptionCodeForSoft.includes(lastError.code)) {
198
+ return this._createAjaxResultWithErrorFromResponse(lastError, requestId, method, params);
199
+ }
200
+ throw lastError;
201
+ }
202
+ }
203
+ throw new AjaxError({
204
+ code: "JSSDK_CALL_ALL_ATTEMPTS_EXHAUSTED",
205
+ description: "All attempts exhausted",
206
+ status: lastError?.status || 500,
207
+ requestInfo: { method, params, requestId },
208
+ originalError: lastError?.originalError || null
209
+ });
210
+ }
211
+ _convertToAjaxError(requestId, error, method, params) {
212
+ if (error instanceof AjaxError) {
213
+ return error;
214
+ }
215
+ if (error instanceof AxiosError) {
216
+ return this._convertAxiosErrorToAjaxError(requestId, error, method, params);
217
+ }
218
+ return this._convertUnknownErrorToAjaxError(requestId, error, method, params);
219
+ }
220
+ _convertAxiosErrorToAjaxError(requestId, axiosError, method, params) {
221
+ let errorCode = `${axiosError.code || "JSSDK_AXIOS_ERROR"}`;
222
+ let errorDescription = axiosError.message;
223
+ const status = axiosError.response?.status || 0;
224
+ if (errorCode === "ERR_NETWORK") {
225
+ return new AjaxError({
226
+ code: "NETWORK_ERROR",
227
+ description: "Network connection failed",
228
+ status: 0,
229
+ requestInfo: { method, params, requestId },
230
+ originalError: axiosError
231
+ });
232
+ }
233
+ if (errorCode === "ECONNABORTED" || axiosError.message.includes("timeout")) {
234
+ return new AjaxError({
235
+ code: "REQUEST_TIMEOUT",
236
+ description: "Request timeout exceeded",
237
+ status: 408,
238
+ requestInfo: { method, params, requestId },
239
+ originalError: axiosError
240
+ });
241
+ }
242
+ if (axiosError.response?.data && typeof axiosError.response.data === "object") {
243
+ const responseData = axiosError.response.data;
244
+ if (responseData.error && typeof responseData.error === "object" && "code" in responseData.error) {
245
+ errorCode = responseData.error.code;
246
+ errorDescription = responseData.error.message.trimEnd();
247
+ if (responseData.error.validation) {
248
+ if (errorDescription.length > 0) {
249
+ if (!errorDescription.endsWith(".")) {
250
+ errorDescription += `.`;
251
+ }
252
+ errorDescription += ` `;
253
+ }
254
+ responseData.error.validation.forEach((row) => {
255
+ errorDescription += `${row?.message || JSON.stringify(row)}`;
256
+ });
257
+ }
258
+ } else if (responseData.error && typeof responseData.error === "string") {
259
+ errorCode = responseData.error !== "0" ? responseData.error : errorCode;
260
+ errorDescription = responseData?.error_description ?? errorDescription;
261
+ }
262
+ }
263
+ return new AjaxError({
264
+ code: errorCode,
265
+ description: errorDescription,
266
+ status,
267
+ requestInfo: { method, params, requestId },
268
+ originalError: axiosError
269
+ });
270
+ }
271
+ _convertUnknownErrorToAjaxError(requestId, error, method, params) {
272
+ return new AjaxError({
273
+ code: "JSSDK_UNKNOWN_ERROR",
274
+ description: error instanceof Error ? error.message : String(error),
275
+ status: 0,
276
+ requestInfo: { method, params, requestId },
277
+ originalError: error
278
+ });
279
+ }
280
+ // region Execute Single Call ////
281
+ /**
282
+ * Performs a single call with
283
+ * - 401 error handling
284
+ * - rate limit check
285
+ * - updating operating statistics
286
+ */
287
+ async _executeSingleCall(requestId, method, params) {
288
+ this._checkClientSideWarning(requestId);
289
+ const authData = await this._ensureAuth(requestId);
290
+ const response = await this._makeRequestWithAuthRetry(requestId, method, params, authData);
291
+ return this._createAjaxResultFromResponse(response, requestId, method, params);
292
+ }
293
+ // Get/update authorization
294
+ async _ensureAuth(requestId) {
295
+ let authData = this._authActions.getAuthData();
296
+ if (authData === false) {
297
+ this._logRefreshingAuthToken(requestId);
298
+ authData = await this._authActions.refreshAuth();
299
+ }
300
+ return authData;
301
+ }
302
+ // Execute the request with 401 error handling
303
+ async _makeRequestWithAuthRetry(requestId, method, params, authData) {
304
+ try {
305
+ await this._restrictionManager.checkRateLimit(requestId, method);
306
+ return await this._makeAxiosRequest(requestId, method, params, authData);
307
+ } catch (error) {
308
+ if (error instanceof AxiosError) {
309
+ this.getLogger().info(
310
+ `post/catchError`,
311
+ {
312
+ requestId,
313
+ status: error.status,
314
+ responseData: JSON.stringify(error?.response?.data, null, 0)
315
+ }
316
+ );
317
+ }
318
+ if (this._isAuthError(error)) {
319
+ this._logAuthErrorDetected(requestId);
320
+ this._logRefreshingAuthToken(requestId);
321
+ const refreshedAuthData = await this._authActions.refreshAuth();
322
+ await this._restrictionManager.checkRateLimit(requestId, method);
323
+ return await this._makeAxiosRequest(requestId, method, params, refreshedAuthData);
324
+ }
325
+ throw error;
326
+ }
327
+ }
328
+ async _makeAxiosRequest(requestId, method, params, authData) {
329
+ const methodFormatted = this._prepareMethod(requestId, method, this.getBaseUrl());
330
+ const paramsFormatted = this._prepareParams(authData, params);
331
+ const paramsFormattedForLog = JSON.stringify(paramsFormatted, null, 0);
332
+ const maxLogLength = 300;
333
+ const sliceLogLength = 100;
334
+ this.getLogger().info(
335
+ `post/send`,
336
+ {
337
+ requestId,
338
+ method: methodFormatted,
339
+ params: paramsFormattedForLog.length > maxLogLength ? paramsFormattedForLog.slice(0, sliceLogLength) + "..." : paramsFormattedForLog
340
+ }
341
+ );
342
+ const response = await this._clientAxios.post(methodFormatted, paramsFormatted);
343
+ const resultFormattedForLog = JSON.stringify(response.data.result, null, 0);
344
+ this.getLogger().info(
345
+ `post/response`,
346
+ {
347
+ requestId,
348
+ // responseFull: JSON.stringify(response.data, null, 2),
349
+ result: resultFormattedForLog.length > maxLogLength ? resultFormattedForLog.slice(0, sliceLogLength) + "..." : resultFormattedForLog,
350
+ time: JSON.stringify(response.data.time, null, 0)
351
+ }
352
+ );
353
+ return {
354
+ status: response.status,
355
+ payload: response.data
356
+ };
357
+ }
358
+ _isAuthError(error) {
359
+ if (!(error instanceof AjaxError)) {
360
+ return false;
361
+ }
362
+ return error.status === 401 && ["expired_token", "invalid_token"].includes(error.code);
363
+ }
364
+ async _createAjaxResultFromResponse(response, requestId, method, params) {
365
+ const result = new AjaxResult({
366
+ answer: response.payload,
367
+ query: { method, params, requestId },
368
+ status: response.status
369
+ });
370
+ if (result.isSuccess) {
371
+ const time = result.getData()?.time;
372
+ await this._restrictionManager.updateStats(requestId, method, time);
373
+ }
374
+ return result;
375
+ }
376
+ /**
377
+ * This works in conjunction with the AbstractHttp._convertAxiosErrorToAjaxError function
378
+ */
379
+ _createAjaxResultWithErrorFromResponse(ajaxError, requestId, method, params) {
380
+ return new AjaxResult({
381
+ answer: {
382
+ error: {
383
+ code: ajaxError.code,
384
+ message: ajaxError.message
385
+ }
386
+ },
387
+ query: { method, params, requestId },
388
+ status: ajaxError.status
389
+ });
390
+ }
391
+ /**
392
+ * Processes function parameters and adds authorization
393
+ */
394
+ _prepareParams(authData, params) {
395
+ const result = { ...params };
396
+ if (authData.refresh_token !== "hook") {
397
+ result.auth = authData.access_token;
398
+ }
399
+ if (result?.data && "start" in result.data) {
400
+ const { start, ...dataWithoutStart } = result.data;
401
+ result.data = dataWithoutStart;
402
+ }
403
+ return result;
404
+ }
405
+ /**
406
+ * @inheritDoc
407
+ */
408
+ setClientSideWarning(value, message) {
409
+ this._isClientSideWarning = value;
410
+ this._clientSideWarningMessage = message;
411
+ }
412
+ // endregion ////
413
+ // region Tools ////
414
+ /**
415
+ * Tests whether the code is executed on the client side
416
+ * @return {boolean}
417
+ * @protected
418
+ */
419
+ isServerSide() {
420
+ return getEnvironment() !== Environment.BROWSE;
421
+ }
422
+ /**
423
+ * Get the BX24 account address with the path based on the API version
424
+ */
425
+ getBaseUrl() {
426
+ return this._authActions.getTargetOriginWithPath().get(this._version);
427
+ }
428
+ // endregion ////
429
+ // region Log ////
430
+ _sanitizeParams(params) {
431
+ const sanitized = { ...params };
432
+ const sensitiveKeys = ["auth", "password", "token", "secret", "access_token", "refresh_token"];
433
+ sensitiveKeys.forEach((key) => {
434
+ if (key in sanitized && sanitized[key]) {
435
+ sanitized[key] = "***REDACTED***";
436
+ }
437
+ });
438
+ return sanitized;
439
+ }
440
+ _logRequest(requestId, method, params) {
441
+ this.getLogger().debug(`http request starting`, {
442
+ requestId,
443
+ method,
444
+ params: this._sanitizeParams(params),
445
+ api: this.apiVersion,
446
+ timestamp: Date.now()
447
+ });
448
+ }
449
+ _logAttempt(requestId, method, attempt, maxRetries) {
450
+ this.getLogger().info(`http request attempt`, {
451
+ requestId,
452
+ method,
453
+ api: this.apiVersion,
454
+ attempt: {
455
+ current: attempt,
456
+ max: maxRetries
457
+ }
458
+ });
459
+ }
460
+ _logRefreshingAuthToken(requestId) {
461
+ this.getLogger().info(`http refreshing auth token`, {
462
+ requestId,
463
+ api: this.apiVersion
464
+ });
465
+ }
466
+ _logAuthErrorDetected(requestId) {
467
+ this.getLogger().info(`http auth error detected`, {
468
+ requestId,
469
+ api: this.apiVersion
470
+ });
471
+ }
472
+ _logSuccessfulRequest(requestId, method, duration) {
473
+ this.getLogger().debug(`http request successful`, {
474
+ requestId,
475
+ method,
476
+ api: this.apiVersion,
477
+ duration: {
478
+ ms: duration,
479
+ sec: Number.parseFloat((duration / 1e3).toFixed(2))
480
+ }
481
+ });
482
+ }
483
+ _logFailedRequest(requestId, method, attempt, maxRetries, error) {
484
+ this.getLogger().debug(`http request failed`, {
485
+ requestId,
486
+ method,
487
+ api: this.apiVersion,
488
+ attempt: {
489
+ current: attempt,
490
+ max: maxRetries
491
+ },
492
+ error: {
493
+ code: error.code,
494
+ message: error.message,
495
+ status: error.status
496
+ }
497
+ });
498
+ }
499
+ _logAttemptRetryWaiteDelay(requestId, method, wait, attempt, maxRetries) {
500
+ this.getLogger().debug(
501
+ `http wait ${(wait / 1e3).toFixed(2)} sec.`,
502
+ {
503
+ requestId,
504
+ method,
505
+ api: this.apiVersion,
506
+ wait,
507
+ attempt: {
508
+ current: attempt,
509
+ max: maxRetries
510
+ }
511
+ }
512
+ );
513
+ }
514
+ _logAllAttemptsExhausted(requestId, method, attempt, maxRetries) {
515
+ this.getLogger().warning(`http all retry attempts exhausted`, {
516
+ requestId,
517
+ method,
518
+ api: this.apiVersion,
519
+ attempt: {
520
+ current: attempt,
521
+ max: maxRetries
522
+ }
523
+ });
524
+ }
525
+ _logBatchStart(requestId, calls, options) {
526
+ const callCount = Array.isArray(calls) ? calls.length : Object.keys(calls).length;
527
+ this.getLogger().debug(`http batch request starting `, {
528
+ requestId,
529
+ callCount,
530
+ api: this.apiVersion,
531
+ isHaltOnError: options.isHaltOnError,
532
+ timestamp: Date.now()
533
+ });
534
+ }
535
+ _logBatchCompletion(requestId, total, errors) {
536
+ this.getLogger().debug(`http batch request completed`, {
537
+ requestId,
538
+ api: this.apiVersion,
539
+ totalCalls: total,
540
+ successful: total - errors,
541
+ failed: errors,
542
+ successRate: total > 0 ? ((total - errors) / total * 100).toFixed(1) + "%" : "??"
543
+ });
544
+ }
545
+ // Check client-side warnings
546
+ _checkClientSideWarning(requestId) {
547
+ if (this._isClientSideWarning && !this.isServerSide() && Type.isStringFilled(this._clientSideWarningMessage)) {
548
+ LoggerFactory.forcedLog(
549
+ this.getLogger(),
550
+ "warning",
551
+ this._clientSideWarningMessage,
552
+ {
553
+ requestId,
554
+ code: "JSSDK_CLIENT_SIDE_WARNING"
555
+ }
556
+ );
557
+ }
558
+ }
559
+ // endregion ////
560
+ }
561
+
562
+ export { AbstractHttp };
563
+ //# sourceMappingURL=abstract-http.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract-http.mjs","sources":["../../../../src/core/http/abstract-http.ts"],"sourcesContent":["import type { LoggerInterface } from '../../logger'\nimport type {\n TypeCallParams,\n TypeHttp,\n ICallBatchOptions,\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal,\n ICallBatchResult\n} from '../../types/http'\nimport type { RestrictionManagerStats, RestrictionParams } from '../../types/limiters'\nimport type { AuthActions, AuthData, TypeDescriptionError, TypeDescriptionErrorV3 } from '../../types/auth'\nimport type { AxiosInstance } from 'axios'\nimport type { Result } from '../result'\nimport type { SuccessPayload } from '../../types/payloads'\nimport axios, { AxiosError } from 'axios'\nimport { LoggerFactory } from '../../logger'\nimport { RequestIdGenerator } from '../request-id-generator'\nimport { ParamsFactory } from './limiters/params-factory'\nimport { RestrictionManager } from './limiters/manager'\nimport { AjaxError } from './ajax-error'\nimport { AjaxResult } from './ajax-result'\nimport { Type } from '../../tools/type'\nimport { Environment, getEnvironment } from '../../tools/environment'\nimport { ApiVersion } from '../../types/b24'\n\nexport type AjaxResponse<T = unknown> = {\n status: number\n payload: SuccessPayload<T>\n}\n\nexport type TypePrepareParams = TypeCallParams & {\n data?: Record<string, any>\n auth?: string\n}\n\n/**\n * Abstract Class for working with RestApi requests via http\n *\n * @link https://bitrix24.github.io/b24jssdk/\n *\n * @todo docs\n */\nexport abstract class AbstractHttp implements TypeHttp {\n protected _clientAxios: AxiosInstance\n protected _authActions: AuthActions\n protected _requestIdGenerator: RequestIdGenerator\n protected _restrictionManager: RestrictionManager\n\n protected _logger: LoggerInterface\n\n protected _isClientSideWarning: boolean = false\n protected _clientSideWarningMessage: string = ''\n\n protected _version: ApiVersion\n\n protected _metrics = {\n totalRequests: 0,\n successfulRequests: 0,\n failedRequests: 0,\n totalDuration: 0,\n byMethod: new Map<string, { count: number, totalDuration: number }>(),\n lastErrors: [] as Array<{ method: string, error: string, timestamp: number }>\n }\n\n constructor(\n authActions: AuthActions,\n options?: null | object,\n restrictionParams?: Partial<RestrictionParams>\n ) {\n this._version = ApiVersion.v2\n\n this._logger = LoggerFactory.createNullLogger()\n\n const defaultHeaders: Record<string, string> = {}\n\n if (this.isServerSide()) {\n defaultHeaders['User-Agent'] = '__SDK_USER_AGENT__/__SDK_VERSION__'\n }\n\n this._authActions = authActions\n this._requestIdGenerator = new RequestIdGenerator()\n\n this._clientAxios = axios.create({\n headers: {\n ...defaultHeaders,\n ...(options ? (options as any).headers : {})\n },\n timeout: 30_000,\n timeoutErrorMessage: 'Request timeout exceeded',\n ...(options && { ...options, headers: undefined })\n })\n\n /**\n * Basic parameters of restrictions\n */\n const params: RestrictionParams = {\n ...ParamsFactory.getDefault(),\n ...restrictionParams\n }\n\n this._restrictionManager = new RestrictionManager(params)\n }\n\n get apiVersion(): ApiVersion {\n return this._version\n }\n\n get ajaxClient(): AxiosInstance {\n return this._clientAxios\n }\n\n // region Logger ////\n public setLogger(logger: LoggerInterface): void {\n this._logger = logger\n this._restrictionManager.setLogger(this._logger)\n }\n\n public getLogger(): LoggerInterface {\n return this._logger\n }\n // endregion ////\n\n // region RestrictionManager ////\n public async setRestrictionManagerParams(params: RestrictionParams): Promise<void> {\n await this._restrictionManager.setConfig(params)\n }\n\n public getRestrictionManagerParams(): RestrictionParams {\n return this._restrictionManager.getParams()\n }\n\n /**\n * @inheritDoc\n */\n public getStats(): RestrictionManagerStats & {\n adaptiveDelayAvg: number\n errorCounts: Record<string, number>\n totalRequests: number\n successfulRequests: number\n failedRequests: number\n totalDuration: number\n byMethod: Map<string, { count: number, totalDuration: number }>\n lastErrors: { method: string, error: string, timestamp: number }[]\n } {\n return {\n ...this._restrictionManager.getStats(),\n totalRequests: this._metrics.totalDuration,\n successfulRequests: this._metrics.successfulRequests,\n failedRequests: this._metrics.failedRequests,\n totalDuration: this._metrics.totalDuration,\n byMethod: this._metrics.byMethod,\n lastErrors: this._metrics.lastErrors\n }\n }\n\n /**\n * @inheritDoc\n */\n public async reset(): Promise<void> {\n this._metrics.totalDuration = 0\n this._metrics.successfulRequests = 0\n this._metrics.failedRequests = 0\n this._metrics.totalDuration = 0\n this._metrics.byMethod.clear()\n this._metrics.lastErrors = []\n\n return this._restrictionManager.reset()\n }\n // endregion ////\n\n // region Metrics ////\n protected _updateMetrics(\n method: string,\n isSuccess: boolean,\n duration: number,\n error?: unknown\n ): void {\n this._metrics.totalRequests++\n\n if (isSuccess) {\n this._metrics.successfulRequests++\n } else {\n this._metrics.failedRequests++\n\n if (error instanceof AjaxError) {\n this._metrics.lastErrors.push({\n method,\n error: error.message,\n timestamp: Date.now()\n })\n\n if (this._metrics.lastErrors.length > 100) {\n this._metrics.lastErrors = this._metrics.lastErrors.slice(-100)\n }\n }\n }\n\n // Metrics by Method\n if (!this._metrics.byMethod.has(method)) {\n this._metrics.byMethod.set(method, { count: 0, totalDuration: 0 })\n }\n\n const methodMetrics = this._metrics.byMethod.get(method)!\n methodMetrics.count++\n methodMetrics.totalDuration += duration\n }\n // endregion ////\n\n // region Actions Call ////\n // region batch ////\n public abstract batch<T = unknown>(\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal,\n options?: ICallBatchOptions\n ): Promise<Result<ICallBatchResult<T>>>\n // endregion ////\n\n protected _validateParams(requestId: string, method: string, params: TypeCallParams): void {\n // Checking for cyclic references (especially important when logging)\n try {\n JSON.stringify(params)\n } catch (error) {\n throw new AjaxError({\n code: 'JSSDK_INVALID_PARAMS',\n description: 'Parameters contain circular references',\n status: 400,\n requestInfo: { method, params, requestId },\n originalError: error\n })\n }\n\n // Size check (It is especially important for batch)\n // const paramsSize = JSON.stringify(params).length\n // if (paramsSize > 1024 * 1024) { // 1MB\n // throw new AjaxError({\n // code: 'JSSDK_PARAMS_TOO_LARGE',\n // description: `Parameters too large: ${(paramsSize / 1024 / 1024).toFixed(2)}MB`,\n // status: 400,\n // requestInfo: { method, params, requestId },\n // originalError: null\n // })\n // }\n }\n\n /**\n * Calling the RestApi function\n * @param method - REST API method name\n * @param params - Parameters for the method.\n * @param requestId - Request id\n * @returns Promise with AjaxResult\n */\n public async call<T = unknown>(method: string, params: TypeCallParams, requestId?: string): Promise<AjaxResult<T>> {\n requestId = requestId ?? this._requestIdGenerator.getRequestId()\n const maxRetries = this._restrictionManager.getParams().maxRetries!\n\n this._validateParams(requestId, method, params)\n this._logRequest(requestId, method, params)\n\n let lastError: AjaxError | null = null\n const startTime = Date.now()\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n this._logAttempt(requestId, method, attempt + 1, maxRetries)\n\n // Apply operating limits via the manager\n await this._restrictionManager.applyOperatingLimits(requestId, method, params)\n\n // 3. We execute the request taking into account authorization, rate limit, and update operating statistics.\n const result = await this._executeSingleCall<T>(requestId, method, params)\n const duration = Date.now() - startTime\n\n // 6. Updating statistics\n this._restrictionManager.resetErrors(method)\n this._updateMetrics(method, true, duration)\n\n // Log the results\n this._logSuccessfulRequest(requestId, method, duration)\n return result\n } catch (error: unknown) {\n lastError = this._convertToAjaxError(requestId, error, method, params)\n\n const duration = Date.now() - startTime\n\n this._restrictionManager.incrementError(method)\n this._updateMetrics(method, false, duration, lastError)\n\n // Log the results\n this._logFailedRequest(requestId, method, attempt + 1, maxRetries, lastError)\n\n if (attempt < maxRetries) {\n const waitTime = await this._restrictionManager.handleError(requestId, method, params, lastError, attempt)\n // We don't repeat if waitTime === 0\n if (waitTime > 0) {\n this._restrictionManager.incrementStats('limitHits')\n\n this._logAttemptRetryWaiteDelay(requestId, method, waitTime, attempt + 1, maxRetries)\n await this._restrictionManager.waiteDelay(waitTime)\n\n this._restrictionManager.incrementStats('retries')\n\n continue\n }\n }\n\n if (attempt + 1 === maxRetries) {\n this._logAllAttemptsExhausted(requestId, method, attempt + 1, maxRetries)\n }\n\n /**\n * We decide whether to throw an error in `AjaxResult` or throw an exception.\n */\n if (this._restrictionManager.exceptionCodeForSoft.includes(lastError.code)) {\n return this._createAjaxResultWithErrorFromResponse<T>(lastError, requestId, method, params)\n }\n throw lastError\n }\n }\n\n throw new AjaxError({\n code: 'JSSDK_CALL_ALL_ATTEMPTS_EXHAUSTED',\n description: 'All attempts exhausted',\n status: lastError?.status || 500,\n requestInfo: { method, params, requestId },\n originalError: lastError?.originalError || null\n })\n }\n\n protected _convertToAjaxError(requestId: string, error: unknown, method: string, params: TypeCallParams): AjaxError {\n if (error instanceof AjaxError) {\n return error\n }\n\n if (error instanceof AxiosError) {\n return this._convertAxiosErrorToAjaxError(requestId, error, method, params)\n }\n\n return this._convertUnknownErrorToAjaxError(requestId, error, method, params)\n }\n\n protected _convertAxiosErrorToAjaxError(requestId: string, axiosError: AxiosError, method: string, params: TypeCallParams): AjaxError {\n let errorCode = `${axiosError.code || 'JSSDK_AXIOS_ERROR'}`\n let errorDescription = axiosError.message\n const status = axiosError.response?.status || 0\n\n // Handling network errors\n if (errorCode === 'ERR_NETWORK') {\n return new AjaxError({\n code: 'NETWORK_ERROR',\n description: 'Network connection failed',\n status: 0,\n requestInfo: { method, params, requestId },\n originalError: axiosError\n })\n }\n\n // Handling timeout\n if (errorCode === 'ECONNABORTED' || axiosError.message.includes('timeout')) {\n return new AjaxError({\n code: 'REQUEST_TIMEOUT',\n description: 'Request timeout exceeded',\n status: 408,\n requestInfo: { method, params, requestId },\n originalError: axiosError\n })\n }\n\n /**\n * @todo make single function\n * @see AjaxResult.#processErrors()\n */\n if (axiosError.response?.data && typeof axiosError.response.data === 'object') {\n const responseData = axiosError.response.data as TypeDescriptionError | TypeDescriptionErrorV3\n if (\n responseData.error\n && typeof responseData.error === 'object'\n && 'code' in responseData.error\n ) {\n errorCode = responseData.error.code\n 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 } else if (responseData.error && typeof responseData.error === 'string') {\n errorCode = responseData.error !== '0' ? responseData.error : errorCode\n errorDescription = (responseData as TypeDescriptionError)?.error_description ?? errorDescription\n }\n }\n\n return new AjaxError({\n code: errorCode,\n description: errorDescription,\n status,\n requestInfo: { method, params, requestId },\n originalError: axiosError\n })\n }\n\n protected _convertUnknownErrorToAjaxError(requestId: string, error: unknown, method: string, params: TypeCallParams): AjaxError {\n return new AjaxError({\n code: 'JSSDK_UNKNOWN_ERROR',\n description: error instanceof Error ? error.message : String(error),\n status: 0,\n requestInfo: { method, params, requestId },\n originalError: error\n })\n }\n\n // region Execute Single Call ////\n /**\n * Performs a single call with\n * - 401 error handling\n * - rate limit check\n * - updating operating statistics\n */\n protected async _executeSingleCall<T = unknown>(requestId: string, method: string, params: TypeCallParams): Promise<AjaxResult<T>> {\n this._checkClientSideWarning(requestId)\n const authData = await this._ensureAuth(requestId)\n const response = await this._makeRequestWithAuthRetry<T>(requestId, method, params, authData)\n\n return this._createAjaxResultFromResponse<T>(response, requestId, method, params)\n }\n\n // Get/update authorization\n protected async _ensureAuth(requestId: string): Promise<AuthData> {\n let authData = this._authActions.getAuthData()\n if (authData === false) {\n this._logRefreshingAuthToken(requestId)\n authData = await this._authActions.refreshAuth()\n }\n return authData\n }\n\n // Execute the request with 401 error handling\n protected async _makeRequestWithAuthRetry<T>(requestId: string, method: string, params: TypeCallParams, authData: AuthData): Promise<AjaxResponse<T>> {\n try {\n // 4. Apply the rate limit through the manager\n await this._restrictionManager.checkRateLimit(requestId, method)\n\n return await this._makeAxiosRequest<T>(requestId, method, params, authData)\n } catch (error) {\n if (error instanceof AxiosError) {\n this.getLogger().info(\n `post/catchError`, {\n requestId,\n status: error.status,\n responseData: JSON.stringify(error?.response?.data, null, 0)\n }\n )\n }\n\n // If this is an authorization error (401), then we try to update the token and repeat\n if (this._isAuthError(error)) {\n this._logAuthErrorDetected(requestId)\n this._logRefreshingAuthToken(requestId)\n\n const refreshedAuthData = await this._authActions.refreshAuth()\n\n // 4. Apply the rate limit through the manager\n await this._restrictionManager.checkRateLimit(requestId, method)\n\n return await this._makeAxiosRequest<T>(requestId, method, params, refreshedAuthData)\n }\n\n throw error\n }\n }\n\n protected async _makeAxiosRequest<T>(requestId: string, method: string, params: TypeCallParams, authData: AuthData): Promise<AjaxResponse<T>> {\n const methodFormatted = this._prepareMethod(requestId, method, this.getBaseUrl())\n\n const paramsFormatted = this._prepareParams(authData, params)\n const paramsFormattedForLog = JSON.stringify(paramsFormatted, null, 0)\n\n const maxLogLength = 300\n const sliceLogLength = 100\n this.getLogger().info(\n `post/send`, {\n requestId,\n method: methodFormatted,\n params: paramsFormattedForLog.length > maxLogLength ? paramsFormattedForLog.slice(0, sliceLogLength) + '...' : paramsFormattedForLog\n }\n )\n\n const response = await this._clientAxios.post<SuccessPayload<T>>(methodFormatted, paramsFormatted)\n\n const resultFormattedForLog = JSON.stringify(response.data.result, null, 0)\n this.getLogger().info(\n `post/response`, {\n requestId,\n // responseFull: JSON.stringify(response.data, null, 2),\n result: resultFormattedForLog.length > maxLogLength ? resultFormattedForLog.slice(0, sliceLogLength) + '...' : resultFormattedForLog,\n time: JSON.stringify(response.data.time, null, 0)\n }\n )\n\n return {\n status: response.status,\n payload: response.data\n }\n }\n\n protected _isAuthError(error: unknown): boolean {\n if (!(error instanceof AjaxError)) {\n return false\n }\n\n // @todo ! test this\n return (\n error.status === 401\n && ['expired_token', 'invalid_token'].includes(error.code)\n )\n }\n\n protected async _createAjaxResultFromResponse<T>(response: AjaxResponse<T>, requestId: string, method: string, params: TypeCallParams): Promise<AjaxResult<T>> {\n const result = new AjaxResult<T>({\n answer: response.payload,\n query: { method, params, requestId },\n status: response.status\n })\n\n // 5. Update operating statistics\n if (result.isSuccess) {\n const time = result.getData()?.time\n await this._restrictionManager.updateStats(requestId, method, time!)\n }\n\n return result\n }\n\n /**\n * This works in conjunction with the AbstractHttp._convertAxiosErrorToAjaxError function\n */\n protected _createAjaxResultWithErrorFromResponse<T>(ajaxError: AjaxError, requestId: string, method: string, params: TypeCallParams): AjaxResult<T> {\n return new AjaxResult<T>({\n answer: {\n error: {\n code: ajaxError.code,\n message: ajaxError.message\n }\n },\n query: { method, params, requestId },\n status: ajaxError.status\n })\n //\n // result.addError(ajaxError)\n //\n // return result\n }\n // endregion ////\n // endregion ////\n\n // region Prepare ////\n /**\n * Makes the function name safe and adds JSON format\n */\n protected abstract _prepareMethod(requestId: string, method: string, baseUrl: string): string\n\n /**\n * Processes function parameters and adds authorization\n */\n protected _prepareParams(authData: AuthData, params: TypeCallParams): TypePrepareParams {\n const result: TypePrepareParams = { ...params }\n\n /** @memo we skip auth for hook */\n if (authData.refresh_token !== 'hook') {\n result.auth = authData.access_token\n }\n\n if (result?.data && 'start' in result.data) {\n const { start, ...dataWithoutStart } = result.data\n result.data = dataWithoutStart\n }\n\n return result\n }\n\n /**\n * @inheritDoc\n */\n public setClientSideWarning(\n value: boolean,\n message: string\n ): void {\n this._isClientSideWarning = value\n this._clientSideWarningMessage = message\n }\n // endregion ////\n\n // region Tools ////\n /**\n * Tests whether the code is executed on the client side\n * @return {boolean}\n * @protected\n */\n protected isServerSide(): boolean {\n return (getEnvironment() !== Environment.BROWSE)\n }\n\n /**\n * Get the BX24 account address with the path based on the API version\n */\n public getBaseUrl(): string {\n return this._authActions.getTargetOriginWithPath().get(this._version)!\n }\n // endregion ////\n\n // region Log ////\n protected _sanitizeParams(params: TypeCallParams): Record<string, unknown> {\n const sanitized = { ...params }\n const sensitiveKeys = ['auth', 'password', 'token', 'secret', 'access_token', 'refresh_token']\n\n sensitiveKeys.forEach((key) => {\n if (key in sanitized && sanitized[key]) {\n sanitized[key] = '***REDACTED***'\n }\n })\n\n return sanitized\n }\n\n protected _logRequest(requestId: string, method: string, params: TypeCallParams): void {\n this.getLogger().debug(`http request starting`, {\n requestId,\n method,\n params: this._sanitizeParams(params),\n api: this.apiVersion,\n timestamp: Date.now()\n })\n }\n\n protected _logAttempt(requestId: string, method: string, attempt: number, maxRetries: number): void {\n this.getLogger().info(`http request attempt`, {\n requestId,\n method,\n api: this.apiVersion,\n attempt: {\n current: attempt,\n max: maxRetries\n }\n })\n }\n\n protected _logRefreshingAuthToken(requestId: string): void {\n this.getLogger().info(`http refreshing auth token`, {\n requestId,\n api: this.apiVersion\n })\n }\n\n protected _logAuthErrorDetected(requestId: string): void {\n this.getLogger().info(`http auth error detected`, {\n requestId,\n api: this.apiVersion\n })\n }\n\n protected _logSuccessfulRequest(requestId: string, method: string, duration: number): void {\n this.getLogger().debug(`http request successful`, {\n requestId,\n method,\n api: this.apiVersion,\n duration: {\n ms: duration,\n sec: Number.parseFloat((duration / 1000).toFixed(2))\n }\n })\n }\n\n protected _logFailedRequest(\n requestId: string,\n method: string,\n attempt: number,\n maxRetries: number,\n error: AjaxError\n ): void {\n this.getLogger().debug(`http request failed`, {\n requestId,\n method,\n api: this.apiVersion,\n attempt: {\n current: attempt,\n max: maxRetries\n },\n error: {\n code: error.code,\n message: error.message,\n status: error.status\n }\n })\n }\n\n protected _logAttemptRetryWaiteDelay(\n requestId: string,\n method: string,\n wait: number,\n attempt: number,\n maxRetries: number\n ): void {\n this.getLogger().debug(\n `http wait ${(wait / 1000).toFixed(2)} sec.`,\n {\n requestId,\n method,\n api: this.apiVersion,\n wait: wait,\n attempt: {\n current: attempt,\n max: maxRetries\n }\n }\n )\n }\n\n protected _logAllAttemptsExhausted(requestId: string, method: string, attempt: number, maxRetries: number): void {\n this.getLogger().warning(`http all retry attempts exhausted`, {\n requestId,\n method,\n api: this.apiVersion,\n attempt: {\n current: attempt,\n max: maxRetries\n }\n })\n }\n\n protected _logBatchStart(\n requestId: string,\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal,\n options: ICallBatchOptions\n ): void {\n const callCount = Array.isArray(calls)\n ? calls.length\n : Object.keys(calls).length\n\n this.getLogger().debug(`http batch request starting `, {\n requestId,\n callCount,\n api: this.apiVersion,\n isHaltOnError: options.isHaltOnError,\n timestamp: Date.now()\n })\n }\n\n protected _logBatchCompletion(requestId: string, total: number, errors: number): void {\n this.getLogger().debug(`http batch request completed`, {\n requestId,\n api: this.apiVersion,\n totalCalls: total,\n successful: total - errors,\n failed: errors,\n successRate: total > 0 ? ((total - errors) / (total) * 100).toFixed(1) + '%' : '??'\n })\n }\n\n // Check client-side warnings\n protected _checkClientSideWarning(requestId: string): void {\n if (\n this._isClientSideWarning\n && !this.isServerSide()\n && Type.isStringFilled(this._clientSideWarningMessage)\n ) {\n LoggerFactory.forcedLog(\n this.getLogger(),\n 'warning',\n this._clientSideWarningMessage,\n {\n requestId,\n code: 'JSSDK_CLIENT_SIDE_WARNING'\n }\n )\n }\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}