403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/pull/client/dist/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/pull/client/dist/pull.client.js
/* eslint-disable */
(function (exports,pull_util,pull_connector,pull_configholder) {
	'use strict';

	const REVISION = 19; // api revision - check module/pull/include.php

	const ConnectionType = {
	  WebSocket: 'webSocket',
	  LongPolling: 'longPolling'
	};
	const PullStatus = {
	  Online: 'online',
	  Offline: 'offline',
	  Connecting: 'connect'
	};
	const SenderType = {
	  Unknown: 0,
	  Client: 1,
	  Backend: 2
	};
	const SubscriptionType = {
	  Server: 'server',
	  Client: 'client',
	  Online: 'online',
	  Status: 'status',
	  Revision: 'revision'
	};
	const CloseReasons = {
	  NORMAL_CLOSURE: 1000,
	  SERVER_DIE: 1001,
	  CONFIG_REPLACED: 3000,
	  CHANNEL_EXPIRED: 3001,
	  SERVER_RESTARTED: 3002,
	  CONFIG_EXPIRED: 3003,
	  MANUAL: 3004,
	  STUCK: 3005,
	  BACKEND_ERROR: 3006,
	  WRONG_CHANNEL_ID: 4010
	};
	const ServerMode = {
	  Shared: 'shared',
	  Personal: 'personal'
	};

	/* eslint-disable @bitrix24/bitrix24-rules/no-typeof */
	function isString(item) {
	  return item === '' ? true : item ? typeof item === 'string' || item instanceof String : false;
	}
	function isArray(item) {
	  return item && Object.prototype.toString.call(item) === '[object Array]';
	}
	function isDomNode(item) {
	  return item && typeof item === 'object' && 'nodeType' in item;
	}
	function isDate(item) {
	  return item && Object.prototype.toString.call(item) === '[object Date]';
	}
	function isPlainObject(item) {
	  return Boolean(item) && typeof item === 'object' && item.constructor === Object;
	}
	function isNotEmptyString(item) {
	  return isString(item) ? item.length > 0 : false;
	}
	function isJsonRpcRequest(item) {
	  return typeof item === 'object' && item && 'jsonrpc' in item && isNotEmptyString(item.jsonrpc) && 'method' in item && isNotEmptyString(item.method);
	}
	function isJsonRpcResponse(item) {
	  return typeof item === 'object' && item && 'jsonrpc' in item && isNotEmptyString(item.jsonrpc) && 'id' in item && ('result' in item || 'error' in item);
	}
	function buildQueryString(params) {
	  let result = '';
	  for (const key of Object.keys(params)) {
	    const value = params[key];
	    if (isArray(value)) {
	      for (const [index, valueElement] of value.entries()) {
	        const left = encodeURIComponent(`${key}[${index}]`);
	        const right = `${encodeURIComponent(valueElement)}&`;
	        result += `${left}=${right}`;
	      }
	    } else {
	      result += `${encodeURIComponent(key)}=${encodeURIComponent(value)}&`;
	    }
	  }
	  if (result.length > 0) {
	    result = result.slice(0, Math.max(0, result.length - 1));
	  }
	  return result;
	}
	function clone(obj, bCopyObj = true) {
	  let _obj, i, l;
	  if (obj === null) {
	    return null;
	  }
	  if (isDomNode(obj)) {
	    _obj = obj.cloneNode(bCopyObj);
	  } else if (typeof obj === 'object') {
	    if (isArray(obj)) {
	      _obj = [];
	      for (i = 0, l = obj.length; i < l; i++) {
	        if (typeof obj[i] === 'object' && bCopyObj) {
	          _obj[i] = clone(obj[i], bCopyObj);
	        } else {
	          _obj[i] = obj[i];
	        }
	      }
	    } else {
	      _obj = {};
	      if (obj.constructor) {
	        if (isDate(obj)) {
	          _obj = new Date(obj);
	        } else {
	          _obj = new obj.constructor();
	        }
	      }
	      for (i in obj) {
	        if (!obj.hasOwnProperty(i)) {
	          continue;
	        }
	        if (typeof obj[i] === 'object' && bCopyObj) {
	          _obj[i] = clone(obj[i], bCopyObj);
	        } else {
	          _obj[i] = obj[i];
	        }
	      }
	    }
	  } else {
	    _obj = obj;
	  }
	  return _obj;
	}
	function getDateForLog() {
	  const d = new Date();
	  return `${d.getFullYear()}-${lpad(d.getMonth(), 2, '0')}-${lpad(d.getDate(), 2, '0')} ${lpad(d.getHours(), 2, '0')}:${lpad(d.getMinutes(), 2, '0')}`;
	}
	function lpad(str, length, chr = ' ') {
	  if (str.length > length) {
	    return str;
	  }
	  let result = '';
	  for (let i = 0; i < length - result.length; i++) {
	    result += chr;
	  }
	  return result + str;
	}

	/* eslint-disable @bitrix24/bitrix24-rules/no-typeof */
	var _subscribers = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("subscribers");
	var _logger = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("logger");
	class Emitter {
	  // [userId] => array of callbacks

	  constructor(options = {}) {
	    Object.defineProperty(this, _subscribers, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _logger, {
	      writable: true,
	      value: void 0
	    });
	    this.debug = false;
	    this.userStatusCallbacks = {};
	    babelHelpers.classPrivateFieldLooseBase(this, _logger)[_logger] = options.logger;
	  }

	  /**
	   * Creates a subscription to incoming messages.
	   *
	   * @returns {Function} - Unsubscribe callback function
	   */
	  subscribe(params) {
	    /**
	     * After modify this method, copy to follow scripts:
	     * mobile/install/mobileapp/mobile/extensions/bitrix/pull/client/events/extension.js
	     * mobile/install/js/mobile/pull/client/src/client.js
	     */

	    if (!pull_util.isObject(params)) {
	      throw new TypeError('params must be an object');
	    }
	    if (!pull_util.isPlainObject(params)) {
	      return this.attachCommandHandler(params);
	    }
	    const {
	      command,
	      moduleId,
	      callback,
	      type = SubscriptionType.Server
	    } = params;
	    if (type === SubscriptionType.Server || type === SubscriptionType.Client) {
	      if (typeof babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type] === 'undefined') {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type] = {};
	      }
	      if (typeof babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId] === 'undefined') {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId] = {
	          callbacks: [],
	          commands: {}
	        };
	      }
	      if (command) {
	        if (!pull_util.isArray(babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].commands[command])) {
	          babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].commands[command] = [];
	        }
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].commands[command].push(callback);
	        return () => {
	          // eslint-disable-next-line max-len
	          babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].commands[command] = babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].commands[command].filter(element => {
	            return element !== callback;
	          });
	        };
	      }
	      babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].callbacks.push(callback);
	      return () => {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].callbacks = babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type][moduleId].callbacks.filter(element => {
	          return element !== callback;
	        });
	      };
	    }
	    if (typeof babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type] === 'undefined') {
	      babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type] = [];
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type].push(callback);
	    return () => {
	      babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type] = babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][type].filter(element => {
	        return element !== callback;
	      });
	    };
	  }

	  /*
	   Subscribes provided handler to pull events.
	   @return {() => void} Returns function, that can be called to unsubscribe the handler.
	   */
	  attachCommandHandler(handler) {
	    /**
	     * After modify this method, copy to follow scripts:
	     * mobile/install/mobileapp/mobile/extensions/bitrix/pull/client/events/extension.js
	     */
	    const moduleId = pull_util.isFunction(handler.getModuleId) ? handler.getModuleId() : '';
	    if (!pull_util.isNotEmptyString(moduleId)) {
	      throw new TypeError('handler.getModuleId() must return a string');
	    }
	    let type = SubscriptionType.Server;
	    if (pull_util.isFunction(handler.getSubscriptionType)) {
	      type = handler.getSubscriptionType();
	      if (!Object.values(SubscriptionType).includes(type)) {
	        throw new Error('result of handler.getSubscriptionType() must return valid SubscriptionType element');
	      }
	    }
	    return this.subscribe({
	      type,
	      moduleId,
	      callback: data => {
	        const method = findHandlerMethod(handler, data.command);
	        if (method) {
	          var _babelHelpers$classPr;
	          let loggableData = '';
	          try {
	            loggableData = JSON.stringify(data);
	          } catch {
	            loggableData = '(contains circular references)';
	          }
	          (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _logger)[_logger]) == null ? void 0 : _babelHelpers$classPr.log(`Pull.attachCommandHandler: receive command ${loggableData}`);
	          method(data.params, data.extra, data.command);
	        }
	      }
	    });
	  }

	  /**
	   *
	   * @param params {Object}
	   * @returns {boolean}
	   */
	  emit(params = {}) {
	    /**
	     * After modify this method, copy to follow scripts:
	     * mobile/install/mobileapp/mobile/extensions/bitrix/pull/client/events/extension.js
	     * mobile/install/js/mobile/pull/client/src/client.js
	     */
	    if (params.type === SubscriptionType.Server || params.type === SubscriptionType.Client) {
	      if (typeof babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type] === 'undefined') {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type] = {};
	      }
	      if (typeof babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId] === 'undefined') {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId] = {
	          callbacks: [],
	          commands: {}
	        };
	      }
	      if (babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId].callbacks.length > 0) {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId].callbacks.forEach(callback => {
	          callback(params.data, {
	            type: params.type,
	            moduleId: params.moduleId
	          });
	        });
	      }
	      if (babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId].commands[params.data.command] && babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId].commands[params.data.command].length > 0) {
	        babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type][params.moduleId].commands[params.data.command].forEach(callback => {
	          callback(params.data.params, params.data.extra, params.data.command, {
	            type: params.type,
	            moduleId: params.moduleId
	          });
	        });
	      }
	      return true;
	    }
	    if (typeof babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type] === 'undefined') {
	      babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type] = [];
	    }
	    if (babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type].length <= 0) {
	      return true;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _subscribers)[_subscribers][params.type].forEach(callback => {
	      callback(params.data, {
	        type: params.type
	      });
	    });
	    return true;
	  }
	  broadcastMessage(message) {
	    var _message$extra;
	    const moduleId = message.module_id.toLowerCase();
	    const command = message.command;
	    const params = message.params;
	    const extra = (_message$extra = message.extra) != null ? _message$extra : {};
	    this.logMessage(message);
	    try {
	      if (extra.sender && extra.sender.type === SenderType.Client) {
	        this.emitClientEvent(moduleId, command, pull_util.clone(params), pull_util.clone(extra));
	      } else if (moduleId === 'online') {
	        if (extra.server_time_ago < 240) {
	          this.emitOnlineEvent(moduleId, command, pull_util.clone(params), pull_util.clone(extra));
	        }
	        if (command === 'userStatusChange') {
	          this.emitUserStatusChange(params.user_id, params.online);
	        }
	      } else {
	        this.emitServerEvent(moduleId, command, pull_util.clone(params), pull_util.clone(extra));
	      }
	    } catch (e) {
	      if (typeof console === 'object') {
	        console.error('\n========= PULL ERROR ===========\n' + 'Error type: broadcastMessages execute error\n' + 'Error event: ', e, '\n' + 'Message: ', message, '\n' + '================================\n');
	        if (pull_util.isFunction(BX.debug)) {
	          BX.debug(e);
	        }
	      }
	    }
	  }
	  emitServerEvent(moduleId, command, params, extra) {
	    if ('BX' in globalThis && pull_util.isFunction(BX.onCustomEvent)) {
	      BX.onCustomEvent(window, `onPullEvent-${moduleId}`, [command, params, extra], true);
	      BX.onCustomEvent(window, 'onPullEvent', [moduleId, command, params, extra], true);
	    }
	    this.emit({
	      type: SubscriptionType.Server,
	      moduleId,
	      data: {
	        command,
	        params,
	        extra
	      }
	    });
	  }
	  emitClientEvent(moduleId, command, params, extra) {
	    if (pull_util.isFunction(BX.onCustomEvent)) {
	      BX.onCustomEvent(window, `onPullClientEvent-${moduleId}`, [command, params, extra], true);
	      BX.onCustomEvent(window, 'onPullClientEvent', [moduleId, command, params, extra], true);
	    }
	    this.emit({
	      type: SubscriptionType.Client,
	      moduleId,
	      data: {
	        command,
	        params,
	        extra
	      }
	    });
	  }
	  emitOnlineEvent(moduleId, command, params, extra) {
	    if (pull_util.isFunction(BX.onCustomEvent)) {
	      BX.onCustomEvent(window, 'onPullOnlineEvent', [command, params, extra], true);
	    }
	    this.emit({
	      type: SubscriptionType.Online,
	      data: {
	        command,
	        params,
	        extra
	      }
	    });
	  }
	  addUserStatusCallback(userId, callback) {
	    if (!this.userStatusCallbacks[userId]) {
	      this.userStatusCallbacks[userId] = [];
	    }
	    if (pull_util.isFunction(callback)) {
	      this.userStatusCallbacks[userId].push(callback);
	    }
	  }
	  removeUserStatusCallback(userId, callback) {
	    if (this.userStatusCallbacks[userId]) {
	      this.userStatusCallbacks[userId] = this.userStatusCallbacks[userId].filter(cb => cb !== callback);
	    }
	  }
	  hasUserStatusCallbacks(userId) {
	    return this.userStatusCallbacks[userId].length > 0;
	  }
	  emitUserStatusChange(userId, isOnline) {
	    if (this.userStatusCallbacks[userId]) {
	      this.userStatusCallbacks[userId].forEach(cb => cb({
	        userId,
	        isOnline
	      }));
	    }
	  }
	  getSubscribedUsersList() {
	    const result = [];
	    for (const userId of Object.keys(this.userStatusCallbacks)) {
	      if (this.userStatusCallbacks[userId].length > 0) {
	        result.push(Number(userId));
	      }
	    }
	    return result;
	  }
	  capturePullEvent(debugFlag = true) {
	    this.debug = debugFlag;
	  }
	  logMessage(message) {
	    if (!this.debug) {
	      return;
	    }
	    if (message.extra.sender && message.extra.sender.type === SenderType.Client) {
	      console.info(`onPullClientEvent-${message.module_id}`, message.command, message.params, message.extra);
	    } else if (message.module_id === 'online') {
	      console.info('onPullOnlineEvent', message.command, message.params, message.extra);
	    } else {
	      console.info('onPullEvent', message.module_id, message.command, message.params, message.extra);
	    }
	  }
	}
	function findHandlerMethod(handler, command) {
	  let method = null;
	  if (pull_util.isFunction(handler.getMap)) {
	    const mapping = handler.getMap();
	    if (pull_util.isPlainObject(mapping)) {
	      if (pull_util.isFunction(mapping[command])) {
	        method = mapping[command].bind(handler);
	      } else if (typeof mapping[command] === 'string' && pull_util.isFunction(handler[mapping[command]])) {
	        method = handler[mapping[command]].bind(handler);
	      }
	    }
	  }
	  if (!method) {
	    const methodName = getDefaultHandlerMethodName(command);
	    if (pull_util.isFunction(handler[methodName])) {
	      method = handler[methodName].bind(handler);
	    }
	  }
	  return method;
	}
	function getDefaultHandlerMethodName(command) {
	  return `handle${command.charAt(0).toUpperCase()}${command.slice(1)}`;
	}

	class ErrorNotConnected extends Error {
	  constructor(message) {
	    super(message);
	    this.name = 'ErrorNotConnected';
	  }
	}

	class ErrorTimeout extends Error {
	  constructor(message) {
	    super(message);
	    this.name = 'ErrorTimeout';
	  }
	}

	const JSON_RPC_VERSION = '2.0';
	const RpcError = {
	  Parse: {
	    code: -32700,
	    message: 'Parse error'
	  },
	  InvalidRequest: {
	    code: -32600,
	    message: 'Invalid Request'
	  },
	  MethodNotFound: {
	    code: -32601,
	    message: 'Method not found'
	  },
	  InvalidParams: {
	    code: -32602,
	    message: 'Invalid params'
	  },
	  Internal: {
	    code: -32603,
	    message: 'Internal error'
	  }
	};
	class JsonRpc extends EventTarget {
	  constructor(options) {
	    super();
	    this.idCounter = 0;
	    this.handlers = {};
	    this.rpcResponseAwaiters = new Map();
	    this.sender = options.sender;
	    for (const method of Object.keys(options.handlers || {})) {
	      this.handle(method, options.handlers[method]);
	    }
	    for (const eventType of Object.keys(options.events || {})) {
	      // eslint-disable-next-line @bitrix24/bitrix24-rules/no-native-events-binding
	      this.addEventListener(eventType, options.events[eventType]);
	    }
	  }

	  /**
	   * @param {string} method
	   * @param {function} handler
	   */
	  handle(method, handler) {
	    this.handlers[method] = handler;
	  }

	  /**
	   * Sends RPC command to the server.
	   *
	   * @param {string} method Method name
	   * @param {object} params
	   * @param {int} timeout
	   * @returns {Promise}
	   */
	  executeOutgoingRpcCommand(method, params, timeout = 5) {
	    return new Promise((resolve, reject) => {
	      const request = this.createRequest(method, params);
	      if (this.sender.send(JSON.stringify(request)) === false) {
	        reject(new ErrorNotConnected('send failed'));
	      }
	      if (timeout > 0) {
	        const t = setTimeout(() => {
	          this.rpcResponseAwaiters.delete(request.id);
	          reject(new ErrorTimeout('no response'));
	        }, timeout * 1000);
	        this.rpcResponseAwaiters.set(request.id, {
	          resolve,
	          reject,
	          timeout: t
	        });
	      } else {
	        resolve();
	      }
	    });
	  }

	  /**
	   * Executes array or rpc commands. Returns array of promises, each promise will be resolved individually.
	   *
	   * @param {JsonRpcRequest[]} batch
	   * @returns {Promise[]}
	   */
	  executeOutgoingRpcBatch(batch) {
	    const requests = [];
	    const promises = [];
	    batch.forEach(({
	      method,
	      params,
	      id
	    }) => {
	      const request = this.createRequest(method, params, id);
	      requests.push(request);
	      promises.push(new Promise((resolve, reject) => {
	        this.rpcResponseAwaiters.set(request.id, {
	          resolve,
	          reject
	        });
	      }));
	    });
	    this.sender.send(JSON.stringify(requests));
	    return promises;
	  }
	  processRpcResponse(response) {
	    if ('id' in response && this.rpcResponseAwaiters.has(response.id)) {
	      const awaiter = this.rpcResponseAwaiters.get(response.id);
	      if ('result' in response) {
	        awaiter.resolve(response.result);
	      } else if ('error' in response) {
	        awaiter.reject(response.error);
	      } else {
	        awaiter.reject(new Error('wrong response structure'));
	      }
	      clearTimeout(awaiter.timeout);
	      this.rpcResponseAwaiters.delete(response.id);
	    } else {
	      this.dispatchEvent(new CustomEvent('error', {
	        error: new Error(`received rpc response with unknown id ${response}`)
	      }));
	    }
	  }
	  async handleIncomingMessage(message) {
	    let decoded = {};
	    try {
	      decoded = JSON.parse(message);
	    } catch (e) {
	      throw new Error(`could not decode json rpc message: ${e}`);
	    }
	    if (isArray(decoded)) {
	      this.executeIncomingRpcBatch(decoded);
	    } else if (isJsonRpcRequest(decoded)) {
	      const commandResult = await this.executeIncomingRpcCommand(decoded);
	      if (commandResult !== null && commandResult !== undefined) {
	        const response = commandResult.error ? this.createErrorResponse(decoded.id, commandResult.error) : this.createResponse(decoded.id, commandResult);
	        this.sender.send(JSON.stringify(response));
	      } else {
	        this.sender.send(JSON.stringify(this.createResponse(decoded.id, null)));
	      }
	    } else if (isJsonRpcResponse(decoded)) {
	      this.processRpcResponse(decoded);
	    } else {
	      throw new Error(`unknown rpc packet: ${decoded}`);
	    }
	  }

	  /**
	   * Executes RPC command, received from the server
	   *
	   * @param {string} method
	   * @param {object} params
	   * @returns {object}
	   */
	  async executeIncomingRpcCommand({
	    method,
	    params
	  }) {
	    if (method in this.handlers) {
	      try {
	        return this.handlers[method].call(this, params);
	      } catch (e) {
	        return {
	          jsonrpc: '2.0',
	          error: e.toString()
	        };
	      }
	    }
	    return {
	      error: RpcError.MethodNotFound
	    };
	  }
	  async executeIncomingRpcBatch(batch) {
	    const result = [];
	    for (const command of batch) {
	      if ('jsonrpc' in command) {
	        if ('method' in command) {
	          const commandResult = this.executeIncomingRpcCommand(command);
	          if (commandResult) {
	            commandResult.jsonrpc = JSON_RPC_VERSION;
	            commandResult.id = command.id;
	            result.push(commandResult);
	          }
	        } else {
	          this.processRpcResponse(command);
	        }
	      } else {
	        this.dispatchEvent(new CustomEvent('error', {
	          error: new Error(`unknown rpc command in batch: ${command}`)
	        }));
	        result.push({
	          jsonrpc: '2.0',
	          error: RpcError.InvalidRequest
	        });
	      }
	    }
	    return result;
	  }
	  nextId() {
	    this.idCounter++;
	    return this.idCounter;
	  }
	  createPublishRequest(messageBatch) {
	    const result = messageBatch.map(message => this.createRequest('publish', message));
	    if (result.length === 0) {
	      return result[0];
	    }
	    return result;
	  }
	  createRequest(method, params, id) {
	    return {
	      jsonrpc: JSON_RPC_VERSION,
	      method,
	      params,
	      id: id != null ? id : this.nextId()
	    };
	  }
	  createResponse(id, result) {
	    return {
	      jsonrpc: JSON_RPC_VERSION,
	      id,
	      result
	    };
	  }
	  createErrorResponse(id, error) {
	    return {
	      jsonrpc: JSON_RPC_VERSION,
	      id,
	      error
	    };
	  }
	}

	/* eslint-disable @bitrix24/bitrix24-rules/no-typeof */
	const WorkerConnectorEvents = {
	  Message: 'message',
	  RevisionChanged: 'revisionChanged',
	  ConnectionStatus: 'connectionStatus'
	};
	const WORKER_PATH = '/bitrix/js/pull/worker/dist/pull.worker.bundle.js';
	const WORKER_NAME = 'Bitrix24 Push&Pull';
	class WorkerConnector extends EventTarget {
	  static isSharedWorkerSupported() {
	    return 'SharedWorker' in window;
	  }
	  constructor(options) {
	    super();
	    this.connectionType = ConnectionType.WebSocket;
	    this.connectionStatus = PullStatus.Offline;
	    this.isJsonRpcConnection = false;
	    this.bundleTimestamp = options.bundleTimestamp;
	    this.configTimestamp = options.configTimestamp;
	    for (const eventName of Object.keys(options.events || {})) {
	      this.addEventListener(eventName, options.events[eventName]);
	    }
	    this.worker = new SharedWorker(`${WORKER_PATH}?${this.bundleTimestamp}`, WORKER_NAME);
	    this.rpcAdapter = this.createRpcAdapter();
	    this.worker.port.start();
	    this.worker.port.addEventListener('message', this.onPortMessage.bind(this));
	    window.addEventListener('offline', this.onOffline.bind(this));
	    window.addEventListener('online', this.onOnline.bind(this));
	    window.addEventListener('pagehide', this.onPageHide.bind(this));
	  }
	  createRpcAdapter() {
	    return new JsonRpc({
	      sender: {
	        send: m => this.worker.port.postMessage(m)
	      },
	      handlers: {
	        ready: this.handleReady.bind(this),
	        incomingMessage: this.handleIncomingMessage.bind(this),
	        revisionChanged: this.handleRevisionChanged.bind(this),
	        connectionStatusChanged: this.handleConnectionStatusChanged.bind(this)
	      },
	      events: {
	        error: error => console.error('rpc error', error)
	      }
	    });
	  }
	  setPublicIds(publicIds) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('setPublicIds', {
	      publicIds
	    });
	  }
	  sendMessage(users, moduleId, command, params, expiry) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('sendMessage', {
	      users,
	      moduleId,
	      command,
	      params,
	      expiry
	    });
	  }
	  sendMessageBatch(messageBatch) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('sendMessageBatch', {
	      messageBatch
	    });
	  }
	  sendMessageToChannels(publicChannels, moduleId, command, params, expiry) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('sendMessageToChannels', {
	      publicChannels,
	      moduleId,
	      command,
	      params,
	      expiry
	    });
	  }
	  connect() {
	    return Promise.resolve();
	  }
	  getUsersLastSeen(userList) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('getUsersLastSeen', {
	      userList
	    });
	  }
	  listChannels() {
	    return this.rpcAdapter.executeOutgoingRpcCommand('listChannels');
	  }
	  isJsonRpc() {
	    return this.isJsonRpcConnection;
	  }
	  subscribeUserStatusChange(userId) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('subscribeUserStatusChange', {
	      userId
	    });
	  }
	  unsubscribeUserStatusChange(userId) {
	    return this.rpcAdapter.executeOutgoingRpcCommand('unsubscribeUserStatusChange', {
	      userId
	    });
	  }
	  isWebSocketConnected() {
	    return this.connectionType === ConnectionType.WebSocket && this.connectionStatus === PullStatus.Online;
	  }
	  getConnectionPath() {
	    return 'not available in SharedWorker mode';
	  }
	  getServerMode() {
	    return 'n/a';
	  }
	  onLoginSuccess() {
	    this.rpcAdapter.executeOutgoingRpcCommand('notifyLogin');
	  }
	  handleReady() {
	    this.rpcAdapter.executeOutgoingRpcCommand('notifyConfigTimestamp', {
	      configTimestamp: this.configTimestamp
	    });
	  }
	  handleIncomingMessage({
	    payload
	  }) {
	    this.dispatchEvent(new CustomEvent(WorkerConnectorEvents.Message, {
	      detail: payload
	    }));
	  }
	  handleRevisionChanged({
	    revision
	  }) {
	    this.dispatchEvent(new CustomEvent(WorkerConnectorEvents.RevisionChanged, {
	      detail: {
	        revision
	      }
	    }));
	  }
	  handleConnectionStatusChanged({
	    status,
	    connectionType,
	    isJsonRpc
	  }) {
	    this.dispatchEvent(new CustomEvent(WorkerConnectorEvents.ConnectionStatus, {
	      detail: {
	        status
	      }
	    }));
	    this.connectionType = connectionType;
	    this.connectionStatus = status;
	    this.isJsonRpcConnection = isJsonRpc;
	  }
	  onPortMessage(e) {
	    const message = e.data;
	    this.rpcAdapter.handleIncomingMessage(message);
	  }
	  onOffline() {
	    this.rpcAdapter.executeOutgoingRpcCommand('notifyOffline');
	  }
	  onOnline() {
	    this.rpcAdapter.executeOutgoingRpcCommand('notifyOnline');
	  }
	  onPageHide() {
	    this.rpcAdapter.executeOutgoingRpcCommand('bye');
	  }
	  isConnected() {
	    return this.connectionStatus === PullStatus.Online;
	  }
	  async pingWorker() {
	    return this.rpcAdapter.executeOutgoingRpcCommand('bye');
	  }
	  async getWorkerLog() {
	    return this.rpcAdapter.executeOutgoingRpcCommand('getLog');
	  }
	  async getWorkerConfig() {
	    return this.rpcAdapter.executeOutgoingRpcCommand('getConfig');
	  }
	  disconnect() {
	    console.warn('Pull: SharedWorker mode: disconnection request ignored');
	  }
	  scheduleReconnect() {
	    // nothing
	  }
	  resetSession() {
	    // nothing
	  }
	}

	/* eslint-disable max-classes-per-file */
	class MiniRest {
	  constructor(options = {}) {
	    this.sessid = '';
	    this.queryParams = {};
	    if (isNotEmptyString(options.sessid)) {
	      this.sessid = options.sessid;
	    }
	    if (isPlainObject(options.queryParams)) {
	      this.queryParams = options.queryParams;
	    }
	  }
	  async callMethod(method, params = {}, _ = null, __ = null, logTag = '') {
	    const lt = logTag ? `?logTag=${logTag}` : '';
	    const url = `/rest/${method}.json${lt}`;
	    let decoded = null;
	    let responseStatus = 0;
	    try {
	      const response = await fetch(url, this.getFetchOptions({
	        ...this.queryParams,
	        ...params
	      }));
	      responseStatus = response.status;
	      decoded = await response.json();
	    } catch {
	      throw new RestCompatResult(0, {
	        error: 'NETWORK_ERROR',
	        error_description: 'Network error'
	      });
	    }
	    if (decoded && 'error' in decoded && decoded.error === 'session_failed' && 'sessid' in decoded && isNotEmptyString(decoded.sessid)) {
	      this.sessid = decoded.sessid;
	      // after setting sessid fetch options should differ
	      try {
	        const fallbackResponse = await fetch(url, this.getFetchOptions({
	          ...this.queryParams,
	          ...params
	        }));
	        responseStatus = fallbackResponse.status;
	        decoded = await fallbackResponse.json();
	      } catch {
	        throw new RestCompatResult(0, {
	          error: 'NETWORK_ERROR',
	          error_description: 'Network error'
	        });
	      }
	    }
	    const result = new RestCompatResult(responseStatus, decoded);
	    if (result.isError) {
	      throw result;
	    }
	    return result;
	  }
	  getFetchOptions(params = {}) {
	    const query = buildQueryString({
	      sessid: this.getSessid(),
	      ...params
	    });
	    return {
	      method: 'POST',
	      headers: {
	        'Content-Type': 'application/x-www-form-urlencoded',
	        'X-Bitrix-Csrf-Token': this.getSessid()
	      },
	      credentials: 'same-origin',
	      body: query
	    };
	  }
	  getSessid() {
	    if (this.sessid !== '') {
	      return this.sessid;
	    }

	    // eslint-disable-next-line @bitrix24/bitrix24-rules/no-typeof
	    if (typeof BX !== 'undefined' && BX.bitrix_sessid) {
	      // eslint-disable-next-line @bitrix24/bitrix24-rules/no-bx
	      return BX.bitrix_sessid();
	    }
	    return '';
	  }
	}
	class RestCompatResult {
	  constructor(status, answer) {
	    this.isError = false;
	    this.status = status;
	    this.answer = answer;
	    if (typeof this.answer.error !== 'undefined') {
	      this.isError = true;
	      this.answer.ex = new RestCompatError(this.status, typeof this.answer.error === 'string' ? this.answer : this.answer.error);
	    }
	  }
	  data() {
	    return this.answer.result;
	  }
	  time() {
	    return this.answer.time;
	  }
	  error() {
	    return this.answer.ex;
	  }
	}
	class RestCompatError {
	  constructor(status, ex) {
	    this.status = status;
	    this.ex = ex;
	  }
	  getError() {
	    return this.ex;
	  }
	  getStatus() {
	    return this.status;
	  }
	  toString() {
	    const description = this.ex.error_description ? `: ${this.ex.error_description}` : '';
	    return `${this.ex.error}${description} (${this.status})`;
	  }
	}

	class TagWatcher {
	  constructor(options) {
	    this.queue = {};
	    this.watchUpdateInterval = 1740000;
	    this.watchForceUpdateInterval = 5000;
	    this.restClient = options.restClient;
	  }
	  extend(tag, force) {
	    if (!tag || this.queue[tag]) {
	      return;
	    }
	    this.queue[tag] = true;
	    if (force) {
	      this.scheduleUpdate(true);
	    }
	  }
	  clear(tagId) {
	    delete this.queue[tagId];
	  }
	  scheduleUpdate(force) {
	    clearTimeout(this.watchUpdateTimeout);
	    this.watchUpdateTimeout = setTimeout(() => {
	      this.update();
	    }, force ? this.watchForceUpdateInterval : this.watchUpdateInterval);
	  }
	  update() {
	    const watchTags = Object.keys(this.queue);
	    if (watchTags.length > 0) {
	      this.restClient.callMethod('pull.watch.extend', {
	        tags: watchTags
	      }, result => {
	        if (result.error()) {
	          this.scheduleUpdate();
	          return;
	        }
	        const updatedTags = result.data();
	        for (const tagId of Object.keys(updatedTags)) {
	          if (!updatedTags[tagId]) {
	            this.clear(tagId);
	          }
	        }
	        this.scheduleUpdate();
	      });
	    } else {
	      this.scheduleUpdate();
	    }
	  }
	}

	/* eslint-disable @bitrix24/bitrix24-rules/no-bx-message */
	class StorageManager {
	  constructor(params = {}) {
	    var _params$userId, _params$siteId;
	    this.userId = (_params$userId = params.userId) != null ? _params$userId : BX.message && BX.message.USER_ID ? BX.message.USER_ID : 0;
	    this.siteId = (_params$siteId = params.siteId) != null ? _params$siteId : BX.message && BX.message.SITE_ID ? BX.message.SITE_ID : 'none';
	  }
	  set(name, value) {
	    if (!window.localStorage) {
	      return false;
	    }
	    let encoded = value;
	    if (isNotEmptyString(value)) {
	      encoded = JSON.stringify(value);
	    }
	    return window.localStorage.setItem(this.getKey(name), encoded);
	  }
	  get(name, defaultValue = null) {
	    if (!window.localStorage) {
	      return defaultValue;
	    }
	    const result = window.localStorage.getItem(this.getKey(name));
	    if (result === null) {
	      return defaultValue;
	    }
	    return JSON.parse(result);
	  }
	  remove(name) {
	    if (!window.localStorage) {
	      return;
	    }
	    window.localStorage.removeItem(this.getKey(name));
	  }
	  getKey(name) {
	    return `bx-pull-${this.userId}-${this.siteId}-${name}`;
	  }
	  compareKey(eventKey, userKey) {
	    return eventKey === this.getKey(userKey);
	  }
	}

	/* eslint-disable @bitrix24/bitrix24-rules/no-typeof */
	const OFFLINE_STATUS_DELAY = 5000;
	const LS_SESSION = 'bx-pull-session';
	const LS_SESSION_CACHE_TIME = 20;
	var _status = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("status");
	var _emitter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("emitter");
	var _connector = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("connector");
	class PullClient {
	  /* eslint-disable no-param-reassign */
	  constructor(params = {}) {
	    var _params$guestMode, _params$guestUserId, _params$siteId, _params$restClient, _params$configTimesta;
	    Object.defineProperty(this, _status, {
	      writable: true,
	      value: ''
	    });
	    Object.defineProperty(this, _emitter, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _connector, {
	      writable: true,
	      value: void 0
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter] = new Emitter({
	      logger: this.getLogger()
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] = null;
	    if (params.restApplication) {
	      if (typeof params.configGetMethod === 'undefined') {
	        params.configGetMethod = 'pull.application.config.get';
	      }
	      if (typeof params.skipCheckRevision === 'undefined') {
	        params.skipCheckRevision = true;
	      }
	      if (typeof params.restApplication === 'string') {
	        params.siteId = params.restApplication;
	      }
	      params.serverEnabled = true;
	    }
	    this.context = 'master';
	    this.guestMode = (_params$guestMode = params.guestMode) != null ? _params$guestMode : getGlobalParam('pull_guest_mode', 'N') === 'Y';
	    this.guestUserId = (_params$guestUserId = params.guestUserId) != null ? _params$guestUserId : getGlobalParamInt('pull_guest_user_id', 0);
	    if (this.guestMode && this.guestUserId) {
	      this.userId = this.guestUserId;
	    } else {
	      var _params$userId;
	      this.userId = (_params$userId = params.userId) != null ? _params$userId : getGlobalParamInt('USER_ID', 0);
	    }
	    this.siteId = (_params$siteId = params.siteId) != null ? _params$siteId : getGlobalParam('SITE_ID', 'none');
	    this.restClient = (_params$restClient = params.restClient) != null ? _params$restClient : this.createRestClint();
	    this.customRestClient = Boolean(params.restClient);
	    this.enabled = typeof params.serverEnabled === 'undefined' ? typeof BX.message !== 'undefined' && BX.message.pull_server_enabled === 'Y' : params.serverEnabled === 'Y' || params.serverEnabled === true;
	    this.unloading = false;
	    this.starting = false;
	    this.connectionAttempt = 0;
	    this.connectionType = ConnectionType.WebSocket;
	    this.restartTimeout = null;
	    this.restoreWebSocketTimeout = null;
	    this.configGetMethod = typeof params.configGetMethod === 'string' ? params.configGetMethod : 'pull.config.get';
	    this.getPublicListMethod = typeof params.getPublicListMethod === 'string' ? params.getPublicListMethod : 'pull.channel.public.list';
	    this.skipStorageInit = params.skipStorageInit === true;
	    this.skipCheckRevision = params.skipCheckRevision === true;
	    this.tagWatcher = new TagWatcher({
	      restClient: this.restClient
	    });
	    this.configTimestamp = (_params$configTimesta = params.configTimestamp) != null ? _params$configTimesta : getGlobalParamInt('pull_config_timestamp', 0);
	    this.config = null;
	    this.storage = null;
	    if (this.userId && !this.skipStorageInit) {
	      this.storage = new StorageManager({
	        userId: this.userId,
	        siteId: this.siteId
	      });
	    }
	    this.notificationPopup = null;

	    // timers
	    this.checkInterval = null;
	    this.offlineTimeout = null;

	    // manual stop workaround
	    this.isManualDisconnect = false;
	    this.loggingEnabled = false;
	    this.status = PullStatus.Offline;
	  }
	  get connector() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector];
	  }
	  get session() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].session;
	  }
	  get status() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _status)[_status];
	  }
	  set status(status) {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _status)[_status] === status) {
	      return;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _status)[_status] = status;
	    if (!this.enabled) {
	      return;
	    }
	    if (this.offlineTimeout) {
	      clearTimeout(this.offlineTimeout);
	      this.offlineTimeout = null;
	    }
	    if (status === PullStatus.Offline) {
	      this.sendPullStatusDelayed(status, OFFLINE_STATUS_DELAY);
	    } else {
	      this.sendPullStatus(status);
	    }
	  }
	  subscribe(params) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].subscribe(params);
	  }
	  attachCommandHandler(handler) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].attachCommandHandler(handler);
	  }
	  async start(startConfig) {
	    if (!this.enabled) {
	      throw new Error('Push & Pull server is disabled');
	    }
	    if (this.isConnected()) {
	      return true;
	    }
	    const sharedWorkerAllowed = getGlobalParamBool('shared_worker_allowed') && WorkerConnector.isSharedWorkerSupported();

	    /* if config exists - initialize PullConnector with this config, otherwise start SharedWorker */
	    if (startConfig) {
	      let restoreSession = true;
	      if (typeof startConfig.skipReconnectToLastSession !== 'undefined') {
	        restoreSession = !startConfig.skipReconnectToLastSession;
	        delete startConfig.skipReconnectToLastSession;
	      }
	      babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] = this.createConnector(startConfig, restoreSession);
	    } else if (!this.guestMode && !this.customRestClient && sharedWorkerAllowed) {
	      babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] = this.createWorkerConnector();
	    } else {
	      window.addEventListener('beforeunload', this.onBeforeUnload.bind(this));
	      window.addEventListener('offline', this.onOffline.bind(this));
	      window.addEventListener('online', this.onOnline.bind(this));
	      this.configHolder = this.createConfigHolder(this.restClient);
	      let config = null;
	      try {
	        config = await this.configHolder.loadConfig('client_start');
	        babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] = this.createConnector(config, true);
	      } catch (e) {
	        console.error(`${getDateForLog()} Pull: load config`, e);
	        babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] = this.createConnector(null, true);
	        this.scheduleRestart(CloseReasons.BACKEND_ERROR, 'backend error');
	        return false;
	      }
	    }
	    await babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].connect();
	    this.init();
	    this.tagWatcher.scheduleUpdate();
	    return true;
	  }
	  createConnector(config, restoreSession) {
	    return new pull_connector.Connector({
	      config,
	      restoreSession,
	      restClient: this.restClient,
	      getPublicListMethod: this.getPublicListMethod,
	      logger: this.getLogger(),
	      events: {
	        [pull_connector.ConnectorEvents.Message]: this.onMessage.bind(this),
	        [pull_connector.ConnectorEvents.ChannelReplaced]: this.onChannelReplaced.bind(this),
	        [pull_connector.ConnectorEvents.ConfigExpired]: this.onConfigExpired.bind(this),
	        [pull_connector.ConnectorEvents.ConnectionStatus]: this.onConnectionStatus.bind(this),
	        [pull_connector.ConnectorEvents.ConnectionError]: this.onConnectionError.bind(this),
	        [pull_connector.ConnectorEvents.RevisionChanged]: this.onRevisionChanged.bind(this)
	      }
	    });
	  }
	  createWorkerConnector() {
	    return new WorkerConnector({
	      bundleTimestamp: getGlobalParamInt('pull_worker_mtime', 0),
	      configTimestamp: this.configTimestamp,
	      events: {
	        [WorkerConnectorEvents.Message]: this.onMessage.bind(this),
	        [WorkerConnectorEvents.RevisionChanged]: this.onRevisionChanged.bind(this),
	        [WorkerConnectorEvents.ConnectionStatus]: this.onConnectionStatus.bind(this)
	      }
	    });
	  }
	  init() {
	    if (BX && BX.desktop) {
	      BX.addCustomEvent('BXLinkOpened', this.connect.bind(this));
	      BX.addCustomEvent('onDesktopReload', () => {
	        var _babelHelpers$classPr;
	        return (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector]) == null ? void 0 : _babelHelpers$classPr.resetSession();
	      });
	      BX.desktop.addCustomEvent('BXLoginSuccess', this.onLoginSuccess.bind(this));
	    }
	  }
	  onLoginSuccess() {
	    if (babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] instanceof WorkerConnector) {
	      babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].onLoginSuccess();
	    } else {
	      this.restart(1000, 'desktop login');
	    }
	  }
	  createConfigHolder(restClient) {
	    return new pull_configholder.ConfigHolder({
	      restClient,
	      configGetMethod: this.configGetMethod,
	      events: {
	        [pull_configholder.ConfigHolderEvents.ConfigExpired]: e => {
	          this.logToConsole('Stale config detected. Restarting');
	          this.restart(CloseReasons.CONFIG_EXPIRED, 'config expired');
	        },
	        [pull_configholder.ConfigHolderEvents.RevisionChanged]: this.onRevisionChanged.bind(this)
	      }
	    });
	  }
	  createRestClint() {
	    const options = {};
	    if (this.guestMode && this.guestUserId !== 0) {
	      options.queryParams = {
	        pull_guest_id: this.guestUserId
	      };
	    }
	    return new MiniRest(options);
	  }
	  setLastMessageId(lastMessageId) {
	    this.session.mid = lastMessageId;
	  }
	  setPublicIds(publicIds) {
	    babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].setPublicIds(publicIds);
	  }

	  /**
	   * Send single message to the specified users.
	   *
	   * @param {integer[]} users User ids of the message receivers.
	   * @param {string} moduleId Name of the module to receive message,
	   * @param {string} command Command name.
	   * @param {object} params Command parameters.
	   * @param {integer} [expiry] Message expiry time in seconds.
	   * @return {Promise}
	   */
	  sendMessage(users, moduleId, command, params, expiry) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].sendMessage(users, moduleId, command, params, expiry);
	  }

	  /**
	   * Send single message to the specified public channels.
	   *
	   * @param {string[]} publicChannels Public ids of the channels to receive message.
	   * @param {string} moduleId Name of the module to receive message,
	   * @param {string} command Command name.
	   * @param {object} params Command parameters.
	   * @param {integer} [expiry] Message expiry time in seconds.
	   * @return {Promise}
	   */
	  sendMessageToChannels(publicChannels, moduleId, command, params, expiry) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].sendMessageToChannels(publicChannels, moduleId, command, params, expiry);
	  }

	  /**
	   * Sends batch of messages to the multiple public channels.
	   *
	   * @param {object[]} messageBatch Array of messages to send.
	   * @param  {int[]} messageBatch.userList User ids the message receivers.
	   * @param  {string[]|object[]} messageBatch.channelList Public ids of the channels to send messages.
	   * @param {string} messageBatch.moduleId Name of the module to receive message,
	   * @param {string} messageBatch.command Command name.
	   * @param {object} messageBatch.params Command parameters.
	   * @param {integer} [messageBatch.expiry] Message expiry time in seconds.
	   * @return void
	   */
	  async sendMessageBatch(messageBatch) {
	    try {
	      await babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].sendMessageBatch(messageBatch);
	    } catch (e) {
	      console.error(e);
	    }
	  }

	  /**
	   * @param userId {number}
	   * @param callback {UserStatusCallback}
	   * @returns {Promise}
	   */
	  async subscribeUserStatusChange(userId, callback) {
	    if (typeof userId !== 'number') {
	      throw new TypeError('userId must be a number');
	    }
	    await babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].subscribeUserStatusChange(userId);
	    babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].addUserStatusCallback(userId, callback);
	  }

	  /**
	   * @param userId {number}
	   * @param callback {UserStatusCallback}
	   * @returns {Promise}
	   */
	  async unsubscribeUserStatusChange(userId, callback) {
	    if (typeof userId !== 'number') {
	      throw new TypeError('userId must be a number');
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].removeUserStatusCallback(userId, callback);
	    if (!babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].hasUserStatusCallbacks(userId)) {
	      await babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].unsubscribeUserStatusChange(userId);
	    }
	  }
	  restoreUserStatusSubscription() {
	    for (const userId of babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].getSubscribedUsersList()) {
	      babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].subscribeUserStatusChange(userId);
	    }
	  }
	  emitAuthError() {
	    if (BX && BX.onCustomEvent) {
	      BX.onCustomEvent(window, 'onPullError', ['AUTHORIZE_ERROR']);
	    }
	  }
	  isJsonRpc() {
	    return this.connector ? this.connector.isJsonRpc() : false;
	  }

	  /**
	   * Returns "last seen" time in seconds for the users. Result format: Object{userId: int}
	   * If the user is currently connected - will return 0.
	   * If the user if offline - will return diff between current timestamp and last seen timestamp in seconds.
	   * If the user was never online - the record for user will be missing from the result object.
	   *
	   * @param {integer[]} userList List of user ids.
	   * @returns {Promise}
	   */
	  getUsersLastSeen(userList) {
	    if (!isArray(userList) || !userList.every(item => typeof item === 'number')) {
	      throw new Error('userList must be an array of numbers');
	    }
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].getUsersLastSeen(userList);
	  }

	  /**
	   * Pings server. In case of success promise will be resolved, otherwise - rejected.
	   *
	   * @param {int} timeout Request timeout in seconds
	   * @returns {Promise}
	   */
	  ping(timeout) {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].ping(timeout);
	  }

	  /**
	   * Returns list channels that the connection is subscribed to.
	   *
	   * @returns {Promise}
	   */
	  listChannels() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].listChannels();
	  }
	  scheduleRestart(disconnectCode, disconnectReason, restartDelay) {
	    clearTimeout(this.restartTimeout);
	    let delay = restartDelay;
	    if (!delay || delay < 1) {
	      delay = Math.ceil(Math.random() * 30) + 5;
	    }
	    this.restartTimeout = setTimeout(() => this.restart(disconnectCode, disconnectReason), delay * 1000);
	  }
	  async restart(disconnectCode = CloseReasons.NORMAL_CLOSURE, disconnectReason = 'manual restart') {
	    if (this.configHolder && babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] instanceof pull_connector.Connector) {
	      this.logToConsole(`Pull: restarting with code ${disconnectCode}`);
	      this.disconnect(disconnectCode, disconnectReason);
	      const loadConfigReason = `${disconnectCode}_${disconnectReason.replaceAll(' ', '_')}`;
	      try {
	        const config = await this.configHolder.loadConfig(loadConfigReason);
	        babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].setConfig(config);
	      } catch (error) {
	        if ('status' in error && (error.status === 401 || error.status === 403)) {
	          this.emitAuthError();
	        }
	        this.scheduleRestart(CloseReasons.BACKEND_ERROR, 'backend error');
	        return;
	      }
	      try {
	        await babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].connect();
	      } catch {
	        babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].scheduleReconnect();
	      }
	      this.tagWatcher.scheduleUpdate();
	    } else {
	      this.logToConsole('Pull: restart request ignored in shared worker mode');
	    }
	  }
	  disconnect(disconnectCode, disconnectReason) {
	    var _babelHelpers$classPr2;
	    (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector]) == null ? void 0 : _babelHelpers$classPr2.disconnect(disconnectCode, disconnectReason);
	  }
	  stop(disconnectCode, disconnectReason) {
	    this.disconnect(disconnectCode, disconnectReason);
	  }

	  /**
	   * @returns {Promise}
	   */
	  connect() {
	    if (!this.enabled) {
	      return Promise.reject();
	    }
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].connect();
	  }
	  logToConsole(message, ...params) {
	    if (this.loggingEnabled) {
	      // eslint-disable-next-line no-console
	      console.log(`${getDateForLog()}: ${message}`, ...params);
	    }
	  }
	  getLogger() {
	    return {
	      log: this.logToConsole.bind(this),
	      logForce: (message, ...params) => {
	        console.log(`${getDateForLog()}: ${message}`, ...params);
	      }
	    };
	  }
	  isConnected() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] ? babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].isConnected() : false;
	  }

	  // can't be disabled anymore, now when we dropped support for nginx servers
	  isPublishingSupported() {
	    return true;
	  }

	  // can't be disabled anymore
	  isPublishingEnabled() {
	    return true;
	  }
	  onMessage(e) {
	    babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].broadcastMessage(e.detail);
	  }
	  onChannelReplaced(e) {
	    this.logToConsole(`Pull: new config for ${e.detail.type} channel set\n`);
	  }
	  onConfigExpired() {
	    this.restart(CloseReasons.CONFIG_EXPIRED, 'config expired');
	  }
	  onConnectionStatus(e) {
	    this.status = e.detail.status;
	    if (this.status === PullStatus.Online && e.detail.connectionType === ConnectionType.WebSocket) {
	      this.restoreUserStatusSubscription();
	    }
	  }
	  onConnectionError(e) {
	    if (e.detail.code === CloseReasons.WRONG_CHANNEL_ID) {
	      this.scheduleRestart(CloseReasons.WRONG_CHANNEL_ID, 'wrong channel signature');
	    } else {
	      this.restart(e.detail.code, e.detail.reason);
	    }
	  }
	  onRevisionChanged(e) {
	    this.checkRevision(e.detail.revision);
	  }
	  onBeforeUnload() {
	    this.unloading = true;
	    const session = clone(this.session);
	    session.ttl = Date.now() + LS_SESSION_CACHE_TIME * 1000;
	    if (this.storage) {
	      try {
	        this.storage.set(LS_SESSION, JSON.stringify(session), LS_SESSION_CACHE_TIME);
	      } catch (e) {
	        console.error(`${getDateForLog()} Pull: Could not save session info in local storage. Error:`, e);
	      }
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].scheduleReconnect(15);
	  }
	  onOffline() {
	    this.disconnect('1000', 'offline');
	  }
	  onOnline() {
	    this.connect();
	  }
	  checkRevision(serverRevision) {
	    if (this.skipCheckRevision) {
	      return true;
	    }
	    if (serverRevision > 0 && serverRevision !== REVISION) {
	      this.enabled = false;
	      if (typeof BX.message !== 'undefined') {
	        this.showNotification(BX.message('PULL_OLD_REVISION'));
	      }
	      this.disconnect(CloseReasons.NORMAL_CLOSURE, 'check_revision');
	      if (typeof BX.onCustomEvent !== 'undefined') {
	        BX.onCustomEvent(window, 'onPullRevisionUp', [serverRevision, REVISION]);
	      }
	      babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].emit({
	        type: SubscriptionType.Revision,
	        data: {
	          server: serverRevision,
	          client: REVISION
	        }
	      });
	      this.logToConsole(`Pull revision changed from ${REVISION} to ${serverRevision}. Reload required`);
	      return false;
	    }
	    return true;
	  }
	  showNotification(text) {
	    if (this.notificationPopup || typeof BX.PopupWindow === 'undefined') {
	      return;
	    }
	    this.notificationPopup = new BX.PopupWindow('bx-notifier-popup-confirm', null, {
	      zIndex: 200,
	      autoHide: false,
	      closeByEsc: false,
	      overlay: true,
	      content: BX.create('div', {
	        props: {
	          className: 'bx-messenger-confirm'
	        },
	        html: text
	      }),
	      buttons: [new BX.PopupWindowButton({
	        text: BX.message('JS_CORE_WINDOW_CLOSE'),
	        className: 'popup-window-button-decline',
	        events: {
	          click: () => this.notificationPopup.close()
	        }
	      })],
	      events: {
	        onPopupClose: () => this.notificationPopup.destroy(),
	        onPopupDestroy: () => {
	          this.notificationPopup = null;
	        }
	      }
	    });
	    this.notificationPopup.show();
	  }
	  getServerMode() {
	    switch (babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].getServerMode()) {
	      case ServerMode.Shared:
	        return 'cloud';
	      case ServerMode.Personal:
	        return 'local';
	      default:
	        return 'n/a';
	    }
	  }
	  getDebugInfo() {
	    var _babelHelpers$classPr3, _babelHelpers$classPr4, _this$session, _this$session2, _this$session$history, _this$session3;
	    if (!JSON || !JSON.stringify) {
	      return false;
	    }
	    let configDump = {
	      'Config error': 'config is not loaded'
	    };
	    if (this.config && this.config.channels) {
	      configDump = {
	        ChannelID: this.config.channels.private ? this.config.channels.private.id : 'n/a',
	        ChannelDie: this.config.channels.private ? this.config.channels.private.end : 'n/a',
	        ChannelDieShared: 'shared' in this.config.channels ? this.config.channels.shared.end : 'n/a'
	      };
	    }
	    let websocketMode = '-';
	    if (babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] instanceof pull_connector.Connector && babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].isWebSocketConnected()) {
	      if (babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].isJsonRpc()) {
	        websocketMode = 'json-rpc';
	      } else {
	        websocketMode = babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].isProtobufSupported() ? 'protobuf' : 'text';
	      }
	    }
	    return {
	      UserId: this.userId + (this.userId > 0 ? '' : '(guest)'),
	      'Guest userId': this.guestMode && this.guestUserId !== 0 ? this.guestUserId : '-',
	      'Browser online': navigator.onLine ? 'Y' : 'N',
	      Connect: this.isConnected() ? 'Y' : 'N',
	      'Server type': this.getServerMode(),
	      'WebSocket supported': 'Y',
	      'WebSocket connected': (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector]) != null && _babelHelpers$classPr3.isWebSocketConnected() ? 'Y' : 'N',
	      'WebSocket mode': websocketMode,
	      'Try connect': (_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector]) != null && _babelHelpers$classPr4.reconnectTimeout ? 'Y' : 'N',
	      'Try number': this.connectionAttempt,
	      Path: babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector] ? babelHelpers.classPrivateFieldLooseBase(this, _connector)[_connector].getConnectionPath() : '-',
	      ...configDump,
	      'Last message': ((_this$session = this.session) == null ? void 0 : _this$session.mid) > 0 ? (_this$session2 = this.session) == null ? void 0 : _this$session2.mid : '-',
	      'Session history': (_this$session$history = (_this$session3 = this.session) == null ? void 0 : _this$session3.history) != null ? _this$session$history : null,
	      'Watch tags': this.tagWatcher.queue
	    };
	  }
	  enableLogging(loggingFlag = true) {
	    this.loggingEnabled = loggingFlag;
	  }
	  capturePullEvent(debugFlag = true) {
	    babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].capturePullEvent(debugFlag);
	  }
	  sendPullStatusDelayed(status, delay) {
	    if (this.offlineTimeout) {
	      clearTimeout(this.offlineTimeout);
	    }
	    this.offlineTimeout = setTimeout(() => {
	      this.offlineTimeout = null;
	      this.sendPullStatus(status);
	    }, delay);
	  }
	  sendPullStatus(status) {
	    if (this.unloading) {
	      return;
	    }
	    if (typeof BX.onCustomEvent !== 'undefined') {
	      BX.onCustomEvent(window, 'onPullStatus', [status]);
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].emit({
	      type: SubscriptionType.Status,
	      data: {
	        status
	      }
	    });
	  }
	  extendWatch(tag, force) {
	    this.tagWatcher.extend(tag, force);
	  }
	  clearWatch(tagId) {
	    this.tagWatcher.clear(tagId);
	  }

	  // old functions, not used anymore.
	  setPrivateVar() {}
	  returnPrivateVar() {}
	  expireConfig() {}
	  updateChannelID() {}
	  tryConnect() {}
	  tryConnectDelay() {}
	  tryConnectSet() {}
	  updateState() {}
	  setUpdateStateStepCount() {}
	  supportWebSocket() {
	    return this.isWebSocketSupported();
	  }
	  isWebSoketConnected() {
	    return this.isConnected() && this.connectionType === ConnectionType.WebSocket;
	  }
	  getPullServerStatus() {
	    return this.isConnected();
	  }
	  closeConfirm() {
	    if (this.notificationPopup) {
	      this.notificationPopup.destroy();
	    }
	  }
	}
	PullClient.PullStatus = PullStatus;
	PullClient.SubscriptionType = SubscriptionType;
	PullClient.CloseReasons = CloseReasons;
	PullClient.StorageManager = StorageManager;
	function getGlobalParam(name, defaultValue) {
	  if (typeof BX.message !== 'undefined' && name in BX.message) {
	    return BX.message[name];
	  }
	  return defaultValue;
	}
	function getGlobalParamInt(name, defaultValue) {
	  if (typeof BX.message !== 'undefined' && name in BX.message) {
	    return parseInt(BX.message[name], 10);
	  }
	  return defaultValue;
	}
	function getGlobalParamBool(name, defaultValue) {
	  if (typeof BX.message !== 'undefined' && name in BX.message) {
	    return BX.message[name] === 'Y';
	  }
	  return defaultValue;
	}

	/**
	 * Bitrix Push & Pull
	 * Pull client
	 *
	 * @package bitrix
	 * @subpackage pull
	 * @copyright 2001-2019 Bitrix
	 */
	if (!globalThis.BX) {
	  globalThis.BX = {};
	}
	if (!BX.PULL) {
	  BX.PULL = new PullClient();
	}
	BX.PullClient = PullClient;

	exports.PullClient = PullClient;

}((this.BX = this.BX || {}),BX.Pull.Util,BX.Pull,BX.Pull));
//# sourceMappingURL=pull.client.js.map

Youez - 2016 - github.com/yon3zu
LinuXploit