@bitrix24/b24jssdk 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/esm/_virtual/_commonjsHelpers.mjs +1 -1
  2. package/dist/esm/_virtual/protobuf.mjs +1 -1
  3. package/dist/esm/_virtual/protobuf2.mjs +1 -1
  4. package/dist/esm/core/abstract-b24.mjs +1 -1
  5. package/dist/esm/core/abstract-b24.mjs.map +1 -1
  6. package/dist/esm/core/actions/abstract-action.mjs +1 -1
  7. package/dist/esm/core/actions/abstract-batch.mjs +1 -1
  8. package/dist/esm/core/actions/manager.mjs +1 -1
  9. package/dist/esm/core/actions/v2/batch-by-chunk.mjs +2 -1
  10. package/dist/esm/core/actions/v2/batch-by-chunk.mjs.map +1 -1
  11. package/dist/esm/core/actions/v2/batch.mjs +1 -1
  12. package/dist/esm/core/actions/v2/call-list.mjs +1 -1
  13. package/dist/esm/core/actions/v2/call-list.mjs.map +1 -1
  14. package/dist/esm/core/actions/v2/call.mjs +1 -1
  15. package/dist/esm/core/actions/v2/fetch-list.mjs +1 -1
  16. package/dist/esm/core/actions/v2/fetch-list.mjs.map +1 -1
  17. package/dist/esm/core/actions/v2/manager-v2.mjs +1 -1
  18. package/dist/esm/core/actions/v3/batch-by-chunk.mjs +1 -1
  19. package/dist/esm/core/actions/v3/batch-by-chunk.mjs.map +1 -1
  20. package/dist/esm/core/actions/v3/batch.mjs +1 -1
  21. package/dist/esm/core/actions/v3/call-list.mjs +1 -1
  22. package/dist/esm/core/actions/v3/call-list.mjs.map +1 -1
  23. package/dist/esm/core/actions/v3/call.mjs +1 -1
  24. package/dist/esm/core/actions/v3/fetch-list.mjs +2 -1
  25. package/dist/esm/core/actions/v3/fetch-list.mjs.map +1 -1
  26. package/dist/esm/core/actions/v3/manager-v3.mjs +1 -1
  27. package/dist/esm/core/http/abstract-http.mjs +2 -2
  28. package/dist/esm/core/http/ajax-error.mjs +1 -1
  29. package/dist/esm/core/http/ajax-result.mjs +1 -1
  30. package/dist/esm/core/http/limiters/adaptive-delayer.mjs +1 -1
  31. package/dist/esm/core/http/limiters/manager.mjs +1 -1
  32. package/dist/esm/core/http/limiters/operating-limiter.mjs +1 -1
  33. package/dist/esm/core/http/limiters/params-factory.mjs +1 -1
  34. package/dist/esm/core/http/limiters/rate-limiter.mjs +1 -1
  35. package/dist/esm/core/http/v2.mjs +2 -2
  36. package/dist/esm/core/http/v3.mjs +2 -2
  37. package/dist/esm/core/interaction/batch/abstract-interaction-batch.mjs +1 -1
  38. package/dist/esm/core/interaction/batch/parse-row.mjs +1 -1
  39. package/dist/esm/core/interaction/batch/processing/interface-strategy.mjs +1 -1
  40. package/dist/esm/core/interaction/batch/processing/v2/abstract-processing.mjs +1 -1
  41. package/dist/esm/core/interaction/batch/processing/v2/as-array.mjs +1 -1
  42. package/dist/esm/core/interaction/batch/processing/v2/as-object.mjs +1 -1
  43. package/dist/esm/core/interaction/batch/processing/v3/abstract-processing.mjs +1 -1
  44. package/dist/esm/core/interaction/batch/processing/v3/as-array.mjs +1 -1
  45. package/dist/esm/core/interaction/batch/processing/v3/as-object.mjs +1 -1
  46. package/dist/esm/core/interaction/batch/v2.mjs +1 -1
  47. package/dist/esm/core/interaction/batch/v3.mjs +1 -1
  48. package/dist/esm/core/language/list.mjs +1 -1
  49. package/dist/esm/core/request-id-generator.mjs +1 -1
  50. package/dist/esm/core/result.mjs +1 -1
  51. package/dist/esm/core/sdk-error.mjs +1 -1
  52. package/dist/esm/core/tools/abstract-tool.mjs +1 -1
  53. package/dist/esm/core/tools/healthcheck.mjs +1 -1
  54. package/dist/esm/core/tools/manager.mjs +1 -1
  55. package/dist/esm/core/tools/ping.mjs +1 -1
  56. package/dist/esm/core/version-manager.mjs +1 -1
  57. package/dist/esm/frame/auth.mjs +1 -1
  58. package/dist/esm/frame/b24.mjs +1 -1
  59. package/dist/esm/frame/dialog.mjs +1 -1
  60. package/dist/esm/frame/frame.mjs +1 -1
  61. package/dist/esm/frame/message/commands.mjs +1 -1
  62. package/dist/esm/frame/message/controller.mjs +1 -1
  63. package/dist/esm/frame/options.mjs +1 -1
  64. package/dist/esm/frame/parent.mjs +1 -1
  65. package/dist/esm/frame/placement.mjs +1 -1
  66. package/dist/esm/frame/slider.mjs +1 -1
  67. package/dist/esm/helper/abstract-helper.mjs +1 -1
  68. package/dist/esm/helper/app-manager.mjs +1 -1
  69. package/dist/esm/helper/currency-manager.mjs +1 -1
  70. package/dist/esm/helper/helper-manager.mjs +1 -1
  71. package/dist/esm/helper/license-manager.mjs +1 -1
  72. package/dist/esm/helper/options-manager.mjs +1 -1
  73. package/dist/esm/helper/payment-manager.mjs +1 -1
  74. package/dist/esm/helper/profile-manager.mjs +1 -1
  75. package/dist/esm/helper/use-b24-helper.mjs +1 -1
  76. package/dist/esm/hook/auth.mjs +1 -1
  77. package/dist/esm/hook/b24.mjs +1 -1
  78. package/dist/esm/index.d.mts +3 -3
  79. package/dist/esm/index.d.ts +3 -3
  80. package/dist/esm/index.mjs +1 -1
  81. package/dist/esm/loader-b24frame.mjs +1 -1
  82. package/dist/esm/logger/abstract-logger.mjs +1 -1
  83. package/dist/esm/logger/browser.mjs +1 -1
  84. package/dist/esm/logger/formatter/abstract-formatter.mjs +1 -1
  85. package/dist/esm/logger/formatter/json-formatter.mjs +1 -1
  86. package/dist/esm/logger/formatter/line-formatter.mjs +1 -1
  87. package/dist/esm/logger/formatter/telegram-formatter.mjs +1 -1
  88. package/dist/esm/logger/handler/abstract-handler.mjs +1 -1
  89. package/dist/esm/logger/handler/consola-adapter.mjs +1 -1
  90. package/dist/esm/logger/handler/console-handler.mjs +1 -1
  91. package/dist/esm/logger/handler/console-v2-handler.mjs +1 -1
  92. package/dist/esm/logger/handler/memory-handler.mjs +1 -1
  93. package/dist/esm/logger/handler/stream-handler.mjs +1 -1
  94. package/dist/esm/logger/handler/telegram-handler.mjs +1 -1
  95. package/dist/esm/logger/handler/winston-adapter.mjs +1 -1
  96. package/dist/esm/logger/logger-factory.mjs +1 -1
  97. package/dist/esm/logger/logger.mjs +1 -1
  98. package/dist/esm/logger/null-logger.mjs +1 -1
  99. package/dist/esm/logger/processor/memory-usage-processor.mjs +1 -1
  100. package/dist/esm/logger/processor/pid-processor.mjs +1 -1
  101. package/dist/esm/oauth/auth.mjs +1 -1
  102. package/dist/esm/oauth/auth.mjs.map +1 -1
  103. package/dist/esm/oauth/b24.mjs +1 -1
  104. package/dist/esm/oauth/refresh-token-error.mjs +1 -1
  105. package/dist/esm/pullClient/abstract-connector.mjs +1 -1
  106. package/dist/esm/pullClient/channel-manager.mjs +1 -1
  107. package/dist/esm/pullClient/client.mjs +1 -1
  108. package/dist/esm/pullClient/client.mjs.map +1 -1
  109. package/dist/esm/pullClient/errors.mjs +1 -1
  110. package/dist/esm/pullClient/json-rpc.mjs +1 -1
  111. package/dist/esm/pullClient/long-polling-connector.mjs +1 -1
  112. package/dist/esm/pullClient/protobuf/index.mjs +1 -1
  113. package/dist/esm/pullClient/protobuf/model.mjs +1 -1
  114. package/dist/esm/pullClient/protobuf/protobuf.mjs +1 -1
  115. package/dist/esm/pullClient/shared-config.mjs +1 -1
  116. package/dist/esm/pullClient/storage-manager.mjs +1 -1
  117. package/dist/esm/pullClient/web-socket-connector.mjs +1 -1
  118. package/dist/esm/tools/browser.mjs +1 -1
  119. package/dist/esm/tools/environment.mjs +1 -1
  120. package/dist/esm/tools/formatters/iban.mjs +1 -1
  121. package/dist/esm/tools/formatters/numbers.mjs +1 -1
  122. package/dist/esm/tools/index.mjs +1 -1
  123. package/dist/esm/tools/scroll-size.mjs +1 -1
  124. package/dist/esm/tools/text.mjs +1 -1
  125. package/dist/esm/tools/type.mjs +1 -1
  126. package/dist/esm/tools/use-formatters.mjs +1 -1
  127. package/dist/esm/tools/uuidv7.mjs +1 -1
  128. package/dist/esm/types/b24-helper.mjs +1 -1
  129. package/dist/esm/types/b24.mjs +1 -1
  130. package/dist/esm/types/bizproc/index.mjs +1 -1
  131. package/dist/esm/types/catalog/index.mjs +1 -1
  132. package/dist/esm/types/common.mjs +1 -1
  133. package/dist/esm/types/crm/entity-type.mjs +1 -1
  134. package/dist/esm/types/crm/productrow.mjs +1 -1
  135. package/dist/esm/types/logger.mjs +1 -1
  136. package/dist/esm/types/pull.mjs +1 -1
  137. package/dist/umd/index.js +6 -4
  138. package/dist/umd/index.js.map +1 -1
  139. package/dist/umd/index.min.js +8 -8
  140. package/dist/umd/index.min.js.map +1 -1
  141. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","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 { 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 private _loggingEnabled: boolean = false\n\n // bound event handlers ////\n private _onPingTimeoutHandler: () => 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 }\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 destroy(): void {\n this.stop(CloseReasons.NORMAL_CLOSURE, 'manual stop')\n\n this.onBeforeUnload()\n }\n\n private init(): void {\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 window.addEventListener('beforeunload', this.onBeforeUnload.bind(this))\n window.addEventListener('offline', this.onOffline.bind(this))\n window.addEventListener('online', this.onOnline.bind(this))\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 }\n )\n }\n\n method(data.params, data.extra, data.command)\n }\n }\n })\n }\n\n /**\n * @param config\n */\n public async start(\n config:\n | null\n | (TypePullClientConfig & {\n skipReconnectToLastSession?: boolean\n }) = null\n ): Promise<boolean> {\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._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\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 = (\n response.getData() as SuccessPayload<Record<NumberString, NumberString>>\n ).result\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 ChannelID: this._config.channels.private?.id || '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 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 'Path': this.connector?.connectionPath || '-',\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 if (this._config?.channels?.private) {\n channels.push(this._config.channels.private?.id || '')\n }\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 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 message\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\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._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 if (this._storage && allowCaching) {\n try {\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._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 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._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._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: ${this._config.channels.private}`\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: ${this._config.channels.shared}`\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 dataString: pullEvent\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 this.disconnect(CloseReasons.NORMAL_CLOSURE, 'offline')\n }\n\n private onOnline(): void {\n this.connect().catch((error) => {\n this.getLogger().error('onOnline', { error })\n })\n }\n\n private onBeforeUnload(): void {\n this._unloading = true\n\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 this.scheduleReconnect(15)\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._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._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\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._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._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}`, {\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`, {\n command: message.command,\n params: message.params,\n extra: message.extra\n }\n )\n } else {\n this.getLogger().info(\n `onPullEvent`,\n {\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":["config","response"],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","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 { 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 private _loggingEnabled: boolean = false\n\n // bound event handlers ////\n private _onPingTimeoutHandler: () => 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 }\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 destroy(): void {\n this.stop(CloseReasons.NORMAL_CLOSURE, 'manual stop')\n\n this.onBeforeUnload()\n }\n\n private init(): void {\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 window.addEventListener('beforeunload', this.onBeforeUnload.bind(this))\n window.addEventListener('offline', this.onOffline.bind(this))\n window.addEventListener('online', this.onOnline.bind(this))\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 }\n )\n }\n\n method(data.params, data.extra, data.command)\n }\n }\n })\n }\n\n /**\n * @param config\n */\n public async start(\n config:\n | null\n | (TypePullClientConfig & {\n skipReconnectToLastSession?: boolean\n }) = null\n ): Promise<boolean> {\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._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\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 ChannelID: this._config.channels.private?.id || '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 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 'Path': this.connector?.connectionPath || '-',\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 if (this._config?.channels?.private) {\n channels.push(this._config.channels.private?.id || '')\n }\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 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 message\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._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 if (this._storage && allowCaching) {\n try {\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._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 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._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._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: ${this._config.channels.private}`\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: ${this._config.channels.shared}`\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 dataString: pullEvent\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 this.disconnect(CloseReasons.NORMAL_CLOSURE, 'offline')\n }\n\n private onOnline(): void {\n this.connect().catch((error) => {\n this.getLogger().error('onOnline', { error })\n })\n }\n\n private onBeforeUnload(): void {\n this._unloading = true\n\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 this.scheduleReconnect(15)\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._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._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._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._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}`, {\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`, {\n command: message.command,\n params: message.params,\n extra: message.extra\n }\n )\n } else {\n this.getLogger().info(\n `onPullEvent`,\n {\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":["config","response"],"mappings":"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"}