@bitrix24/b24jssdk 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README-AI.md +12 -0
- package/dist/esm/_virtual/_commonjsHelpers.mjs +1 -1
- package/dist/esm/_virtual/protobuf.mjs +1 -1
- package/dist/esm/_virtual/protobuf2.mjs +1 -1
- package/dist/esm/core/abstract-b24.mjs +1 -1
- package/dist/esm/core/actions/abstract-action.mjs +1 -1
- package/dist/esm/core/actions/abstract-batch.mjs +1 -1
- package/dist/esm/core/actions/manager.mjs +1 -1
- package/dist/esm/core/actions/v2/batch-by-chunk.mjs +1 -1
- package/dist/esm/core/actions/v2/batch.mjs +4 -4
- package/dist/esm/core/actions/v2/batch.mjs.map +1 -1
- package/dist/esm/core/actions/v2/call-list.mjs +1 -1
- package/dist/esm/core/actions/v2/call.mjs +1 -1
- package/dist/esm/core/actions/v2/fetch-list.mjs +1 -1
- package/dist/esm/core/actions/v2/manager-v2.mjs +1 -1
- package/dist/esm/core/actions/v3/batch-by-chunk.mjs +1 -1
- package/dist/esm/core/actions/v3/batch.mjs +4 -4
- package/dist/esm/core/actions/v3/batch.mjs.map +1 -1
- package/dist/esm/core/actions/v3/call-list.mjs +1 -1
- package/dist/esm/core/actions/v3/call.mjs +1 -1
- package/dist/esm/core/actions/v3/fetch-list.mjs +1 -1
- package/dist/esm/core/actions/v3/manager-v3.mjs +1 -1
- package/dist/esm/core/http/abstract-http.mjs +2 -2
- package/dist/esm/core/http/ajax-error.mjs +1 -1
- package/dist/esm/core/http/ajax-result.mjs +1 -1
- package/dist/esm/core/http/limiters/adaptive-delayer.mjs +1 -1
- package/dist/esm/core/http/limiters/manager.mjs +30 -1
- package/dist/esm/core/http/limiters/manager.mjs.map +1 -1
- package/dist/esm/core/http/limiters/operating-limiter.mjs +1 -1
- package/dist/esm/core/http/limiters/params-factory.mjs +1 -1
- package/dist/esm/core/http/limiters/rate-limiter.mjs +1 -1
- package/dist/esm/core/http/redact.mjs +1 -1
- package/dist/esm/core/http/v2.mjs +2 -2
- package/dist/esm/core/http/v3.mjs +2 -2
- package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs +1 -1
- package/dist/esm/core/interaction/batch/parse-row.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs +1 -1
- package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs +1 -1
- package/dist/esm/core/interaction/batch/v2.mjs +1 -1
- package/dist/esm/core/interaction/batch/v3.mjs +1 -1
- package/dist/esm/core/language/list.mjs +1 -1
- package/dist/esm/core/request-id-generator.mjs +1 -1
- package/dist/esm/core/result.mjs +1 -1
- package/dist/esm/core/sdk-error.mjs +1 -1
- package/dist/esm/core/tools/abstract-tool.mjs +1 -1
- package/dist/esm/core/tools/healthcheck.mjs +1 -1
- package/dist/esm/core/tools/manager.mjs +1 -1
- package/dist/esm/core/tools/ping.mjs +1 -1
- package/dist/esm/core/version-manager.mjs +1 -1
- package/dist/esm/frame/auth.mjs +1 -1
- package/dist/esm/frame/b24.mjs +1 -1
- package/dist/esm/frame/dialog.mjs +1 -1
- package/dist/esm/frame/frame.mjs +1 -1
- package/dist/esm/frame/message/commands.mjs +1 -1
- package/dist/esm/frame/message/controller.mjs +1 -1
- package/dist/esm/frame/options.mjs +1 -1
- package/dist/esm/frame/parent.mjs +1 -1
- package/dist/esm/frame/placement.mjs +1 -1
- package/dist/esm/frame/slider.mjs +1 -1
- package/dist/esm/helper/abstract-helper.mjs +1 -1
- package/dist/esm/helper/app-manager.mjs +1 -1
- package/dist/esm/helper/currency-manager.mjs +1 -1
- package/dist/esm/helper/helper-manager.mjs +1 -1
- package/dist/esm/helper/license-manager.mjs +1 -1
- package/dist/esm/helper/options-manager.mjs +1 -1
- package/dist/esm/helper/payment-manager.mjs +1 -1
- package/dist/esm/helper/profile-manager.mjs +1 -1
- package/dist/esm/helper/use-b24-helper.mjs +1 -1
- package/dist/esm/hook/auth.mjs +1 -1
- package/dist/esm/hook/b24.mjs +1 -1
- package/dist/esm/index.d.mts +6 -6
- package/dist/esm/index.d.ts +6 -6
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/loader-b24frame.mjs +1 -1
- package/dist/esm/logger/abstract-logger.mjs +1 -1
- package/dist/esm/logger/browser.mjs +1 -1
- package/dist/esm/logger/formatter/abstract-formatter.mjs +1 -1
- package/dist/esm/logger/formatter/json-formatter.mjs +1 -1
- package/dist/esm/logger/formatter/line-formatter.mjs +1 -1
- package/dist/esm/logger/formatter/telegram-formatter.mjs +1 -1
- package/dist/esm/logger/handler/abstract-handler.mjs +1 -1
- package/dist/esm/logger/handler/consola-adapter.mjs +1 -1
- package/dist/esm/logger/handler/console-handler.mjs +1 -1
- package/dist/esm/logger/handler/console-v2-handler.mjs +1 -1
- package/dist/esm/logger/handler/memory-handler.mjs +1 -1
- package/dist/esm/logger/handler/stream-handler.mjs +1 -1
- package/dist/esm/logger/handler/telegram-handler.mjs +1 -1
- package/dist/esm/logger/handler/winston-adapter.mjs +1 -1
- package/dist/esm/logger/logger-factory.mjs +1 -1
- package/dist/esm/logger/logger.mjs +1 -1
- package/dist/esm/logger/null-logger.mjs +1 -1
- package/dist/esm/logger/processor/memory-usage-processor.mjs +1 -1
- package/dist/esm/logger/processor/pid-processor.mjs +1 -1
- package/dist/esm/oauth/auth.mjs +1 -1
- package/dist/esm/oauth/b24.mjs +1 -1
- package/dist/esm/oauth/refresh-token-error.mjs +1 -1
- package/dist/esm/pullClient/abstract-connector.mjs +1 -1
- package/dist/esm/pullClient/channel-manager.mjs +1 -1
- package/dist/esm/pullClient/client.mjs +1 -1
- package/dist/esm/pullClient/errors.mjs +1 -1
- package/dist/esm/pullClient/json-rpc.mjs +1 -1
- package/dist/esm/pullClient/long-polling-connector.mjs +1 -1
- package/dist/esm/pullClient/protobuf/index.mjs +1 -1
- package/dist/esm/pullClient/protobuf/model.mjs +1 -1
- package/dist/esm/pullClient/protobuf/protobuf.mjs +53 -53
- package/dist/esm/pullClient/protobuf/protobuf.mjs.map +1 -1
- package/dist/esm/pullClient/shared-config.mjs +1 -1
- package/dist/esm/pullClient/storage-manager.mjs +1 -1
- package/dist/esm/pullClient/web-socket-connector.mjs +1 -1
- package/dist/esm/tools/browser.mjs +1 -1
- package/dist/esm/tools/environment.mjs +1 -1
- package/dist/esm/tools/formatters/iban.mjs +1 -1
- package/dist/esm/tools/formatters/numbers.mjs +1 -1
- package/dist/esm/tools/index.mjs +1 -1
- package/dist/esm/tools/scroll-size.mjs +1 -1
- package/dist/esm/tools/text.mjs +1 -1
- package/dist/esm/tools/type.mjs +1 -1
- package/dist/esm/tools/use-formatters.mjs +1 -1
- package/dist/esm/tools/uuidv7.mjs +1 -1
- package/dist/esm/types/b24-helper.mjs +1 -1
- package/dist/esm/types/b24.mjs +1 -1
- package/dist/esm/types/bizproc/index.mjs +1 -1
- package/dist/esm/types/catalog/index.mjs +1 -1
- package/dist/esm/types/common.mjs +1 -1
- package/dist/esm/types/crm/entity-type.mjs +1 -1
- package/dist/esm/types/crm/productrow.mjs +1 -1
- package/dist/esm/types/logger.mjs +1 -1
- package/dist/esm/types/pull.mjs +1 -1
- package/dist/umd/index.js +1666 -1241
- package/dist/umd/index.js.map +1 -1
- package/dist/umd/index.min.js +28 -28
- package/dist/umd/index.min.js.map +1 -1
- package/package.json +1 -1
package/README-AI.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Bitrix24 JS SDK — AI Guide
|
|
2
2
|
|
|
3
|
+
> ⚠️ **This file is transitional and will be removed.**
|
|
4
|
+
>
|
|
5
|
+
> Its content is being progressively absorbed into [`AGENTS.md`](../../AGENTS.md) (the root agent-facing guide) and the four focused guides under [`.github/contributing/`](../../.github/contributing/). Future PRs will continue migrating sections out of here until the file can be deleted.
|
|
6
|
+
>
|
|
7
|
+
> **Until then:**
|
|
8
|
+
>
|
|
9
|
+
> - When this guide disagrees with `AGENTS.md` or the `.github/contributing/` guides, **`AGENTS.md` wins**. Do not "fix" `AGENTS.md` to match this file.
|
|
10
|
+
> - **Do not add new material here.** New conventions, examples, and patterns belong in `AGENTS.md` or the matching contributing guide.
|
|
11
|
+
> - Bug-fix edits to existing sections are fine (e.g. correcting a stale API name) but should be mirrored into the canonical location as part of the same PR when possible.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
3
15
|
Purpose: give AI agents a precise, code-oriented overview of the SDK to generate working Bitrix24 apps. This SDK lets you:
|
|
4
16
|
|
|
5
17
|
- Call Bitrix24 REST API from apps embedded in Bitrix24 (iframe) and from backend services
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package @bitrix24/b24jssdk
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.2.0
|
|
4
4
|
* @copyright (c) 2026 Bitrix24
|
|
5
5
|
* @license MIT
|
|
6
6
|
* @see https://github.com/bitrix24/b24jssdk
|
|
@@ -61,7 +61,7 @@ class BatchV2 extends AbstractBatch {
|
|
|
61
61
|
* const resultData = (response as Result<AjaxResult<{ item: Contact }>[]>).getData()
|
|
62
62
|
* resultData.forEach((resultRow, index) => {
|
|
63
63
|
* if (resultRow.isSuccess) {
|
|
64
|
-
* console.log(`Item ${index + 1}:`, resultRow.getData()
|
|
64
|
+
* console.log(`Item ${index + 1}:`, resultRow.getData()!.result.item)
|
|
65
65
|
* }
|
|
66
66
|
* })
|
|
67
67
|
*
|
|
@@ -104,8 +104,8 @@ class BatchV2 extends AbstractBatch {
|
|
|
104
104
|
* }
|
|
105
105
|
*
|
|
106
106
|
* const results = response.getData() as Record<string, AjaxResult<{ item: Contact } | { item: Deal }>>
|
|
107
|
-
* console.log('Contact:', results.Contact.getData()
|
|
108
|
-
* console.log('Deal:', results.Deal.getData()
|
|
107
|
+
* console.log('Contact:', results.Contact.getData()?.result.item as Contact)
|
|
108
|
+
* console.log('Deal:', results.Deal.getData()?.result.item as Deal)
|
|
109
109
|
*
|
|
110
110
|
* @warning The maximum number of commands in one batch request is 50.
|
|
111
111
|
* @note A batch request executes faster than sequential single calls,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.mjs","sources":["../../../../../src/core/actions/v2/batch.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { CallBatchResult, IB24BatchOptions } from '../../../types/b24'\nimport type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal\n} from '../../../types/http'\nimport { AbstractBatch } from '../abstract-batch'\nimport { ApiVersion } from '../../../types/b24'\n\nexport type ActionBatchV2 = ActionOptions & {\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal\n options?: IB24BatchOptions\n}\n\n/**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50. `restApi:v2`\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @todo add docs\n */\nexport class BatchV2 extends AbstractBatch {\n /**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50.\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @template T - The data type returned by batch query commands (default is `unknown`)\n *\n * @param {ActionBatchV2} options - parameters for executing the request.\n * - `calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal` - Commands to execute in a batch.\n * Supports several formats:\n * 1. Array of tuples: `[['method1', params1], ['method2', params2], ...]`\n * 2. Array of objects: `[{ method: 'method1', params: params1 }, { method: 'method2', params: params2 }, ...]`\n * 3. An object with named commands: `{ cmd1: { method: 'method1', params: params1 }, cmd2: ['method2', params2], ...}`\n * - `options?: IB24BatchOptions` - Additional options for executing a batch request.\n * - `isHaltOnError?: boolean` - Whether to stop execution on the first error (default: true)\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging (default: undefined)\n * - `returnAjaxResult?: boolean` - Whether to return an AjaxResult object instead of data (default: false)\n *\n * @returns {Promise<CallBatchResult<T>>} A promise that is resolved by the result of executing a batch request:\n * - On success: a `Result` object with the command execution results\n * - The structure of the results depends on the format of the `calls` input data:\n * - For an array of commands, an array of results in the same order\n * - For named commands, an object with keys corresponding to the command names\n *\n * @example\n * import { EnumCrmEntityTypeId } from '@bitrix24/b24jssdk'\n *\n * interface Contact { id: number, name: string }\n * const response = await b24.actions.v2.batch.make<{ item: Contact }>({\n * calls: [\n * ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.contact, id: 1 }],\n * ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.contact, id: 2 }],\n * ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.contact, id: 3 }]\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const resultData = (response as Result<AjaxResult<{ item: Contact }>[]>).getData()\n * resultData.forEach((resultRow, index) => {\n * if (resultRow.isSuccess) {\n * console.log(`Item ${index + 1}:`, resultRow.getData()
|
|
1
|
+
{"version":3,"file":"batch.mjs","sources":["../../../../../src/core/actions/v2/batch.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { CallBatchResult, IB24BatchOptions } from '../../../types/b24'\nimport type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal\n} from '../../../types/http'\nimport { AbstractBatch } from '../abstract-batch'\nimport { ApiVersion } from '../../../types/b24'\n\nexport type ActionBatchV2 = ActionOptions & {\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal\n options?: IB24BatchOptions\n}\n\n/**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50. `restApi:v2`\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @todo add docs\n */\nexport class BatchV2 extends AbstractBatch {\n /**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50.\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @template T - The data type returned by batch query commands (default is `unknown`)\n *\n * @param {ActionBatchV2} options - parameters for executing the request.\n * - `calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal` - Commands to execute in a batch.\n * Supports several formats:\n * 1. Array of tuples: `[['method1', params1], ['method2', params2], ...]`\n * 2. Array of objects: `[{ method: 'method1', params: params1 }, { method: 'method2', params: params2 }, ...]`\n * 3. An object with named commands: `{ cmd1: { method: 'method1', params: params1 }, cmd2: ['method2', params2], ...}`\n * - `options?: IB24BatchOptions` - Additional options for executing a batch request.\n * - `isHaltOnError?: boolean` - Whether to stop execution on the first error (default: true)\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging (default: undefined)\n * - `returnAjaxResult?: boolean` - Whether to return an AjaxResult object instead of data (default: false)\n *\n * @returns {Promise<CallBatchResult<T>>} A promise that is resolved by the result of executing a batch request:\n * - On success: a `Result` object with the command execution results\n * - The structure of the results depends on the format of the `calls` input data:\n * - For an array of commands, an array of results in the same order\n * - For named commands, an object with keys corresponding to the command names\n *\n * @example\n * import { EnumCrmEntityTypeId } from '@bitrix24/b24jssdk'\n *\n * interface Contact { id: number, name: string }\n * const response = await b24.actions.v2.batch.make<{ item: Contact }>({\n * calls: [\n * ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.contact, id: 1 }],\n * ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.contact, id: 2 }],\n * ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.contact, id: 3 }]\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const resultData = (response as Result<AjaxResult<{ item: Contact }>[]>).getData()\n * resultData.forEach((resultRow, index) => {\n * if (resultRow.isSuccess) {\n * console.log(`Item ${index + 1}:`, resultRow.getData()!.result.item)\n * }\n * })\n *\n * @example\n * import { EnumCrmEntityTypeId } from '@bitrix24/b24jssdk'\n *\n * const response = await b24.actions.v2.batch.make({\n * calls: [\n * { method: 'crm.item.get', params: { entityTypeId: EnumCrmEntityTypeId.contact, id: 1 } },\n * { method: 'crm.item.get', params: { entityTypeId: EnumCrmEntityTypeId.contact, id: 2 } }\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * @example\n * import { EnumCrmEntityTypeId } from '@bitrix24/b24jssdk'\n *\n * interface Contact { id: number, name: string }\n * interface Deal { id: number, title: string }\n * const response = await b24.actions.v2.batch.make<{ item: Contact } | { item: Deal }>({\n * calls: {\n * Contact: { method: 'crm.item.get', params: { entityTypeId: EnumCrmEntityTypeId.contact, id: 1 } },\n * Deal: ['crm.item.get', { entityTypeId: EnumCrmEntityTypeId.deal, id: 2 }]\n * },\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const results = response.getData() as Record<string, AjaxResult<{ item: Contact } | { item: Deal }>>\n * console.log('Contact:', results.Contact.getData()?.result.item as Contact)\n * console.log('Deal:', results.Deal.getData()?.result.item as Deal)\n *\n * @warning The maximum number of commands in one batch request is 50.\n * @note A batch request executes faster than sequential single calls,\n * but if one command fails, the entire batch may fail\n * (depending on API settings and options).\n */\n public override async make<T = unknown>(options: ActionBatchV2): Promise<CallBatchResult<T>> {\n const opts = {\n ...options.options,\n apiVersion: ApiVersion.v2\n }\n\n const response = await this._b24.getHttpClient(ApiVersion.v2).batch<T>(options.calls, opts)\n\n return this._processBatchResponse<T>(response, options.calls, opts)\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAqBO,MAAM,gBAAgB,aAAA,CAAc;AAAA,EArB3C;AAqB2C,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkGzC,MAAsB,KAAkB,OAAA,EAAqD;AAC3F,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,YAAY,UAAA,CAAW;AAAA,KACzB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,EAAE,CAAA,CAAE,KAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAE1F,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAyB,QAAA,EAAU,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EACpE;AACF;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package @bitrix24/b24jssdk
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.2.0
|
|
4
4
|
* @copyright (c) 2026 Bitrix24
|
|
5
5
|
* @license MIT
|
|
6
6
|
* @see https://github.com/bitrix24/b24jssdk
|
|
@@ -61,7 +61,7 @@ class BatchV3 extends AbstractBatch {
|
|
|
61
61
|
* const resultData = (response as Result<AjaxResult<{ item: TaskItem }>[]>).getData()
|
|
62
62
|
* resultData.forEach((resultRow, index) => {
|
|
63
63
|
* if (resultRow.isSuccess) {
|
|
64
|
-
* console.log(`Item ${index + 1}:`, resultRow.getData()
|
|
64
|
+
* console.log(`Item ${index + 1}:`, resultRow.getData()!.result.item)
|
|
65
65
|
* }
|
|
66
66
|
* })
|
|
67
67
|
*
|
|
@@ -100,8 +100,8 @@ class BatchV3 extends AbstractBatch {
|
|
|
100
100
|
* }
|
|
101
101
|
*
|
|
102
102
|
* const results = response.getData() as Record<string, AjaxResult<{ item: TaskItem } | { items: MainEventLogItem[] }>>
|
|
103
|
-
* console.log('Task:', results.Task.getData()
|
|
104
|
-
* console.log('MainEventLog:', results.MainEventLog.getData()
|
|
103
|
+
* console.log('Task:', results.Task.getData()?.result.item as TaskItem)
|
|
104
|
+
* console.log('MainEventLog:', results.MainEventLog.getData()?.result.items as MainEventLogItem[])
|
|
105
105
|
*
|
|
106
106
|
* @warning The maximum number of commands in one batch request is 50.
|
|
107
107
|
* @note A batch request executes faster than sequential single calls,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.mjs","sources":["../../../../../src/core/actions/v3/batch.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { CallBatchResult, IB24BatchOptions } from '../../../types/b24'\nimport type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal\n} from '../../../types/http'\nimport { AbstractBatch } from '../abstract-batch'\nimport { ApiVersion } from '../../../types/b24'\nimport { versionManager } from '../../version-manager'\nimport { SdkError } from '../../sdk-error'\n\nexport type ActionBatchV3 = ActionOptions & {\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal\n options?: IB24BatchOptions\n}\n\n/**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50. `restApi:v3`\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @todo add docs\n */\nexport class BatchV3 extends AbstractBatch {\n /**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50.\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @template T - The data type returned by batch query commands (default is `unknown`)\n *\n * @param {ActionBatchV3} options - parameters for executing the request.\n * - `calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal` - Commands to execute in a batch.\n * Supports several formats:\n * 1. Array of tuples: `[['method1', params1], ['method2', params2], ...]`\n * 2. Array of objects: `[{ method: 'method1', params: params1 }, { method: 'method2', params: params2 }, ...]`\n * 3. An object with named commands: `{ cmd1: { method: 'method1', params: params1 }, cmd2: ['method2', params2], ...}`\n * - `options?: IB24BatchOptions` - Additional options for executing a batch request.\n * - `isHaltOnError?: boolean` - Whether to stop execution on the first error (default: true)\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging (default: undefined)\n * - `returnAjaxResult?: boolean` - Whether to return an AjaxResult object instead of data (default: false)\n *\n * @returns {Promise<CallBatchResult<T>>} A promise that is resolved by the result of executing a batch request:\n * - On success: a `Result` object with the command execution results\n * - The structure of the results depends on the format of the `calls` input data:\n * - For an array of commands, an array of results in the same order\n * - For named commands, an object with keys corresponding to the command names\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem }>({\n * calls: [\n * ['tasks.task.get', { id: 1, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 2, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 3, select: ['id', 'title'] }]\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const resultData = (response as Result<AjaxResult<{ item: TaskItem }>[]>).getData()\n * resultData.forEach((resultRow, index) => {\n * if (resultRow.isSuccess) {\n * console.log(`Item ${index + 1}:`, resultRow.getData()
|
|
1
|
+
{"version":3,"file":"batch.mjs","sources":["../../../../../src/core/actions/v3/batch.ts"],"sourcesContent":["import type { ActionOptions } from '../abstract-action'\nimport type { CallBatchResult, IB24BatchOptions } from '../../../types/b24'\nimport type {\n BatchCommandsArrayUniversal,\n BatchCommandsObjectUniversal,\n BatchNamedCommandsUniversal\n} from '../../../types/http'\nimport { AbstractBatch } from '../abstract-batch'\nimport { ApiVersion } from '../../../types/b24'\nimport { versionManager } from '../../version-manager'\nimport { SdkError } from '../../sdk-error'\n\nexport type ActionBatchV3 = ActionOptions & {\n calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal\n options?: IB24BatchOptions\n}\n\n/**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50. `restApi:v3`\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @todo add docs\n */\nexport class BatchV3 extends AbstractBatch {\n /**\n * Executes a batch request to the Bitrix24 REST API with a maximum number of commands of no more than 50.\n * Allows you to execute multiple requests in a single API call, significantly improving performance.\n *\n * @template T - The data type returned by batch query commands (default is `unknown`)\n *\n * @param {ActionBatchV3} options - parameters for executing the request.\n * - `calls: BatchCommandsArrayUniversal | BatchCommandsObjectUniversal | BatchNamedCommandsUniversal` - Commands to execute in a batch.\n * Supports several formats:\n * 1. Array of tuples: `[['method1', params1], ['method2', params2], ...]`\n * 2. Array of objects: `[{ method: 'method1', params: params1 }, { method: 'method2', params: params2 }, ...]`\n * 3. An object with named commands: `{ cmd1: { method: 'method1', params: params1 }, cmd2: ['method2', params2], ...}`\n * - `options?: IB24BatchOptions` - Additional options for executing a batch request.\n * - `isHaltOnError?: boolean` - Whether to stop execution on the first error (default: true)\n * - `requestId?: string` - Unique request identifier for tracking. Used for query deduplication and debugging (default: undefined)\n * - `returnAjaxResult?: boolean` - Whether to return an AjaxResult object instead of data (default: false)\n *\n * @returns {Promise<CallBatchResult<T>>} A promise that is resolved by the result of executing a batch request:\n * - On success: a `Result` object with the command execution results\n * - The structure of the results depends on the format of the `calls` input data:\n * - For an array of commands, an array of results in the same order\n * - For named commands, an object with keys corresponding to the command names\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem }>({\n * calls: [\n * ['tasks.task.get', { id: 1, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 2, select: ['id', 'title'] }],\n * ['tasks.task.get', { id: 3, select: ['id', 'title'] }]\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const resultData = (response as Result<AjaxResult<{ item: TaskItem }>[]>).getData()\n * resultData.forEach((resultRow, index) => {\n * if (resultRow.isSuccess) {\n * console.log(`Item ${index + 1}:`, resultRow.getData()!.result.item)\n * }\n * })\n *\n * @example\n * const response = await b24.actions.v3.batch.make({\n * calls: [\n * { method: 'tasks.task.get', params: { id: 1, select: ['id', 'title'] } },\n * { method: 'tasks.task.get', params: { id: 2, select: ['id', 'title'] } }\n * ],\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * @example\n * interface TaskItem { id: number, title: string }\n * interface MainEventLogItem { id: number, userId: number }\n * const response = await b24.actions.v3.batch.make<{ item: TaskItem } | { items: MainEventLogItem[] }>({\n * calls: {\n * Task: { method: 'tasks.task.get', params: { id: 1, select: ['id', 'title'] } },\n * MainEventLog: ['main.eventlog.list', { select: ['id', 'userId'], pagination: { limit: 5 } }]\n * },\n * options: {\n * isHaltOnError: true,\n * returnAjaxResult: true,\n * requestId: 'batch-123'\n * }\n * })\n * if (!response.isSuccess) {\n * throw new Error(`Problem: ${response.getErrorMessages().join('; ')}`)\n * }\n *\n * const results = response.getData() as Record<string, AjaxResult<{ item: TaskItem } | { items: MainEventLogItem[] }>>\n * console.log('Task:', results.Task.getData()?.result.item as TaskItem)\n * console.log('MainEventLog:', results.MainEventLog.getData()?.result.items as MainEventLogItem[])\n *\n * @warning The maximum number of commands in one batch request is 50.\n * @note A batch request executes faster than sequential single calls,\n * but if one command fails, the entire batch may fail\n * (depending on API settings and options).\n */\n public override async make<T = unknown>(options: ActionBatchV3): Promise<CallBatchResult<T>> {\n const opts = {\n ...options.options,\n apiVersion: ApiVersion.v3\n }\n\n if (versionManager.automaticallyObtainApiVersionForBatch(options.calls) !== opts.apiVersion) {\n throw new SdkError({\n code: 'JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3',\n description: `restApi:v3 not support some methods in calls: ${JSON.stringify(options.calls)}`,\n status: 500\n })\n }\n\n const response = await this._b24.getHttpClient(ApiVersion.v3).batch<T>(options.calls, opts)\n\n return this._processBatchResponse<T>(response, options.calls, opts)\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAuBO,MAAM,gBAAgB,aAAA,CAAc;AAAA,EAvB3C;AAuB2C,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4FzC,MAAsB,KAAkB,OAAA,EAAqD;AAC3F,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,YAAY,UAAA,CAAW;AAAA,KACzB;AAEA,IAAA,IAAI,eAAe,qCAAA,CAAsC,OAAA,CAAQ,KAAK,CAAA,KAAM,KAAK,UAAA,EAAY;AAC3F,MAAA,MAAM,IAAI,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,yCAAA;AAAA,QACN,aAAa,CAAA,8CAAA,EAAiD,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,QAC3F,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAA,CAAW,EAAE,CAAA,CAAE,KAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAE1F,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAyB,QAAA,EAAU,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EACpE;AACF;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package @bitrix24/b24jssdk
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.2.0
|
|
4
4
|
* @copyright (c) 2026 Bitrix24
|
|
5
5
|
* @license MIT
|
|
6
6
|
* @see https://github.com/bitrix24/b24jssdk
|
|
@@ -45,7 +45,7 @@ class AbstractHttp {
|
|
|
45
45
|
this._logger = LoggerFactory.createNullLogger();
|
|
46
46
|
const defaultHeaders = {};
|
|
47
47
|
if (this.isServerSide()) {
|
|
48
|
-
defaultHeaders["User-Agent"] = "b24-js-sdk/1.
|
|
48
|
+
defaultHeaders["User-Agent"] = "b24-js-sdk/1.2.0";
|
|
49
49
|
}
|
|
50
50
|
this._authActions = authActions;
|
|
51
51
|
this._requestIdGenerator = new RequestIdGenerator();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package @bitrix24/b24jssdk
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.2.0
|
|
4
4
|
* @copyright (c) 2026 Bitrix24
|
|
5
5
|
* @license MIT
|
|
6
6
|
* @see https://github.com/bitrix24/b24jssdk
|
|
@@ -97,6 +97,10 @@ class RestrictionManager {
|
|
|
97
97
|
this.#logError(this.#operatingLimiter.getTitle(), requestId, "OPERATION_TIME_LIMIT", error.message, method, wait);
|
|
98
98
|
return wait;
|
|
99
99
|
}
|
|
100
|
+
if (this.#isNonRetryableClientError(error)) {
|
|
101
|
+
this.#logNonRetryableClientError(requestId, error?.code ? `${error.code}` : "?", error?.message ?? "", method, Number(error?.status ?? 0));
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
100
104
|
if (!this.#isNeedThrowError(error)) {
|
|
101
105
|
const baseDelay = await this.#getErrorBackoff(requestId);
|
|
102
106
|
const maxDelay = Math.max(3e4, baseDelay);
|
|
@@ -138,6 +142,20 @@ class RestrictionManager {
|
|
|
138
142
|
async #handleOperatingLimitError(requestId, method, params, _error) {
|
|
139
143
|
return this.#operatingLimiter.getTimeToFree(requestId, method, params, _error);
|
|
140
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Checks if the error is a non-retryable client error (HTTP 4xx).
|
|
147
|
+
*
|
|
148
|
+
* `429` is excluded — it is handled as a rate/operating limit and is retried
|
|
149
|
+
* with backoff. `408` (request timeout) is excluded — it is transient and is
|
|
150
|
+
* governed by `retryOnNetworkError`.
|
|
151
|
+
*/
|
|
152
|
+
#isNonRetryableClientError(error) {
|
|
153
|
+
const status = Number(error?.status ?? 0);
|
|
154
|
+
if (Number.isNaN(status)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
return status >= 400 && status < 500 && status !== 408 && status !== 429;
|
|
158
|
+
}
|
|
141
159
|
/**
|
|
142
160
|
* Checks whether attempts should be stopped if errors are encountered that are unclear.
|
|
143
161
|
*/
|
|
@@ -334,6 +352,17 @@ class RestrictionManager {
|
|
|
334
352
|
}
|
|
335
353
|
});
|
|
336
354
|
}
|
|
355
|
+
#logNonRetryableClientError(requestId, code, message, method, status) {
|
|
356
|
+
this.getLogger().error(`client error ${status} (${code}) for the ${method} method is not retryable`, {
|
|
357
|
+
requestId,
|
|
358
|
+
method,
|
|
359
|
+
status,
|
|
360
|
+
error: {
|
|
361
|
+
code,
|
|
362
|
+
message
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
}
|
|
337
366
|
// endregion ////
|
|
338
367
|
}
|
|
339
368
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.mjs","sources":["../../../../../src/core/http/limiters/manager.ts"],"sourcesContent":["import type { RestrictionParams, RestrictionManagerStats } from '../../../types/limiters'\nimport type { LoggerInterface } from '../../../types/logger'\nimport { LoggerFactory } from '../../../logger'\nimport { RateLimiter } from './rate-limiter'\nimport { OperatingLimiter } from './operating-limiter'\nimport { AdaptiveDelayer } from './adaptive-delayer'\n\n/**\n * Delay Management Manager\n *\n * @todo docs\n */\nexport class RestrictionManager {\n #rateLimiter: RateLimiter\n #operatingLimiter: OperatingLimiter\n #adaptiveDelayer: AdaptiveDelayer\n #config: RestrictionParams\n #stats: Pick<RestrictionManagerStats, 'retries' | 'consecutiveErrors' | 'limitHits'> = {\n /** Retry attempts */\n retries: 0,\n /** Consecutive errors */\n consecutiveErrors: 0,\n /** Limit triggers */\n limitHits: 0\n }\n\n #errorCounts = new Map<string, number>()\n\n private _logger: LoggerInterface\n\n constructor(params: RestrictionParams) {\n this._logger = LoggerFactory.createNullLogger()\n this.#config = params\n this.#rateLimiter = new RateLimiter(params.rateLimit!)\n this.#operatingLimiter = new OperatingLimiter(params.operatingLimit!)\n this.#adaptiveDelayer = new AdaptiveDelayer(params.adaptiveConfig!, this.#operatingLimiter)\n }\n\n // region Logger ////\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n this.#rateLimiter.setLogger(this._logger)\n this.#operatingLimiter.setLogger(this._logger)\n this.#adaptiveDelayer.setLogger(this._logger)\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n // endregion ////\n\n async applyOperatingLimits(requestId: string, method: string, params?: any): Promise<void> {\n // 1. Check operating limit\n const operatingWait = await this.#operatingLimiter.waitIfNeeded(requestId, method, params)\n if (operatingWait > 0) {\n this.incrementStats('limitHits')\n this.#logMethodBlocked(this.#operatingLimiter.getTitle(), requestId, method, operatingWait)\n await this.#delay(operatingWait)\n } else {\n // 2. Apply adaptive delay\n const adaptiveDelay = await this.#adaptiveDelayer.waitIfNeeded(requestId, method, params)\n if (adaptiveDelay > 0) {\n this.incrementStats('limitHits')\n this.#logMethodBlocked(this.#adaptiveDelayer.getTitle(), requestId, method, adaptiveDelay)\n await this.#delay(adaptiveDelay)\n }\n }\n }\n\n /**\n * Checks and waits for the rate limit\n * The loop is needed for parallel requests (Promise.all())\n */\n async checkRateLimit(requestId: string, method: string): Promise<void> {\n // 3. Apply rate limit\n let waitTime\n let times = 1\n do {\n waitTime = await this.#rateLimiter.waitIfNeeded(requestId, method)\n if (waitTime > 0) {\n this.incrementStats('limitHits')\n this.#logMethodBlockedWithTimes(this.#rateLimiter.getTitle(), requestId, method, waitTime, times)\n await this.#delay(waitTime)\n times++\n }\n } while (waitTime > 0)\n }\n\n async updateStats(\n requestId: string,\n method: string,\n timeData: any\n ): Promise<void> {\n await this.#operatingLimiter.updateStats(requestId, method, timeData)\n await this.#adaptiveDelayer.updateStats(requestId, method, timeData)\n await this.#rateLimiter.updateStats(requestId, method, timeData)\n }\n\n async handleError(\n requestId: string,\n method: string,\n params: any,\n error: any,\n attempt: number\n ): Promise<number> {\n // Rate limit exceeded\n if (this.#isRateLimitError(error)) {\n // Since this is error handling, we take into account the number of attempts\n const wait = (await this.#handleRateLimitExceeded(requestId)) * Math.pow(1.5, attempt)\n this.#logError(this.#rateLimiter.getTitle(), requestId, 'QUERY_LIMIT_EXCEEDED', error.message, method, wait)\n return wait\n }\n\n // Operating limit exceeded\n if (this.#isOperatingLimitError(error)) {\n // Since this is error handling, we will increase the minimum to 10 seconds.\n const wait = Math.max(10_000, await this.#handleOperatingLimitError(requestId, method, params, error))\n this.#logError(this.#operatingLimiter.getTitle(), requestId, 'OPERATION_TIME_LIMIT', error.message, method, wait)\n return wait\n }\n\n // Other exceptions\n if (!this.#isNeedThrowError(error)) {\n // Since this is error handling, we take into account the number of attempts\n const baseDelay = await this.#getErrorBackoff(requestId)\n const maxDelay = Math.max(30_000, baseDelay)\n const delay = Math.min(maxDelay, baseDelay * Math.pow(2, attempt))\n\n // Add jitter to prevent thundering herd\n const jitter = delay * 0.1 * (Math.random() * 2 - 1) // ±10% jitter\n const wait = Math.max(100, delay + jitter)\n\n this.#logSomeError(requestId, error?.code ? `${error.code}` : '?', error.message, method, wait)\n\n return wait\n }\n\n return 0 // We don't repeat\n }\n\n /**\n * Checks if the error is a rate limit\n */\n #isRateLimitError(error: any): boolean {\n return error.status === 503\n || error.code === 'QUERY_LIMIT_EXCEEDED'\n }\n\n /**\n * Delay when exceeding the rate limit\n */\n async #handleRateLimitExceeded(requestId: string): Promise<number> {\n return this.#rateLimiter.handleExceeded(requestId)\n }\n\n /**\n * Checks if the error is an operating limit\n *\n * @memo `OPERATION_TIME_LIMIT` && `429` - obtained through practical means\n * @memo This doesn't work for `batch` queries.\n */\n #isOperatingLimitError(error: any): boolean {\n return error.status === 429\n || error.code === 'OPERATION_TIME_LIMIT'\n }\n\n /**\n * Operating limit error delay\n *\n * @memo Currently, the errors don't include timings for operations.\n * For this reason, we will take data from the previous request\n */\n async #handleOperatingLimitError(requestId: string, method: string, params?: any, _error?: any): Promise<number> {\n return this.#operatingLimiter.getTimeToFree(requestId, method, params, _error)\n }\n\n /**\n * Checks whether attempts should be stopped if errors are encountered that are unclear.\n */\n #isNeedThrowError(error: any): boolean {\n const answerError = {\n code: error?.code ?? '-1',\n description: error?.message ?? ''\n }\n\n return [\n ...this.exceptionCodeForHard,\n ...this.exceptionCodeForSoft\n ].includes(answerError.code)\n || (answerError.description ?? '').includes('Could not find value for parameter')\n }\n\n /**\n * Built-in hard error codes (always throw, never retry).\n *\n * Includes authorization and fatal codes that must never be silently retried.\n * Use `RestrictionParams.hardErrorCodes` to extend this list with custom codes.\n */\n static readonly BUILT_IN_HARD_ERROR_CODES: readonly string[] = [\n 'ERR_BAD_REQUEST',\n 'JSSDK_UNKNOWN_ERROR',\n '100',\n 'INTERNAL_SERVER_ERROR', 'ERROR_UNEXPECTED_ANSWER', 'PORTAL_DELETED',\n 'ERROR_BATCH_METHOD_NOT_ALLOWED', 'ERROR_BATCH_LENGTH_EXCEEDED',\n 'NO_AUTH_FOUND',\n 'INVALID_REQUEST',\n 'OVERLOAD_LIMIT', 'expired_token',\n 'ACCESS_DENIED', 'INVALID_CREDENTIALS', 'user_access_error', 'insufficient_scope',\n 'ERROR_MANIFEST_IS_NOT_AVAILABLE',\n 'allowed_only_intranet_user',\n 'NOT_FOUND',\n 'INVALID_ARG_VALUE'\n ]\n\n /**\n * Built-in soft error codes (returned as `AjaxResult` with error, never thrown).\n *\n * Use `RestrictionParams.softErrorCodes` to extend this list with custom codes.\n */\n static readonly BUILT_IN_SOFT_ERROR_CODES: readonly string[] = [\n 'ERROR_ENTITY_NOT_FOUND',\n 'BITRIX_REST_V3_EXCEPTION_ACCESSDENIEDEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_INVALIDJSONEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_INVALIDFILTEREXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_INVALIDSELECTEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_ENTITYNOTFOUNDEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_METHODNOTFOUNDEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_UNKNOWNDTOPROPERTYEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_VALIDATION_REQUESTVALIDATIONEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_VALIDATION_DTOVALIDATIONEXCEPTION'\n ]\n\n /**\n * Codes that cause the SDK to throw immediately.\n *\n * Composed of:\n * - `BUILT_IN_HARD_ERROR_CODES` (always included)\n * - `NETWORK_ERROR` and `REQUEST_TIMEOUT` when `retryOnNetworkError === false`\n * - `RestrictionParams.hardErrorCodes` (user-provided extensions)\n */\n get exceptionCodeForHard(): string[] {\n const codes = [...RestrictionManager.BUILT_IN_HARD_ERROR_CODES]\n\n if (this.#config.retryOnNetworkError === false) {\n codes.push('NETWORK_ERROR', 'REQUEST_TIMEOUT')\n }\n\n if (this.#config.hardErrorCodes && this.#config.hardErrorCodes.length > 0) {\n codes.push(...this.#config.hardErrorCodes)\n }\n\n return codes\n }\n\n /**\n * Codes returned as `AjaxResult` with an `AjaxError` payload instead of thrown.\n *\n * Composed of:\n * - `BUILT_IN_SOFT_ERROR_CODES` (always included)\n * - `RestrictionParams.softErrorCodes` (user-provided extensions)\n */\n get exceptionCodeForSoft(): string[] {\n const codes = [...RestrictionManager.BUILT_IN_SOFT_ERROR_CODES]\n\n if (this.#config.softErrorCodes && this.#config.softErrorCodes.length > 0) {\n codes.push(...this.#config.softErrorCodes)\n }\n\n return codes\n }\n\n /**\n * Delay due to unknown errors\n */\n async #getErrorBackoff(_requestId: string): Promise<number> {\n return this.#config.retryDelay!\n }\n\n incrementError(method: string): void {\n const current = this.#errorCounts.get(method) || 0\n this.#errorCounts.set(method, current + 1)\n this.incrementStats('consecutiveErrors')\n }\n\n resetErrors(method: string): void {\n this.#errorCounts.delete(method)\n this.#stats.consecutiveErrors = 0\n }\n\n incrementStats(stat: keyof Pick<RestrictionManagerStats, 'retries' | 'consecutiveErrors' | 'limitHits'>): void {\n this.#stats[stat]++\n }\n\n /**\n * Returns job statistics\n */\n getStats(): RestrictionManagerStats & {\n adaptiveDelayAvg: number\n errorCounts: Record<string, number>\n } {\n return {\n ...this.#stats,\n ...this.#rateLimiter.getStats(),\n ...this.#adaptiveDelayer.getStats(),\n ...this.#operatingLimiter.getStats(),\n errorCounts: Object.fromEntries(this.#errorCounts)\n }\n }\n\n /**\n * Resets limiters and statistics\n */\n async reset(): Promise<void> {\n await this.#rateLimiter.reset()\n await this.#operatingLimiter.reset()\n await this.#adaptiveDelayer.reset()\n this.#errorCounts.clear()\n\n this.#stats = {\n retries: 0,\n consecutiveErrors: 0,\n limitHits: 0\n }\n }\n\n async setConfig(params: RestrictionParams): Promise<void> {\n this.#config = params\n await this.#rateLimiter.setConfig(params.rateLimit!)\n await this.#operatingLimiter.setConfig(params.operatingLimit!)\n await this.#adaptiveDelayer.setConfig(params.adaptiveConfig!)\n }\n\n getParams(): RestrictionParams {\n return { ...this.#config }\n }\n\n /**\n * Delay function\n */\n async #delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Public access to the delay function\n */\n async waiteDelay(ms: number): Promise<void> {\n return this.#delay(ms)\n }\n\n // region Log ////\n #logMethodBlocked(limiter: string, requestId: string, method: string, wait: number) {\n this.getLogger().notice(`${limiter} blocked method ${method}`, {\n requestId,\n method,\n wait,\n limiter\n })\n }\n\n #logMethodBlockedWithTimes(limiter: string, requestId: string, method: string, wait: number, times: number) {\n this.getLogger().notice(`${limiter} blocked method ${method} | ${times} times`, {\n requestId,\n method,\n times,\n wait,\n limiter\n })\n }\n\n #logError(limiter: string, requestId: string, code: string, message: string, method: string, wait: number) {\n this.getLogger().error(`${limiter} recognized the ${code} error for the ${method} method`, {\n requestId,\n method,\n wait,\n limiter,\n error: {\n code,\n message\n }\n })\n }\n\n #logSomeError(requestId: string, code: string, message: string, method: string, wait: number) {\n this.getLogger().error(`recognized the ${code} error for the ${method} method`, {\n requestId,\n method,\n wait,\n error: {\n code,\n message\n }\n })\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.mjs","sources":["../../../../../src/core/http/limiters/manager.ts"],"sourcesContent":["import type { RestrictionParams, RestrictionManagerStats } from '../../../types/limiters'\nimport type { LoggerInterface } from '../../../types/logger'\nimport { LoggerFactory } from '../../../logger'\nimport { RateLimiter } from './rate-limiter'\nimport { OperatingLimiter } from './operating-limiter'\nimport { AdaptiveDelayer } from './adaptive-delayer'\n\n/**\n * Delay Management Manager\n *\n * @todo docs\n */\nexport class RestrictionManager {\n #rateLimiter: RateLimiter\n #operatingLimiter: OperatingLimiter\n #adaptiveDelayer: AdaptiveDelayer\n #config: RestrictionParams\n #stats: Pick<RestrictionManagerStats, 'retries' | 'consecutiveErrors' | 'limitHits'> = {\n /** Retry attempts */\n retries: 0,\n /** Consecutive errors */\n consecutiveErrors: 0,\n /** Limit triggers */\n limitHits: 0\n }\n\n #errorCounts = new Map<string, number>()\n\n private _logger: LoggerInterface\n\n constructor(params: RestrictionParams) {\n this._logger = LoggerFactory.createNullLogger()\n this.#config = params\n this.#rateLimiter = new RateLimiter(params.rateLimit!)\n this.#operatingLimiter = new OperatingLimiter(params.operatingLimit!)\n this.#adaptiveDelayer = new AdaptiveDelayer(params.adaptiveConfig!, this.#operatingLimiter)\n }\n\n // region Logger ////\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n this.#rateLimiter.setLogger(this._logger)\n this.#operatingLimiter.setLogger(this._logger)\n this.#adaptiveDelayer.setLogger(this._logger)\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n // endregion ////\n\n async applyOperatingLimits(requestId: string, method: string, params?: any): Promise<void> {\n // 1. Check operating limit\n const operatingWait = await this.#operatingLimiter.waitIfNeeded(requestId, method, params)\n if (operatingWait > 0) {\n this.incrementStats('limitHits')\n this.#logMethodBlocked(this.#operatingLimiter.getTitle(), requestId, method, operatingWait)\n await this.#delay(operatingWait)\n } else {\n // 2. Apply adaptive delay\n const adaptiveDelay = await this.#adaptiveDelayer.waitIfNeeded(requestId, method, params)\n if (adaptiveDelay > 0) {\n this.incrementStats('limitHits')\n this.#logMethodBlocked(this.#adaptiveDelayer.getTitle(), requestId, method, adaptiveDelay)\n await this.#delay(adaptiveDelay)\n }\n }\n }\n\n /**\n * Checks and waits for the rate limit\n * The loop is needed for parallel requests (Promise.all())\n */\n async checkRateLimit(requestId: string, method: string): Promise<void> {\n // 3. Apply rate limit\n let waitTime\n let times = 1\n do {\n waitTime = await this.#rateLimiter.waitIfNeeded(requestId, method)\n if (waitTime > 0) {\n this.incrementStats('limitHits')\n this.#logMethodBlockedWithTimes(this.#rateLimiter.getTitle(), requestId, method, waitTime, times)\n await this.#delay(waitTime)\n times++\n }\n } while (waitTime > 0)\n }\n\n async updateStats(\n requestId: string,\n method: string,\n timeData: any\n ): Promise<void> {\n await this.#operatingLimiter.updateStats(requestId, method, timeData)\n await this.#adaptiveDelayer.updateStats(requestId, method, timeData)\n await this.#rateLimiter.updateStats(requestId, method, timeData)\n }\n\n async handleError(\n requestId: string,\n method: string,\n params: any,\n error: any,\n attempt: number\n ): Promise<number> {\n // Rate limit exceeded\n if (this.#isRateLimitError(error)) {\n // Since this is error handling, we take into account the number of attempts\n const wait = (await this.#handleRateLimitExceeded(requestId)) * Math.pow(1.5, attempt)\n this.#logError(this.#rateLimiter.getTitle(), requestId, 'QUERY_LIMIT_EXCEEDED', error.message, method, wait)\n return wait\n }\n\n // Operating limit exceeded\n if (this.#isOperatingLimitError(error)) {\n // Since this is error handling, we will increase the minimum to 10 seconds.\n const wait = Math.max(10_000, await this.#handleOperatingLimitError(requestId, method, params, error))\n this.#logError(this.#operatingLimiter.getTitle(), requestId, 'OPERATION_TIME_LIMIT', error.message, method, wait)\n return wait\n }\n\n // Client errors (HTTP 4xx) are deterministic — retrying cannot change the\n // outcome, so fail fast regardless of whether the error code is enumerated.\n // 429 (rate/operating limit) is handled above; 408 (timeout) stays retryable.\n if (this.#isNonRetryableClientError(error)) {\n this.#logNonRetryableClientError(requestId, error?.code ? `${error.code}` : '?', error?.message ?? '', method, Number(error?.status ?? 0))\n return 0\n }\n\n // Other exceptions\n if (!this.#isNeedThrowError(error)) {\n // Since this is error handling, we take into account the number of attempts\n const baseDelay = await this.#getErrorBackoff(requestId)\n const maxDelay = Math.max(30_000, baseDelay)\n const delay = Math.min(maxDelay, baseDelay * Math.pow(2, attempt))\n\n // Add jitter to prevent thundering herd\n const jitter = delay * 0.1 * (Math.random() * 2 - 1) // ±10% jitter\n const wait = Math.max(100, delay + jitter)\n\n this.#logSomeError(requestId, error?.code ? `${error.code}` : '?', error.message, method, wait)\n\n return wait\n }\n\n return 0 // We don't repeat\n }\n\n /**\n * Checks if the error is a rate limit\n */\n #isRateLimitError(error: any): boolean {\n return error.status === 503\n || error.code === 'QUERY_LIMIT_EXCEEDED'\n }\n\n /**\n * Delay when exceeding the rate limit\n */\n async #handleRateLimitExceeded(requestId: string): Promise<number> {\n return this.#rateLimiter.handleExceeded(requestId)\n }\n\n /**\n * Checks if the error is an operating limit\n *\n * @memo `OPERATION_TIME_LIMIT` && `429` - obtained through practical means\n * @memo This doesn't work for `batch` queries.\n */\n #isOperatingLimitError(error: any): boolean {\n return error.status === 429\n || error.code === 'OPERATION_TIME_LIMIT'\n }\n\n /**\n * Operating limit error delay\n *\n * @memo Currently, the errors don't include timings for operations.\n * For this reason, we will take data from the previous request\n */\n async #handleOperatingLimitError(requestId: string, method: string, params?: any, _error?: any): Promise<number> {\n return this.#operatingLimiter.getTimeToFree(requestId, method, params, _error)\n }\n\n /**\n * Checks if the error is a non-retryable client error (HTTP 4xx).\n *\n * `429` is excluded — it is handled as a rate/operating limit and is retried\n * with backoff. `408` (request timeout) is excluded — it is transient and is\n * governed by `retryOnNetworkError`.\n */\n #isNonRetryableClientError(error: any): boolean {\n const status = Number(error?.status ?? 0)\n if (Number.isNaN(status)) {\n return false\n }\n return status >= 400 && status < 500 && status !== 408 && status !== 429\n }\n\n /**\n * Checks whether attempts should be stopped if errors are encountered that are unclear.\n */\n #isNeedThrowError(error: any): boolean {\n const answerError = {\n code: error?.code ?? '-1',\n description: error?.message ?? ''\n }\n\n return [\n ...this.exceptionCodeForHard,\n ...this.exceptionCodeForSoft\n ].includes(answerError.code)\n || (answerError.description ?? '').includes('Could not find value for parameter')\n }\n\n /**\n * Built-in hard error codes (always throw, never retry).\n *\n * Includes authorization and fatal codes that must never be silently retried.\n * Use `RestrictionParams.hardErrorCodes` to extend this list with custom codes.\n */\n static readonly BUILT_IN_HARD_ERROR_CODES: readonly string[] = [\n 'ERR_BAD_REQUEST',\n 'JSSDK_UNKNOWN_ERROR',\n '100',\n 'INTERNAL_SERVER_ERROR', 'ERROR_UNEXPECTED_ANSWER', 'PORTAL_DELETED',\n 'ERROR_BATCH_METHOD_NOT_ALLOWED', 'ERROR_BATCH_LENGTH_EXCEEDED',\n 'NO_AUTH_FOUND',\n 'INVALID_REQUEST',\n 'OVERLOAD_LIMIT', 'expired_token',\n 'ACCESS_DENIED', 'INVALID_CREDENTIALS', 'user_access_error', 'insufficient_scope',\n 'ERROR_MANIFEST_IS_NOT_AVAILABLE',\n 'allowed_only_intranet_user',\n 'NOT_FOUND',\n 'INVALID_ARG_VALUE'\n ]\n\n /**\n * Built-in soft error codes (returned as `AjaxResult` with error, never thrown).\n *\n * Use `RestrictionParams.softErrorCodes` to extend this list with custom codes.\n */\n static readonly BUILT_IN_SOFT_ERROR_CODES: readonly string[] = [\n 'ERROR_ENTITY_NOT_FOUND',\n 'BITRIX_REST_V3_EXCEPTION_ACCESSDENIEDEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_INVALIDJSONEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_INVALIDFILTEREXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_INVALIDSELECTEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_ENTITYNOTFOUNDEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_METHODNOTFOUNDEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_UNKNOWNDTOPROPERTYEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_VALIDATION_REQUESTVALIDATIONEXCEPTION',\n 'BITRIX_REST_V3_EXCEPTION_VALIDATION_DTOVALIDATIONEXCEPTION'\n ]\n\n /**\n * Codes that cause the SDK to throw immediately.\n *\n * Composed of:\n * - `BUILT_IN_HARD_ERROR_CODES` (always included)\n * - `NETWORK_ERROR` and `REQUEST_TIMEOUT` when `retryOnNetworkError === false`\n * - `RestrictionParams.hardErrorCodes` (user-provided extensions)\n */\n get exceptionCodeForHard(): string[] {\n const codes = [...RestrictionManager.BUILT_IN_HARD_ERROR_CODES]\n\n if (this.#config.retryOnNetworkError === false) {\n codes.push('NETWORK_ERROR', 'REQUEST_TIMEOUT')\n }\n\n if (this.#config.hardErrorCodes && this.#config.hardErrorCodes.length > 0) {\n codes.push(...this.#config.hardErrorCodes)\n }\n\n return codes\n }\n\n /**\n * Codes returned as `AjaxResult` with an `AjaxError` payload instead of thrown.\n *\n * Composed of:\n * - `BUILT_IN_SOFT_ERROR_CODES` (always included)\n * - `RestrictionParams.softErrorCodes` (user-provided extensions)\n */\n get exceptionCodeForSoft(): string[] {\n const codes = [...RestrictionManager.BUILT_IN_SOFT_ERROR_CODES]\n\n if (this.#config.softErrorCodes && this.#config.softErrorCodes.length > 0) {\n codes.push(...this.#config.softErrorCodes)\n }\n\n return codes\n }\n\n /**\n * Delay due to unknown errors\n */\n async #getErrorBackoff(_requestId: string): Promise<number> {\n return this.#config.retryDelay!\n }\n\n incrementError(method: string): void {\n const current = this.#errorCounts.get(method) || 0\n this.#errorCounts.set(method, current + 1)\n this.incrementStats('consecutiveErrors')\n }\n\n resetErrors(method: string): void {\n this.#errorCounts.delete(method)\n this.#stats.consecutiveErrors = 0\n }\n\n incrementStats(stat: keyof Pick<RestrictionManagerStats, 'retries' | 'consecutiveErrors' | 'limitHits'>): void {\n this.#stats[stat]++\n }\n\n /**\n * Returns job statistics\n */\n getStats(): RestrictionManagerStats & {\n adaptiveDelayAvg: number\n errorCounts: Record<string, number>\n } {\n return {\n ...this.#stats,\n ...this.#rateLimiter.getStats(),\n ...this.#adaptiveDelayer.getStats(),\n ...this.#operatingLimiter.getStats(),\n errorCounts: Object.fromEntries(this.#errorCounts)\n }\n }\n\n /**\n * Resets limiters and statistics\n */\n async reset(): Promise<void> {\n await this.#rateLimiter.reset()\n await this.#operatingLimiter.reset()\n await this.#adaptiveDelayer.reset()\n this.#errorCounts.clear()\n\n this.#stats = {\n retries: 0,\n consecutiveErrors: 0,\n limitHits: 0\n }\n }\n\n async setConfig(params: RestrictionParams): Promise<void> {\n this.#config = params\n await this.#rateLimiter.setConfig(params.rateLimit!)\n await this.#operatingLimiter.setConfig(params.operatingLimit!)\n await this.#adaptiveDelayer.setConfig(params.adaptiveConfig!)\n }\n\n getParams(): RestrictionParams {\n return { ...this.#config }\n }\n\n /**\n * Delay function\n */\n async #delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n /**\n * Public access to the delay function\n */\n async waiteDelay(ms: number): Promise<void> {\n return this.#delay(ms)\n }\n\n // region Log ////\n #logMethodBlocked(limiter: string, requestId: string, method: string, wait: number) {\n this.getLogger().notice(`${limiter} blocked method ${method}`, {\n requestId,\n method,\n wait,\n limiter\n })\n }\n\n #logMethodBlockedWithTimes(limiter: string, requestId: string, method: string, wait: number, times: number) {\n this.getLogger().notice(`${limiter} blocked method ${method} | ${times} times`, {\n requestId,\n method,\n times,\n wait,\n limiter\n })\n }\n\n #logError(limiter: string, requestId: string, code: string, message: string, method: string, wait: number) {\n this.getLogger().error(`${limiter} recognized the ${code} error for the ${method} method`, {\n requestId,\n method,\n wait,\n limiter,\n error: {\n code,\n message\n }\n })\n }\n\n #logSomeError(requestId: string, code: string, message: string, method: string, wait: number) {\n this.getLogger().error(`recognized the ${code} error for the ${method} method`, {\n requestId,\n method,\n wait,\n error: {\n code,\n message\n }\n })\n }\n\n #logNonRetryableClientError(requestId: string, code: string, message: string, method: string, status: number) {\n this.getLogger().error(`client error ${status} (${code}) for the ${method} method is not retryable`, {\n requestId,\n method,\n status,\n error: {\n code,\n message\n }\n })\n }\n // endregion ////\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package @bitrix24/b24jssdk
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.2.0
|
|
4
4
|
* @copyright (c) 2026 Bitrix24
|
|
5
5
|
* @license MIT
|
|
6
6
|
* @see https://github.com/bitrix24/b24jssdk
|
|
@@ -88,7 +88,7 @@ class HttpV2 extends AbstractHttp {
|
|
|
88
88
|
}
|
|
89
89
|
const queryParams = new URLSearchParams({
|
|
90
90
|
[this._requestIdGenerator.getQueryStringParameterName()]: requestId,
|
|
91
|
-
[this._requestIdGenerator.getQueryStringSdkParameterName()]: "1.
|
|
91
|
+
[this._requestIdGenerator.getQueryStringSdkParameterName()]: "1.2.0",
|
|
92
92
|
[this._requestIdGenerator.getQueryStringSdkTypeParameterName()]: "b24-js-sdk"
|
|
93
93
|
});
|
|
94
94
|
return `${baseUrl}${methodUrl}?${queryParams.toString()}`;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @package @bitrix24/b24jssdk
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.2.0
|
|
4
4
|
* @copyright (c) 2026 Bitrix24
|
|
5
5
|
* @license MIT
|
|
6
6
|
* @see https://github.com/bitrix24/b24jssdk
|
|
@@ -82,7 +82,7 @@ class HttpV3 extends AbstractHttp {
|
|
|
82
82
|
const methodUrl = `/${encodeURIComponent(method)}`;
|
|
83
83
|
const queryParams = new URLSearchParams({
|
|
84
84
|
[this._requestIdGenerator.getQueryStringParameterName()]: requestId,
|
|
85
|
-
[this._requestIdGenerator.getQueryStringSdkParameterName()]: "1.
|
|
85
|
+
[this._requestIdGenerator.getQueryStringSdkParameterName()]: "1.2.0",
|
|
86
86
|
[this._requestIdGenerator.getQueryStringSdkTypeParameterName()]: "b24-js-sdk"
|
|
87
87
|
});
|
|
88
88
|
return `${baseUrl}${methodUrl}?${queryParams.toString()}`;
|