@bitrix24/b24jssdk 1.3.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 +3 -2
- 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 +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 +1 -1
- package/dist/esm/core/actions/v2/manager-v2.mjs +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 +30 -44
- 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 +24 -41
- 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 +25 -1
- package/dist/esm/core/actions/v3/manager-v3.mjs.map +1 -1
- package/dist/esm/core/http/abstract-http.mjs +68 -17
- 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 +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 +11 -4
- 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 +1 -1
- package/dist/esm/core/tools/ping.mjs +1 -1
- package/dist/esm/core/version-manager.mjs +19 -157
- 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 +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 +3 -3
- package/dist/esm/hook/b24.mjs.map +1 -1
- package/dist/esm/index.d.mts +412 -39
- package/dist/esm/index.d.ts +412 -39
- 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 +1258 -719
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"client.cjs","sources":["../../../src/pullClient/client.ts"],"sourcesContent":["import type { LoggerInterface } from '../logger'\nimport { LoggerFactory } from '../logger'\nimport { Type } from '../tools/type'\nimport { Text } from '../tools/text'\nimport { Browser } from '../tools/browser'\nimport { redactSensitiveParams, redactSensitiveUrl, REDACTED_PLACEHOLDER } from '../core/http/redact'\nimport { StorageManager } from './storage-manager'\nimport { JsonRpc } from './json-rpc'\nimport { SharedConfig } from './shared-config'\nimport { ChannelManager } from './channel-manager'\nimport { ResponseBatch, RequestBatch, IncomingMessage, Receiver } from './protobuf'\nimport { CloseReasons, ConnectionType, PullStatus, RpcMethod, SenderType, ServerMode, SubscriptionType, SystemCommands, LsKeys } from '../types/pull'\nimport { WebSocketConnector } from './web-socket-connector'\nimport { LongPollingConnector } from './long-polling-connector'\nimport type { StorageManagerParams, TypePullClientParams, TypePullClientSession, TypeStorageManager, SharedConfigParams, TypeChannelManagerParams, TypeConnector, RpcError, TypePullClientConfig, TypePullMessage, TypeSubscriptionOptions, TypeSubscriptionCommandHandler, TypePullClientEmitConfig, CommandHandlerFunctionV1, CommandHandlerFunctionV2, ConnectorParent, UserStatusCallback, TypePublicIdDescriptor, TypePullClientMessageBatch, TypeChanel, TypeSessionEvent, TypePullClientMessageBody } from '../types/pull'\nimport type { TypeB24 } from '../types/b24'\nimport type { AjaxResult } from '../core/http/ajax-result'\nimport type { SuccessPayload } from '../types/payloads'\nimport type { NumberString } from '../types/common'\n\n/**\n * @memo api revision - check module/pull/include.php\n */\nconst REVISION = 19\nconst RESTORE_WEBSOCKET_TIMEOUT = 30 * 60\nconst OFFLINE_STATUS_DELAY = 5_000\nconst CONFIG_CHECK_INTERVAL = 60 * 1000\nconst MAX_IDS_TO_STORE = 10\nconst PING_TIMEOUT = 10\nconst JSON_RPC_PING = 'ping'\nconst JSON_RPC_PONG = 'pong'\nconst LS_SESSION = 'bx-pull-session'\nconst LS_SESSION_CACHE_TIME = 20\n\nconst EmptyConfig = {\n api: {},\n channels: {},\n publicChannels: {},\n server: { timeShift: 0 },\n clientId: null,\n jwt: null,\n exp: 0\n} as TypePullClientConfig\n\nexport class PullClient implements ConnectorParent {\n // region Params ////\n private _logger: LoggerInterface\n private _restClient: TypeB24\n private _status: PullStatus\n private _context: string\n private readonly _guestMode: boolean\n private readonly _guestUserId: number\n private _userId: number\n\n private _configGetMethod: string\n private _getPublicListMethod: string\n\n private _siteId: string\n private _enabled: boolean\n\n private _unloading: boolean = false\n private _starting: boolean = false\n private _debug: boolean = false\n private _connectionAttempt: number = 0\n private _connectionType: ConnectionType = ConnectionType.WebSocket\n private _skipStorageInit: boolean\n private _skipCheckRevision: boolean\n\n private _subscribers: Record<string, any> = {}\n private _watchTagsQueue: Map<string, boolean> = new Map()\n private _watchUpdateInterval: number = 1_740_000\n private _watchForceUpdateInterval: number = 5_000\n private _configTimestamp: number = 0\n private _session: TypePullClientSession = {\n mid: null,\n tag: null,\n time: null,\n history: {},\n lastMessageIds: [],\n messageCount: 0\n }\n\n private _connectors: Record<ConnectionType, null | TypeConnector> = {\n [ConnectionType.Undefined]: null,\n [ConnectionType.WebSocket]: null,\n [ConnectionType.LongPolling]: null\n }\n\n private _isSecure: boolean\n\n private _config: null | TypePullClientConfig = null\n\n private _storage: null | TypeStorageManager = null\n private _sharedConfig: SharedConfig\n private _channelManager: ChannelManager\n private _jsonRpcAdapter: null | JsonRpc = null\n\n /**\n * @depricate\n */\n // private _notificationPopup: null = null\n\n // timers ////\n private _reconnectTimeout: ReturnType<typeof setTimeout> | null = null\n private _restartTimeout: ReturnType<typeof setTimeout> | null = null\n private _restoreWebSocketTimeout: ReturnType<typeof setTimeout> | null = null\n private _checkInterval: ReturnType<typeof setTimeout> | null = null\n private _offlineTimeout: ReturnType<typeof setTimeout> | null = null\n private _watchUpdateTimeout: ReturnType<typeof setTimeout> | null = null\n private _pingWaitTimeout: ReturnType<typeof setTimeout> | null = null\n\n // manual stop workaround ////\n private _isManualDisconnect: boolean = false\n\n // set once destroy() has run; gates reconnect / watch / online so a torn-down\n // client never schedules new work (#141) ////\n private _disposed: boolean = false\n\n private _loggingEnabled: boolean = false\n\n // bound event handlers, stored so they can be removed in destroy() (#141) ////\n private _onPingTimeoutHandler: () => void\n private _onBeforeUnloadHandler: () => void\n private _onOfflineHandler: () => void\n private _onOnlineHandler: () => void\n\n // [userId] => array of callbacks\n private _userStatusCallbacks: Record<number, UserStatusCallback[]> = {}\n\n private _connectPromise: null | {\n resolve: (response: any) => void\n reject: (error: string | RpcError | Error) => void\n } = null\n\n private _startingPromise: null | Promise<boolean> = null\n // endregion ////\n\n // region Init ////\n /**\n * @param params\n */\n constructor(params: TypePullClientParams) {\n this._logger = LoggerFactory.createNullLogger()\n this._restClient = params.b24\n this._status = PullStatus.Offline\n this._context = 'master'\n\n // region RestApplication ////\n if (params.restApplication) {\n if (typeof params.configGetMethod === 'undefined') {\n params.configGetMethod = 'pull.application.config.get'\n }\n\n if (typeof params.skipCheckRevision === 'undefined') {\n params.skipCheckRevision = true\n }\n\n if (Type.isStringFilled(params.restApplication)) {\n params.siteId = params.restApplication\n }\n\n params.serverEnabled = true\n }\n // endregion ////\n\n // region Params ////\n this._guestMode = params.guestMode\n ? Text.toBoolean(params.guestMode)\n : false\n\n this._guestUserId = params.guestUserId\n ? Text.toInteger(params.guestUserId)\n : 0\n\n if (this._guestMode && this._guestUserId > 0) {\n this._userId = this._guestUserId\n } else {\n this._guestMode = false\n this._userId = params.userId ? Text.toInteger(params.userId) : 0\n }\n\n this._siteId = params.siteId ?? 'none'\n\n this._enabled = !Type.isUndefined(params.serverEnabled)\n ? params.serverEnabled === true\n : true\n\n this._configGetMethod = !Type.isStringFilled(params.configGetMethod)\n ? 'pull.config.get'\n : params.configGetMethod || ''\n\n this._getPublicListMethod = !Type.isStringFilled(params.getPublicListMethod)\n ? 'pull.channel.public.list'\n : params.getPublicListMethod || ''\n\n this._skipStorageInit = params.skipStorageInit === true\n this._skipCheckRevision = params.skipCheckRevision === true\n\n if (!Type.isUndefined(params.configTimestamp)) {\n this._configTimestamp = Text.toInteger(params.configTimestamp)\n }\n // endregion ////\n\n this._isSecure = document?.location.href.indexOf('https') === 0\n\n if (this._userId && !this._skipStorageInit) {\n this._storage = new StorageManager({\n userId: this._userId,\n siteId: this._siteId\n } as StorageManagerParams)\n }\n\n this._sharedConfig = new SharedConfig({\n onWebSocketBlockChanged: this.onWebSocketBlockChanged.bind(this),\n storage: this._storage\n } as SharedConfigParams)\n\n this._channelManager = new ChannelManager({\n b24: this._restClient,\n getPublicListMethod: this._getPublicListMethod\n } as TypeChannelManagerParams)\n\n this._loggingEnabled = this._sharedConfig.isLoggingEnabled()\n\n // bound event handlers ////\n this._onPingTimeoutHandler = this.onPingTimeout.bind(this)\n this._onBeforeUnloadHandler = this.onBeforeUnload.bind(this)\n this._onOfflineHandler = this.onOffline.bind(this)\n this._onOnlineHandler = this.onOnline.bind(this)\n }\n\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n this._jsonRpcAdapter?.setLogger(this.getLogger())\n this._storage?.setLogger(this.getLogger())\n this._sharedConfig.setLogger(this.getLogger())\n this._channelManager.setLogger(this.getLogger())\n\n this._connectors.webSocket?.setLogger(this.getLogger())\n this._connectors.longPolling?.setLogger(this.getLogger())\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n\n /**\n * Terminal teardown: removes the window listeners, cancels every pending timer,\n * persists the session for a quick re-init, and disconnects. Irreversible — a\n * destroyed client schedules no further work and `start()` rejects with\n * `PULL_DISPOSED`; create a new instance to reconnect.\n */\n destroy(): void {\n this._disposed = true\n\n this.stop(CloseReasons.NORMAL_CLOSURE, 'manual stop')\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('beforeunload', this._onBeforeUnloadHandler)\n window.removeEventListener('offline', this._onOfflineHandler)\n window.removeEventListener('online', this._onOnlineHandler)\n }\n\n // Drop the cached pull config on teardown: it holds the push `jwt` and the\n // channel signatures, which must not linger in localStorage after the client\n // is gone (it is readable by any same-origin script and survives reloads). A\n // torn-down client is terminal; a fresh instance re-fetches the config (#242).\n if (this._storage) {\n this._storage.remove(LsKeys.PullConfig)\n }\n\n // Save the (non-secret) session for a quick re-init, but — unlike\n // onBeforeUnload — do NOT schedule a reconnect: the client is being torn\n // down (#141).\n this.persistSession()\n }\n\n private init(): void {\n if (this._disposed) {\n return\n }\n\n this._connectors.webSocket = new WebSocketConnector({\n parent: this,\n onOpen: this.onWebSocketOpen.bind(this),\n onMessage: this.onIncomingMessage.bind(this),\n onDisconnect: this.onWebSocketDisconnect.bind(this),\n onError: this.onWebSocketError.bind(this)\n })\n\n this._connectors.longPolling = new LongPollingConnector({\n parent: this,\n onOpen: this.onLongPollingOpen.bind(this),\n onMessage: this.onIncomingMessage.bind(this),\n onDisconnect: this.onLongPollingDisconnect.bind(this),\n onError: this.onLongPollingError.bind(this)\n })\n\n this._connectionType = this.isWebSocketAllowed()\n ? ConnectionType.WebSocket\n : ConnectionType.LongPolling\n\n if (typeof window !== 'undefined') {\n window.addEventListener('beforeunload', this._onBeforeUnloadHandler)\n window.addEventListener('offline', this._onOfflineHandler)\n window.addEventListener('online', this._onOnlineHandler)\n }\n\n /**\n * @memo Not use under Node.js\n */\n /* /\n if (BX && BX.addCustomEvent)\n {\n BX.addCustomEvent('BXLinkOpened', this.connect.bind(this))\n }\n\n if (BX && BX.desktop)\n {\n BX.addCustomEvent('onDesktopReload', () => {\n this._session.mid = null\n this._session.tag = null\n this._session.time = null\n })\n\n BX.desktop.addCustomEvent('BXLoginSuccess', () => this.restart(1_000, 'desktop login'))\n }\n // */\n\n this._jsonRpcAdapter = new JsonRpc({\n connector: this._connectors.webSocket,\n handlers: {\n 'incoming.message': this.handleRpcIncomingMessage.bind(this)\n }\n })\n }\n\n // endregion ////\n\n // region Get-Set ////\n get connector(): null | TypeConnector {\n return this._connectors[this._connectionType]\n }\n\n get status(): PullStatus {\n return this._status\n }\n\n /**\n * @param status\n */\n set status(status: PullStatus) {\n if (this._status === status) {\n return\n }\n\n this._status = status\n if (this._offlineTimeout) {\n clearTimeout(this._offlineTimeout)\n this._offlineTimeout = null\n }\n\n if (status === PullStatus.Offline) {\n this.sendPullStatusDelayed(status, OFFLINE_STATUS_DELAY)\n } else {\n this.sendPullStatus(status)\n }\n }\n\n get session(): TypePullClientSession {\n return this._session\n }\n\n // endregion ////\n\n // region Public /////\n /**\n * Creates a subscription to incoming messages.\n *\n * @param {TypeSubscriptionOptions | TypeSubscriptionCommandHandler} params\n * @returns { () => void } - Unsubscribe callback function\n */\n public subscribe(\n params: TypeSubscriptionOptions | TypeSubscriptionCommandHandler\n ): () => void {\n if (!Type.isPlainObject(params)) {\n return this.attachCommandHandler(params as TypeSubscriptionCommandHandler)\n }\n\n params = params as TypeSubscriptionOptions\n\n params.type = params.type || SubscriptionType.Server\n params.command = params.command || null\n\n if (\n params.type == SubscriptionType.Server\n || params.type == SubscriptionType.Client\n ) {\n if (typeof params.moduleId === 'undefined') {\n throw new TypeError(\n `${Text.getDateForLog()}: Pull.subscribe: parameter moduleId is not specified`\n )\n }\n\n if (typeof this._subscribers[params.type] === 'undefined') {\n this._subscribers[params.type] = {}\n }\n\n if (\n typeof this._subscribers[params.type][params.moduleId] === 'undefined'\n ) {\n this._subscribers[params.type][params.moduleId] = {\n callbacks: [],\n commands: {}\n }\n }\n\n if (params.command) {\n if (\n typeof this._subscribers[params.type][params.moduleId]['commands'][\n params.command\n ] === 'undefined'\n ) {\n this._subscribers[params.type][params.moduleId]['commands'][\n params.command\n ] = []\n }\n\n this._subscribers[params.type][params.moduleId]['commands'][\n params.command\n ].push(params.callback)\n\n return () => {\n if (\n typeof params.type === 'undefined'\n || typeof params.moduleId === 'undefined'\n || typeof params.command === 'undefined'\n || null === params.command\n ) {\n return\n }\n\n this._subscribers[params.type][params.moduleId]['commands'][\n params.command\n ] = this._subscribers[params.type][params.moduleId]['commands'][\n params.command\n ].filter((element: any) => {\n return element !== params.callback\n })\n }\n } else {\n this._subscribers[params.type][params.moduleId]['callbacks'].push(\n params.callback\n )\n\n return () => {\n if (\n typeof params.type === 'undefined'\n || typeof params.moduleId === 'undefined'\n ) {\n return\n }\n\n this._subscribers[params.type][params.moduleId]['callbacks']\n = this._subscribers[params.type][params.moduleId]['callbacks'].filter(\n (element: any) => {\n return element !== params.callback\n }\n )\n }\n }\n } else {\n if (typeof this._subscribers[params.type] === 'undefined') {\n this._subscribers[params.type] = []\n }\n\n this._subscribers[params.type].push(params.callback)\n\n return () => {\n if (typeof params.type === 'undefined') {\n return\n }\n\n this._subscribers[params.type] = this._subscribers[params.type].filter(\n (element: any) => {\n return element !== params.callback\n }\n )\n }\n }\n }\n\n /**\n * @param {TypeSubscriptionCommandHandler} handler\n * @returns {() => void} - Unsubscribe callback function\n */\n private attachCommandHandler(\n handler: TypeSubscriptionCommandHandler\n ): () => void {\n if (\n typeof handler.getModuleId !== 'function'\n || typeof handler.getModuleId() !== 'string'\n ) {\n this.getLogger().error(`${Text.getDateForLog()}: Pull.attachCommandHandler: result of handler.getModuleId() is not a string.`)\n return () => {}\n }\n\n let type = SubscriptionType.Server\n if (typeof handler.getSubscriptionType === 'function') {\n type = handler.getSubscriptionType()\n }\n\n return this.subscribe({\n type: type,\n moduleId: handler.getModuleId(),\n callback: (data: TypePullMessage) => {\n let method = null\n\n if (typeof handler.getMap === 'function') {\n const mapping = handler.getMap()\n if (mapping && typeof mapping === 'object') {\n const rowMapping = mapping[data.command]\n if (typeof rowMapping === 'function') {\n method = rowMapping.bind(handler)\n } else if (\n typeof rowMapping === 'string'\n && typeof handler[rowMapping] === 'function'\n ) {\n method = handler[rowMapping].bind(handler)\n }\n }\n }\n\n /**\n * handler.handleSomeCommandName: CommandHandlerFunction\n */\n if (!method) {\n const methodName = `handle${Text.capitalize(data.command)}`\n if (typeof handler[methodName] === 'function') {\n method = handler[methodName].bind(handler)\n }\n }\n\n if (method) {\n if (this._debug && this._context !== 'master') {\n this.getLogger().warning(\n `${Text.getDateForLog()}: Pull.attachCommandHandler: result of handler.getModuleId() is not a string`,\n // data.params / data.extra are app-defined and may carry a credential key (#43)\n redactSensitiveParams({ data } as unknown as Record<string, unknown>)\n )\n }\n\n method(data.params, data.extra, data.command)\n }\n }\n })\n }\n\n /**\n * Connects the client and begins receiving events.\n *\n * @param config\n * @throws Rejects with `{ ex: { error: 'PULL_DISPOSED' } }` when called after\n * `destroy()` — a destroyed client cannot be restarted; create a new instance.\n */\n public async start(\n config:\n | null\n | (TypePullClientConfig & {\n skipReconnectToLastSession?: boolean\n }) = null\n ): Promise<boolean> {\n if (this._disposed) {\n return Promise.reject({\n ex: {\n error: 'PULL_DISPOSED',\n error_description: 'PullClient has been destroyed; create a new instance'\n }\n })\n }\n\n let allowConfigCaching = true\n\n if (this.isConnected()) {\n return Promise.resolve(true)\n }\n\n if (this._starting && this._startingPromise) {\n return this._startingPromise\n }\n\n if (!this._userId) {\n throw new Error('Not set userId')\n }\n\n if (this._siteId === 'none') {\n throw new Error('Not set siteId')\n }\n\n let skipReconnectToLastSession = false\n if (!!config && Type.isPlainObject(config)) {\n if (typeof config?.skipReconnectToLastSession !== 'undefined') {\n skipReconnectToLastSession = config.skipReconnectToLastSession\n delete config.skipReconnectToLastSession\n }\n\n this._config = config\n allowConfigCaching = false\n }\n\n if (!this._enabled) {\n return Promise.reject({\n ex: {\n error: 'PULL_DISABLED',\n error_description: 'Push & Pull server is disabled'\n }\n })\n }\n\n const now = Date.now()\n let oldSession\n if (!skipReconnectToLastSession && this._storage) {\n oldSession = this._storage.get(LS_SESSION, null)\n }\n\n if (\n Type.isPlainObject(oldSession)\n && Object.prototype.hasOwnProperty.call(oldSession, 'ttl')\n && oldSession['ttl'] >= now\n ) {\n this._session.mid = oldSession['mid']\n }\n\n this._starting = true\n return (this._startingPromise = new Promise((resolve, reject) => {\n this.loadConfig('client_start')\n .then((config) => {\n this.setConfig(config as TypePullClientConfig, allowConfigCaching)\n this.init()\n this.updateWatch(true)\n this.startCheckConfig()\n\n this.connect().then(\n () => resolve(true),\n error => reject(error)\n )\n })\n .catch((error) => {\n this._starting = false\n this.status = PullStatus.Offline\n this.stopCheckConfig()\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: could not read push-server config`,\n { error }\n )\n reject(error)\n })\n }))\n }\n\n /**\n * @param disconnectCode\n * @param disconnectReason\n */\n public restart(\n disconnectCode: number | CloseReasons = CloseReasons.NORMAL_CLOSURE,\n disconnectReason: string = 'manual restart'\n ): void {\n if (this._disposed) {\n return\n }\n\n if (this._restartTimeout) {\n clearTimeout(this._restartTimeout)\n this._restartTimeout = null\n }\n\n this.getLogger().debug(\n `${Text.getDateForLog()}: Pull: restarting with code ${disconnectCode}`\n )\n\n this.disconnect(disconnectCode, disconnectReason)\n\n if (this._storage) {\n this._storage.remove(LsKeys.PullConfig)\n }\n\n this._config = null\n\n const loadConfigReason = `${disconnectCode}_${disconnectReason.replaceAll(' ', '_')}`\n this.loadConfig(loadConfigReason).then(\n (config) => {\n this.setConfig(config, true)\n this.updateWatch()\n this.startCheckConfig()\n this.connect().catch((error) => {\n this.getLogger().error('restart error', { error })\n })\n },\n (error) => {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: could not read push-server config `,\n { error }\n )\n\n this.status = PullStatus.Offline\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n\n if (error?.status == 401 || error?.status == 403) {\n this.stopCheckConfig()\n this.onCustomEvent('onPullError', ['AUTHORIZE_ERROR'])\n }\n }\n )\n }\n\n public stop(\n disconnectCode: number | CloseReasons = CloseReasons.NORMAL_CLOSURE,\n disconnectReason: string = 'manual stop'\n ): void {\n this.disconnect(disconnectCode, disconnectReason)\n\n this.stopCheckConfig()\n\n this.clearAllTimers()\n }\n\n // Cancel every pending timer so a stopped/destroyed client leaves nothing\n // running. Previously only _checkInterval was cleared, so the other six timers\n // (including the self-rescheduling watch-extend) survived teardown (#141).\n private clearAllTimers(): void {\n for (const timer of [\n this._reconnectTimeout,\n this._restartTimeout,\n this._restoreWebSocketTimeout,\n this._offlineTimeout,\n this._watchUpdateTimeout,\n this._pingWaitTimeout\n ]) {\n if (timer) {\n clearTimeout(timer)\n }\n }\n if (this._checkInterval) {\n clearInterval(this._checkInterval)\n }\n this._reconnectTimeout = null\n this._restartTimeout = null\n this._restoreWebSocketTimeout = null\n this._offlineTimeout = null\n this._watchUpdateTimeout = null\n this._pingWaitTimeout = null\n this._checkInterval = null\n }\n\n public reconnect(\n disconnectCode: number | CloseReasons,\n disconnectReason: string,\n delay: number = 1\n ): void {\n this.disconnect(disconnectCode, disconnectReason)\n\n this.scheduleReconnect(delay)\n }\n\n /**\n * @param lastMessageId\n */\n public setLastMessageId(lastMessageId: string): void {\n this._session.mid = lastMessageId\n }\n\n /**\n * Send a single message to the specified users.\n *\n * @param users User ids of the message receivers.\n * @param moduleId Name of the module to receive a message,\n * @param command Command name.\n * @param {object} params Command parameters.\n * @param [expiry] Message expiry time in seconds.\n * @return {Promise}\n */\n public async sendMessage(\n users: number[],\n moduleId: string,\n command: string,\n params: any,\n expiry?: number\n ): Promise<any> {\n const message = {\n userList: users,\n body: {\n module_id: moduleId,\n command: command,\n params: params\n },\n expiry: expiry\n } as TypePullClientMessageBatch\n\n if (this.isJsonRpc()) {\n return this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.Publish,\n message\n )\n } else {\n return this.sendMessageBatch([message])\n }\n }\n\n /**\n * Send a single message to the specified public channels.\n *\n * @param publicChannels Public ids of the channels to receive a message.\n * @param moduleId Name of the module to receive a message,\n * @param command Command name.\n * @param {object} params Command parameters.\n * @param [expiry] Message expiry time in seconds.\n * @return {Promise}\n */\n public async sendMessageToChannels(\n publicChannels: string[],\n moduleId: string,\n command: string,\n params: any,\n expiry?: number\n ): Promise<any> {\n const message = {\n channelList: publicChannels,\n body: {\n module_id: moduleId,\n command: command,\n params: params\n },\n expiry: expiry\n } as TypePullClientMessageBatch\n\n if (this.isJsonRpc()) {\n return this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.Publish,\n message\n )\n } else {\n return this.sendMessageBatch([message])\n }\n }\n\n /**\n * @param debugFlag\n */\n public capturePullEvent(debugFlag: boolean = true): void {\n this._debug = debugFlag\n }\n\n /**\n * @param loggingFlag\n */\n public enableLogging(loggingFlag: boolean = true): void {\n this._sharedConfig.setLoggingEnabled(loggingFlag)\n this._loggingEnabled = loggingFlag\n }\n\n /**\n * Returns list channels that the connection is subscribed to.\n *\n * @returns {Promise}\n */\n public async listChannels(): Promise<any> {\n return (\n this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.ListChannels,\n {}\n ) || Promise.reject(new Error('jsonRpcAdapter not init'))\n )\n }\n\n /**\n * Returns \"last seen\" time in seconds for the users.\n * Result format: Object{userId: int}\n * If the user is currently connected - will return 0.\n * If the user is offline - will return the diff between the current timestamp and the last seen timestamp in seconds.\n * If the user was never online - the record for the user will be missing from the result object.\n *\n * @param {integer[]} userList List of user ids.\n * @returns {Promise}\n */\n public async getUsersLastSeen(\n userList: number[]\n ): Promise<Record<number, number>> {\n if (\n !Type.isArray(userList)\n || !userList.every(item => typeof item === 'number')\n ) {\n throw new Error('userList must be an array of numbers')\n }\n\n const result: Record<number, number> = {}\n\n return new Promise((resolve, reject) => {\n this._jsonRpcAdapter\n ?.executeOutgoingRpcCommand(RpcMethod.GetUsersLastSeen, {\n userList: userList\n })\n .then((response: any) => {\n const unresolved = []\n\n for (let i = 0; i < userList.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(response, userList[i]!)) {\n unresolved.push(userList[i])\n }\n }\n\n if (unresolved.length === 0) {\n return resolve(result)\n }\n\n const params = {\n userIds: unresolved,\n sendToQueueSever: true\n }\n\n this._restClient\n .actions.v2.call.make({\n method: 'pull.api.user.getLastSeen',\n params\n })\n .then((response: AjaxResult) => {\n const data = (response.getData() as SuccessPayload<Record<NumberString, NumberString>>).result as any\n for (const userId in data) {\n result[Number(userId)] = Number(data[userId])\n }\n\n return resolve(result)\n })\n .catch((error) => {\n this.getLogger().error('getUsersLastSeen', { error })\n reject(error)\n })\n })\n .catch((error) => {\n this.getLogger().error('getUsersLastSeen', { error })\n reject(error)\n })\n })\n }\n\n /**\n * Pings server.\n * In case of success promise will be resolved, otherwise - rejected.\n *\n * @param {number} timeout Request timeout in seconds\n * @returns {Promise}\n */\n public async ping(timeout: number = 5): Promise<void> {\n return this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.Ping,\n {},\n timeout\n )\n }\n\n /**\n * @param userId {number}\n * @param callback {UserStatusCallback}\n * @returns {Promise}\n */\n public async subscribeUserStatusChange(\n userId: number,\n callback: UserStatusCallback\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n this._jsonRpcAdapter\n ?.executeOutgoingRpcCommand(RpcMethod.SubscribeStatusChange, {\n userId\n })\n .then(() => {\n if (!this._userStatusCallbacks[userId]) {\n this._userStatusCallbacks[userId] = []\n }\n\n if (Type.isFunction(callback)) {\n this._userStatusCallbacks[userId].push(callback)\n }\n\n return resolve()\n })\n .catch(error => reject(error))\n })\n }\n\n /**\n * @param {number} userId\n * @param {UserStatusCallback} callback\n * @returns {Promise}\n */\n public async unsubscribeUserStatusChange(\n userId: number,\n callback: UserStatusCallback\n ): Promise<void> {\n if (this._userStatusCallbacks[userId]) {\n this._userStatusCallbacks[userId] = this._userStatusCallbacks[\n userId\n ].filter(cb => cb !== callback)\n\n if (this._userStatusCallbacks[userId].length === 0) {\n return this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.UnsubscribeStatusChange,\n {\n userId\n }\n )\n }\n }\n\n return Promise.resolve()\n }\n\n // endregion ////\n\n // region Get ////\n public getRevision(): number | null {\n return this._config && this._config.api\n ? this._config.api.revision_web\n : null\n }\n\n public getServerVersion(): number {\n return this._config && this._config.server ? this._config.server.version : 0\n }\n\n public getServerMode(): string | null {\n return this._config && this._config.server ? this._config.server.mode : null\n }\n\n public getConfig(): null | TypePullClientConfig {\n return this._config\n }\n\n public getDebugInfo(): any {\n if (!JSON || !JSON.stringify) {\n return {}\n }\n\n let configDump\n if (this._config && this._config.channels) {\n configDump = {\n // The private channel id is a subscription secret — mask it here too, not\n // just in `Path` below, so the debug dump never surfaces it (#148). Expiry\n // timestamps are non-sensitive and kept for diagnostics.\n ChannelID: this._config.channels.private?.id ? REDACTED_PLACEHOLDER : 'n/a',\n ChannelDie: this._config.channels.private?.end || 'n/a',\n ChannelDieShared: this._config.channels.shared?.end || 'n/a'\n }\n } else {\n configDump = {\n ConfigError: 'config is not loaded'\n }\n }\n\n let websocketMode = '-'\n if (\n this._connectors.webSocket\n && (this._connectors.webSocket as WebSocketConnector)?.socket\n ) {\n if (this.isJsonRpc()) {\n websocketMode = 'json-rpc'\n } else {\n websocketMode\n\n = (\n this._connectors.webSocket as WebSocketConnector\n )?.socket?.url.search('binaryMode=true') != -1\n ? 'protobuf'\n : 'text'\n }\n }\n\n const connectionPath = this.connector?.connectionPath\n\n return {\n 'UserId': this._userId + (this._userId > 0 ? '' : '(guest)'),\n 'Guest userId':\n this._guestMode && this._guestUserId !== 0 ? this._guestUserId : '-',\n 'Browser online': navigator.onLine ? 'Y' : 'N',\n 'Connect': this.isConnected() ? 'Y' : 'N',\n 'Server type': this.isSharedMode() ? 'cloud' : 'local',\n 'WebSocket supported': this.isWebSocketSupported() ? 'Y' : 'N',\n 'WebSocket connected':\n this._connectors.webSocket && this._connectors.webSocket.connected\n ? 'Y'\n : 'N',\n 'WebSocket mode': websocketMode,\n\n 'Try connect': this._reconnectTimeout ? 'Y' : 'N',\n 'Try number': this._connectionAttempt,\n\n // Mask the push JWT (`token`) and private `CHANNEL_ID`s before exposing\n // the connection path through this developer-facing debug dump (#148).\n 'Path': connectionPath\n ? redactSensitiveUrl(connectionPath, ['CHANNEL_ID'])\n : '-',\n ...configDump,\n\n 'Last message': this._session.mid || '-',\n 'Session history': this._session.history,\n 'Watch tags': this._watchTagsQueue.entries()\n }\n }\n\n /**\n * @process\n * @param connectionType\n */\n public getConnectionPath(connectionType: ConnectionType): string {\n let path\n const params: any = {}\n\n switch (connectionType) {\n case ConnectionType.WebSocket:\n path = this._isSecure\n ? this._config?.server.websocket_secure\n : this._config?.server.websocket\n break\n case ConnectionType.LongPolling:\n path = this._isSecure\n ? this._config?.server.long_pooling_secure\n : this._config?.server.long_polling\n break\n default:\n throw new Error(`Unknown connection type ${connectionType}`)\n }\n\n if (!Type.isStringFilled(path)) {\n throw new Error(`Empty path`)\n }\n\n if (typeof this._config?.jwt === 'string' && this._config?.jwt !== '') {\n params['token'] = this._config?.jwt\n } else {\n const channels: string[] = []\n\n // One guarded push per channel — previously the private id was pushed\n // twice (and an empty segment when `private` existed without an `id`),\n // producing a malformed `CHANNEL_ID` like `id/id` or a leading `/` (#238).\n if (this._config?.channels?.private?.id) {\n channels.push(this._config.channels.private.id)\n }\n\n if (this._config?.channels?.shared?.id) {\n channels.push(this._config.channels.shared.id)\n }\n\n if (channels.length === 0) {\n throw new Error(`Empty channels`)\n }\n\n params['CHANNEL_ID'] = channels.join('/')\n }\n\n if (this.isJsonRpc()) {\n params.jsonRpc = 'true'\n } else if (this.isProtobufSupported()) {\n params.binaryMode = 'true'\n }\n\n if (this.isSharedMode()) {\n if (!this._config?.clientId) {\n throw new Error(\n 'Push-server is in shared mode, but clientId is not set'\n )\n }\n\n params.clientId = this._config.clientId\n }\n if (this._session.mid) {\n params.mid = this._session.mid\n }\n if (this._session.tag) {\n params.tag = this._session.tag\n }\n if (this._session.time) {\n params.time = this._session.time\n }\n params.revision = REVISION\n\n return `${path}?${Text.buildQueryString(params)}`\n }\n\n /**\n * @process\n */\n public getPublicationPath(): string {\n const path = this._isSecure\n ? this._config?.server.publish_secure\n : this._config?.server.publish\n\n if (!path) {\n return ''\n }\n\n const channels: string[] = []\n\n if (this._config?.channels.private?.id) {\n channels.push(this._config.channels.private.id)\n }\n\n if (this._config?.channels.shared?.id) {\n channels.push(this._config.channels.shared.id)\n }\n\n const params = {\n CHANNEL_ID: channels.join('/')\n }\n\n return path + '?' + Text.buildQueryString(params)\n }\n\n // endregion ////\n\n // region Is* ////\n public isConnected(): boolean {\n return this.connector ? this.connector.connected : false\n }\n\n public isWebSocketSupported(): boolean {\n return typeof window.WebSocket !== 'undefined'\n }\n\n public isWebSocketAllowed(): boolean {\n if (this._sharedConfig.isWebSocketBlocked()) {\n return false\n }\n\n return this.isWebSocketEnabled()\n }\n\n public isWebSocketEnabled(): boolean {\n if (!this.isWebSocketSupported()) {\n return false\n }\n\n if (!this._config) {\n return false\n }\n\n if (!this._config.server) {\n return false\n }\n\n return this._config.server.websocket_enabled\n }\n\n public isPublishingSupported(): boolean {\n return this.getServerVersion() > 3\n }\n\n public isPublishingEnabled(): boolean {\n if (!this.isPublishingSupported()) {\n return false\n }\n\n return this._config?.server.publish_enabled === true\n }\n\n public isProtobufSupported(): boolean {\n return this.getServerVersion() == 4 && !Browser.isIE()\n }\n\n public isJsonRpc(): boolean {\n return this.getServerVersion() >= 5\n }\n\n public isSharedMode(): boolean {\n return this.getServerMode() === ServerMode.Shared\n }\n\n // endregion ////\n\n // region Events ////\n /**\n * @param {TypePullClientEmitConfig} params\n * @returns {boolean}\n */\n private emit(params: TypePullClientEmitConfig): boolean {\n if (\n params.type == SubscriptionType.Server\n || params.type == SubscriptionType.Client\n ) {\n if (typeof this._subscribers[params.type] === 'undefined') {\n this._subscribers[params.type] = {}\n }\n\n if (typeof params.moduleId === 'undefined') {\n throw new TypeError(\n `${Text.getDateForLog()}: Pull.emit: parameter moduleId is not specified`\n )\n }\n\n if (\n typeof this._subscribers[params.type][params.moduleId] === 'undefined'\n ) {\n this._subscribers[params.type][params.moduleId] = {\n callbacks: [],\n commands: {}\n }\n }\n\n if (\n this._subscribers[params.type][params.moduleId]['callbacks'].length > 0\n ) {\n this._subscribers[params.type][params.moduleId]['callbacks'].forEach(\n (callback: CommandHandlerFunctionV1) => {\n callback(params.data as Record<string, any>, {\n type: params.type,\n moduleId: params.moduleId ?? '?'\n })\n }\n )\n }\n\n if (\n !(typeof params.data === 'undefined')\n && !(typeof params.data['command'] === 'undefined')\n && this._subscribers[params.type][params.moduleId]['commands'][\n params.data['command']\n ]\n && this._subscribers[params.type][params.moduleId]['commands'][\n params.data['command']\n ].length > 0\n ) {\n this._subscribers[params.type][params.moduleId]['commands'][\n params.data['command']\n\n ].forEach((callback: CommandHandlerFunctionV2) => {\n if (typeof params.data === 'undefined') {\n return\n }\n\n callback(\n params.data['params'],\n params.data['extra'],\n params.data['command'],\n {\n type: params.type,\n moduleId: params.moduleId as string\n }\n )\n })\n }\n\n return true\n } else {\n if (typeof this._subscribers[params.type] === 'undefined') {\n this._subscribers[params.type] = []\n }\n\n if (this._subscribers[params.type].length <= 0) {\n return true\n }\n\n this._subscribers[params.type].forEach(\n (callback: CommandHandlerFunctionV1) => {\n callback(params.data as Record<string, any>, {\n type: params.type\n })\n }\n )\n\n return true\n }\n }\n\n /**\n * @process\n *\n * @param message\n */\n private broadcastMessage(message: TypePullClientMessageBody): void {\n const moduleId = (message.module_id = message.module_id.toLowerCase())\n const command = message.command\n\n if (!message.extra) {\n message.extra = {}\n }\n\n if (message.extra.server_time_unix) {\n message.extra.server_time_ago\n = (Date.now() - message.extra.server_time_unix * 1000) / 1000\n - (this._config?.server.timeShift || 0)\n message.extra.server_time_ago = Math.max(message.extra.server_time_ago, 0)\n }\n\n this.logMessage(message)\n try {\n if (\n message.extra.sender\n && message.extra.sender.type === SenderType.Client\n ) {\n this.onCustomEvent(\n 'onPullClientEvent-' + moduleId,\n [command, message.params, message.extra],\n true\n )\n this.onCustomEvent(\n 'onPullClientEvent',\n [moduleId, command, message.params, message.extra],\n true\n )\n\n this.emit({\n type: SubscriptionType.Client,\n moduleId: moduleId,\n data: {\n command: command,\n params: Type.clone(message.params),\n extra: Type.clone(message.extra)\n }\n })\n } else if (moduleId === 'pull') {\n this.handleInternalPullEvent(command, message)\n } else if (moduleId == 'online') {\n if ((message?.extra?.server_time_ago || 0) < 240) {\n this.onCustomEvent(\n 'onPullOnlineEvent',\n [command, message.params, message.extra],\n true\n )\n\n this.emit({\n type: SubscriptionType.Online,\n data: {\n command: command,\n params: Type.clone(message.params),\n extra: Type.clone(message.extra)\n }\n })\n }\n\n if (command === 'userStatusChange') {\n this.emitUserStatusChange(\n message.params.user_id,\n message.params.online\n )\n }\n } else {\n this.onCustomEvent(\n 'onPullEvent-' + moduleId,\n [command, message.params, message.extra],\n true\n )\n this.onCustomEvent(\n 'onPullEvent',\n [moduleId, command, message.params, message.extra],\n true\n )\n\n this.emit({\n type: SubscriptionType.Server,\n moduleId: moduleId,\n data: {\n command: command,\n params: Type.clone(message.params),\n extra: Type.clone(message.extra)\n }\n })\n }\n } catch (error) {\n this.getLogger().warning('PULL ERROR', {\n errorType: 'broadcastMessages execute error',\n errorEvent: error,\n // app-defined message.params / extra may carry a credential key (#43)\n message: redactSensitiveParams(message as unknown as Record<string, unknown>)\n })\n }\n\n if (message.extra && message.extra.revision_web) {\n this.checkRevision(Text.toInteger(message.extra.revision_web))\n }\n }\n\n /**\n * @process\n *\n * @param messages\n */\n private broadcastMessages(messages: TypePullClientMessageBody[]): void {\n for (const message of messages) {\n this.broadcastMessage(message)\n }\n }\n\n // endregion ////\n\n // region sendMessage ////\n /**\n * Sends batch of messages to the multiple public channels.\n *\n * @param messageBatchList Array of messages to send.\n * @return void\n */\n private async sendMessageBatch(\n messageBatchList: TypePullClientMessageBatch[]\n ): Promise<any> {\n if (!this.isPublishingEnabled()) {\n this.getLogger().error(`Client publishing is not supported or is disabled`)\n return Promise.reject(\n new Error(`Client publishing is not supported or is disabled`)\n )\n }\n\n if (this.isJsonRpc()) {\n const rpcRequest\n = this._jsonRpcAdapter?.createPublishRequest(messageBatchList)\n this.connector?.send(JSON.stringify(rpcRequest))\n\n return Promise.resolve(true)\n } else {\n const userIds: Record<number, number> = {}\n\n for (const messageBatch of messageBatchList) {\n if (typeof messageBatch.userList !== 'undefined') {\n for (const user of messageBatch.userList) {\n const userId = Number(user)\n userIds[userId] = userId\n }\n }\n }\n\n this._channelManager\n ?.getPublicIds(Object.values(userIds))\n .then((publicIds) => {\n const response = this.connector?.send(\n this.encodeMessageBatch(messageBatchList, publicIds)\n )\n\n return Promise.resolve(response)\n })\n }\n }\n\n /**\n * @param messageBatchList\n * @param publicIds\n */\n private encodeMessageBatch(\n messageBatchList: TypePullClientMessageBatch[],\n publicIds: Record<number, TypeChanel>\n ): ArrayBuffer | string {\n const messages: any[] = []\n\n messageBatchList.forEach((messageFields) => {\n const messageBody = messageFields.body\n\n let receivers: any[] = []\n if (messageFields.userList) {\n receivers = this.createMessageReceivers(\n messageFields.userList,\n publicIds\n )\n }\n\n if (messageFields.channelList) {\n if (!Type.isArray(messageFields.channelList)) {\n throw new TypeError('messageFields.publicChannels must be an array')\n }\n\n messageFields.channelList.forEach((publicChannel) => {\n let publicId\n let signature\n if (\n typeof publicChannel === 'string'\n && publicChannel.includes('.')\n ) {\n const fields = publicChannel.toString().split('.')\n publicId = fields[0]\n signature = fields[1]\n } else if (\n typeof publicChannel === 'object'\n && 'publicId' in publicChannel\n && 'signature' in publicChannel\n ) {\n publicId = publicChannel?.publicId\n signature = publicChannel?.signature\n } else {\n throw new Error(\n 'Public channel MUST be either a string, formatted like \"{publicId}.{signature}\" or an object with fields \\'publicId\\' and \\'signature\\''\n )\n }\n\n receivers.push(\n Receiver.create({\n id: this.encodeId(publicId!),\n signature: this.encodeId(signature!)\n })\n )\n })\n }\n\n const message = IncomingMessage.create({\n receivers: receivers,\n body: JSON.stringify(messageBody),\n expiry: messageFields.expiry || 0\n })\n messages.push(message)\n })\n\n const requestBatch = RequestBatch.create({\n requests: [\n {\n incomingMessages: {\n messages: messages\n }\n }\n ]\n })\n\n return RequestBatch.encode(requestBatch).finish()\n }\n\n /**\n * @memo fix return type\n * @param users\n * @param publicIds\n */\n private createMessageReceivers(\n users: number[],\n publicIds: Record<number, TypeChanel>\n ): any[] {\n const result = []\n\n for (const userId of users) {\n if (!publicIds[userId] || !publicIds[userId].publicId) {\n throw new Error(`Could not determine public id for user ${userId}`)\n }\n\n result.push(\n Receiver.create({\n id: this.encodeId(publicIds[userId].publicId),\n signature: this.encodeId(publicIds[userId].signature)\n })\n )\n }\n\n return result\n }\n\n // endregion ////\n\n // region _userStatusCallbacks ////\n /**\n * @param userId\n * @param isOnline\n */\n private emitUserStatusChange(userId: number, isOnline: boolean): void {\n if (this._userStatusCallbacks[userId]) {\n for (const callback of this._userStatusCallbacks[userId]) {\n callback({\n userId,\n isOnline\n })\n }\n }\n }\n\n private restoreUserStatusSubscription(): void {\n for (const userId in this._userStatusCallbacks) {\n if (\n Object.prototype.hasOwnProperty.call(this._userStatusCallbacks, userId)\n && this._userStatusCallbacks[userId]!.length > 0\n ) {\n this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.SubscribeStatusChange,\n {\n userId: userId\n }\n )\n }\n }\n }\n\n // endregion ////\n\n // region Config ////\n private async loadConfig(_logTag?: string): Promise<TypePullClientConfig> {\n if (!this._config) {\n this._config = Object.assign({}, EmptyConfig)\n\n let config: any\n if (this._storage) {\n config = this._storage.get(LsKeys.PullConfig, null)\n }\n\n if (\n this.isConfigActual(config)\n && this.checkRevision(config.api.revision_web)\n ) {\n return Promise.resolve(config)\n } else if (this._storage) {\n this._storage.remove(LsKeys.PullConfig)\n }\n } else if (\n this.isConfigActual(this._config)\n && this.checkRevision(this._config.api.revision_web)\n ) {\n return Promise.resolve(this._config)\n } else {\n this._config = Object.assign({}, EmptyConfig)\n }\n\n return new Promise((resolve, reject) => {\n this._restClient\n .actions.v2.call.make({\n method: this._configGetMethod,\n params: { CACHE: 'N' }\n })\n .then((response) => {\n const data = response.getData()!.result as any\n\n const timeShift = Math.floor(\n (Date.now() - new Date(data.serverTime).getTime()) / 1000\n )\n\n delete data.serverTime\n\n const config = Object.assign({}, data)\n config.server.timeShift = timeShift\n\n resolve(config)\n })\n .catch((error: unknown) => { reject(error) })\n })\n }\n\n /**\n * @param config\n */\n private isConfigActual(config: any): boolean {\n if (!Type.isPlainObject(config)) {\n return false\n }\n\n if (Number(config['server'].config_timestamp) !== this._configTimestamp) {\n return false\n }\n\n const now = new Date()\n\n if (\n Type.isNumber(config['exp'])\n && config['exp'] > 0\n && config['exp'] < now.getTime() / 1000\n ) {\n return false\n }\n\n const channelCount = Object.keys(config['channels']).length\n if (channelCount === 0) {\n return false\n }\n\n for (const channelType in config['channels']) {\n if (!Object.prototype.hasOwnProperty.call(config['channels'], channelType)) {\n continue\n }\n\n const channel = config['channels'][channelType]\n const channelEnd = new Date(channel.end)\n\n if (channelEnd < now) {\n return false\n }\n }\n\n return true\n }\n\n private startCheckConfig(): void {\n if (this._disposed) {\n return\n }\n\n if (this._checkInterval) {\n clearInterval(this._checkInterval)\n this._checkInterval = null\n }\n\n this._checkInterval = setInterval(\n this.checkConfig.bind(this),\n CONFIG_CHECK_INTERVAL\n )\n }\n\n private stopCheckConfig(): void {\n if (this._checkInterval) {\n clearInterval(this._checkInterval)\n }\n this._checkInterval = null\n }\n\n private checkConfig(): boolean {\n if (this.isConfigActual(this._config)) {\n if (!this.checkRevision(Text.toInteger(this._config?.api.revision_web))) {\n return false\n }\n } else {\n this.logToConsole('Stale config detected. Restarting')\n this.restart(CloseReasons.CONFIG_EXPIRED, 'config expired')\n }\n\n return true\n }\n\n /**\n * @param config\n * @param allowCaching\n */\n private setConfig(config: TypePullClientConfig, allowCaching: boolean): void {\n for (const key in config) {\n if (\n Object.prototype.hasOwnProperty.call(config, key)\n && Object.prototype.hasOwnProperty.call(this._config, key)\n ) {\n // @ts-expect-error this normal work - see ory code\n this._config[key] = config[key]\n }\n }\n\n if (config.publicChannels) {\n this.setPublicIds(Object.values(config.publicChannels))\n }\n\n this._configTimestamp = Number(config.server.config_timestamp)\n\n // Skip re-persisting once disposed: an in-flight loadConfig() from\n // start()/restart() can resolve AFTER destroy() removed the cache, which\n // would write the jwt + channel signatures back to localStorage (#242).\n if (this._storage && allowCaching && !this._disposed) {\n try {\n // Accepted shared-origin risk (#43): the cached config includes the push\n // `jwt` and channel signatures. localStorage is readable by any same-origin\n // script, so this is no weaker than the in-memory config under an\n // XSS/extension threat — and caching avoids a config round-trip on every\n // reconnect. One asymmetry: localStorage persists across reloads/tabs, so a\n // stolen value outlives the page (bounded by the short-lived, push-session-\n // tied jwt/signatures). A deliberate trade-off; documented rather than\n // stripped, and tracked for re-evaluation in #242.\n this._storage.set(LsKeys.PullConfig, config)\n } catch (error) {\n /**\n * @memotry to delete the key \"history\"\n * (landing site change history, see http://jabber.bx/view.php?id=136492)\n */\n if (localStorage && localStorage.removeItem) {\n localStorage.removeItem('history')\n }\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not cache config in local storage.`,\n { error }\n )\n }\n }\n }\n\n private setPublicIds(publicIds: TypePublicIdDescriptor[]): void {\n this._channelManager.setPublicIds(publicIds)\n }\n\n /**\n * @param serverRevision\n */\n private checkRevision(serverRevision: number): boolean {\n if (this._skipCheckRevision) {\n return true\n }\n\n if (serverRevision > 0 && serverRevision !== REVISION) {\n this._enabled = false\n this.showNotification('PULL_OLD_REVISION')\n this.disconnect(CloseReasons.NORMAL_CLOSURE, 'check_revision')\n\n this.onCustomEvent('onPullRevisionUp', [serverRevision, REVISION])\n\n this.emit({\n type: SubscriptionType.Revision,\n data: {\n server: serverRevision,\n client: REVISION\n }\n })\n\n this.logToConsole(\n `Pull revision changed from ${REVISION} to ${serverRevision}. Reload required`\n )\n\n return false\n }\n\n return true\n }\n\n // endregion ////\n\n // region Connect|ReConnect|DisConnect ////\n private disconnect(disconnectCode: number, disconnectReason: string): void {\n if (this.connector) {\n this._isManualDisconnect = true\n this.connector.disconnect(disconnectCode, disconnectReason)\n }\n }\n\n private restoreWebSocketConnection(): void {\n if (this._connectionType === ConnectionType.WebSocket) {\n return\n }\n\n this._connectors.webSocket?.connect()\n }\n\n /**\n * @param connectionDelay\n */\n private scheduleReconnect(connectionDelay: number = 0): void {\n if (this._disposed || !this._enabled) {\n return\n }\n\n if (!connectionDelay) {\n /**\n * never fallback to long polling\n * @memo remove long polling support later\n */\n /* /\n if(\n this._connectionAttempt > 3\n && this._connectionType === ConnectionType.WebSocket\n && !this._sharedConfig.isLongPollingBlocked()\n )\n {\n // Websocket seems to be closed by network filter. Trying to fall back to long polling ////\n this._sharedConfig.setWebSocketBlocked(true)\n this._connectionType = ConnectionType.LongPolling\n this._connectionAttempt = 1\n connectionDelay = 1\n }\n else\n // */\n {\n connectionDelay = this.getConnectionAttemptDelay(\n this._connectionAttempt\n )\n }\n }\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n\n this.logToConsole(\n `Pull: scheduling reconnection in ${connectionDelay} seconds; attempt # ${this._connectionAttempt}`\n )\n\n this._reconnectTimeout = setTimeout(() => {\n this.connect().catch((error) => {\n this.getLogger().error('scheduleReconnect', { error })\n })\n }, connectionDelay * 1_000)\n }\n\n private scheduleRestoreWebSocketConnection(): void {\n if (this._disposed) {\n return\n }\n\n this.logToConsole(\n `Pull: scheduling restoration of websocket connection in ${RESTORE_WEBSOCKET_TIMEOUT} seconds`\n )\n\n if (this._restoreWebSocketTimeout) {\n return\n }\n\n this._restoreWebSocketTimeout = setTimeout(() => {\n this._restoreWebSocketTimeout = null\n this.restoreWebSocketConnection()\n }, RESTORE_WEBSOCKET_TIMEOUT * 1_000)\n }\n\n /**\n * @returns {Promise}\n */\n private async connect(): Promise<void> {\n if (this._disposed || !this._enabled) {\n return Promise.reject()\n }\n if (this.connector?.connected) {\n return Promise.resolve()\n }\n\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n\n this.status = PullStatus.Connecting\n this._connectionAttempt++\n return new Promise((resolve, reject) => {\n this._connectPromise = {\n resolve,\n reject\n }\n this.connector?.connect()\n })\n }\n\n /**\n * @param disconnectCode\n * @param disconnectReason\n * @param restartDelay\n */\n private scheduleRestart(\n disconnectCode: number,\n disconnectReason: string,\n restartDelay: number = 0\n ): void {\n if (this._disposed) {\n return\n }\n\n if (this._restartTimeout) {\n clearTimeout(this._restartTimeout)\n this._restartTimeout = null\n }\n\n if (restartDelay < 1) {\n restartDelay = Math.ceil(Math.random() * 30) + 5\n }\n\n this._restartTimeout = setTimeout(\n () => this.restart(disconnectCode, disconnectReason),\n restartDelay * 1_000\n )\n }\n\n // endregion ////\n\n // region Handlers ////\n /**\n * @param messageFields\n */\n private handleRpcIncomingMessage(messageFields: any): object {\n this._session.mid = messageFields.mid\n const body = messageFields.body\n\n if (!messageFields.body.extra) {\n body.extra = {}\n }\n body.extra.sender = messageFields.sender\n\n if (\n 'user_params' in messageFields\n && Type.isPlainObject(messageFields.user_params)\n ) {\n Object.assign(body.params, messageFields.user_params)\n }\n\n if (\n 'dictionary' in messageFields\n && Type.isPlainObject(messageFields.dictionary)\n ) {\n Object.assign(body.params, messageFields.dictionary)\n }\n\n if (this.checkDuplicate(messageFields.mid)) {\n this.addMessageToStat(body)\n this.trimDuplicates()\n this.broadcastMessage(body)\n }\n\n this.connector?.send(`mack:${messageFields.mid}`)\n\n return {}\n }\n\n /**\n * @param events\n */\n private handleIncomingEvents(events: TypeSessionEvent[]): void {\n const messages: TypePullClientMessageBody[] = []\n if (events.length === 0) {\n this._session.mid = null\n return\n }\n\n for (const event of events) {\n this.updateSessionFromEvent(event)\n\n if (event.mid && !this.checkDuplicate(event.mid)) {\n continue\n }\n\n this.addMessageToStat(\n event.text as { module_id: string, command: string }\n )\n messages.push(event.text as TypePullClientMessageBody)\n }\n this.trimDuplicates()\n this.broadcastMessages(messages)\n }\n\n /**\n * @param event\n */\n private updateSessionFromEvent(event: TypeSessionEvent): void {\n this._session.mid = event.mid || null\n this._session.tag = event.tag || null\n this._session.time = event.time || null\n }\n\n /**\n * @process\n *\n * @param command\n * @param message\n */\n private handleInternalPullEvent(\n command: string,\n message: TypePullClientMessageBody\n ): void {\n switch (command.toUpperCase()) {\n case SystemCommands.CHANNEL_EXPIRE: {\n if (message.params.action === 'reconnect') {\n const typeChanel = message.params?.channel.type as string\n if (typeChanel === 'private' && this._config?.channels?.private) {\n this._config.channels.private = message.params.new_channel\n this.logToConsole(\n `Pull: new config for ${message.params.channel.type} channel set: [updated]`\n )\n }\n if (typeChanel === 'shared' && this._config?.channels?.shared) {\n this._config.channels.shared = message.params.new_channel\n this.logToConsole(\n `Pull: new config for ${message.params.channel.type} channel set: [updated]`\n )\n }\n\n this.reconnect(CloseReasons.CONFIG_REPLACED, 'config was replaced')\n } else {\n this.restart(CloseReasons.CHANNEL_EXPIRED, 'channel expired received')\n }\n break\n }\n case SystemCommands.CONFIG_EXPIRE: {\n this.restart(CloseReasons.CONFIG_EXPIRED, 'config expired received')\n break\n }\n case SystemCommands.SERVER_RESTART: {\n this.reconnect(\n CloseReasons.SERVER_RESTARTED,\n 'server was restarted',\n 15\n )\n break\n }\n default:\n }\n }\n\n // region Handlers For Message ////\n /**\n * @param response\n */\n private onIncomingMessage(response: string | ArrayBuffer): void {\n if (this.isJsonRpc()) {\n if (response === JSON_RPC_PING) {\n this.onJsonRpcPing()\n } else {\n this._jsonRpcAdapter?.parseJsonRpcMessage(response as string)\n }\n } else {\n const events = this.extractMessages(response)\n this.handleIncomingEvents(events)\n }\n }\n\n // region onLongPolling ////\n private onLongPollingOpen(): void {\n this._unloading = false\n this._starting = false\n this._connectionAttempt = 0\n this._isManualDisconnect = false\n this.status = PullStatus.Online\n\n this.logToConsole('Pull: Long polling connection with push-server opened')\n if (this.isWebSocketEnabled()) {\n this.scheduleRestoreWebSocketConnection()\n }\n if (this._connectPromise) {\n this._connectPromise.resolve({})\n }\n }\n\n /**\n * @param response\n */\n private onLongPollingDisconnect(response: {\n code: number\n reason: string\n }): void {\n if (this._connectionType === ConnectionType.LongPolling) {\n this.status = PullStatus.Offline\n }\n\n this.logToConsole(\n `Pull: Long polling connection with push-server closed. Code: ${response.code}, reason: ${response.reason}`\n )\n if (!this._isManualDisconnect) {\n this.scheduleReconnect()\n }\n this._isManualDisconnect = false\n this.clearPingWaitTimeout()\n }\n\n /**\n * @param error\n */\n private onLongPollingError(error: Error): void {\n this._starting = false\n if (this._connectionType === ConnectionType.LongPolling) {\n this.status = PullStatus.Offline\n }\n\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Long polling connection error`,\n { error }\n )\n\n this.scheduleReconnect()\n if (this._connectPromise) {\n this._connectPromise.reject(error)\n }\n\n this.clearPingWaitTimeout()\n }\n\n // endregion ////\n\n // region onWebSocket ////\n /**\n * @param response\n */\n private onWebSocketBlockChanged(response: {\n isWebSocketBlocked: boolean\n }): void {\n const isWebSocketBlocked = response.isWebSocketBlocked\n\n if (\n isWebSocketBlocked\n && this._connectionType === ConnectionType.WebSocket\n && !this.isConnected()\n ) {\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n\n this._connectionAttempt = 0\n this._connectionType = ConnectionType.LongPolling\n this.scheduleReconnect(1)\n } else if (\n !isWebSocketBlocked\n && this._connectionType === ConnectionType.LongPolling\n ) {\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n if (this._restoreWebSocketTimeout) {\n clearTimeout(this._restoreWebSocketTimeout)\n this._restoreWebSocketTimeout = null\n }\n\n this._connectionAttempt = 0\n this._connectionType = ConnectionType.WebSocket\n this.scheduleReconnect(1)\n }\n }\n\n private onWebSocketOpen(): void {\n this._unloading = false\n this._starting = false\n this._connectionAttempt = 0\n this._isManualDisconnect = false\n this.status = PullStatus.Online\n this._sharedConfig.setWebSocketBlocked(false)\n\n // to prevent fallback to long polling in case of networking problems\n this._sharedConfig.setLongPollingBlocked(true)\n\n if (this._connectionType == ConnectionType.LongPolling) {\n this._connectionType = ConnectionType.WebSocket\n this._connectors.longPolling?.disconnect(\n CloseReasons.CONFIG_REPLACED,\n 'Fire at onWebSocketOpen'\n )\n }\n\n if (this._restoreWebSocketTimeout) {\n clearTimeout(this._restoreWebSocketTimeout)\n this._restoreWebSocketTimeout = null\n }\n this.logToConsole('Pull: Websocket connection with push-server opened')\n if (this._connectPromise) {\n this._connectPromise.resolve({})\n }\n\n this.restoreUserStatusSubscription()\n }\n\n /**\n * @param response\n */\n private onWebSocketDisconnect(response: {\n code: number\n reason: string\n }): void {\n if (this._connectionType === ConnectionType.WebSocket) {\n this.status = PullStatus.Offline\n }\n\n this.logToConsole(\n `Pull: Websocket connection with push-server closed. Code: ${response.code}, reason: ${response.reason}`,\n true\n )\n if (!this._isManualDisconnect) {\n if (response.code == CloseReasons.WRONG_CHANNEL_ID) {\n this.scheduleRestart(\n CloseReasons.WRONG_CHANNEL_ID,\n 'wrong channel signature'\n )\n } else {\n this.scheduleReconnect()\n }\n }\n\n // to prevent fallback to long polling in case of networking problems\n this._sharedConfig.setLongPollingBlocked(true)\n this._isManualDisconnect = false\n\n this.clearPingWaitTimeout()\n }\n\n /**\n * @param error\n */\n private onWebSocketError(error: Error): void {\n this._starting = false\n if (this._connectionType === ConnectionType.WebSocket) {\n this.status = PullStatus.Offline\n }\n\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: WebSocket connection error`,\n { error }\n )\n this.scheduleReconnect()\n if (this._connectPromise) {\n this._connectPromise.reject(error)\n }\n\n this.clearPingWaitTimeout()\n }\n\n // endregion ////\n // endregion ////\n\n // endregion ////\n\n // region extractMessages ////\n /**\n * @param pullEvent\n */\n private extractMessages(pullEvent: string | ArrayBuffer): TypeSessionEvent[] {\n if (pullEvent instanceof ArrayBuffer) {\n return this.extractProtobufMessages(pullEvent)\n } else if (Type.isStringFilled(pullEvent)) {\n return this.extractPlainTextMessages(pullEvent)\n }\n\n throw new Error('Error pullEvent type')\n }\n\n /**\n * @param pullEvent\n */\n private extractProtobufMessages(pullEvent: ArrayBuffer): TypeSessionEvent[] {\n const result = []\n\n try {\n const responseBatch = ResponseBatch.decode(new Uint8Array(pullEvent))\n for (let i = 0; i < responseBatch.responses.length; i++) {\n const response = responseBatch.responses[i]\n if (response.command !== 'outgoingMessages') {\n continue\n }\n\n const messages = response.outgoingMessages.messages\n for (const message of messages) {\n let messageFields\n try {\n messageFields = JSON.parse(message.body)\n } catch (error) {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not parse message body`,\n { error }\n )\n continue\n }\n\n if (!messageFields.extra) {\n messageFields.extra = {}\n }\n messageFields.extra.sender = {\n type: message.sender.type\n }\n\n if (message.sender.id instanceof Uint8Array) {\n messageFields.extra.sender.id = this.decodeId(message.sender.id)\n }\n\n const compatibleMessage = {\n mid: this.decodeId(message.id),\n text: messageFields\n }\n\n result.push(compatibleMessage)\n }\n }\n } catch (error) {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not parse message`,\n { error }\n )\n }\n\n return result\n }\n\n /**\n * @param pullEvent\n */\n private extractPlainTextMessages(pullEvent: string): TypeSessionEvent[] {\n const result = []\n\n const dataArray = pullEvent.match(/#!NGINXNMS!#(.*?)#!NGINXNME!#/g)\n if (dataArray === null) {\n this.getLogger().warning('PULL ERROR', {\n errorType: 'parseResponse error parsing message',\n // The frame failed the NGINX-delimiter match, so its content is\n // unparseable anyway and could carry a credential (e.g. a channel\n // `signature`); log only its size, never the bytes (#43).\n byteLength: pullEvent.length\n })\n\n return []\n }\n for (let i = 0; i < dataArray.length; i++) {\n dataArray[i] = dataArray[i]!.substring(12, dataArray[i]!.length - 12)\n if (dataArray[i]!.length <= 0) {\n continue\n }\n\n let data\n try {\n data = JSON.parse(dataArray[i]!)\n } catch {\n continue\n }\n\n result.push(data as TypeSessionEvent)\n }\n\n return result\n }\n\n /**\n * Converts message id from byte[] to string\n * @param {Uint8Array} encodedId\n * @return {string}\n */\n private decodeId(encodedId: Uint8Array): string {\n let result = ''\n for (const element_ of encodedId) {\n const hexByte = element_.toString(16)\n if (hexByte.length === 1) {\n result += '0'\n }\n result += hexByte\n }\n\n return result\n }\n\n /**\n * Converts message id from hex-encoded string to byte[]\n * @param {string} id Hex-encoded string.\n * @return {Uint8Array}\n */\n private encodeId(id: string): Uint8Array {\n if (!id) {\n return new Uint8Array()\n }\n\n const result = []\n for (let i = 0; i < id.length; i += 2) {\n result.push(Number.parseInt(id.slice(i, i + 2), 16))\n }\n\n return new Uint8Array(result)\n }\n\n // endregion ////\n\n // region Events.Status /////\n private onOffline(): void {\n if (this._disposed) {\n return\n }\n this.disconnect(CloseReasons.NORMAL_CLOSURE, 'offline')\n }\n\n private onOnline(): void {\n if (this._disposed) {\n return\n }\n this.connect().catch((error) => {\n this.getLogger().error('onOnline', { error })\n })\n }\n\n private onBeforeUnload(): void {\n this._unloading = true\n\n this.persistSession()\n\n this.scheduleReconnect(15)\n }\n\n // Persist the current session (with a short TTL) so a quick reload / re-init can\n // resume it. Shared by onBeforeUnload and destroy() — destroy() saves WITHOUT\n // scheduling a reconnect (#141).\n private persistSession(): void {\n const session = Type.clone(this.session)\n session.ttl = Date.now() + LS_SESSION_CACHE_TIME * 1000\n if (this._storage) {\n try {\n this._storage.set(\n LS_SESSION,\n JSON.stringify(session)\n // LS_SESSION_CACHE_TIME\n )\n } catch (error) {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not save session info in local storage. Error: `,\n { error }\n )\n }\n }\n }\n\n // endregion ////\n\n // region PullStatus ////\n /**\n * @param status\n * @param delay\n */\n private sendPullStatusDelayed(status: PullStatus, delay: number): void {\n if (this._disposed) {\n return\n }\n\n if (this._offlineTimeout) {\n clearTimeout(this._offlineTimeout)\n this._offlineTimeout = null\n }\n\n this._offlineTimeout = setTimeout(() => {\n this._offlineTimeout = null\n this.sendPullStatus(status)\n }, delay)\n }\n\n /**\n * @param status\n */\n private sendPullStatus(status: PullStatus): void {\n if (this._unloading) {\n return\n }\n\n this.onCustomEvent('onPullStatus', [status])\n\n this.emit({\n type: SubscriptionType.Status,\n data: {\n status: status\n }\n })\n }\n\n // endregion ////\n\n // region _watchTagsQueue ////\n /**\n * @memo if private?\n * @param tagId\n * @param force\n */\n // @ts-expect-error When we rewrite it to something more modern, then we'll remove this\n private extendWatch(tagId: string, force: boolean = false): void {\n if (this._watchTagsQueue.get(tagId)) {\n return\n }\n\n this._watchTagsQueue.set(tagId, true)\n if (force) {\n this.updateWatch(force)\n }\n }\n\n /**\n * @param force\n */\n private updateWatch(force: boolean = false): void {\n if (this._disposed) {\n return\n }\n\n if (this._watchUpdateTimeout) {\n clearTimeout(this._watchUpdateTimeout)\n this._watchUpdateTimeout = null\n }\n\n this._watchUpdateTimeout = setTimeout(\n () => {\n /**\n * @memo test this\n */\n const watchTags = [...this._watchTagsQueue.keys()]\n\n if (watchTags.length > 0) {\n this._restClient\n .actions.v2.call.make({\n method: 'pull.watch.extend',\n params: { tags: watchTags }\n })\n .then((response: AjaxResult) => {\n /**\n * @memo test this\n */\n const updatedTags: NumberString[] = (response.getData() as SuccessPayload<NumberString[]>).result as any\n\n for (const tagId of updatedTags) {\n this.clearWatch(tagId)\n }\n\n this.updateWatch()\n })\n .catch(() => {\n this.updateWatch()\n })\n } else {\n this.updateWatch()\n }\n },\n force ? this._watchForceUpdateInterval : this._watchUpdateInterval\n )\n }\n\n /**\n * @param tagId\n */\n private clearWatch(tagId: string): void {\n this._watchTagsQueue.delete(tagId)\n }\n\n // endregion ////\n\n // region Ping ////\n private onJsonRpcPing(): void {\n this.updatePingWaitTimeout()\n this.connector?.send(JSON_RPC_PONG)\n }\n\n private updatePingWaitTimeout(): void {\n if (this._disposed) {\n return\n }\n\n if (this._pingWaitTimeout) {\n clearTimeout(this._pingWaitTimeout)\n this._pingWaitTimeout = null\n }\n\n this._pingWaitTimeout = setTimeout(\n this._onPingTimeoutHandler,\n PING_TIMEOUT * 2 * 1_000\n )\n }\n\n private clearPingWaitTimeout(): void {\n if (this._pingWaitTimeout) {\n clearTimeout(this._pingWaitTimeout)\n }\n\n this._pingWaitTimeout = null\n }\n\n private onPingTimeout(): void {\n this._pingWaitTimeout = null\n if (this._disposed || !this._enabled || !this.isConnected()) {\n return\n }\n\n this.getLogger().warning(`No pings are received in ${PING_TIMEOUT * 2} seconds. Reconnecting`)\n this.disconnect(CloseReasons.STUCK, 'connection stuck')\n\n this.scheduleReconnect()\n }\n\n // endregion ////\n\n // region Time ////\n /**\n * Returns reconnect delay in seconds\n *\n * @param attemptNumber\n * @return {number}\n */\n private getConnectionAttemptDelay(attemptNumber: number): number {\n let result\n if (attemptNumber < 1) {\n result = 0.5\n } else if (attemptNumber < 3) {\n result = 15\n } else if (attemptNumber < 5) {\n result = 45\n } else if (attemptNumber < 10) {\n result = 600\n } else {\n result = 3_600\n }\n\n return result + result * Math.random() * 0.2\n }\n\n // endregion ////\n\n // region Tools ////\n /**\n * @param mid\n */\n private checkDuplicate(mid: string): boolean {\n if (this._session.lastMessageIds.includes(mid)) {\n this.getLogger().warning(`Duplicate message ${mid} skipped`)\n return false\n } else {\n this._session.lastMessageIds.push(mid)\n return true\n }\n }\n\n private trimDuplicates(): void {\n if (this._session.lastMessageIds.length > MAX_IDS_TO_STORE) {\n this._session.lastMessageIds\n = this._session.lastMessageIds.slice(-MAX_IDS_TO_STORE)\n }\n }\n\n // endregion ////\n\n // region Logging ////\n /**\n * @param message\n */\n private logMessage(message: TypePullClientMessageBody): void {\n if (!this._debug) {\n return\n }\n\n if (\n message.extra?.sender\n && message.extra.sender.type === SenderType.Client\n ) {\n this.getLogger().info(\n `onPullClientEvent-${message.module_id}`, redactSensitiveParams({\n command: message.command,\n params: message.params,\n extra: message.extra\n })\n )\n } else if (message.module_id == 'online') {\n this.getLogger().info(\n `onPullOnlineEvent`, redactSensitiveParams({\n command: message.command,\n params: message.params,\n extra: message.extra\n })\n )\n } else {\n this.getLogger().info(\n `onPullEvent`,\n redactSensitiveParams({\n moduleId: message.module_id,\n command: message.command,\n params: message.params,\n extra: message.extra\n })\n )\n }\n }\n\n /**\n * @param message\n * @param force\n */\n private logToConsole(message: string, force: boolean = false): void {\n if (this._loggingEnabled || force) {\n this.getLogger().debug(`${Text.getDateForLog()}: ${message}`)\n }\n }\n\n /**\n * @param message\n */\n private addMessageToStat(message: {\n module_id: string\n command: string\n }): void {\n if (!this._session.history[message.module_id]) {\n this._session.history[message.module_id] = {}\n }\n if (!this._session.history[message.module_id][message.command]) {\n this.session.history[message.module_id][message.command] = 0\n }\n\n this._session.history[message.module_id][message.command]++\n\n this._session.messageCount++\n }\n\n /**\n * @param text\n */\n private showNotification(text: string): void {\n this.getLogger().notice(text)\n\n /* /\n if(this._notificationPopup || typeof BX.PopupWindow === 'undefined')\n {\n return;\n }\n\n this._notificationPopup = new BX.PopupWindow('bx-notifier-popup-confirm', null, {\n zIndex: 200,\n autoHide: false,\n closeByEsc: false,\n overlay: true,\n content: BX.create(\"div\", {\n props: {className: \"bx-messenger-confirm\"},\n html: text\n }),\n buttons: [\n new BX.PopupWindowButton({\n text: BX.message('JS_CORE_WINDOW_CLOSE'),\n className: \"popup-window-button-decline\",\n events: {\n click: () => this._notificationPopup.close(),\n }\n })\n ],\n events: {\n onPopupClose: () => this._notificationPopup.destroy(),\n onPopupDestroy: () => this._notificationPopup = null,\n }\n });\n this._notificationPopup.show();\n // */\n }\n\n // endregion ////\n\n // region onCustomEvent ////\n /**\n * @memo may be need to use onCustomEvent\n * @memo ? force\n */\n private onCustomEvent(\n eventName: string,\n data: any,\n force: boolean = false\n ): void {\n if (eventName || data || force) {\n /* empty */\n }\n\n /* /\n if (BX && BX.onCustomEvent)\n {\n BX.onCustomEvent(window, eventName, data, force)\n }\n // */\n }\n // endregion ////\n}\n"],"names":["ConnectionType","LoggerFactory","PullStatus","Type","Text","StorageManager","SharedConfig","ChannelManager","CloseReasons","LsKeys","WebSocketConnector","LongPollingConnector","JsonRpc","SubscriptionType","redactSensitiveParams","config","RpcMethod","response","REDACTED_PLACEHOLDER","redactSensitiveUrl","Browser","ServerMode","SenderType","Receiver","IncomingMessage","RequestBatch","SystemCommands","ResponseBatch"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 ErrorNotConnected extends Error {
|
|
14
|
+
static {
|
|
15
|
+
__name(this, "ErrorNotConnected");
|
|
16
|
+
}
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "ErrorNotConnected";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class ErrorTimeout extends Error {
|
|
23
|
+
static {
|
|
24
|
+
__name(this, "ErrorTimeout");
|
|
25
|
+
}
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "ErrorTimeout";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.ErrorNotConnected = ErrorNotConnected;
|
|
33
|
+
exports.ErrorTimeout = ErrorTimeout;
|
|
34
|
+
//# sourceMappingURL=errors.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.cjs","sources":["../../../src/pullClient/errors.ts"],"sourcesContent":["export class ErrorNotConnected extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ErrorNotConnected'\n }\n}\n\nexport class ErrorTimeout extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ErrorTimeout'\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAO,MAAM,0BAA0B,KAAA,CAAM;AAAA,EAA7C;AAA6C,IAAA,MAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AAAA;AAAA,EAC3C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAEO,MAAM,qBAAqB,KAAA,CAAM;AAAA,EAPxC;AAOwC,IAAA,MAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAAA;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;;;;;"}
|
|
@@ -0,0 +1,213 @@
|
|
|
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 errors = require('./errors.cjs');
|
|
12
|
+
const type = require('../tools/type.cjs');
|
|
13
|
+
const text = require('../tools/text.cjs');
|
|
14
|
+
const pull = require('../types/pull.cjs');
|
|
15
|
+
const redact = require('../core/http/redact.cjs');
|
|
16
|
+
const loggerFactory = require('../logger/logger-factory.cjs');
|
|
17
|
+
|
|
18
|
+
var __defProp = Object.defineProperty;
|
|
19
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
20
|
+
const JSON_RPC_VERSION = "2.0";
|
|
21
|
+
class JsonRpc {
|
|
22
|
+
static {
|
|
23
|
+
__name(this, "JsonRpc");
|
|
24
|
+
}
|
|
25
|
+
_logger;
|
|
26
|
+
_connector;
|
|
27
|
+
_idCounter = 0;
|
|
28
|
+
_handlers = {};
|
|
29
|
+
_rpcResponseAwaiters = /* @__PURE__ */ new Map();
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this._logger = loggerFactory.LoggerFactory.createNullLogger();
|
|
32
|
+
this._connector = options.connector;
|
|
33
|
+
if (type.Type.isPlainObject(options.handlers)) {
|
|
34
|
+
for (const method in options.handlers) {
|
|
35
|
+
this.handle(method, options.handlers[method]);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
setLogger(logger) {
|
|
40
|
+
this._logger = logger;
|
|
41
|
+
}
|
|
42
|
+
getLogger() {
|
|
43
|
+
return this._logger;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @param {string} method
|
|
47
|
+
* @param {function} handler
|
|
48
|
+
*/
|
|
49
|
+
handle(method, handler) {
|
|
50
|
+
this._handlers[method] = handler;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sends RPC command to the server.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} method Method name
|
|
56
|
+
* @param {object} params
|
|
57
|
+
* @param {int} timeout
|
|
58
|
+
* @returns {Promise}
|
|
59
|
+
*/
|
|
60
|
+
async executeOutgoingRpcCommand(method, params, timeout = 5) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
const request = this.createRequest(method, params);
|
|
63
|
+
if (!this._connector.send(JSON.stringify(request))) {
|
|
64
|
+
reject(new errors.ErrorNotConnected("websocket is not connected"));
|
|
65
|
+
}
|
|
66
|
+
const timeoutHandler = setTimeout(() => {
|
|
67
|
+
this._rpcResponseAwaiters.delete(request.id);
|
|
68
|
+
reject(new errors.ErrorTimeout("no response"));
|
|
69
|
+
}, timeout * 1e3);
|
|
70
|
+
this._rpcResponseAwaiters.set(request.id, {
|
|
71
|
+
resolve,
|
|
72
|
+
reject,
|
|
73
|
+
timeout: timeoutHandler
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Executes array or rpc commands.
|
|
79
|
+
* Returns an array of promises, each promise will be resolved individually.
|
|
80
|
+
*
|
|
81
|
+
* @param {JsonRpcRequest[]} batch
|
|
82
|
+
* @returns {Promise[]}
|
|
83
|
+
*/
|
|
84
|
+
// @ts-expect-error When we rewrite it to something more modern, then we'll remove this
|
|
85
|
+
executeOutgoingRpcBatch(batch) {
|
|
86
|
+
const requests = [];
|
|
87
|
+
const promises = [];
|
|
88
|
+
batch.forEach(({ method, params, id }) => {
|
|
89
|
+
const request = this.createRequest(method, params, id);
|
|
90
|
+
requests.push(request);
|
|
91
|
+
promises.push(
|
|
92
|
+
new Promise(
|
|
93
|
+
(resolve, reject) => this._rpcResponseAwaiters.set(request.id, {
|
|
94
|
+
resolve,
|
|
95
|
+
reject
|
|
96
|
+
})
|
|
97
|
+
)
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
this._connector.send(JSON.stringify(requests));
|
|
101
|
+
return promises;
|
|
102
|
+
}
|
|
103
|
+
processRpcResponse(response) {
|
|
104
|
+
if ("id" in response && this._rpcResponseAwaiters.has(Number(response.id))) {
|
|
105
|
+
const awaiter = this._rpcResponseAwaiters.get(Number(response.id));
|
|
106
|
+
if (awaiter) {
|
|
107
|
+
if ("result" in response) {
|
|
108
|
+
awaiter.resolve(response.result);
|
|
109
|
+
} else if ("error" in response) {
|
|
110
|
+
awaiter.reject(response?.error || "error");
|
|
111
|
+
} else {
|
|
112
|
+
awaiter.reject("wrong response structure");
|
|
113
|
+
}
|
|
114
|
+
clearTimeout(awaiter.timeout);
|
|
115
|
+
this._rpcResponseAwaiters.delete(Number(response.id));
|
|
116
|
+
}
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.getLogger().error(`${text.Text.getDateForLog()}: Pull: Received rpc response with unknown id`, redact.redactSensitiveParams({ response }));
|
|
120
|
+
}
|
|
121
|
+
parseJsonRpcMessage(message) {
|
|
122
|
+
let decoded;
|
|
123
|
+
try {
|
|
124
|
+
decoded = JSON.parse(message);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
this.getLogger().error(
|
|
127
|
+
`${text.Text.getDateForLog()}: Pull: Could not decode json rpc message`,
|
|
128
|
+
{ error }
|
|
129
|
+
);
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
if (type.Type.isArray(decoded)) {
|
|
133
|
+
return this.executeIncomingRpcBatch(decoded);
|
|
134
|
+
} else if (type.Type.isJsonRpcRequest(decoded)) {
|
|
135
|
+
return this.executeIncomingRpcCommand(decoded);
|
|
136
|
+
} else if (type.Type.isJsonRpcResponse(decoded)) {
|
|
137
|
+
this.processRpcResponse(decoded);
|
|
138
|
+
return [];
|
|
139
|
+
} else {
|
|
140
|
+
this.getLogger().error(
|
|
141
|
+
`${text.Text.getDateForLog()}: Pull: unknown rpc packet`,
|
|
142
|
+
redact.redactSensitiveParams({ decoded })
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Executes RPC command, received from the server
|
|
149
|
+
*
|
|
150
|
+
* @param {string} method
|
|
151
|
+
* @param {object} params
|
|
152
|
+
* @returns {object} RpcCommandResult
|
|
153
|
+
*/
|
|
154
|
+
executeIncomingRpcCommand({
|
|
155
|
+
method,
|
|
156
|
+
params
|
|
157
|
+
}) {
|
|
158
|
+
if (method in this._handlers) {
|
|
159
|
+
return this._handlers[method].call(this, params || {});
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
163
|
+
error: pull.ListRpcError.MethodNotFound
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
executeIncomingRpcBatch(batch) {
|
|
167
|
+
const result = [];
|
|
168
|
+
for (const command of batch) {
|
|
169
|
+
if ("jsonrpc" in command) {
|
|
170
|
+
if ("method" in command) {
|
|
171
|
+
const commandResult = this.executeIncomingRpcCommand(command);
|
|
172
|
+
if (commandResult) {
|
|
173
|
+
commandResult["jsonrpc"] = JSON_RPC_VERSION;
|
|
174
|
+
commandResult["id"] = command["id"];
|
|
175
|
+
result.push(commandResult);
|
|
176
|
+
}
|
|
177
|
+
} else {
|
|
178
|
+
this.processRpcResponse(command);
|
|
179
|
+
}
|
|
180
|
+
} else {
|
|
181
|
+
this.getLogger().error(
|
|
182
|
+
`${text.Text.getDateForLog()}: Pull: unknown rpc command in batch`,
|
|
183
|
+
redact.redactSensitiveParams({ command })
|
|
184
|
+
);
|
|
185
|
+
result.push({
|
|
186
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
187
|
+
error: pull.ListRpcError.InvalidRequest
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
nextId() {
|
|
194
|
+
return ++this._idCounter;
|
|
195
|
+
}
|
|
196
|
+
createPublishRequest(messageBatch) {
|
|
197
|
+
return messageBatch.map((message) => this.createRequest("publish", message));
|
|
198
|
+
}
|
|
199
|
+
createRequest(method, params, id) {
|
|
200
|
+
if (!id) {
|
|
201
|
+
id = this.nextId();
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
jsonrpc: JSON_RPC_VERSION,
|
|
205
|
+
method,
|
|
206
|
+
params,
|
|
207
|
+
id
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
exports.JsonRpc = JsonRpc;
|
|
213
|
+
//# sourceMappingURL=json-rpc.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-rpc.cjs","sources":["../../../src/pullClient/json-rpc.ts"],"sourcesContent":["import type { RpcCommand, RpcCommandResult, TypeRpcResponseAwaiters, JsonRpcRequest, RpcRequest, TypeConnector, TypeJsonRpcConfig, TypePullClientMessageBatch } from '../types/pull'\nimport type { LoggerInterface } from '../logger'\nimport { LoggerFactory } from '../logger'\nimport { ErrorNotConnected, ErrorTimeout } from './errors'\nimport { Type } from '../tools/type'\nimport { Text } from '../tools/text'\nimport { ListRpcError } from '../types/pull'\nimport { redactSensitiveParams } from '../core/http/redact'\n\nconst JSON_RPC_VERSION = '2.0'\n\nexport class JsonRpc {\n private _logger: LoggerInterface\n\n private _connector: TypeConnector\n private _idCounter: number = 0\n\n private _handlers: Record<string, (params: any) => RpcCommandResult> = {}\n\n private _rpcResponseAwaiters: Map<number, TypeRpcResponseAwaiters> = new Map()\n\n constructor(options: TypeJsonRpcConfig) {\n this._logger = LoggerFactory.createNullLogger()\n this._connector = options.connector\n\n if (Type.isPlainObject(options.handlers)) {\n for (const method in options.handlers) {\n this.handle(method, options.handlers[method]!)\n }\n }\n }\n\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n\n /**\n * @param {string} method\n * @param {function} handler\n */\n handle(method: string, handler: (params: any) => RpcCommandResult) {\n this._handlers[method] = handler\n }\n\n /**\n * Sends RPC command to the server.\n *\n * @param {string} method Method name\n * @param {object} params\n * @param {int} timeout\n * @returns {Promise}\n */\n async executeOutgoingRpcCommand(\n method: string,\n params: object,\n timeout: number = 5\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const request = this.createRequest(method, params)\n\n if (!this._connector.send(JSON.stringify(request))) {\n reject(new ErrorNotConnected('websocket is not connected'))\n }\n\n const timeoutHandler = setTimeout(() => {\n this._rpcResponseAwaiters.delete(request.id)\n reject(new ErrorTimeout('no response'))\n }, timeout * 1_000)\n\n this._rpcResponseAwaiters.set(request.id, {\n resolve,\n reject,\n timeout: timeoutHandler\n } as unknown as TypeRpcResponseAwaiters)\n })\n }\n\n /**\n * Executes array or rpc commands.\n * Returns an array of promises, each promise will be resolved individually.\n *\n * @param {JsonRpcRequest[]} batch\n * @returns {Promise[]}\n */\n // @ts-expect-error When we rewrite it to something more modern, then we'll remove this\n private executeOutgoingRpcBatch(batch: JsonRpcRequest[]): Promise<any>[] {\n const requests: RpcRequest[] = []\n const promises: Promise<any>[] = []\n\n // eslint-disable-next-line\n\t\tbatch.forEach(({ method, params, id }) => {\n const request = this.createRequest(method, params, id)\n requests.push(request)\n promises.push(\n new Promise((resolve, reject) =>\n this._rpcResponseAwaiters.set(request.id, {\n resolve,\n reject\n } as TypeRpcResponseAwaiters)\n )\n )\n })\n\n this._connector.send(JSON.stringify(requests))\n return promises\n }\n\n private processRpcResponse(response: RpcCommandResult): void {\n if (\n 'id' in response\n && this._rpcResponseAwaiters.has(Number(response.id))\n ) {\n const awaiter = this._rpcResponseAwaiters.get(Number(response.id))\n if (awaiter) {\n if ('result' in response) {\n awaiter.resolve(response.result)\n } else if ('error' in response) {\n awaiter.reject(response?.error || 'error')\n } else {\n awaiter.reject('wrong response structure')\n }\n\n clearTimeout(awaiter.timeout)\n this._rpcResponseAwaiters.delete(Number(response.id))\n }\n\n return\n }\n\n // Redact: an unknown/error server frame is opaque and could carry a credential key (#43).\n this.getLogger().error(`${Text.getDateForLog()}: Pull: Received rpc response with unknown id`, redactSensitiveParams({ response }))\n }\n\n parseJsonRpcMessage(\n message: string\n ): RpcCommandResult[] | RpcCommandResult {\n let decoded\n try {\n decoded = JSON.parse(message)\n } catch (error) {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not decode json rpc message`,\n { error }\n )\n\n return []\n }\n\n if (Type.isArray(decoded)) {\n return this.executeIncomingRpcBatch(decoded)\n } else if (Type.isJsonRpcRequest(decoded)) {\n return this.executeIncomingRpcCommand(decoded)\n } else if (Type.isJsonRpcResponse(decoded)) {\n this.processRpcResponse(decoded)\n return []\n } else {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: unknown rpc packet`,\n redactSensitiveParams({ decoded })\n )\n }\n\n return []\n }\n\n /**\n * Executes RPC command, received from the server\n *\n * @param {string} method\n * @param {object} params\n * @returns {object} RpcCommandResult\n */\n private executeIncomingRpcCommand({\n method,\n params\n }: RpcCommand): RpcCommandResult {\n if (method in this._handlers) {\n return this._handlers[method]!.call(this, params || {})\n }\n\n return {\n jsonrpc: JSON_RPC_VERSION,\n error: ListRpcError.MethodNotFound\n } as RpcCommandResult\n }\n\n private executeIncomingRpcBatch(batch: RpcCommand[]): RpcCommandResult[] {\n const result: RpcCommandResult[] = []\n\n for (const command of batch) {\n if ('jsonrpc' in command) {\n if ('method' in command) {\n const commandResult = this.executeIncomingRpcCommand(command)\n if (commandResult) {\n commandResult['jsonrpc'] = JSON_RPC_VERSION\n commandResult['id'] = command['id']\n\n result.push(commandResult)\n }\n } else {\n this.processRpcResponse(command)\n }\n } else {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: unknown rpc command in batch`,\n redactSensitiveParams({ command })\n )\n\n result.push({\n jsonrpc: JSON_RPC_VERSION,\n error: ListRpcError.InvalidRequest\n } as RpcCommandResult)\n }\n }\n\n return result\n }\n\n private nextId(): number {\n return ++this._idCounter\n }\n\n public createPublishRequest(\n messageBatch: TypePullClientMessageBatch[]\n ): RpcRequest[] {\n return messageBatch.map(message => this.createRequest('publish', message))\n }\n\n private createRequest(method: string, params: any, id?: number): RpcRequest {\n if (!id) {\n id = this.nextId()\n }\n\n return {\n jsonrpc: JSON_RPC_VERSION,\n method,\n params,\n id\n } as RpcRequest\n }\n}\n"],"names":["LoggerFactory","Type","ErrorNotConnected","ErrorTimeout","Text","redactSensitiveParams","ListRpcError"],"mappings":"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"}
|