@bitrix24/b24jssdk 1.2.0 → 2.0.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 +6 -5
- package/README.md +2 -0
- package/dist/cjs/_virtual/_commonjsHelpers.cjs +19 -0
- package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +1 -0
- package/dist/cjs/_virtual/protobuf.cjs +20 -0
- package/dist/cjs/_virtual/protobuf.cjs.map +1 -0
- package/dist/cjs/_virtual/protobuf2.cjs +14 -0
- package/dist/cjs/_virtual/protobuf2.cjs.map +1 -0
- package/dist/cjs/core/abstract-b24.cjs +357 -0
- package/dist/cjs/core/abstract-b24.cjs.map +1 -0
- package/dist/cjs/core/actions/abstract-action.cjs +26 -0
- package/dist/cjs/core/actions/abstract-action.cjs.map +1 -0
- package/dist/cjs/core/actions/abstract-batch.cjs +97 -0
- package/dist/cjs/core/actions/abstract-batch.cjs.map +1 -0
- package/dist/cjs/core/actions/manager.cjs +55 -0
- package/dist/cjs/core/actions/manager.cjs.map +1 -0
- package/dist/cjs/core/actions/v2/batch-by-chunk.cjs +95 -0
- package/dist/cjs/core/actions/v2/batch-by-chunk.cjs.map +1 -0
- package/dist/cjs/core/actions/v2/batch.cjs +128 -0
- package/dist/cjs/core/actions/v2/batch.cjs.map +1 -0
- package/dist/cjs/core/actions/v2/call-list.cjs +144 -0
- package/dist/cjs/core/actions/v2/call-list.cjs.map +1 -0
- package/dist/cjs/core/actions/v2/call.cjs +56 -0
- package/dist/cjs/core/actions/v2/call.cjs.map +1 -0
- package/dist/cjs/core/actions/v2/fetch-list.cjs +145 -0
- package/dist/cjs/core/actions/v2/fetch-list.cjs.map +1 -0
- package/dist/cjs/core/actions/v2/manager-v2.cjs +76 -0
- package/dist/cjs/core/actions/v2/manager-v2.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/_keyset-paginate.cjs +69 -0
- package/dist/cjs/core/actions/v3/_keyset-paginate.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/aggregate.cjs +96 -0
- package/dist/cjs/core/actions/v3/aggregate.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/batch-by-chunk.cjs +93 -0
- package/dist/cjs/core/actions/v3/batch-by-chunk.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/batch.cjs +122 -0
- package/dist/cjs/core/actions/v3/batch.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/call-list.cjs +126 -0
- package/dist/cjs/core/actions/v3/call-list.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/call-tail.cjs +118 -0
- package/dist/cjs/core/actions/v3/call-tail.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/call.cjs +51 -0
- package/dist/cjs/core/actions/v3/call.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/fetch-list.cjs +122 -0
- package/dist/cjs/core/actions/v3/fetch-list.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/fetch-tail.cjs +112 -0
- package/dist/cjs/core/actions/v3/fetch-tail.cjs.map +1 -0
- package/dist/cjs/core/actions/v3/manager-v3.cjs +100 -0
- package/dist/cjs/core/actions/v3/manager-v3.cjs.map +1 -0
- package/dist/cjs/core/http/abstract-http.cjs +641 -0
- package/dist/cjs/core/http/abstract-http.cjs.map +1 -0
- package/dist/cjs/core/http/ajax-error.cjs +113 -0
- package/dist/cjs/core/http/ajax-error.cjs.map +1 -0
- package/dist/cjs/core/http/ajax-result.cjs +219 -0
- package/dist/cjs/core/http/ajax-result.cjs.map +1 -0
- package/dist/cjs/core/http/limiters/adaptive-delayer.cjs +137 -0
- package/dist/cjs/core/http/limiters/adaptive-delayer.cjs.map +1 -0
- package/dist/cjs/core/http/limiters/manager.cjs +373 -0
- package/dist/cjs/core/http/limiters/manager.cjs.map +1 -0
- package/dist/cjs/core/http/limiters/operating-limiter.cjs +173 -0
- package/dist/cjs/core/http/limiters/operating-limiter.cjs.map +1 -0
- package/dist/cjs/core/http/limiters/params-factory.cjs +124 -0
- package/dist/cjs/core/http/limiters/params-factory.cjs.map +1 -0
- package/dist/cjs/core/http/limiters/rate-limiter.cjs +404 -0
- package/dist/cjs/core/http/limiters/rate-limiter.cjs.map +1 -0
- package/dist/cjs/core/http/redact.cjs +85 -0
- package/dist/cjs/core/http/redact.cjs.map +1 -0
- package/dist/cjs/core/http/v2.cjs +85 -0
- package/dist/cjs/core/http/v2.cjs.map +1 -0
- package/dist/cjs/core/http/v3.cjs +82 -0
- package/dist/cjs/core/http/v3.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/abstract-interaction-batch.cjs +71 -0
- package/dist/cjs/core/interaction/batch/abstract-interaction-batch.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/parse-row.cjs +69 -0
- package/dist/cjs/core/interaction/batch/parse-row.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/interface-strategy.cjs +87 -0
- package/dist/cjs/core/interaction/batch/processing/interface-strategy.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/v2/abstract-processing.cjs +138 -0
- package/dist/cjs/core/interaction/batch/processing/v2/abstract-processing.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/v2/as-array.cjs +34 -0
- package/dist/cjs/core/interaction/batch/processing/v2/as-array.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/v2/as-object.cjs +34 -0
- package/dist/cjs/core/interaction/batch/processing/v2/as-object.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/v3/abstract-processing.cjs +115 -0
- package/dist/cjs/core/interaction/batch/processing/v3/abstract-processing.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/v3/as-array.cjs +34 -0
- package/dist/cjs/core/interaction/batch/processing/v3/as-array.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/processing/v3/as-object.cjs +34 -0
- package/dist/cjs/core/interaction/batch/processing/v3/as-object.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/v2.cjs +47 -0
- package/dist/cjs/core/interaction/batch/v2.cjs.map +1 -0
- package/dist/cjs/core/interaction/batch/v3.cjs +45 -0
- package/dist/cjs/core/interaction/batch/v3.cjs.map +1 -0
- package/dist/cjs/core/language/list.cjs +59 -0
- package/dist/cjs/core/language/list.cjs.map +1 -0
- package/dist/cjs/core/request-id-generator.cjs +44 -0
- package/dist/cjs/core/request-id-generator.cjs.map +1 -0
- package/dist/cjs/core/result.cjs +137 -0
- package/dist/cjs/core/result.cjs.map +1 -0
- package/dist/cjs/core/sdk-error.cjs +85 -0
- package/dist/cjs/core/sdk-error.cjs.map +1 -0
- package/dist/cjs/core/tools/abstract-tool.cjs +26 -0
- package/dist/cjs/core/tools/abstract-tool.cjs.map +1 -0
- package/dist/cjs/core/tools/healthcheck.cjs +50 -0
- package/dist/cjs/core/tools/healthcheck.cjs.map +1 -0
- package/dist/cjs/core/tools/manager.cjs +52 -0
- package/dist/cjs/core/tools/manager.cjs.map +1 -0
- package/dist/cjs/core/tools/ping.cjs +58 -0
- package/dist/cjs/core/tools/ping.cjs.map +1 -0
- package/dist/cjs/core/version-manager.cjs +57 -0
- package/dist/cjs/core/version-manager.cjs.map +1 -0
- package/dist/cjs/frame/auth.cjs +100 -0
- package/dist/cjs/frame/auth.cjs.map +1 -0
- package/dist/cjs/frame/b24.cjs +178 -0
- package/dist/cjs/frame/b24.cjs.map +1 -0
- package/dist/cjs/frame/dialog.cjs +120 -0
- package/dist/cjs/frame/dialog.cjs.map +1 -0
- package/dist/cjs/frame/frame.cjs +103 -0
- package/dist/cjs/frame/frame.cjs.map +1 -0
- package/dist/cjs/frame/message/commands.cjs +39 -0
- package/dist/cjs/frame/message/commands.cjs.map +1 -0
- package/dist/cjs/frame/message/controller.cjs +191 -0
- package/dist/cjs/frame/message/controller.cjs.map +1 -0
- package/dist/cjs/frame/options.cjs +108 -0
- package/dist/cjs/frame/options.cjs.map +1 -0
- package/dist/cjs/frame/parent.cjs +259 -0
- package/dist/cjs/frame/parent.cjs.map +1 -0
- package/dist/cjs/frame/placement.cjs +156 -0
- package/dist/cjs/frame/placement.cjs.map +1 -0
- package/dist/cjs/frame/slider.cjs +162 -0
- package/dist/cjs/frame/slider.cjs.map +1 -0
- package/dist/cjs/helper/abstract-helper.cjs +55 -0
- package/dist/cjs/helper/abstract-helper.cjs.map +1 -0
- package/dist/cjs/helper/app-manager.cjs +39 -0
- package/dist/cjs/helper/app-manager.cjs.map +1 -0
- package/dist/cjs/helper/currency-manager.cjs +215 -0
- package/dist/cjs/helper/currency-manager.cjs.map +1 -0
- package/dist/cjs/helper/helper-manager.cjs +397 -0
- package/dist/cjs/helper/helper-manager.cjs.map +1 -0
- package/dist/cjs/helper/license-manager.cjs +52 -0
- package/dist/cjs/helper/license-manager.cjs.map +1 -0
- package/dist/cjs/helper/options-manager.cjs +205 -0
- package/dist/cjs/helper/options-manager.cjs.map +1 -0
- package/dist/cjs/helper/payment-manager.cjs +35 -0
- package/dist/cjs/helper/payment-manager.cjs.map +1 -0
- package/dist/cjs/helper/profile-manager.cjs +35 -0
- package/dist/cjs/helper/profile-manager.cjs.map +1 -0
- package/dist/cjs/helper/use-b24-helper.cjs +85 -0
- package/dist/cjs/helper/use-b24-helper.cjs.map +1 -0
- package/dist/cjs/hook/auth.cjs +79 -0
- package/dist/cjs/hook/auth.cjs.map +1 -0
- package/dist/cjs/hook/b24.cjs +117 -0
- package/dist/cjs/hook/b24.cjs.map +1 -0
- package/dist/cjs/index.cjs +176 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +6415 -0
- package/dist/cjs/index.d.mts +6415 -0
- package/dist/cjs/index.d.ts +6415 -0
- package/dist/cjs/loader-b24frame.cjs +103 -0
- package/dist/cjs/loader-b24frame.cjs.map +1 -0
- package/dist/cjs/logger/abstract-logger.cjs +71 -0
- package/dist/cjs/logger/abstract-logger.cjs.map +1 -0
- package/dist/cjs/logger/browser.cjs +165 -0
- package/dist/cjs/logger/browser.cjs.map +1 -0
- package/dist/cjs/logger/formatter/abstract-formatter.cjs +36 -0
- package/dist/cjs/logger/formatter/abstract-formatter.cjs.map +1 -0
- package/dist/cjs/logger/formatter/json-formatter.cjs +36 -0
- package/dist/cjs/logger/formatter/json-formatter.cjs.map +1 -0
- package/dist/cjs/logger/formatter/line-formatter.cjs +43 -0
- package/dist/cjs/logger/formatter/line-formatter.cjs.map +1 -0
- package/dist/cjs/logger/formatter/telegram-formatter.cjs +105 -0
- package/dist/cjs/logger/formatter/telegram-formatter.cjs.map +1 -0
- package/dist/cjs/logger/handler/abstract-handler.cjs +41 -0
- package/dist/cjs/logger/handler/abstract-handler.cjs.map +1 -0
- package/dist/cjs/logger/handler/consola-adapter.cjs +64 -0
- package/dist/cjs/logger/handler/consola-adapter.cjs.map +1 -0
- package/dist/cjs/logger/handler/console-handler.cjs +100 -0
- package/dist/cjs/logger/handler/console-handler.cjs.map +1 -0
- package/dist/cjs/logger/handler/console-v2-handler.cjs +53 -0
- package/dist/cjs/logger/handler/console-v2-handler.cjs.map +1 -0
- package/dist/cjs/logger/handler/memory-handler.cjs +50 -0
- package/dist/cjs/logger/handler/memory-handler.cjs.map +1 -0
- package/dist/cjs/logger/handler/stream-handler.cjs +75 -0
- package/dist/cjs/logger/handler/stream-handler.cjs.map +1 -0
- package/dist/cjs/logger/handler/telegram-handler.cjs +159 -0
- package/dist/cjs/logger/handler/telegram-handler.cjs.map +1 -0
- package/dist/cjs/logger/handler/winston-adapter.cjs +59 -0
- package/dist/cjs/logger/handler/winston-adapter.cjs.map +1 -0
- package/dist/cjs/logger/logger-factory.cjs +69 -0
- package/dist/cjs/logger/logger-factory.cjs.map +1 -0
- package/dist/cjs/logger/logger.cjs +78 -0
- package/dist/cjs/logger/logger.cjs.map +1 -0
- package/dist/cjs/logger/null-logger.cjs +34 -0
- package/dist/cjs/logger/null-logger.cjs.map +1 -0
- package/dist/cjs/logger/processor/memory-usage-processor.cjs +22 -0
- package/dist/cjs/logger/processor/memory-usage-processor.cjs.map +1 -0
- package/dist/cjs/logger/processor/pid-processor.cjs +22 -0
- package/dist/cjs/logger/processor/pid-processor.cjs.map +1 -0
- package/dist/cjs/oauth/auth.cjs +214 -0
- package/dist/cjs/oauth/auth.cjs.map +1 -0
- package/dist/cjs/oauth/b24.cjs +119 -0
- package/dist/cjs/oauth/b24.cjs.map +1 -0
- package/dist/cjs/oauth/refresh-token-error.cjs +22 -0
- package/dist/cjs/oauth/refresh-token-error.cjs.map +1 -0
- package/dist/cjs/pullClient/abstract-connector.cjs +80 -0
- package/dist/cjs/pullClient/abstract-connector.cjs.map +1 -0
- package/dist/cjs/pullClient/channel-manager.cjs +91 -0
- package/dist/cjs/pullClient/channel-manager.cjs.map +1 -0
- package/dist/cjs/pullClient/client.cjs +2177 -0
- package/dist/cjs/pullClient/client.cjs.map +1 -0
- package/dist/cjs/pullClient/errors.cjs +34 -0
- package/dist/cjs/pullClient/errors.cjs.map +1 -0
- package/dist/cjs/pullClient/json-rpc.cjs +213 -0
- package/dist/cjs/pullClient/json-rpc.cjs.map +1 -0
- package/dist/cjs/pullClient/long-polling-connector.cjs +159 -0
- package/dist/cjs/pullClient/long-polling-connector.cjs.map +1 -0
- package/dist/cjs/pullClient/protobuf/index.cjs +22 -0
- package/dist/cjs/pullClient/protobuf/index.cjs.map +1 -0
- package/dist/cjs/pullClient/protobuf/model.cjs +1060 -0
- package/dist/cjs/pullClient/protobuf/model.cjs.map +1 -0
- package/dist/cjs/pullClient/protobuf/protobuf.cjs +4655 -0
- package/dist/cjs/pullClient/protobuf/protobuf.cjs.map +1 -0
- package/dist/cjs/pullClient/shared-config.cjs +135 -0
- package/dist/cjs/pullClient/shared-config.cjs.map +1 -0
- package/dist/cjs/pullClient/storage-manager.cjs +74 -0
- package/dist/cjs/pullClient/storage-manager.cjs.map +1 -0
- package/dist/cjs/pullClient/web-socket-connector.cjs +131 -0
- package/dist/cjs/pullClient/web-socket-connector.cjs.map +1 -0
- package/dist/cjs/tools/batch-ref-v3.cjs +54 -0
- package/dist/cjs/tools/batch-ref-v3.cjs.map +1 -0
- package/dist/cjs/tools/browser.cjs +156 -0
- package/dist/cjs/tools/browser.cjs.map +1 -0
- package/dist/cjs/tools/environment.cjs +32 -0
- package/dist/cjs/tools/environment.cjs.map +1 -0
- package/dist/cjs/tools/filter-v3.cjs +139 -0
- package/dist/cjs/tools/filter-v3.cjs.map +1 -0
- package/dist/cjs/tools/formatters/iban.cjs +307 -0
- package/dist/cjs/tools/formatters/iban.cjs.map +1 -0
- package/dist/cjs/tools/formatters/numbers.cjs +68 -0
- package/dist/cjs/tools/formatters/numbers.cjs.map +1 -0
- package/dist/cjs/tools/index.cjs +42 -0
- package/dist/cjs/tools/index.cjs.map +1 -0
- package/dist/cjs/tools/scroll-size.cjs +29 -0
- package/dist/cjs/tools/scroll-size.cjs.map +1 -0
- package/dist/cjs/tools/text.cjs +210 -0
- package/dist/cjs/tools/text.cjs.map +1 -0
- package/dist/cjs/tools/type.cjs +339 -0
- package/dist/cjs/tools/type.cjs.map +1 -0
- package/dist/cjs/tools/use-formatters.cjs +462 -0
- package/dist/cjs/tools/use-formatters.cjs.map +1 -0
- package/dist/cjs/tools/uuidv7.cjs +58 -0
- package/dist/cjs/tools/uuidv7.cjs.map +1 -0
- package/dist/cjs/types/b24-helper.cjs +62 -0
- package/dist/cjs/types/b24-helper.cjs.map +1 -0
- package/dist/cjs/types/b24.cjs +18 -0
- package/dist/cjs/types/b24.cjs.map +1 -0
- package/dist/cjs/types/bizproc/index.cjs +195 -0
- package/dist/cjs/types/bizproc/index.cjs.map +1 -0
- package/dist/cjs/types/catalog/index.cjs +39 -0
- package/dist/cjs/types/catalog/index.cjs.map +1 -0
- package/dist/cjs/types/common.cjs +33 -0
- package/dist/cjs/types/common.cjs.map +1 -0
- package/dist/cjs/types/crm/entity-type.cjs +62 -0
- package/dist/cjs/types/crm/entity-type.cjs.map +1 -0
- package/dist/cjs/types/crm/productrow.cjs +19 -0
- package/dist/cjs/types/crm/productrow.cjs.map +1 -0
- package/dist/cjs/types/logger.cjs +24 -0
- package/dist/cjs/types/logger.cjs.map +1 -0
- package/dist/cjs/types/pull.cjs +94 -0
- package/dist/cjs/types/pull.cjs.map +1 -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 +1 -1
- package/dist/esm/core/actions/v2/call-list.mjs +17 -10
- package/dist/esm/core/actions/v2/call-list.mjs.map +1 -1
- package/dist/esm/core/actions/v2/call.mjs +1 -15
- package/dist/esm/core/actions/v2/call.mjs.map +1 -1
- package/dist/esm/core/actions/v2/fetch-list.mjs +17 -10
- package/dist/esm/core/actions/v2/fetch-list.mjs.map +1 -1
- package/dist/esm/core/actions/v2/manager-v2.mjs +6 -6
- package/dist/esm/core/actions/v2/manager-v2.mjs.map +1 -1
- package/dist/esm/core/actions/v3/_keyset-paginate.mjs +66 -0
- package/dist/esm/core/actions/v3/_keyset-paginate.mjs.map +1 -0
- package/dist/esm/core/actions/v3/aggregate.mjs +94 -0
- package/dist/esm/core/actions/v3/aggregate.mjs.map +1 -0
- package/dist/esm/core/actions/v3/batch-by-chunk.mjs +1 -1
- package/dist/esm/core/actions/v3/batch.mjs +1 -10
- package/dist/esm/core/actions/v3/batch.mjs.map +1 -1
- package/dist/esm/core/actions/v3/call-list.mjs +40 -47
- package/dist/esm/core/actions/v3/call-list.mjs.map +1 -1
- package/dist/esm/core/actions/v3/call-tail.mjs +116 -0
- package/dist/esm/core/actions/v3/call-tail.mjs.map +1 -0
- package/dist/esm/core/actions/v3/call.mjs +1 -10
- package/dist/esm/core/actions/v3/call.mjs.map +1 -1
- package/dist/esm/core/actions/v3/fetch-list.mjs +34 -44
- package/dist/esm/core/actions/v3/fetch-list.mjs.map +1 -1
- package/dist/esm/core/actions/v3/fetch-tail.mjs +110 -0
- package/dist/esm/core/actions/v3/fetch-tail.mjs.map +1 -0
- package/dist/esm/core/actions/v3/manager-v3.mjs +30 -6
- package/dist/esm/core/actions/v3/manager-v3.mjs.map +1 -1
- package/dist/esm/core/http/abstract-http.mjs +96 -21
- package/dist/esm/core/http/abstract-http.mjs.map +1 -1
- package/dist/esm/core/http/ajax-error.mjs +1 -1
- package/dist/esm/core/http/ajax-result.mjs +9 -8
- package/dist/esm/core/http/ajax-result.mjs.map +1 -1
- package/dist/esm/core/http/limiters/adaptive-delayer.mjs +1 -1
- package/dist/esm/core/http/limiters/manager.mjs +2 -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 +41 -13
- package/dist/esm/core/http/redact.mjs.map +1 -1
- package/dist/esm/core/http/v2.mjs +1 -18
- package/dist/esm/core/http/v2.mjs.map +1 -1
- package/dist/esm/core/http/v3.mjs +1 -15
- package/dist/esm/core/http/v3.mjs.map +1 -1
- 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 +44 -1
- package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs.map +1 -1
- package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs +7 -6
- package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs.map +1 -1
- package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs +3 -3
- package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs.map +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 +7 -19
- package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs.map +1 -1
- package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs +3 -3
- package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs.map +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 +35 -1
- package/dist/esm/core/result.mjs.map +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 +3 -3
- package/dist/esm/core/tools/manager.mjs.map +1 -1
- package/dist/esm/core/tools/ping.mjs +1 -1
- package/dist/esm/core/version-manager.mjs +19 -80
- package/dist/esm/core/version-manager.mjs.map +1 -1
- package/dist/esm/frame/auth.mjs +1 -1
- package/dist/esm/frame/b24.mjs +8 -2
- package/dist/esm/frame/b24.mjs.map +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 +17 -6
- package/dist/esm/frame/message/controller.mjs.map +1 -1
- package/dist/esm/frame/options.mjs +1 -1
- package/dist/esm/frame/parent.mjs +6 -2
- package/dist/esm/frame/parent.mjs.map +1 -1
- package/dist/esm/frame/placement.mjs +1 -1
- package/dist/esm/frame/slider.mjs +5 -1
- package/dist/esm/frame/slider.mjs.map +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 +3 -3
- package/dist/esm/hook/b24.mjs.map +1 -1
- package/dist/esm/index.d.mts +501 -49
- package/dist/esm/index.d.ts +501 -49
- package/dist/esm/index.mjs +3 -1
- package/dist/esm/index.mjs.map +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 +13 -16
- package/dist/esm/oauth/auth.mjs.map +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 +141 -30
- package/dist/esm/pullClient/client.mjs.map +1 -1
- package/dist/esm/pullClient/errors.mjs +1 -1
- package/dist/esm/pullClient/json-rpc.mjs +5 -4
- package/dist/esm/pullClient/json-rpc.mjs.map +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 +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/batch-ref-v3.mjs +52 -0
- package/dist/esm/tools/batch-ref-v3.mjs.map +1 -0
- package/dist/esm/tools/browser.mjs +1 -1
- package/dist/esm/tools/environment.mjs +1 -1
- package/dist/esm/tools/filter-v3.mjs +137 -0
- package/dist/esm/tools/filter-v3.mjs.map +1 -0
- 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 +1384 -680
- package/dist/umd/index.js.map +1 -1
- package/dist/umd/index.min.js +26 -26
- package/dist/umd/index.min.js.map +1 -1
- package/dist/umd/package.json +3 -0
- package/package.json +12 -4
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @package @bitrix24/b24jssdk
|
|
3
|
+
* @version 2.0.0
|
|
4
|
+
* @copyright (c) 2026 Bitrix24
|
|
5
|
+
* @license MIT
|
|
6
|
+
* @see https://github.com/bitrix24/b24jssdk
|
|
7
|
+
* @see https://bitrix24.github.io/b24jssdk/
|
|
8
|
+
*/
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
var __defProp = Object.defineProperty;
|
|
12
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
13
|
+
class ParamsFactory {
|
|
14
|
+
static {
|
|
15
|
+
__name(this, "ParamsFactory");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Default parameters for regular tariffs
|
|
19
|
+
*
|
|
20
|
+
* @see Http.#restrictionParams
|
|
21
|
+
*/
|
|
22
|
+
static getDefault() {
|
|
23
|
+
return {
|
|
24
|
+
rateLimit: {
|
|
25
|
+
burstLimit: 50,
|
|
26
|
+
drainRate: 2,
|
|
27
|
+
adaptiveEnabled: true
|
|
28
|
+
},
|
|
29
|
+
operatingLimit: {
|
|
30
|
+
windowMs: 6e5,
|
|
31
|
+
// 10 min
|
|
32
|
+
limitMs: 48e4,
|
|
33
|
+
// 480 sec
|
|
34
|
+
heavyPercent: 80
|
|
35
|
+
},
|
|
36
|
+
adaptiveConfig: {
|
|
37
|
+
enabled: true,
|
|
38
|
+
thresholdPercent: 80,
|
|
39
|
+
coefficient: 0.01,
|
|
40
|
+
maxDelay: 7e3
|
|
41
|
+
},
|
|
42
|
+
maxRetries: 3,
|
|
43
|
+
retryDelay: 1e3,
|
|
44
|
+
retryOnNetworkError: true
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parameters for the Enterprise plan
|
|
49
|
+
*/
|
|
50
|
+
static getEnterprise() {
|
|
51
|
+
return {
|
|
52
|
+
...this.getDefault(),
|
|
53
|
+
rateLimit: {
|
|
54
|
+
burstLimit: 250,
|
|
55
|
+
drainRate: 5,
|
|
56
|
+
adaptiveEnabled: true
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parameters for bulk data processing
|
|
62
|
+
*/
|
|
63
|
+
static getBatchProcessing() {
|
|
64
|
+
return {
|
|
65
|
+
...this.getDefault(),
|
|
66
|
+
rateLimit: {
|
|
67
|
+
burstLimit: 30,
|
|
68
|
+
drainRate: 1,
|
|
69
|
+
adaptiveEnabled: true
|
|
70
|
+
},
|
|
71
|
+
operatingLimit: {
|
|
72
|
+
windowMs: 6e5,
|
|
73
|
+
limitMs: 48e4,
|
|
74
|
+
heavyPercent: 50
|
|
75
|
+
// Higher threshold for notifications
|
|
76
|
+
},
|
|
77
|
+
adaptiveConfig: {
|
|
78
|
+
enabled: true,
|
|
79
|
+
thresholdPercent: 50,
|
|
80
|
+
// More threshold
|
|
81
|
+
coefficient: 0.015,
|
|
82
|
+
// More pause
|
|
83
|
+
maxDelay: 1e4
|
|
84
|
+
// Max 10 seconds
|
|
85
|
+
},
|
|
86
|
+
maxRetries: 5
|
|
87
|
+
// More attempts
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Real-time parameters
|
|
92
|
+
*/
|
|
93
|
+
static getRealtime() {
|
|
94
|
+
return {
|
|
95
|
+
...this.getDefault(),
|
|
96
|
+
adaptiveConfig: {
|
|
97
|
+
enabled: false,
|
|
98
|
+
// Off
|
|
99
|
+
thresholdPercent: 100,
|
|
100
|
+
coefficient: 1e-3,
|
|
101
|
+
maxDelay: 48e4
|
|
102
|
+
},
|
|
103
|
+
maxRetries: 1
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Tariff plan based parameters
|
|
108
|
+
*/
|
|
109
|
+
static fromTariffPlan(plan) {
|
|
110
|
+
switch (plan.toLowerCase()) {
|
|
111
|
+
case "enterprise":
|
|
112
|
+
return this.getEnterprise();
|
|
113
|
+
case "company":
|
|
114
|
+
case "start":
|
|
115
|
+
case "standard":
|
|
116
|
+
case "basic":
|
|
117
|
+
default:
|
|
118
|
+
return this.getDefault();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
exports.ParamsFactory = ParamsFactory;
|
|
124
|
+
//# sourceMappingURL=params-factory.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params-factory.cjs","sources":["../../../../../src/core/http/limiters/params-factory.ts"],"sourcesContent":["import type { RestrictionParams } from '../../../types/limiters'\n\n/**\n * Factory for creating constraint parameters\n */\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport class ParamsFactory {\n /**\n * Default parameters for regular tariffs\n *\n * @see Http.#restrictionParams\n */\n static getDefault(): RestrictionParams {\n return {\n rateLimit: {\n burstLimit: 50,\n drainRate: 2,\n adaptiveEnabled: true\n },\n operatingLimit: {\n windowMs: 600_000, // 10 min\n limitMs: 480_000, // 480 sec\n heavyPercent: 80\n },\n adaptiveConfig: {\n enabled: true,\n thresholdPercent: 80,\n coefficient: 0.01,\n maxDelay: 7_000\n },\n maxRetries: 3,\n retryDelay: 1_000,\n retryOnNetworkError: true\n }\n }\n\n /**\n * Parameters for the Enterprise plan\n */\n static getEnterprise(): RestrictionParams {\n return {\n ...this.getDefault(),\n rateLimit: {\n burstLimit: 250,\n drainRate: 5,\n adaptiveEnabled: true\n }\n }\n }\n\n /**\n * Parameters for bulk data processing\n */\n static getBatchProcessing(): RestrictionParams {\n return {\n ...this.getDefault(),\n rateLimit: {\n burstLimit: 30,\n drainRate: 1,\n adaptiveEnabled: true\n },\n operatingLimit: {\n windowMs: 600_000,\n limitMs: 480_000,\n heavyPercent: 50 // Higher threshold for notifications\n },\n adaptiveConfig: {\n enabled: true,\n thresholdPercent: 50, // More threshold\n coefficient: 0.015, // More pause\n maxDelay: 10_000 // Max 10 seconds\n },\n maxRetries: 5 // More attempts\n }\n }\n\n /**\n * Real-time parameters\n */\n static getRealtime(): RestrictionParams {\n return {\n ...this.getDefault(),\n adaptiveConfig: {\n enabled: false, // Off\n thresholdPercent: 100,\n coefficient: 0.001,\n maxDelay: 480_000\n },\n maxRetries: 1\n }\n }\n\n /**\n * Tariff plan based parameters\n */\n static fromTariffPlan(plan: string): RestrictionParams {\n switch (plan.toLowerCase()) {\n case 'enterprise':\n return this.getEnterprise()\n case 'company':\n case 'start':\n case 'standard':\n case 'basic':\n default:\n return this.getDefault()\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAMO,MAAM,aAAA,CAAc;AAAA,EAN3B;AAM2B,IAAA,MAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB,OAAO,UAAA,GAAgC;AACrC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW;AAAA,QACT,UAAA,EAAY,EAAA;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,eAAA,EAAiB;AAAA,OACnB;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,QAAA,EAAU,GAAA;AAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA;AAAA,QACT,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,IAAA;AAAA,QACT,gBAAA,EAAkB,EAAA;AAAA,QAClB,WAAA,EAAa,IAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,mBAAA,EAAqB;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,GAAmC;AACxC,IAAA,OAAO;AAAA,MACL,GAAG,KAAK,UAAA,EAAW;AAAA,MACnB,SAAA,EAAW;AAAA,QACT,UAAA,EAAY,GAAA;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,eAAA,EAAiB;AAAA;AACnB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAA,GAAwC;AAC7C,IAAA,OAAO;AAAA,MACL,GAAG,KAAK,UAAA,EAAW;AAAA,MACnB,SAAA,EAAW;AAAA,QACT,UAAA,EAAY,EAAA;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,eAAA,EAAiB;AAAA,OACnB;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,QAAA,EAAU,GAAA;AAAA,QACV,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc;AAAA;AAAA,OAChB;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,IAAA;AAAA,QACT,gBAAA,EAAkB,EAAA;AAAA;AAAA,QAClB,WAAA,EAAa,KAAA;AAAA;AAAA,QACb,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MACA,UAAA,EAAY;AAAA;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,GAAiC;AACtC,IAAA,OAAO;AAAA,MACL,GAAG,KAAK,UAAA,EAAW;AAAA,MACnB,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,KAAA;AAAA;AAAA,QACT,gBAAA,EAAkB,GAAA;AAAA,QAClB,WAAA,EAAa,IAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAe,IAAA,EAAiC;AACrD,IAAA,QAAQ,IAAA,CAAK,aAAY;AAAG,MAC1B,KAAK,YAAA;AACH,QAAA,OAAO,KAAK,aAAA,EAAc;AAAA,MAC5B,KAAK,SAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,OAAA;AAAA,MACL;AACE,QAAA,OAAO,KAAK,UAAA,EAAW;AAAA;AAC3B,EACF;AACF;;;;"}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @package @bitrix24/b24jssdk
|
|
3
|
+
* @version 2.0.0
|
|
4
|
+
* @copyright (c) 2026 Bitrix24
|
|
5
|
+
* @license MIT
|
|
6
|
+
* @see https://github.com/bitrix24/b24jssdk
|
|
7
|
+
* @see https://bitrix24.github.io/b24jssdk/
|
|
8
|
+
*/
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const loggerFactory = require('../../../logger/logger-factory.cjs');
|
|
12
|
+
|
|
13
|
+
var __defProp = Object.defineProperty;
|
|
14
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
15
|
+
class RateLimiter {
|
|
16
|
+
static {
|
|
17
|
+
__name(this, "RateLimiter");
|
|
18
|
+
}
|
|
19
|
+
#tokens;
|
|
20
|
+
#lastRefill;
|
|
21
|
+
#refillIntervalMs;
|
|
22
|
+
#config;
|
|
23
|
+
#lockQueue = [];
|
|
24
|
+
#originalConfig;
|
|
25
|
+
// Original configuration for recovery
|
|
26
|
+
#errorThreshold = 5;
|
|
27
|
+
// 60-second error threshold to reduce limits
|
|
28
|
+
#successThreshold = 20;
|
|
29
|
+
// Consecutive success threshold for restoring limits
|
|
30
|
+
#minDrainRate = 0.5;
|
|
31
|
+
// Minimum drain rate
|
|
32
|
+
#minBurstLimit = 5;
|
|
33
|
+
// Minimum burst limit
|
|
34
|
+
#errorTimestamps = [];
|
|
35
|
+
// Error timestamps (last 60 seconds)
|
|
36
|
+
#successTimestamps = [];
|
|
37
|
+
// Timestamps of successful requests
|
|
38
|
+
_logger;
|
|
39
|
+
constructor(config) {
|
|
40
|
+
this._logger = loggerFactory.LoggerFactory.createNullLogger();
|
|
41
|
+
this.#config = config;
|
|
42
|
+
this.#originalConfig = { ...config };
|
|
43
|
+
this.#tokens = config.burstLimit;
|
|
44
|
+
this.#lastRefill = Date.now();
|
|
45
|
+
this.#refillIntervalMs = 1e3 / config.drainRate;
|
|
46
|
+
}
|
|
47
|
+
getTitle() {
|
|
48
|
+
return "rateLimiter";
|
|
49
|
+
}
|
|
50
|
+
// region Logger ////
|
|
51
|
+
setLogger(logger) {
|
|
52
|
+
this._logger = logger;
|
|
53
|
+
}
|
|
54
|
+
getLogger() {
|
|
55
|
+
return this._logger;
|
|
56
|
+
}
|
|
57
|
+
// endregion ////
|
|
58
|
+
/**
|
|
59
|
+
* @inheritDoc
|
|
60
|
+
*/
|
|
61
|
+
async canProceed(requestId, _method, _params) {
|
|
62
|
+
await this.#acquireLock(requestId);
|
|
63
|
+
try {
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const timePassed = now - this.#lastRefill;
|
|
66
|
+
const refillAmount = timePassed * this.#config.drainRate / 1e3;
|
|
67
|
+
this.#tokens = Math.min(
|
|
68
|
+
this.#config.burstLimit,
|
|
69
|
+
this.#tokens + refillAmount
|
|
70
|
+
);
|
|
71
|
+
this.#lastRefill = now;
|
|
72
|
+
return this.#tokens >= 1;
|
|
73
|
+
} finally {
|
|
74
|
+
this.#releaseLock();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @inheritDoc
|
|
79
|
+
*/
|
|
80
|
+
async waitIfNeeded(requestId, _method, _params) {
|
|
81
|
+
await this.#acquireLock(requestId);
|
|
82
|
+
try {
|
|
83
|
+
const now = Date.now();
|
|
84
|
+
const timePassed = now - this.#lastRefill;
|
|
85
|
+
const refillAmount = timePassed * this.#config.drainRate / 1e3;
|
|
86
|
+
this.#tokens = Math.min(
|
|
87
|
+
this.#config.burstLimit,
|
|
88
|
+
this.#tokens + refillAmount
|
|
89
|
+
);
|
|
90
|
+
this.#lastRefill = now;
|
|
91
|
+
if (this.#tokens >= 1) {
|
|
92
|
+
this.#tokens -= 1;
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
const deficit = 1 - this.#tokens;
|
|
96
|
+
return Math.ceil(deficit * this.#refillIntervalMs);
|
|
97
|
+
} finally {
|
|
98
|
+
this.#releaseLock();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Error handler.
|
|
103
|
+
* If there are a lot of errors, we'll lower the limits.
|
|
104
|
+
*/
|
|
105
|
+
async handleExceeded(requestId) {
|
|
106
|
+
await this.#acquireLock(requestId);
|
|
107
|
+
try {
|
|
108
|
+
this.#recordError();
|
|
109
|
+
if (this.#config.adaptiveEnabled && this.#shouldReduceLimits()) {
|
|
110
|
+
this.#reduceLimits(requestId);
|
|
111
|
+
}
|
|
112
|
+
this.#tokens = 0;
|
|
113
|
+
return this.#refillIntervalMs + 1e3;
|
|
114
|
+
} finally {
|
|
115
|
+
this.#releaseLock();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Successful request handler.
|
|
120
|
+
* If everything is OK, we'll restore the limits.
|
|
121
|
+
*/
|
|
122
|
+
async updateStats(requestId, method, _data) {
|
|
123
|
+
if (method.startsWith("batch::")) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
await this.#acquireLock(requestId);
|
|
127
|
+
try {
|
|
128
|
+
this.#recordSuccess();
|
|
129
|
+
if (this.#config.adaptiveEnabled) {
|
|
130
|
+
this.#logStat(requestId);
|
|
131
|
+
}
|
|
132
|
+
if (this.#config.adaptiveEnabled && this.#shouldRestoreLimits()) {
|
|
133
|
+
this.#restoreLimits(requestId);
|
|
134
|
+
}
|
|
135
|
+
} finally {
|
|
136
|
+
this.#releaseLock();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* @inheritDoc
|
|
141
|
+
*/
|
|
142
|
+
async reset() {
|
|
143
|
+
await this.#acquireLock("reset");
|
|
144
|
+
try {
|
|
145
|
+
this.#tokens = this.#config.burstLimit;
|
|
146
|
+
this.#lastRefill = Date.now();
|
|
147
|
+
this.#errorTimestamps = [];
|
|
148
|
+
this.#successTimestamps = [];
|
|
149
|
+
this.#config.drainRate = this.#originalConfig.drainRate;
|
|
150
|
+
this.#config.burstLimit = this.#originalConfig.burstLimit;
|
|
151
|
+
this.#refillIntervalMs = 1e3 / this.#config.drainRate;
|
|
152
|
+
} finally {
|
|
153
|
+
this.#releaseLock();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* @inheritDoc
|
|
158
|
+
*/
|
|
159
|
+
getStats() {
|
|
160
|
+
return {
|
|
161
|
+
tokens: this.#tokens,
|
|
162
|
+
burstLimit: this.#config.burstLimit,
|
|
163
|
+
originalBurstLimit: this.#originalConfig.burstLimit,
|
|
164
|
+
drainRate: this.#config.drainRate,
|
|
165
|
+
originalDrainRate: this.#originalConfig.drainRate,
|
|
166
|
+
refillIntervalMs: this.#refillIntervalMs,
|
|
167
|
+
lastRefill: this.#lastRefill,
|
|
168
|
+
pendingRequests: this.#lockQueue.length,
|
|
169
|
+
recentErrors: this.#errorTimestamps.length,
|
|
170
|
+
recentSuccesses: this.#successTimestamps.length
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* @inheritDoc
|
|
175
|
+
*/
|
|
176
|
+
async setConfig(config) {
|
|
177
|
+
await this.#acquireLock("setConfig");
|
|
178
|
+
try {
|
|
179
|
+
this.#config = config;
|
|
180
|
+
this.#originalConfig = { ...config };
|
|
181
|
+
this.#refillIntervalMs = 1e3 / this.#config.drainRate;
|
|
182
|
+
if (config.burstLimit > this.#tokens) {
|
|
183
|
+
this.#tokens = Math.min(config.burstLimit, this.#tokens);
|
|
184
|
+
}
|
|
185
|
+
this.#errorTimestamps = [];
|
|
186
|
+
this.#successTimestamps = [];
|
|
187
|
+
} finally {
|
|
188
|
+
this.#releaseLock();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Acquire a lock for the critical section
|
|
193
|
+
* Uses a promise queue
|
|
194
|
+
*/
|
|
195
|
+
async #acquireLock(requestId) {
|
|
196
|
+
return new Promise((resolve) => {
|
|
197
|
+
const queueLength = this.#lockQueue.push(resolve);
|
|
198
|
+
if (queueLength > 1) {
|
|
199
|
+
this.#logAcquireQueue(requestId, queueLength);
|
|
200
|
+
}
|
|
201
|
+
if (this.#lockQueue.length === 1) {
|
|
202
|
+
resolve();
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Releases the lock and allows the next person in the queue to proceed
|
|
208
|
+
*/
|
|
209
|
+
#releaseLock() {
|
|
210
|
+
this.#lockQueue.shift();
|
|
211
|
+
if (this.#lockQueue.length > 0) {
|
|
212
|
+
const nextResolve = this.#lockQueue[0];
|
|
213
|
+
nextResolve();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Checks whether the limits need to be reduced
|
|
218
|
+
*/
|
|
219
|
+
#shouldReduceLimits() {
|
|
220
|
+
return this.#errorTimestamps.length >= this.#errorThreshold;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Checks whether limits need to be restored
|
|
224
|
+
* Restore if:
|
|
225
|
+
* 1. Many successful requests (more than the threshold)
|
|
226
|
+
* 2. Few errors (less than half the threshold)
|
|
227
|
+
* 3. Current limits are lower than the original ones
|
|
228
|
+
*/
|
|
229
|
+
#shouldRestoreLimits() {
|
|
230
|
+
return this.#successTimestamps.length >= this.#successThreshold && this.#errorTimestamps.length < this.#errorThreshold / 2 && (this.#config.drainRate < this.#originalConfig.drainRate || this.#config.burstLimit < this.#originalConfig.burstLimit);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Reduces limits for frequent errors
|
|
234
|
+
*/
|
|
235
|
+
#reduceLimits(requestId) {
|
|
236
|
+
const newDrainRate = Math.max(
|
|
237
|
+
this.#minDrainRate,
|
|
238
|
+
Number.parseFloat((this.#config.drainRate * 0.8).toFixed(2))
|
|
239
|
+
);
|
|
240
|
+
const newBurstLimit = Math.max(
|
|
241
|
+
this.#minBurstLimit,
|
|
242
|
+
Number.parseFloat((this.#config.burstLimit * 0.8).toFixed(2))
|
|
243
|
+
);
|
|
244
|
+
this.#config.drainRate = newDrainRate;
|
|
245
|
+
this.#config.burstLimit = newBurstLimit;
|
|
246
|
+
this.#refillIntervalMs = 1e3 / newDrainRate;
|
|
247
|
+
this.#logReduceLimits(requestId, newDrainRate, newBurstLimit);
|
|
248
|
+
this.#errorTimestamps = [];
|
|
249
|
+
this.#successTimestamps = [];
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Restores limits during stable operation
|
|
253
|
+
*/
|
|
254
|
+
#restoreLimits(requestId) {
|
|
255
|
+
if (this.#config.drainRate === this.#originalConfig.drainRate && this.#config.burstLimit === this.#originalConfig.burstLimit) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const newDrainRate = Math.min(
|
|
259
|
+
this.#originalConfig.drainRate,
|
|
260
|
+
Number.parseFloat((this.#config.drainRate * 1.1).toFixed(2))
|
|
261
|
+
);
|
|
262
|
+
const newBurstLimit = Math.min(
|
|
263
|
+
this.#originalConfig.burstLimit,
|
|
264
|
+
Number.parseFloat((this.#config.burstLimit * 1.1).toFixed(2))
|
|
265
|
+
);
|
|
266
|
+
this.#config.drainRate = newDrainRate;
|
|
267
|
+
this.#config.burstLimit = newBurstLimit;
|
|
268
|
+
this.#refillIntervalMs = 1e3 / newDrainRate;
|
|
269
|
+
this.#logRestoreLimits(requestId, newDrainRate, newBurstLimit);
|
|
270
|
+
this.#errorTimestamps = [];
|
|
271
|
+
this.#successTimestamps = [];
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Writes an error to the temporary history
|
|
275
|
+
*/
|
|
276
|
+
#recordError() {
|
|
277
|
+
const now = Date.now();
|
|
278
|
+
this.#errorTimestamps.push(now);
|
|
279
|
+
this.#successTimestamps = [];
|
|
280
|
+
this.#cleanupOldErrors(now);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Clears old errors (older than 60 seconds)
|
|
284
|
+
*/
|
|
285
|
+
#cleanupOldErrors(now) {
|
|
286
|
+
const cutoff = now - 6e4;
|
|
287
|
+
this.#errorTimestamps = this.#errorTimestamps.filter((timestamp) => timestamp > cutoff);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Writes a successful request to the temporary history
|
|
291
|
+
*/
|
|
292
|
+
#recordSuccess() {
|
|
293
|
+
const now = Date.now();
|
|
294
|
+
this.#successTimestamps.push(now);
|
|
295
|
+
this.#cleanupOldSuccesses();
|
|
296
|
+
this.#cleanupOldErrors(now);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Clears old progress
|
|
300
|
+
*/
|
|
301
|
+
#cleanupOldSuccesses() {
|
|
302
|
+
this.#successTimestamps = this.#successTimestamps.slice(-1 * this.#successThreshold);
|
|
303
|
+
}
|
|
304
|
+
// region Log ////
|
|
305
|
+
#logReduceLimits(requestId, currentDrainRate, currentBurstLimit) {
|
|
306
|
+
const originalDrainRate = this.#originalConfig.drainRate;
|
|
307
|
+
const drainRateCondition = currentDrainRate < originalDrainRate;
|
|
308
|
+
const originalBurstLimit = this.#originalConfig.burstLimit;
|
|
309
|
+
const burstLimitCondition = currentBurstLimit < originalBurstLimit;
|
|
310
|
+
this.getLogger().warning(
|
|
311
|
+
`${this.getTitle()} is lowering limits due to frequent errors`,
|
|
312
|
+
{
|
|
313
|
+
requestId,
|
|
314
|
+
drainRate: {
|
|
315
|
+
current: currentDrainRate,
|
|
316
|
+
original: originalDrainRate,
|
|
317
|
+
condition: drainRateCondition,
|
|
318
|
+
formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`
|
|
319
|
+
},
|
|
320
|
+
burstLimit: {
|
|
321
|
+
current: currentBurstLimit,
|
|
322
|
+
original: originalBurstLimit,
|
|
323
|
+
condition: burstLimitCondition,
|
|
324
|
+
formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
#logRestoreLimits(requestId, currentDrainRate, currentBurstLimit) {
|
|
330
|
+
const originalDrainRate = this.#originalConfig.drainRate;
|
|
331
|
+
const drainRateCondition = currentDrainRate < originalDrainRate;
|
|
332
|
+
const originalBurstLimit = this.#originalConfig.burstLimit;
|
|
333
|
+
const burstLimitCondition = currentBurstLimit < originalBurstLimit;
|
|
334
|
+
this.getLogger().warning(
|
|
335
|
+
`${this.getTitle()} increases limits during stable operation`,
|
|
336
|
+
{
|
|
337
|
+
requestId,
|
|
338
|
+
drainRate: {
|
|
339
|
+
current: currentDrainRate,
|
|
340
|
+
original: originalDrainRate,
|
|
341
|
+
condition: drainRateCondition,
|
|
342
|
+
formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`
|
|
343
|
+
},
|
|
344
|
+
burstLimit: {
|
|
345
|
+
current: currentBurstLimit,
|
|
346
|
+
original: originalBurstLimit,
|
|
347
|
+
condition: burstLimitCondition,
|
|
348
|
+
formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
#logAcquireQueue(requestId, queueLength) {
|
|
354
|
+
this.getLogger().debug(`${this.getTitle()} request in queue`, {
|
|
355
|
+
requestId,
|
|
356
|
+
queueLength
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
#logStat(requestId) {
|
|
360
|
+
const successCount = this.#successTimestamps.length;
|
|
361
|
+
const successThreshold = this.#successThreshold;
|
|
362
|
+
const successCondition = successCount >= successThreshold;
|
|
363
|
+
const errorCount = this.#errorTimestamps.length;
|
|
364
|
+
const errorThreshold = this.#errorThreshold;
|
|
365
|
+
const failCondition = errorCount < errorThreshold / 2;
|
|
366
|
+
const currentDrainRate = this.#config.drainRate;
|
|
367
|
+
const originalDrainRate = this.#originalConfig.drainRate;
|
|
368
|
+
const drainRateCondition = currentDrainRate < originalDrainRate;
|
|
369
|
+
const currentBurstLimit = this.#config.burstLimit;
|
|
370
|
+
const originalBurstLimit = this.#originalConfig.burstLimit;
|
|
371
|
+
const burstLimitCondition = currentBurstLimit < originalBurstLimit;
|
|
372
|
+
this.getLogger().debug(`${this.getTitle()} state`, {
|
|
373
|
+
requestId,
|
|
374
|
+
success: {
|
|
375
|
+
count: successCount,
|
|
376
|
+
threshold: successThreshold,
|
|
377
|
+
condition: successCondition,
|
|
378
|
+
formatted: `(${successCount} >= ${successThreshold}) ${successCondition}`
|
|
379
|
+
},
|
|
380
|
+
fail: {
|
|
381
|
+
count: errorCount,
|
|
382
|
+
threshold: errorThreshold / 2,
|
|
383
|
+
condition: failCondition,
|
|
384
|
+
formatted: `(${errorCount} < ${errorThreshold / 2}) ${failCondition}`
|
|
385
|
+
},
|
|
386
|
+
drainRate: {
|
|
387
|
+
current: currentDrainRate,
|
|
388
|
+
original: originalDrainRate,
|
|
389
|
+
condition: drainRateCondition,
|
|
390
|
+
formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`
|
|
391
|
+
},
|
|
392
|
+
burstLimit: {
|
|
393
|
+
current: currentBurstLimit,
|
|
394
|
+
original: originalBurstLimit,
|
|
395
|
+
condition: burstLimitCondition,
|
|
396
|
+
formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
// endregion ////
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
exports.RateLimiter = RateLimiter;
|
|
404
|
+
//# sourceMappingURL=rate-limiter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.cjs","sources":["../../../../../src/core/http/limiters/rate-limiter.ts"],"sourcesContent":["import type { ILimiter, RateLimitConfig } from '../../../types/limiters'\nimport type { LoggerInterface } from '../../../types/logger'\nimport { LoggerFactory } from '../../../logger'\n\n/**\n * Rate limiting (Leaky Bucket) with adaptive control\n */\nexport class RateLimiter implements ILimiter {\n #tokens: number\n #lastRefill: number\n #refillIntervalMs: number\n #config: RateLimitConfig\n #lockQueue: Array<() => void> = []\n\n #originalConfig: RateLimitConfig // Original configuration for recovery\n #errorThreshold: number = 5 // 60-second error threshold to reduce limits\n #successThreshold: number = 20 // Consecutive success threshold for restoring limits\n #minDrainRate: number = 0.5 // Minimum drain rate\n #minBurstLimit: number = 5 // Minimum burst limit\n #errorTimestamps: number[] = [] // Error timestamps (last 60 seconds)\n #successTimestamps: number[] = [] // Timestamps of successful requests\n\n private _logger: LoggerInterface\n\n constructor(config: RateLimitConfig) {\n this._logger = LoggerFactory.createNullLogger()\n this.#config = config\n this.#originalConfig = { ...config }\n this.#tokens = config.burstLimit\n this.#lastRefill = Date.now()\n this.#refillIntervalMs = 1000 / config.drainRate\n }\n\n getTitle(): string {\n return 'rateLimiter'\n }\n\n // region Logger ////\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n // endregion ////\n\n /**\n * @inheritDoc\n */\n async canProceed(requestId: string, _method: string, _params?: any): Promise<boolean> {\n await this.#acquireLock(requestId)\n try {\n const now = Date.now()\n const timePassed = now - this.#lastRefill\n\n // Refill tokens\n const refillAmount = timePassed * this.#config.drainRate / 1000\n this.#tokens = Math.min(\n this.#config.burstLimit,\n this.#tokens + refillAmount\n )\n this.#lastRefill = now\n\n return this.#tokens >= 1\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * @inheritDoc\n */\n async waitIfNeeded(requestId: string, _method: string, _params?: any): Promise<number> {\n await this.#acquireLock(requestId)\n\n try {\n const now = Date.now()\n const timePassed = now - this.#lastRefill\n\n // Replenishing tokens\n const refillAmount = timePassed * this.#config.drainRate / 1_000\n this.#tokens = Math.min(\n this.#config.burstLimit,\n this.#tokens + refillAmount\n )\n\n // We always update the time of the last replenishment\n this.#lastRefill = now\n\n // If there are enough tokens\n if (this.#tokens >= 1) {\n // Consume token\n this.#tokens -= 1\n return 0\n }\n\n // Calculating the waiting time for 1 token\n const deficit = 1 - this.#tokens\n return Math.ceil(deficit * this.#refillIntervalMs)\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * Error handler.\n * If there are a lot of errors, we'll lower the limits.\n */\n async handleExceeded(requestId: string): Promise<number> {\n await this.#acquireLock(requestId)\n\n try {\n this.#recordError()\n\n // Adaptive regulation: if there are many errors, we reduce the limits\n if (this.#config.adaptiveEnabled && this.#shouldReduceLimits()) {\n this.#reduceLimits(requestId)\n }\n\n this.#tokens = 0\n // Wait for the time to restore at least one token + 1sec\n return this.#refillIntervalMs + 1_000\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * Successful request handler.\n * If everything is OK, we'll restore the limits.\n */\n async updateStats(requestId: string, method: string, _data: any): Promise<void> {\n // skip accounting of `batch` subqueries\n if (method.startsWith('batch::')) {\n return\n }\n\n await this.#acquireLock(requestId)\n\n try {\n this.#recordSuccess()\n\n // Adaptive regulation: if we operate stably, we restore the limits\n if (this.#config.adaptiveEnabled) {\n this.#logStat(requestId)\n }\n\n if (this.#config.adaptiveEnabled && this.#shouldRestoreLimits()) {\n this.#restoreLimits(requestId)\n }\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * @inheritDoc\n */\n async reset(): Promise<void> {\n await this.#acquireLock('reset')\n\n try {\n this.#tokens = this.#config.burstLimit\n this.#lastRefill = Date.now()\n this.#errorTimestamps = []\n this.#successTimestamps = []\n\n // Restore original settings during reset\n this.#config.drainRate = this.#originalConfig.drainRate\n this.#config.burstLimit = this.#originalConfig.burstLimit\n this.#refillIntervalMs = 1000 / this.#config.drainRate\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * @inheritDoc\n */\n getStats() {\n return {\n tokens: this.#tokens,\n burstLimit: this.#config.burstLimit,\n originalBurstLimit: this.#originalConfig.burstLimit,\n drainRate: this.#config.drainRate,\n originalDrainRate: this.#originalConfig.drainRate,\n refillIntervalMs: this.#refillIntervalMs,\n lastRefill: this.#lastRefill,\n pendingRequests: this.#lockQueue.length,\n recentErrors: this.#errorTimestamps.length,\n recentSuccesses: this.#successTimestamps.length\n }\n }\n\n /**\n * @inheritDoc\n */\n async setConfig(config: RateLimitConfig): Promise<void> {\n await this.#acquireLock('setConfig')\n\n try {\n this.#config = config\n this.#originalConfig = { ...config }\n this.#refillIntervalMs = 1000 / this.#config.drainRate\n\n // If the new configuration increases burstLimit, we can increase the current number of tokens\n if (config.burstLimit > this.#tokens) {\n this.#tokens = Math.min(config.burstLimit, this.#tokens)\n }\n\n // Reset statistics when changing configuration\n this.#errorTimestamps = []\n this.#successTimestamps = []\n } finally {\n this.#releaseLock()\n }\n }\n\n /**\n * Acquire a lock for the critical section\n * Uses a promise queue\n */\n async #acquireLock(requestId: string): Promise<void> {\n return new Promise<void>((resolve) => {\n // Add the resolution function to the queue\n const queueLength = this.#lockQueue.push(resolve)\n\n if (queueLength > 1) {\n this.#logAcquireQueue(requestId, queueLength)\n }\n // If it's the first one in the queue, we allow it immediately\n if (this.#lockQueue.length === 1) {\n resolve()\n }\n })\n }\n\n /**\n * Releases the lock and allows the next person in the queue to proceed\n */\n #releaseLock(): void {\n // Remove the current resolver from the front of the queue\n this.#lockQueue.shift()\n\n // If there are any waiting, resolve the next one\n if (this.#lockQueue.length > 0) {\n const nextResolve = this.#lockQueue[0]!\n nextResolve()\n }\n }\n\n /**\n * Checks whether the limits need to be reduced\n */\n #shouldReduceLimits(): boolean {\n // If there are more errors than the threshold in the last 60 seconds\n return this.#errorTimestamps.length >= this.#errorThreshold\n }\n\n /**\n * Checks whether limits need to be restored\n * Restore if:\n * 1. Many successful requests (more than the threshold)\n * 2. Few errors (less than half the threshold)\n * 3. Current limits are lower than the original ones\n */\n #shouldRestoreLimits(): boolean {\n return this.#successTimestamps.length >= this.#successThreshold\n && this.#errorTimestamps.length < (this.#errorThreshold / 2)\n && (\n this.#config.drainRate < this.#originalConfig.drainRate\n || this.#config.burstLimit < this.#originalConfig.burstLimit\n )\n }\n\n /**\n * Reduces limits for frequent errors\n */\n #reduceLimits(requestId: string): void {\n // Reduce drainRate by 20%, but not below the minimum\n const newDrainRate = Math.max(\n this.#minDrainRate,\n Number.parseFloat((this.#config.drainRate * 0.8).toFixed(2))\n )\n\n // Reduce burstLimit by 20%, but not below the minimum\n const newBurstLimit = Math.max(\n this.#minBurstLimit,\n Number.parseFloat((this.#config.burstLimit * 0.8).toFixed(2))\n )\n\n // Applying new limits\n this.#config.drainRate = newDrainRate\n this.#config.burstLimit = newBurstLimit\n this.#refillIntervalMs = 1000 / newDrainRate\n\n this.#logReduceLimits(requestId, newDrainRate, newBurstLimit)\n\n // Reset error statistics after reduction\n this.#errorTimestamps = []\n this.#successTimestamps = []\n }\n\n /**\n * Restores limits during stable operation\n */\n #restoreLimits(requestId: string): void {\n if (\n this.#config.drainRate === this.#originalConfig.drainRate\n && this.#config.burstLimit === this.#originalConfig.burstLimit\n ) {\n return\n }\n\n // Restore drainRate to 10% of its original value\n const newDrainRate = Math.min(\n this.#originalConfig.drainRate,\n Number.parseFloat((this.#config.drainRate * 1.1).toFixed(2))\n )\n\n // Restore burstLimit to 10% of its original value\n const newBurstLimit = Math.min(\n this.#originalConfig.burstLimit,\n Number.parseFloat((this.#config.burstLimit * 1.1).toFixed(2))\n )\n\n // Applying new limits\n this.#config.drainRate = newDrainRate\n this.#config.burstLimit = newBurstLimit\n this.#refillIntervalMs = 1000 / newDrainRate\n\n this.#logRestoreLimits(requestId, newDrainRate, newBurstLimit)\n\n // Reset success statistics after recovery\n this.#errorTimestamps = []\n this.#successTimestamps = []\n }\n\n /**\n * Writes an error to the temporary history\n */\n #recordError(): void {\n const now = Date.now()\n this.#errorTimestamps.push(now)\n\n // Clear ALL progress\n this.#successTimestamps = []\n this.#cleanupOldErrors(now)\n }\n\n /**\n * Clears old errors (older than 60 seconds)\n */\n #cleanupOldErrors(now: number): void {\n const cutoff = now - 60_000\n this.#errorTimestamps = this.#errorTimestamps.filter(timestamp => timestamp > cutoff)\n }\n\n /**\n * Writes a successful request to the temporary history\n */\n #recordSuccess(): void {\n const now = Date.now()\n this.#successTimestamps.push(now)\n\n this.#cleanupOldSuccesses()\n this.#cleanupOldErrors(now)\n }\n\n /**\n * Clears old progress\n */\n #cleanupOldSuccesses(): void {\n this.#successTimestamps = this.#successTimestamps.slice(-1 * this.#successThreshold)\n }\n\n // region Log ////\n #logReduceLimits(requestId: string, currentDrainRate: number, currentBurstLimit: number) {\n const originalDrainRate = this.#originalConfig.drainRate\n const drainRateCondition = currentDrainRate < originalDrainRate\n\n const originalBurstLimit = this.#originalConfig.burstLimit\n const burstLimitCondition = currentBurstLimit < originalBurstLimit\n\n this.getLogger().warning(\n `${this.getTitle()} is lowering limits due to frequent errors`, {\n requestId,\n drainRate: {\n current: currentDrainRate,\n original: originalDrainRate,\n condition: drainRateCondition,\n formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`\n },\n burstLimit: {\n current: currentBurstLimit,\n original: originalBurstLimit,\n condition: burstLimitCondition,\n formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`\n }\n }\n )\n }\n\n #logRestoreLimits(requestId: string, currentDrainRate: number, currentBurstLimit: number) {\n const originalDrainRate = this.#originalConfig.drainRate\n const drainRateCondition = currentDrainRate < originalDrainRate\n\n const originalBurstLimit = this.#originalConfig.burstLimit\n const burstLimitCondition = currentBurstLimit < originalBurstLimit\n\n this.getLogger().warning(\n `${this.getTitle()} increases limits during stable operation`, {\n requestId,\n drainRate: {\n current: currentDrainRate,\n original: originalDrainRate,\n condition: drainRateCondition,\n formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`\n },\n burstLimit: {\n current: currentBurstLimit,\n original: originalBurstLimit,\n condition: burstLimitCondition,\n formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`\n }\n }\n )\n }\n\n #logAcquireQueue(requestId: string, queueLength: number) {\n this.getLogger().debug(`${this.getTitle()} request in queue`, {\n requestId,\n queueLength\n })\n }\n\n #logStat(\n requestId: string\n ): void {\n const successCount = this.#successTimestamps.length\n const successThreshold = this.#successThreshold\n const successCondition = successCount >= successThreshold\n\n const errorCount = this.#errorTimestamps.length\n const errorThreshold = this.#errorThreshold\n const failCondition = errorCount < (errorThreshold / 2)\n\n const currentDrainRate = this.#config.drainRate\n const originalDrainRate = this.#originalConfig.drainRate\n const drainRateCondition = currentDrainRate < originalDrainRate\n\n const currentBurstLimit = this.#config.burstLimit\n const originalBurstLimit = this.#originalConfig.burstLimit\n const burstLimitCondition = currentBurstLimit < originalBurstLimit\n\n this.getLogger().debug(`${this.getTitle()} state`, {\n requestId,\n success: {\n count: successCount,\n threshold: successThreshold,\n condition: successCondition,\n formatted: `(${successCount} >= ${successThreshold}) ${successCondition}`\n },\n fail: {\n count: errorCount,\n threshold: errorThreshold / 2,\n condition: failCondition,\n formatted: `(${errorCount} < ${errorThreshold / 2}) ${failCondition}`\n },\n drainRate: {\n current: currentDrainRate,\n original: originalDrainRate,\n condition: drainRateCondition,\n formatted: `(${currentDrainRate} < ${originalDrainRate}) ${drainRateCondition}`\n },\n burstLimit: {\n current: currentBurstLimit,\n original: originalBurstLimit,\n condition: burstLimitCondition,\n formatted: `(${currentBurstLimit} < ${originalBurstLimit}) ${burstLimitCondition}`\n }\n })\n }\n // endregion ////\n}\n"],"names":["LoggerFactory"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @package @bitrix24/b24jssdk
|
|
3
|
+
* @version 2.0.0
|
|
4
|
+
* @copyright (c) 2026 Bitrix24
|
|
5
|
+
* @license MIT
|
|
6
|
+
* @see https://github.com/bitrix24/b24jssdk
|
|
7
|
+
* @see https://bitrix24.github.io/b24jssdk/
|
|
8
|
+
*/
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
var __defProp = Object.defineProperty;
|
|
12
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
13
|
+
const SENSITIVE_PARAM_KEYS = [
|
|
14
|
+
"auth",
|
|
15
|
+
"password",
|
|
16
|
+
"token",
|
|
17
|
+
"secret",
|
|
18
|
+
"access_token",
|
|
19
|
+
"refresh_token",
|
|
20
|
+
"client_secret",
|
|
21
|
+
"application_token",
|
|
22
|
+
"sessid",
|
|
23
|
+
"key",
|
|
24
|
+
"signature"
|
|
25
|
+
];
|
|
26
|
+
const REDACTED_PLACEHOLDER = "***REDACTED***";
|
|
27
|
+
const QS_SENSITIVE_RE = new RegExp(
|
|
28
|
+
`([?&]|^)(${SENSITIVE_PARAM_KEYS.join("|")})=[^&#;]*`,
|
|
29
|
+
"gi"
|
|
30
|
+
);
|
|
31
|
+
function isPlainObject(value) {
|
|
32
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
__name(isPlainObject, "isPlainObject");
|
|
35
|
+
function redactQueryString(value) {
|
|
36
|
+
if (!value.includes("=")) return value;
|
|
37
|
+
return value.replace(
|
|
38
|
+
QS_SENSITIVE_RE,
|
|
39
|
+
(_match, sep, key) => `${sep}${key}=${REDACTED_PLACEHOLDER}`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
__name(redactQueryString, "redactQueryString");
|
|
43
|
+
function redactValue(value, depth) {
|
|
44
|
+
if (typeof value === "string") return redactQueryString(value);
|
|
45
|
+
if (depth <= 0) return value;
|
|
46
|
+
if (isPlainObject(value)) return redactObject(value, depth - 1);
|
|
47
|
+
if (Array.isArray(value)) return value.map((item) => redactValue(item, depth));
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
__name(redactValue, "redactValue");
|
|
51
|
+
function redactObject(source, depth) {
|
|
52
|
+
const sanitized = { ...source };
|
|
53
|
+
for (const key of Object.keys(sanitized)) {
|
|
54
|
+
if (SENSITIVE_PARAM_KEYS.includes(key.toLowerCase())) {
|
|
55
|
+
sanitized[key] = REDACTED_PLACEHOLDER;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
sanitized[key] = redactValue(sanitized[key], depth);
|
|
59
|
+
}
|
|
60
|
+
return sanitized;
|
|
61
|
+
}
|
|
62
|
+
__name(redactObject, "redactObject");
|
|
63
|
+
const DEFAULT_REDACT_DEPTH = 2;
|
|
64
|
+
function redactSensitiveParams(params) {
|
|
65
|
+
if (!isPlainObject(params)) return params;
|
|
66
|
+
return redactObject(params, DEFAULT_REDACT_DEPTH);
|
|
67
|
+
}
|
|
68
|
+
__name(redactSensitiveParams, "redactSensitiveParams");
|
|
69
|
+
function redactSensitiveUrl(url, extraKeys = []) {
|
|
70
|
+
if (typeof url !== "string" || !url.includes("=")) return url;
|
|
71
|
+
if (extraKeys.length === 0) return redactQueryString(url);
|
|
72
|
+
const escaped = extraKeys.map((key) => key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
|
|
73
|
+
const re = new RegExp(
|
|
74
|
+
`([?&]|^)(${[...SENSITIVE_PARAM_KEYS, ...escaped].join("|")})=[^&#;]*`,
|
|
75
|
+
"gi"
|
|
76
|
+
);
|
|
77
|
+
return url.replace(re, (_match, sep, key) => `${sep}${key}=${REDACTED_PLACEHOLDER}`);
|
|
78
|
+
}
|
|
79
|
+
__name(redactSensitiveUrl, "redactSensitiveUrl");
|
|
80
|
+
|
|
81
|
+
exports.REDACTED_PLACEHOLDER = REDACTED_PLACEHOLDER;
|
|
82
|
+
exports.SENSITIVE_PARAM_KEYS = SENSITIVE_PARAM_KEYS;
|
|
83
|
+
exports.redactSensitiveParams = redactSensitiveParams;
|
|
84
|
+
exports.redactSensitiveUrl = redactSensitiveUrl;
|
|
85
|
+
//# sourceMappingURL=redact.cjs.map
|