{"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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"}