@bitrix24/b24jssdk
Version:
Bitrix24 REST API JavaScript SDK
1 lines • 149 kB
Source Map (JSON)
{"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 { redactSensitiveParams, redactSensitiveUrl, REDACTED_PLACEHOLDER } from '../core/http/redact'\nimport { StorageManager } from './storage-manager'\nimport { JsonRpc } from './json-rpc'\nimport { SharedConfig } from './shared-config'\nimport { ChannelManager } from './channel-manager'\nimport { ResponseBatch, RequestBatch, IncomingMessage, Receiver } from './protobuf'\nimport { CloseReasons, ConnectionType, PullStatus, RpcMethod, SenderType, ServerMode, SubscriptionType, SystemCommands, LsKeys } from '../types/pull'\nimport { WebSocketConnector } from './web-socket-connector'\nimport { LongPollingConnector } from './long-polling-connector'\nimport type { StorageManagerParams, TypePullClientParams, TypePullClientSession, TypeStorageManager, SharedConfigParams, TypeChannelManagerParams, TypeConnector, RpcError, TypePullClientConfig, TypePullMessage, TypeSubscriptionOptions, TypeSubscriptionCommandHandler, TypePullClientEmitConfig, CommandHandlerFunctionV1, CommandHandlerFunctionV2, ConnectorParent, UserStatusCallback, TypePublicIdDescriptor, TypePullClientMessageBatch, TypeChanel, TypeSessionEvent, TypePullClientMessageBody } from '../types/pull'\nimport type { TypeB24 } from '../types/b24'\nimport type { AjaxResult } from '../core/http/ajax-result'\nimport type { SuccessPayload } from '../types/payloads'\nimport type { NumberString } from '../types/common'\n\n/**\n * @memo api revision - check module/pull/include.php\n */\nconst REVISION = 19\nconst RESTORE_WEBSOCKET_TIMEOUT = 30 * 60\nconst OFFLINE_STATUS_DELAY = 5_000\nconst CONFIG_CHECK_INTERVAL = 60 * 1000\nconst MAX_IDS_TO_STORE = 10\nconst PING_TIMEOUT = 10\nconst JSON_RPC_PING = 'ping'\nconst JSON_RPC_PONG = 'pong'\nconst LS_SESSION = 'bx-pull-session'\nconst LS_SESSION_CACHE_TIME = 20\n\nconst EmptyConfig = {\n api: {},\n channels: {},\n publicChannels: {},\n server: { timeShift: 0 },\n clientId: null,\n jwt: null,\n exp: 0\n} as TypePullClientConfig\n\nexport class PullClient implements ConnectorParent {\n // region Params ////\n private _logger: LoggerInterface\n private _restClient: TypeB24\n private _status: PullStatus\n private _context: string\n private readonly _guestMode: boolean\n private readonly _guestUserId: number\n private _userId: number\n\n private _configGetMethod: string\n private _getPublicListMethod: string\n\n private _siteId: string\n private _enabled: boolean\n\n private _unloading: boolean = false\n private _starting: boolean = false\n private _debug: boolean = false\n private _connectionAttempt: number = 0\n private _connectionType: ConnectionType = ConnectionType.WebSocket\n private _skipStorageInit: boolean\n private _skipCheckRevision: boolean\n\n private _subscribers: Record<string, any> = {}\n private _watchTagsQueue: Map<string, boolean> = new Map()\n private _watchUpdateInterval: number = 1_740_000\n private _watchForceUpdateInterval: number = 5_000\n private _configTimestamp: number = 0\n private _session: TypePullClientSession = {\n mid: null,\n tag: null,\n time: null,\n history: {},\n lastMessageIds: [],\n messageCount: 0\n }\n\n private _connectors: Record<ConnectionType, null | TypeConnector> = {\n [ConnectionType.Undefined]: null,\n [ConnectionType.WebSocket]: null,\n [ConnectionType.LongPolling]: null\n }\n\n private _isSecure: boolean\n\n private _config: null | TypePullClientConfig = null\n\n private _storage: null | TypeStorageManager = null\n private _sharedConfig: SharedConfig\n private _channelManager: ChannelManager\n private _jsonRpcAdapter: null | JsonRpc = null\n\n /**\n * @depricate\n */\n // private _notificationPopup: null = null\n\n // timers ////\n private _reconnectTimeout: ReturnType<typeof setTimeout> | null = null\n private _restartTimeout: ReturnType<typeof setTimeout> | null = null\n private _restoreWebSocketTimeout: ReturnType<typeof setTimeout> | null = null\n private _checkInterval: ReturnType<typeof setTimeout> | null = null\n private _offlineTimeout: ReturnType<typeof setTimeout> | null = null\n private _watchUpdateTimeout: ReturnType<typeof setTimeout> | null = null\n private _pingWaitTimeout: ReturnType<typeof setTimeout> | null = null\n\n // Single source of truth for every tracked timer field. armTimeout()/\n // clearAllTimers() route through this list so a future timer cannot be added\n // without a matching teardown — the leak class behind #141 (#222). Individual\n // fields are kept because call-sites read their identity (e.g. `if\n // (this._reconnectTimeout)`), but clearAllTimers() is the one teardown path.\n private readonly _timerFields = [\n '_reconnectTimeout',\n '_restartTimeout',\n '_restoreWebSocketTimeout',\n '_checkInterval',\n '_offlineTimeout',\n '_watchUpdateTimeout',\n '_pingWaitTimeout'\n ] as const\n\n // Records every window listener init() registered so removeAllWindowListeners()\n // can drop exactly what was added, keeping arm/teardown symmetric (#222).\n private _windowListeners: Array<{ type: string, handler: () => void }> = []\n\n // manual stop workaround ////\n private _isManualDisconnect: boolean = false\n\n // set once destroy() has run; gates reconnect / watch / online so a torn-down\n // client never schedules new work (#141) ////\n private _disposed: boolean = false\n\n private _loggingEnabled: boolean = false\n\n // bound event handlers, stored so they can be removed in destroy() (#141) ////\n private _onPingTimeoutHandler: () => void\n private _onBeforeUnloadHandler: () => void\n private _onOfflineHandler: () => void\n private _onOnlineHandler: () => void\n\n // [userId] => array of callbacks\n private _userStatusCallbacks: Record<number, UserStatusCallback[]> = {}\n\n private _connectPromise: null | {\n resolve: (response: any) => void\n reject: (error: string | RpcError | Error) => void\n } = null\n\n private _startingPromise: null | Promise<boolean> = null\n\n // Monotonic token bumped on every start() and on destroy(). start()'s\n // loadConfig()/connect() continuations capture the value at kick-off and bail\n // if it no longer matches — deterministically neutralising an in-flight start()\n // when destroy() (or a fresh start()) supersedes it, even for overlapping\n // start/destroy/start. The underlying rest transport\n // (this._restClient.actions.v2.call.make) does not accept an AbortSignal, so\n // this generation-token approach is used instead of an AbortController; the\n // network round-trip itself is not cancelled (remaining follow-up). (#222)\n private _startGeneration: number = 0\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 // Guard the `document` global: under SSR/Node it is undefined and even\n // `document?.` throws a ReferenceError on an undeclared identifier (#222).\n this._isSecure = typeof document !== 'undefined'\n && document?.location.href.indexOf('https') === 0\n\n if (this._userId && !this._skipStorageInit) {\n this._storage = new StorageManager({\n userId: this._userId,\n siteId: this._siteId\n } as StorageManagerParams)\n }\n\n this._sharedConfig = new SharedConfig({\n onWebSocketBlockChanged: this.onWebSocketBlockChanged.bind(this),\n storage: this._storage\n } as SharedConfigParams)\n\n this._channelManager = new ChannelManager({\n b24: this._restClient,\n getPublicListMethod: this._getPublicListMethod\n } as TypeChannelManagerParams)\n\n this._loggingEnabled = this._sharedConfig.isLoggingEnabled()\n\n // bound event handlers ////\n this._onPingTimeoutHandler = this.onPingTimeout.bind(this)\n this._onBeforeUnloadHandler = this.onBeforeUnload.bind(this)\n this._onOfflineHandler = this.onOffline.bind(this)\n this._onOnlineHandler = this.onOnline.bind(this)\n }\n\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n this._jsonRpcAdapter?.setLogger(this.getLogger())\n this._storage?.setLogger(this.getLogger())\n this._sharedConfig.setLogger(this.getLogger())\n this._channelManager.setLogger(this.getLogger())\n\n this._connectors.webSocket?.setLogger(this.getLogger())\n this._connectors.longPolling?.setLogger(this.getLogger())\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n\n /**\n * Terminal teardown: removes the window listeners, cancels every pending timer,\n * persists the session for a quick re-init, and disconnects. Irreversible — a\n * destroyed client schedules no further work and `start()` rejects with\n * `PULL_DISPOSED`; create a new instance to reconnect.\n */\n destroy(): void {\n this._disposed = true\n\n // Invalidate any in-flight start() continuation (#222).\n this._startGeneration++\n\n this.stop(CloseReasons.NORMAL_CLOSURE, 'manual stop')\n\n this.removeAllWindowListeners()\n\n // Drop the cached pull config on teardown: it holds the push `jwt` and the\n // channel signatures, which must not linger in localStorage after the client\n // is gone (it is readable by any same-origin script and survives reloads). A\n // torn-down client is terminal; a fresh instance re-fetches the config (#242).\n if (this._storage) {\n this._storage.remove(LsKeys.PullConfig)\n }\n\n // Save the (non-secret) session for a quick re-init, but — unlike\n // onBeforeUnload — do NOT schedule a reconnect: the client is being torn\n // down (#141).\n this.persistSession()\n }\n\n private init(): void {\n if (this._disposed) {\n return\n }\n\n this._connectors.webSocket = new WebSocketConnector({\n parent: this,\n onOpen: this.onWebSocketOpen.bind(this),\n onMessage: this.onIncomingMessage.bind(this),\n onDisconnect: this.onWebSocketDisconnect.bind(this),\n onError: this.onWebSocketError.bind(this)\n })\n\n this._connectors.longPolling = new LongPollingConnector({\n parent: this,\n onOpen: this.onLongPollingOpen.bind(this),\n onMessage: this.onIncomingMessage.bind(this),\n onDisconnect: this.onLongPollingDisconnect.bind(this),\n onError: this.onLongPollingError.bind(this)\n })\n\n this._connectionType = this.isWebSocketAllowed()\n ? ConnectionType.WebSocket\n : ConnectionType.LongPolling\n\n this.addWindowListener('beforeunload', this._onBeforeUnloadHandler)\n this.addWindowListener('offline', this._onOfflineHandler)\n this.addWindowListener('online', this._onOnlineHandler)\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.`).catch(() => {})\n return () => {}\n }\n\n let type = SubscriptionType.Server\n if (typeof handler.getSubscriptionType === 'function') {\n type = handler.getSubscriptionType()\n }\n\n return this.subscribe({\n type: type,\n moduleId: handler.getModuleId(),\n callback: (data: TypePullMessage) => {\n let method = null\n\n if (typeof handler.getMap === 'function') {\n const mapping = handler.getMap()\n if (mapping && typeof mapping === 'object') {\n const rowMapping = mapping[data.command]\n if (typeof rowMapping === 'function') {\n method = rowMapping.bind(handler)\n } else if (\n typeof rowMapping === 'string'\n && typeof handler[rowMapping] === 'function'\n ) {\n method = handler[rowMapping].bind(handler)\n }\n }\n }\n\n /**\n * handler.handleSomeCommandName: CommandHandlerFunction\n */\n if (!method) {\n const methodName = `handle${Text.capitalize(data.command)}`\n if (typeof handler[methodName] === 'function') {\n method = handler[methodName].bind(handler)\n }\n }\n\n if (method) {\n if (this._debug && this._context !== 'master') {\n this.getLogger().warning(\n `${Text.getDateForLog()}: Pull.attachCommandHandler: result of handler.getModuleId() is not a string`,\n // data.params / data.extra are app-defined and may carry a credential key (#43)\n redactSensitiveParams({ data } as unknown as Record<string, unknown>)\n ).catch(() => {})\n }\n\n method(data.params, data.extra, data.command)\n }\n }\n })\n }\n\n /**\n * Connects the client and begins receiving events.\n *\n * @param config\n * @throws Rejects with `{ ex: { error: 'PULL_DISPOSED' } }` when called after\n * `destroy()` — a destroyed client cannot be restarted; create a new instance.\n */\n public async start(\n config:\n | null\n | (TypePullClientConfig & {\n skipReconnectToLastSession?: boolean\n }) = null\n ): Promise<boolean> {\n if (this._disposed) {\n return Promise.reject({\n ex: {\n error: 'PULL_DISPOSED',\n error_description: 'PullClient has been destroyed; create a new instance'\n }\n })\n }\n\n let allowConfigCaching = true\n\n if (this.isConnected()) {\n return Promise.resolve(true)\n }\n\n if (this._starting && this._startingPromise) {\n return this._startingPromise\n }\n\n if (!this._userId) {\n throw new Error('Not set userId')\n }\n\n if (this._siteId === 'none') {\n throw new Error('Not set siteId')\n }\n\n let skipReconnectToLastSession = false\n if (!!config && Type.isPlainObject(config)) {\n if (typeof config?.skipReconnectToLastSession !== 'undefined') {\n skipReconnectToLastSession = config.skipReconnectToLastSession\n delete config.skipReconnectToLastSession\n }\n\n this._config = config\n allowConfigCaching = false\n }\n\n if (!this._enabled) {\n return Promise.reject({\n ex: {\n error: 'PULL_DISABLED',\n error_description: 'Push & Pull server is disabled'\n }\n })\n }\n\n const now = Date.now()\n let oldSession\n if (!skipReconnectToLastSession && this._storage) {\n oldSession = this._storage.get(LS_SESSION, null)\n }\n\n if (\n Type.isPlainObject(oldSession)\n && Object.prototype.hasOwnProperty.call(oldSession, 'ttl')\n && oldSession['ttl'] >= now\n ) {\n this._session.mid = oldSession['mid']\n }\n\n this._starting = true\n // Capture the current generation; a destroy() or a newer start() bumps\n // _startGeneration and the continuation below bails (#222).\n const startGeneration = ++this._startGeneration\n return (this._startingPromise = new Promise((resolve, reject) => {\n this.loadConfig('client_start')\n .then((config) => {\n // Abort the continuation if the client was destroyed or superseded\n // while loadConfig()'s network round-trip was in flight. The\n // _disposed guards inside setConfig/init/connect are a second line of\n // defence; this bails deterministically and rejects the start (#222).\n if (this._disposed || this._startGeneration !== startGeneration) {\n this._starting = false\n reject({\n ex: {\n error: 'PULL_DISPOSED',\n error_description: 'PullClient has been destroyed; create a new instance'\n }\n })\n return\n }\n\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 ).catch(() => {})\n reject(error)\n })\n }))\n }\n\n /**\n * @param disconnectCode\n * @param disconnectReason\n */\n public restart(\n disconnectCode: number | CloseReasons = CloseReasons.NORMAL_CLOSURE,\n disconnectReason: string = 'manual restart'\n ): void {\n if (this._disposed) {\n return\n }\n\n if (this._restartTimeout) {\n clearTimeout(this._restartTimeout)\n this._restartTimeout = null\n }\n\n this.getLogger().debug(\n `${Text.getDateForLog()}: Pull: restarting with code ${disconnectCode}`\n ).catch(() => {})\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 }).catch(() => {})\n })\n },\n (error) => {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: could not read push-server config `,\n { error }\n ).catch(() => {})\n\n this.status = PullStatus.Offline\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n\n if (error?.status == 401 || error?.status == 403) {\n this.stopCheckConfig()\n this.onCustomEvent('onPullError', ['AUTHORIZE_ERROR'])\n }\n }\n )\n }\n\n public stop(\n disconnectCode: number | CloseReasons = CloseReasons.NORMAL_CLOSURE,\n disconnectReason: string = 'manual stop'\n ): void {\n this.disconnect(disconnectCode, disconnectReason)\n\n this.stopCheckConfig()\n\n this.clearAllTimers()\n }\n\n // Cancel every pending timer so a stopped/destroyed client leaves nothing\n // running. Previously only _checkInterval was cleared, so the other six timers\n // (including the self-rescheduling watch-extend) survived teardown (#141).\n private clearAllTimers(): void {\n for (const field of this._timerFields) {\n const timer = this[field]\n if (timer) {\n if (field === '_checkInterval') {\n clearInterval(timer)\n } else {\n clearTimeout(timer)\n }\n }\n this[field] = null\n }\n }\n\n // Arm a tracked setTimeout: clears any existing id for the field first (same\n // clear-before-set the call-sites did by hand), then stores the new id. The\n // interval-backed _checkInterval keeps its own setInterval path. (#222)\n private armTimeout(\n field: Exclude<(typeof this._timerFields)[number], '_checkInterval'>,\n fn: () => void,\n ms: number\n ): void {\n const existing = this[field]\n if (existing) {\n clearTimeout(existing)\n }\n this[field] = setTimeout(fn, ms)\n }\n\n // Window-listener registry: init() adds through here, destroy() drops through\n // removeAllWindowListeners(), so a listener can't be added without teardown. (#222)\n private addWindowListener(type: string, handler: () => void): void {\n if (typeof window === 'undefined') {\n return\n }\n window.addEventListener(type, handler)\n this._windowListeners.push({ type, handler })\n }\n\n private removeAllWindowListeners(): void {\n if (typeof window !== 'undefined') {\n for (const { type, handler } of this._windowListeners) {\n window.removeEventListener(type, handler)\n }\n }\n this._windowListeners = []\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 }).catch(() => {})\n reject(error)\n })\n })\n .catch((error) => {\n this.getLogger().error('getUsersLastSeen', { error }).catch(() => {})\n reject(error)\n })\n })\n }\n\n /**\n * Pings server.\n * In case of success promise will be resolved, otherwise - rejected.\n *\n * @param {number} timeout Request timeout in seconds\n * @returns {Promise}\n */\n public async ping(timeout: number = 5): Promise<void> {\n return this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.Ping,\n {},\n timeout\n )\n }\n\n /**\n * @param userId {number}\n * @param callback {UserStatusCallback}\n * @returns {Promise}\n */\n public async subscribeUserStatusChange(\n userId: number,\n callback: UserStatusCallback\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n this._jsonRpcAdapter\n ?.executeOutgoingRpcCommand(RpcMethod.SubscribeStatusChange, {\n userId\n })\n .then(() => {\n if (!this._userStatusCallbacks[userId]) {\n this._userStatusCallbacks[userId] = []\n }\n\n if (Type.isFunction(callback)) {\n this._userStatusCallbacks[userId].push(callback)\n }\n\n return resolve()\n })\n .catch(error => reject(error))\n })\n }\n\n /**\n * @param {number} userId\n * @param {UserStatusCallback} callback\n * @returns {Promise}\n */\n public async unsubscribeUserStatusChange(\n userId: number,\n callback: UserStatusCallback\n ): Promise<void> {\n if (this._userStatusCallbacks[userId]) {\n this._userStatusCallbacks[userId] = this._userStatusCallbacks[\n userId\n ].filter(cb => cb !== callback)\n\n if (this._userStatusCallbacks[userId].length === 0) {\n return this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.UnsubscribeStatusChange,\n {\n userId\n }\n )\n }\n }\n\n return Promise.resolve()\n }\n\n // endregion ////\n\n // region Get ////\n public getRevision(): number | null {\n return this._config && this._config.api\n ? this._config.api.revision_web\n : null\n }\n\n public getServerVersion(): number {\n return this._config && this._config.server ? this._config.server.version : 0\n }\n\n public getServerMode(): string | null {\n return this._config && this._config.server ? this._config.server.mode : null\n }\n\n public getConfig(): null | TypePullClientConfig {\n return this._config\n }\n\n public getDebugInfo(): any {\n if (!JSON || !JSON.stringify) {\n return {}\n }\n\n let configDump\n if (this._config && this._config.channels) {\n configDump = {\n // The private channel id is a subscription secret — mask it here too, not\n // just in `Path` below, so the debug dump never surfaces it (#148). Expiry\n // timestamps are non-sensitive and kept for diagnostics.\n ChannelID: this._config.channels.private?.id ? REDACTED_PLACEHOLDER : 'n/a',\n ChannelDie: this._config.channels.private?.end || 'n/a',\n ChannelDieShared: this._config.channels.shared?.end || 'n/a'\n }\n } else {\n configDump = {\n ConfigError: 'config is not loaded'\n }\n }\n\n let websocketMode = '-'\n if (\n this._connectors.webSocket\n && (this._connectors.webSocket as WebSocketConnector)?.socket\n ) {\n if (this.isJsonRpc()) {\n websocketMode = 'json-rpc'\n } else {\n websocketMode\n\n = (\n this._connectors.webSocket as WebSocketConnector\n )?.socket?.url.search('binaryMode=true') != -1\n ? 'protobuf'\n : 'text'\n }\n }\n\n const connectionPath = this.connector?.connectionPath\n\n return {\n 'UserId': this._userId + (this._userId > 0 ? '' : '(guest)'),\n 'Guest userId':\n this._guestMode && this._guestUserId !== 0 ? this._guestUserId : '-',\n 'Browser online': (typeof navigator !== 'undefined' && navigator.onLine) ? 'Y' : 'N',\n 'Connect': this.isConnected() ? 'Y' : 'N',\n 'Server type': this.isSharedMode() ? 'cloud' : 'local',\n 'WebSocket supported': this.isWebSocketSupported() ? 'Y' : 'N',\n 'WebSocket connected':\n this._connectors.webSocket && this._connectors.webSocket.connected\n ? 'Y'\n : 'N',\n 'WebSocket mode': websocketMode,\n\n 'Try connect': this._reconnectTimeout ? 'Y' : 'N',\n 'Try number': this._connectionAttempt,\n\n // Mask the push JWT (`token`) and private `CHANNEL_ID`s before exposing\n // the connection path through this developer-facing debug dump (#148).\n 'Path': connectionPath\n ? redactSensitiveUrl(connectionPath, ['CHANNEL_ID'])\n : '-',\n ...configDump,\n\n 'Last message': this._session.mid || '-',\n 'Session history': this._session.history,\n 'Watch tags': this._watchTagsQueue.entries()\n }\n }\n\n /**\n * @process\n * @param connectionType\n */\n public getConnectionPath(connectionType: ConnectionType): string {\n let path\n const params: any = {}\n\n switch (connectionType) {\n case ConnectionType.WebSocket:\n path = this._isSecure\n ? this._config?.server.websocket_secure\n : this._config?.server.websocket\n break\n case ConnectionType.LongPolling:\n path = this._isSecure\n ? this._config?.server.long_pooling_secure\n : this._config?.server.long_polling\n break\n default:\n throw new Error(`Unknown connection type ${connectionType}`)\n }\n\n if (!Type.isStringFilled(path)) {\n throw new Error(`Empty path`)\n }\n\n if (typeof this._config?.jwt === 'string' && this._config?.jwt !== '') {\n params['token'] = this._config?.jwt\n } else {\n const channels: string[] = []\n\n // One guarded push per channel — previously the private id was pushed\n // twice (and an empty segment when `private` existed without an `id`),\n // producing a malformed `CHANNEL_ID` like `id/id` or a leading `/` (#238).\n if (this._config?.channels?.private?.id) {\n channels.push(this._config.channels.private.id)\n }\n\n if (this._config?.channels?.shared?.id) {\n channels.push(this._config.channels.shared.id)\n }\n\n if (channels.length === 0) {\n throw new Error(`Empty channels`)\n }\n\n params['CHANNEL_ID'] = channels.join('/')\n }\n\n if (this.isJsonRpc()) {\n params.jsonRpc = 'true'\n } else if (this.isProtobufSupported()) {\n params.binaryMode = 'true'\n }\n\n if (this.isSharedMode()) {\n if (!this._config?.clientId) {\n throw new Error(\n 'Push-server is in shared mode, but clientId is not set'\n )\n }\n\n params.clientId = this._config.clientId\n }\n if (this._session.mid) {\n params.mid = this._session.mid\n }\n if (this._session.tag) {\n params.tag = this._session.tag\n }\n if (this._session.time) {\n params.time = this._session.time\n }\n params.revision = REVISION\n\n return `${path}?${Text.buildQueryString(params)}`\n }\n\n /**\n * @process\n */\n public getPublicationPath(): string {\n const path = this._isSecure\n ? this._config?.server.publish_secure\n : this._config?.server.publish\n\n if (!path) {\n return ''\n }\n\n const channels: string[] = []\n\n if (this._config?.channels.private?.id) {\n channels.push(this._config.channels.private.id)\n }\n\n if (this._config?.channels.shared?.id) {\n channels.push(this._config.channels.shared.id)\n }\n\n const params = {\n CHANNEL_ID: channels.join('/')\n }\n\n return path + '?' + Text.buildQueryString(params)\n }\n\n // endregion ////\n\n // region Is* ////\n public isConnected(): boolean {\n return this.connector ? this.connector.connected : false\n }\n\n public isWebSocketSupported(): boolean {\n return typeof window !== 'undefined' && typeof window.WebSocket !== 'undefined'\n }\n\n public isWebSocketAllowed(): boolean {\n if (this._sharedConfig.isWebSocketBlocked()) {\n return false\n }\n\n return this.isWebSocketEnabled()\n }\n\n public isWebSocketEnabled(): boolean {\n if (!this.isWebSocketSupported()) {\n return false\n }\n\n if (!this._config) {\n return false\n }\n\n if (!this._config.server) {\n return false\n }\n\n return this._config.server.websocket_enabled\n }\n\n public isPublishingSupported(): boolean {\n return this.getServerVersion() > 3\n }\n\n public isPublishingEnabled(): boolean {\n if (!this.isPublishingSupported()) {\n return false\n }\n\n return this._config?.server.publish_enabled === true\n }\n\n public isProtobufSupported(): boolean {\n return this.getServerVersion() == 4 && !Browser.isIE()\n }\n\n public isJsonRpc(): boolean {\n return this.getServerVersion() >= 5\n }\n\n public isSharedMode(): boolean {\n return this.getServerMode() === ServerMode.Shared\n }\n\n // endregion ////\n\n // region Events ////\n /**\n * @param {TypePullClientEmitConfig} params\n * @returns {boolean}\n */\n private emit(params: TypePullClientEmitConfig): boolean {\n if (\n params.type == SubscriptionType.Server\n || params.type == SubscriptionType.Client\n ) {\n if (typeof this._subscribers[params.type] === 'undefined') {\n this._subscribers[params.type] = {}\n }\n\n if (typeof params.moduleId === 'undefined') {\n throw new TypeError(\n `${Text.getDateForLog()}: Pull.emit: parameter moduleId is not specified`\n )\n }\n\n if (\n typeof this._subscribers[params.type][params.moduleId] === 'undefined'\n ) {\n this._subscribers[params.type][params.moduleId] = {\n callbacks: [],\n commands: {}\n }\n }\n\n if (\n this._subscribers[params.type][params.moduleId]['callbacks'].length > 0\n ) {\n this._subscribers[params.type][params.moduleId]['callbacks'].forEach(\n (callback: CommandHandlerFunctionV1) => {\n callback(params.data as Record<string, any>, {\n type: params.type,\n moduleId: params.moduleId ?? '?'\n })\n }\n )\n }\n\n if (\n !(typeof params.data === 'undefined')\n && !(typeof params.data['command'] === 'undefined')\n && this._subscribers[params.type][params.moduleId]['commands'][\n params.data['command']\n ]\n && this._subscribers[params.type][params.moduleId]['commands'][\n params.data['command']\n ].length > 0\n ) {\n this._subscribers[params.type][params.moduleId]['commands'][\n params.data['command']\n\n ].forEach((callback: CommandHandlerFunctionV2) => {\n if (typeof params.data === 'undefined') {\n return\n }\n\n callback(\n params.data['params'],\n params.data['extra'],\n params.data['command'],\n {\n type: params.type,\n moduleId: params.moduleId as string\n }\n )\n })\n }\n\n return true\n } else {\n if (typeof this._subscribers[params.type] === 'undefined') {\n this._subscribers[params.type] = []\n }\n\n if (this._subscribers[params.type].length <= 0) {\n return true\n }\n\n this._subscribers[params.type].forEach(\n (callback: CommandHandlerFunctionV1) => {\n callback(params.data as Record<string, any>, {\n type: params.type\n })\n }\n )\n\n return true\n }\n }\n\n /**\n * @process\n *\n * @param message\n */\n private broadcastMessage(message: TypePullClientMessageBody): void {\n const moduleId = (message.module_id = message.module_id.toLowerCase())\n const command = message.command\n\n if (!message.extra) {\n message.extra = {}\n }\n\n if (message.extra.server_time_unix) {\n message.extra.server_time_ago\n = (Date.now() - message.extra.server_time_unix * 1000) / 1000\n - (this._config?.server.timeShift || 0)\n message.extra.server_time_ago = Math.max(message.extra.server_time_ago, 0)\n }\n\n this.logMessage(message)\n try {\n if (\n message.extra.sender\n && message.extra.sender.type === SenderType.Client\n ) {\n this.onCustomEvent(\n 'onPullClientEvent-' + moduleId,\n [command, message.params, message.extra],\n true\n )\n this.onCustomEvent(\n 'onPullClientEvent',\n [moduleId, command, message.params, message.extra],\n true\n )\n\n this.emit({\n type: SubscriptionType.Client,\n moduleId: moduleId,\n data: {\n command: command,\n params: Type.clone(message.params),\n extra: Type.clone(message.extra)\n }\n })\n } else if (moduleId === 'pull') {\n this.handleInternalPullEvent(command, message)\n } else if (moduleId == 'online') {\n if ((message?.extra?.server_time_ago || 0) < 240) {\n this.onCustomEvent(\n 'onPullOnlineEvent',\n [command, message.params, message.extra],\n true\n )\n\n this.emit({\n type: SubscriptionType.Online,\n data: {\n command: command,\n params: Type.clone(message.params),\n extra: Type.clone(message.extra)\n }\n })\n }\n\n if (command === 'userStatusChange') {\n this.emitUserStatusChange(\n message.params.user_id,\n message.params.online\n )\n }\n } else {\n this.onCustomEvent(\n 'onPullEvent-' + moduleId,\n [command, message.params, message.extra],\n true\n )\n this.onCustomEvent(\n 'onPullEvent',\n [moduleId, command, message.params, message.extra],\n true\n )\n\n this.emit({\n type: SubscriptionType.Server,\n moduleId: moduleId,\n data: {\n command: command,\n params: Type.clone(message.params),\n extra: Type.clone(message.extra)\n }\n })\n }\n } catch (error) {\n this.getLogger().warning('PULL ERROR', {\n errorType: 'broadcastMessages execute error',\n errorEvent: error,\n // app-defined message.params / extra may carry a credential key (#43)\n message: redactSensitiveParams(message as unknown as Record<string, unknown>)\n }).catch(() => {})\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`).catch(() => {})\n return Promise.reject(\n new Error(`Client publishing is not supported or is disabled`)\n )\n }\n\n if (this.isJsonRpc()) {\n const rpcRequest\n = this._jsonRpcAdapter?.createPublishRequest(messageBatchList)\n this.connector?.send(JSON.stringify(rpcRequest))\n\n return Promise.resolve(true)\n } else {\n const userIds: Record<number, number> = {}\n\n for (const messageBatch of messageBatchList) {\n if (typeof messageBatch.userList !== 'undefined') {\n for (const user of messageBatch.userList) {\n const userId = Number(user)\n userIds[userId] = userId\n }\n }\n }\n\n this._channelManager\n ?.getPublicIds(Object.values(userIds))\n .then((publicIds) => {\n const response = this.connector?.send(\n this.encodeMessageBatch(messageBatchList, publicIds)\n )\n\n return Promise.resolve(response)\n })\n }\n }\n\n /**\n * @param messageBatchList\n * @param publicIds\n */\n private encodeMessageBatch(\n messageBatchList: TypePullClientMessageBatch[],\n publicIds: Record<number, TypeChanel>\n ): ArrayBuffer | string {\n const messages: any[] = []\n\n messageBatchList.forEach((messageFields) => {\n const messageBody = messageFields.body\n\n let receivers: any[] = []\n if (messageFields.userList) {\n receivers = this.createMessageReceivers(\n messageFields.userList,\n publicIds\n )\n }\n\n if (messageFields.channelList) {\n if (!Type.isArray(messageFields.channelList)) {\n throw new TypeError('messageFields.publicChannels must be an array')\n }\n\n messageFields.channelList.forEach((publicChannel) => {\n let publicId\n let signature\n if (\n typeof publicChannel === 'string'\n && publicChannel.includes('.')\n ) {\n const fields = publicChannel.toString().split('.')\n publicId = fields[0]\n signature = fields[1]\n } else if (\n typeof publicChannel === 'object'\n && 'publicId' in publicChannel\n && 'signature' in publicChannel\n ) {\n publicId = publicChannel?.publicId\n signature = publicChannel?.signature\n } else {\n throw new Error(\n 'Public channel MUST be either a string, formatted like \"{publicId}.{signature}\" or an object with fields \\'publicId\\' and \\'signature\\''\n )\n }\n\n receivers.push(\n Receiver.create({\n id: this.encodeId(publicId!),\n signature: this.encodeId(signature!)\n })\n )\n })\n }\n\n const message = IncomingMessage.create({\n receivers: receivers,\n body: JSON.stringify(messageBody),\n expiry: messageFields.expiry || 0\n })\n messages.push(message)\n })\n\n const requestBatch = RequestBatch.create({\n requests: [\n {\n incomingMessages: {\n messages: messages\n }\n }\n ]\n })\n\n return RequestBatch.encode(requestBatch).finish()\n }\n\n /**\n * @memo fix return type\n * @param users\n * @param publicIds\n */\n private createMessageReceivers(\n users: number[],\n publicIds: Record<number, TypeChanel>\n ): any[] {\n const result = []\n\n for (const userId of users) {\n if (!publicIds[userId] || !publicIds[userId].publicId) {\n throw new Error(`Could not determine public id for user ${userId}`)\n }\n\n result.push(\n Receiver.create({\n id: this.encodeId(publicIds[userId].publicId),\n signature: this.encodeId(publicIds[userId].signature)\n })\n )\n }\n\n return result\n }\n\n // endregion ////\n\n // region _userStatusCallbacks ////\n /**\n * @param userId\n * @param isOnline\n */\n private emitUserStatusChange(userId: number, isOnline: boolean): void {\n if (this._userStatusCallbacks[userId]) {\n for (const callback of this._userStatusCallbacks[userId]) {\n callback({\n userId,\n isOnline\n })\n }\n }\n }\n\n private restoreUserStatusSubscription(): void {\n for (const userId in this._userStatusCallbacks) {\n if (\n Object.prototype.hasOwnProperty.call(this._userStatusCallbacks, userId)\n && this._userStatusCallbacks[userId]!.length > 0\n ) {\n this._jsonRpcAdapter?.executeOutgoingRpcCommand(\n RpcMethod.SubscribeStatusChange,\n {\n userId: userId\n }\n )\n }\n }\n }\n\n // endregion ////\n\n // region Config ////\n private async loadConfig(_logTag?: string): Promise<TypePullClientConfig> {\n if (!this._config) {\n this._config = Object.assign({}, EmptyConfig)\n\n let config: any\n if (this._storage) {\n config = this._storage.get(LsKeys.PullConfig, null)\n }\n\n if (\n this.isConfigActual(config)\n && this.checkRevision(config.api.revision_web)\n ) {\n return Promise.resolve(config)\n } else if (this._storage) {\n this._storage.remove(LsKeys.PullConfig)\n }\n } else if (\n this.isConfigActual(this._config)\n && this.checkRevision(this._config.api.revision_web)\n ) {\n return Promise.resolve(this._config)\n } else {\n this._config = Object.assign({}, EmptyConfig)\n }\n\n return new Promise((resolve, reject) => {\n this._restClient\n .actions.v2.call.make({\n method: this._configGetMethod,\n params: { CACHE: 'N' }\n })\n .then((response) => {\n const data = response.getData()!.result as any\n\n const timeShift = Math.floor(\n (Date.now() - new Date(data.serverTime).getTime()) / 1000\n )\n\n delete data.serverTime\n\n const config = Object.assign({}, data)\n config.server.timeShift = timeShift\n\n resolve(config)\n })\n .catch((error: unknown) => { reject(error) })\n })\n }\n\n /**\n * @param config\n */\n private isConfigActual(config: any): boolean {\n if (!Type.isPlainObject(config)) {\n return false\n }\n\n if (Number(config['server'].config_timestamp) !== this._configTimestamp) {\n return false\n }\n\n const now = new Date()\n\n if (\n Type.isNumber(config['exp'])\n && config['exp'] > 0\n && config['exp'] < now.getTime() / 1000\n ) {\n return false\n }\n\n const channelCount = Object.keys(config['channels']).length\n if (channelCount === 0) {\n return false\n }\n\n for (const channelType in config['channels']) {\n if (!Object.prototype.hasOwnProperty.call(config['channels'], channelType)) {\n continue\n }\n\n const channel = config['channels'][channelType]\n const channelEnd = new Date(channel.end)\n\n if (channelEnd < now) {\n return false\n }\n }\n\n return true\n }\n\n private startCheckConfig(): void {\n if (this._disposed) {\n return\n }\n\n if (this._checkInterval) {\n clearInterval(this._checkInterval)\n this._checkInterval = null\n }\n\n this._checkInterval = setInterval(\n this.checkConfig.bind(this),\n CONFIG_CHECK_INTERVAL\n )\n }\n\n private stopCheckConfig(): void {\n if (this._checkInterval) {\n clearInterval(this._checkInterval)\n }\n this._checkInterval = null\n }\n\n private checkConfig(): boolean {\n if (this.isConfigActual(this._config)) {\n if (!this.checkRevision(Text.toInteger(this._config?.api.revision_web))) {\n return false\n }\n } else {\n this.logToConsole('Stale config detected. Restarting')\n this.restart(CloseReasons.CONFIG_EXPIRED, 'config expired')\n }\n\n return true\n }\n\n /**\n * @param config\n * @param allowCaching\n */\n private setConfig(config: TypePullClientConfig, allowCaching: boolean): void {\n for (const key in config) {\n if (\n Object.prototype.hasOwnProperty.call(config, key)\n && Object.prototype.hasOwnProperty.call(this._config, key)\n ) {\n // @ts-expect-error this normal work - see ory code\n this._config[key] = config[key]\n }\n }\n\n if (config.publicChannels) {\n this.setPublicIds(Object.values(config.publicChannels))\n }\n\n this._configTimestamp = Number(config.server.config_timestamp)\n\n // Skip re-persisting once disposed: an in-flight loadConfig() from\n // start()/restart() can resolve AFTER destroy() removed the cache, which\n // would write the jwt + channel signatures back to localStorage (#242).\n if (this._storage && allowCaching && !this._disposed) {\n try {\n // Accepted shared-origin risk (#43): the cached config includes the push\n // `jwt` and channel signatures. localStorage is readable by any same-origin\n // script, so this is no weaker than the in-memory config under an\n // XSS/extension threat — and caching avoids a config round-trip on every\n // reconnect. One asymmetry: localStorage persists across reloads/tabs, so a\n // stolen value outlives the page (bounded by the short-lived, push-session-\n // tied jwt/signatures). A deliberate trade-off; documented rather than\n // stripped, and tracked for re-evaluation in #242.\n this._storage.set(LsKeys.PullConfig, config)\n } catch (error) {\n /**\n * @memotry to delete the key \"history\"\n * (landing site change history, see http://jabber.bx/view.php?id=136492)\n */\n if (typeof localStorage !== 'undefined' && 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 ).catch(() => {})\n }\n }\n }\n\n private setPublicIds(publicIds: TypePublicIdDescriptor[]): void {\n this._channelManager.setPublicIds(publicIds)\n }\n\n /**\n * @param serverRevision\n */\n private checkRevision(serverRevision: number): boolean {\n if (this._skipCheckRevision) {\n return true\n }\n\n if (serverRevision > 0 && serverRevision !== REVISION) {\n this._enabled = false\n this.showNotification('PULL_OLD_REVISION')\n this.disconnect(CloseReasons.NORMAL_CLOSURE, 'check_revision')\n\n this.onCustomEvent('onPullRevisionUp', [serverRevision, REVISION])\n\n this.emit({\n type: SubscriptionType.Revision,\n data: {\n server: serverRevision,\n client: REVISION\n }\n })\n\n this.logToConsole(\n `Pull revision changed from ${REVISION} to ${serverRevision}. Reload required`\n )\n\n return false\n }\n\n return true\n }\n\n // endregion ////\n\n // region Connect|ReConnect|DisConnect ////\n private disconnect(disconnectCode: number, disconnectReason: string): void {\n if (this.connector) {\n this._isManualDisconnect = true\n this.connector.disconnect(disconnectCode, disconnectReason)\n }\n }\n\n private restoreWebSocketConnection(): void {\n if (this._connectionType === ConnectionType.WebSocket) {\n return\n }\n\n this._connectors.webSocket?.connect()\n }\n\n /**\n * @param connectionDelay\n */\n private scheduleReconnect(connectionDelay: number = 0): void {\n if (this._disposed || !this._enabled) {\n return\n }\n\n if (!connectionDelay) {\n /**\n * never fallback to long polling\n * @memo remove long polling support later\n */\n /* /\n if(\n this._connectionAttempt > 3\n && this._connectionType === ConnectionType.WebSocket\n && !this._sharedConfig.isLongPollingBlocked()\n )\n {\n // Websocket seems to be closed by network filter. Trying to fall back to long polling ////\n this._sharedConfig.setWebSocketBlocked(true)\n this._connectionType = ConnectionType.LongPolling\n this._connectionAttempt = 1\n connectionDelay = 1\n }\n else\n // */\n {\n connectionDelay = this.getConnectionAttemptDelay(\n this._connectionAttempt\n )\n }\n }\n this.logToConsole(\n `Pull: scheduling reconnection in ${connectionDelay} seconds; attempt # ${this._connectionAttempt}`\n )\n\n this.armTimeout('_reconnectTimeout', () => {\n this.connect().catch((error) => {\n this.getLogger().error('scheduleReconnect', { error }).catch(() => {})\n })\n }, connectionDelay * 1_000)\n }\n\n private scheduleRestoreWebSocketConnection(): void {\n if (this._disposed) {\n return\n }\n\n this.logToConsole(\n `Pull: scheduling restoration of websocket connection in ${RESTORE_WEBSOCKET_TIMEOUT} seconds`\n )\n\n if (this._restoreWebSocketTimeout) {\n return\n }\n\n this.armTimeout('_restoreWebSocketTimeout', () => {\n this._restoreWebSocketTimeout = null\n this.restoreWebSocketConnection()\n }, RESTORE_WEBSOCKET_TIMEOUT * 1_000)\n }\n\n /**\n * @returns {Promise}\n */\n private async connect(): Promise<void> {\n if (this._disposed || !this._enabled) {\n return Promise.reject()\n }\n if (this.connector?.connected) {\n return Promise.resolve()\n }\n\n if (this._reconnectTimeout) {\n clearTimeout(this._reconnectTimeout)\n this._reconnectTimeout = null\n }\n\n this.status = PullStatus.Connecting\n this._connectionAttempt++\n return new Promise((resolve, reject) => {\n this._connectPromise = {\n resolve,\n reject\n }\n this.connector?.connect()\n })\n }\n\n /**\n * @param disconnectCode\n * @param disconnectReason\n * @param restartDelay\n */\n private scheduleRestart(\n disconnectCode: number,\n disconnectReason: string,\n restartDelay: number = 0\n ): void {\n if (this._disposed) {\n return\n }\n\n if (restartDelay < 1) {\n restartDelay = Math.ceil(Math.random() * 30) + 5\n }\n\n this.armTimeout(\n '_restartTimeout',\n () => this.restart(disconnectCode, disconnectReason),\n restartDelay * 1_000\n )\n }\n\n // endregion ////\n\n // region Handlers ////\n /**\n * @param messageFields\n */\n private handleRpcIncomingMessage(messageFields: any): object {\n this._session.mid = messageFields.mid\n const body = messageFields.body\n\n if (!messageFields.body.extra) {\n body.extra = {}\n }\n body.extra.sender = messageFields.sender\n\n if (\n 'user_params' in messageFields\n && Type.isPlainObject(messageFields.user_params)\n ) {\n Object.assign(body.params, messageFields.user_params)\n }\n\n if (\n 'dictionary' in messageFields\n && Type.isPlainObject(messageFields.dictionary)\n ) {\n Object.assign(body.params, messageFields.dictionary)\n }\n\n if (this.checkDuplicate(messageFields.mid)) {\n this.addMessageToStat(body)\n this.trimDuplicates()\n this.broadcastMessage(body)\n }\n\n this.connector?.send(`mack:${messageFields.mid}`)\n\n return {}\n }\n\n /**\n * @param events\n */\n private handleIncomingEvents(events: TypeSessionEvent[]): void {\n const messages: TypePullClientMessageBody[] = []\n if (events.length === 0) {\n this._session.mid = null\n return\n }\n\n for (const event of events) {\n this.updateSessionFromEvent(event)\n\n if (event.mid && !this.checkDuplicate(event.mid)) {\n continue\n }\n\n this.addMessageToStat(\n event.text as { module_id: string, command: string }\n )\n messages.push(event.text as TypePullClientMessageBody)\n }\n this.trimDuplicates()\n this.broadcastMessages(messages)\n }\n\n /**\n * @param event\n */\n private updateSessionFromEvent(event: TypeSessionEvent): void {\n this._session.mid = event.mid || null\n this._session.tag = event.tag || null\n this._session.time = event.time || null\n }\n\n /**\n * @process\n *\n * @param command\n * @param message\n */\n private handleInternalPullEvent(\n command: string,\n message: TypePullClientMessageBody\n ): void {\n switch (command.toUpperCase()) {\n case SystemCommands.CHANNEL_EXPIRE: {\n if (message.params.action === 'reconnect') {\n const typeChanel = message.params?.channel.type as string\n if (typeChanel === 'private' && this._config?.channels?.private) {\n this._config.channels.private = message.params.new_channel\n this.logToConsole(\n `Pull: new config for ${message.params.channel.type} channel set: [updated]`\n )\n }\n if (typeChanel === 'shared' && this._config?.channels?.shared) {\n this._config.channels.shared = message.params.new_channel\n this.logToConsole(\n `Pull: new config for ${message.params.channel.type} channel set: [updated]`\n )\n }\n\n this.reconnect(CloseReasons.CONFIG_REPLACED, 'config was replaced')\n } else {\n this.restart(CloseReasons.CHANNEL_EXPIRED, 'channel expired received')\n }\n break\n }\n case SystemCommands.CONFIG_EXPIRE: {\n this.restart(CloseReasons.CONFIG_EXPIRED, 'config expired received')\n break\n }\n case SystemCommands.SERVER_RESTART: {\n this.reconnect(\n CloseReasons.SERVER_RESTARTED,\n 'server was restarted',\n 15\n )\n break\n }\n default:\n }\n }\n\n // region Handlers For Message ////\n /**\n * @param response\n */\n private onIncomingMessage(response: string | ArrayBuffer): void {\n if (this.isJsonRpc()) {\n if (response === JSON_RPC_PING) {\n this.onJsonRpcPing()\n } else {\n this._jsonRpcAdapter?.parseJsonRpcMessage(response as string)\n }\n } else {\n const events = this.extractMessages(response)\n this.handleIncomingEvents(events)\n }\n }\n\n // region onLongPolling ////\n private onLongPollingOpen(): void {\n this._unloading = false\n this._starting = false\n this._connectionAttempt = 0\n this._isManualDisconnect = false\n this.status = PullStatus.Online\n\n this.logToConsole('Pull: Long polling connection with push-server opened')\n if (this.isWebSocketEnabled()) {\n this.scheduleRestoreWebSocketConnection()\n }\n if (this._connectPromise) {\n this._connectPromise.resolve({})\n }\n }\n\n /**\n * @param response\n */\n private onLongPollingDisconnect(response: {\n code: number\n reason: string\n }): void {\n if (this._connectionType === ConnectionType.LongPolling) {\n this.status = PullStatus.Offline\n }\n\n this.logToConsole(\n `Pull: Long polling connection with push-server closed. Code: ${response.code}, reason: ${response.reason}`\n )\n if (!this._isManualDisconnect) {\n this.scheduleReconnect()\n }\n this._isManualDisconnect = false\n this.clearPingWaitTimeout()\n }\n\n /**\n * @param error\n */\n private onLongPollingError(error: Error): void {\n this._starting = false\n if (this._connectionType === ConnectionType.LongPolling) {\n this.status = PullStatus.Offline\n }\n\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Long polling connection error`,\n { error }\n ).catch(() => {})\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 ).catch(() => {})\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 ).catch(() => {})\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 ).catch(() => {})\n }\n\n return result\n }\n\n /**\n * @param pullEvent\n */\n private extractPlainTextMessages(pullEvent: string): TypeSessionEvent[] {\n const result = []\n\n const dataArray = pullEvent.match(/#!NGINXNMS!#(.*?)#!NGINXNME!#/g)\n if (dataArray === null) {\n this.getLogger().warning('PULL ERROR', {\n errorType: 'parseResponse error parsing message',\n // The frame failed the NGINX-delimiter match, so its content is\n // unparseable anyway and could carry a credential (e.g. a channel\n // `signature`); log only its size, never the bytes (#43).\n byteLength: pullEvent.length\n }).catch(() => {})\n\n return []\n }\n for (let i = 0; i < dataArray.length; i++) {\n dataArray[i] = dataArray[i]!.substring(12, dataArray[i]!.length - 12)\n if (dataArray[i]!.length <= 0) {\n continue\n }\n\n let data\n try {\n data = JSON.parse(dataArray[i]!)\n } catch {\n continue\n }\n\n result.push(data as TypeSessionEvent)\n }\n\n return result\n }\n\n /**\n * Converts message id from byte[] to string\n * @param {Uint8Array} encodedId\n * @return {string}\n */\n private decodeId(encodedId: Uint8Array): string {\n let result = ''\n for (const element_ of encodedId) {\n const hexByte = element_.toString(16)\n if (hexByte.length === 1) {\n result += '0'\n }\n result += hexByte\n }\n\n return result\n }\n\n /**\n * Converts message id from hex-encoded string to byte[]\n * @param {string} id Hex-encoded string.\n * @return {Uint8Array}\n */\n private encodeId(id: string): Uint8Array {\n if (!id) {\n return new Uint8Array()\n }\n\n const result = []\n for (let i = 0; i < id.length; i += 2) {\n result.push(Number.parseInt(id.slice(i, i + 2), 16))\n }\n\n return new Uint8Array(result)\n }\n\n // endregion ////\n\n // region Events.Status /////\n private onOffline(): void {\n if (this._disposed) {\n return\n }\n this.disconnect(CloseReasons.NORMAL_CLOSURE, 'offline')\n }\n\n private onOnline(): void {\n if (this._disposed) {\n return\n }\n this.connect().catch((error) => {\n this.getLogger().error('onOnline', { error }).catch(() => {})\n })\n }\n\n private onBeforeUnload(): void {\n this._unloading = true\n\n this.persistSession()\n\n this.scheduleReconnect(15)\n }\n\n // Persist the current session (with a short TTL) so a quick reload / re-init can\n // resume it. Shared by onBeforeUnload and destroy() — destroy() saves WITHOUT\n // scheduling a reconnect (#141).\n private persistSession(): void {\n const session = Type.clone(this.session)\n session.ttl = Date.now() + LS_SESSION_CACHE_TIME * 1000\n if (this._storage) {\n try {\n this._storage.set(\n LS_SESSION,\n JSON.stringify(session)\n // LS_SESSION_CACHE_TIME\n )\n } catch (error) {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not save session info in local storage. Error: `,\n { error }\n ).catch(() => {})\n }\n }\n }\n\n // endregion ////\n\n // region PullStatus ////\n /**\n * @param status\n * @param delay\n */\n private sendPullStatusDelayed(status: PullStatus, delay: number): void {\n if (this._disposed) {\n return\n }\n\n this.armTimeout('_offlineTimeout', () => {\n this._offlineTimeout = null\n this.sendPullStatus(status)\n }, delay)\n }\n\n /**\n * @param status\n */\n private sendPullStatus(status: PullStatus): void {\n if (this._unloading) {\n return\n }\n\n this.onCustomEvent('onPullStatus', [status])\n\n this.emit({\n type: SubscriptionType.Status,\n data: {\n status: status\n }\n })\n }\n\n // endregion ////\n\n // region _watchTagsQueue ////\n /**\n * @memo if private?\n * @param tagId\n * @param force\n */\n // @ts-expect-error When we rewrite it to something more modern, then we'll remove this\n private extendWatch(tagId: string, force: boolean = false): void {\n if (this._watchTagsQueue.get(tagId)) {\n return\n }\n\n this._watchTagsQueue.set(tagId, true)\n if (force) {\n this.updateWatch(force)\n }\n }\n\n /**\n * @param force\n */\n private updateWatch(force: boolean = false): void {\n if (this._disposed) {\n return\n }\n\n this.armTimeout(\n '_watchUpdateTimeout',\n () => {\n /**\n * @memo test this\n */\n const watchTags = [...this._watchTagsQueue.keys()]\n\n if (watchTags.length > 0) {\n this._restClient\n .actions.v2.call.make({\n method: 'pull.watch.extend',\n params: { tags: watchTags }\n })\n .then((response: AjaxResult) => {\n /**\n * @memo test this\n */\n const updatedTags: NumberString[] = (response.getData() as SuccessPayload<NumberString[]>).result as any\n\n for (const tagId of updatedTags) {\n this.clearWatch(tagId)\n }\n\n this.updateWatch()\n })\n .catch(() => {\n this.updateWatch()\n })\n } else {\n this.updateWatch()\n }\n },\n force ? this._watchForceUpdateInterval : this._watchUpdateInterval\n )\n }\n\n /**\n * @param tagId\n */\n private clearWatch(tagId: string): void {\n this._watchTagsQueue.delete(tagId)\n }\n\n // endregion ////\n\n // region Ping ////\n private onJsonRpcPing(): void {\n this.updatePingWaitTimeout()\n this.connector?.send(JSON_RPC_PONG)\n }\n\n private updatePingWaitTimeout(): void {\n if (this._disposed) {\n return\n }\n\n this.armTimeout(\n '_pingWaitTimeout',\n this._onPingTimeoutHandler,\n PING_TIMEOUT * 2 * 1_000\n )\n }\n\n private clearPingWaitTimeout(): void {\n if (this._pingWaitTimeout) {\n clearTimeout(this._pingWaitTimeout)\n }\n\n this._pingWaitTimeout = null\n }\n\n private onPingTimeout(): void {\n this._pingWaitTimeout = null\n if (this._disposed || !this._enabled || !this.isConnected()) {\n return\n }\n\n this.getLogger().warning(`No pings are received in ${PING_TIMEOUT * 2} seconds. Reconnecting`).catch(() => {})\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`).catch(() => {})\n return false\n } else {\n this._session.lastMessageIds.push(mid)\n return true\n }\n }\n\n private trimDuplicates(): void {\n if (this._session.lastMessageIds.length > MAX_IDS_TO_STORE) {\n this._session.lastMessageIds\n = this._session.lastMessageIds.slice(-MAX_IDS_TO_STORE)\n }\n }\n\n // endregion ////\n\n // region Logging ////\n /**\n * @param message\n */\n private logMessage(message: TypePullClientMessageBody): void {\n if (!this._debug) {\n return\n }\n\n if (\n message.extra?.sender\n && message.extra.sender.type === SenderType.Client\n ) {\n this.getLogger().info(\n `onPullClientEvent-${message.module_id}`, redactSensitiveParams({\n command: message.command,\n params: message.params,\n extra: message.extra\n })\n ).catch(() => {})\n } else if (message.module_id == 'online') {\n this.getLogger().info(\n `onPullOnlineEvent`, redactSensitiveParams({\n command: message.command,\n params: message.params,\n extra: message.extra\n })\n ).catch(() => {})\n } else {\n this.getLogger().info(\n `onPullEvent`,\n redactSensitiveParams({\n moduleId: message.module_id,\n command: message.command,\n params: message.params,\n extra: message.extra\n })\n ).catch(() => {})\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}`).catch(() => {})\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).catch(() => {})\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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"}