UNPKG

backendless-rt-client

Version:

Backendless RT Client for connect to Backendless RT Server

1,291 lines (1,211 loc) 292 kB
/* * ******************************************************************************************************************** * Backendless RT Client for JavaScript. Version: 0.5.0 * * Copyright 2012-2018 BACKENDLESS.COM. All Rights Reserved. * * NOTICE: All information contained herein is, and remains the property of Backendless.com and its suppliers, * if any. The intellectual and technical concepts contained herein are proprietary to Backendless.com and its * suppliers and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret * or copyright law. Dissemination of this information or reproduction of this material is strictly forbidden * unless prior written permission is obtained from Backendless.com. * ******************************************************************************************************************** */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["BackendlessRTClient"] = factory(); else root["BackendlessRTClient"] = factory(); })(self, () => { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./node_modules/after/index.js": /*!*************************************!*\ !*** ./node_modules/after/index.js ***! \*************************************/ /***/ ((module) => { module.exports = after function after(count, callback, err_cb) { var bail = false err_cb = err_cb || noop proxy.count = count return (count === 0) ? callback() : proxy function proxy(err, result) { if (proxy.count <= 0) { throw new Error('after called too many times') } --proxy.count // after first error, rest are passed to err_cb if (err) { bail = true callback(err) // future error callbacks will go to error handler callback = err_cb } else if (proxy.count === 0 && !bail) { callback(null, result) } } } function noop() {} /***/ }), /***/ "./node_modules/arraybuffer.slice/index.js": /*!*************************************************!*\ !*** ./node_modules/arraybuffer.slice/index.js ***! \*************************************************/ /***/ ((module) => { /** * An abstraction for slicing an arraybuffer even when * ArrayBuffer.prototype.slice is not supported * * @api public */ module.exports = function(arraybuffer, start, end) { var bytes = arraybuffer.byteLength; start = start || 0; end = end || bytes; if (arraybuffer.slice) { return arraybuffer.slice(start, end); } if (start < 0) { start += bytes; } if (end < 0) { end += bytes; } if (end > bytes) { end = bytes; } if (start >= bytes || start >= end || bytes === 0) { return new ArrayBuffer(0); } var abv = new Uint8Array(arraybuffer); var result = new Uint8Array(end - start); for (var i = start, ii = 0; i < end; i++, ii++) { result[ii] = abv[i]; } return result.buffer; }; /***/ }), /***/ "./src/client.js": /*!***********************!*\ !*** ./src/client.js ***! \***********************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js")); var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js")); var _constants = __webpack_require__(/*! ./constants */ "./src/constants.js"); var _config = _interopRequireDefault(__webpack_require__(/*! ./config */ "./src/config.js")); var _subscriptions = _interopRequireDefault(__webpack_require__(/*! ./subscriptions */ "./src/subscriptions.js")); var _methods = _interopRequireDefault(__webpack_require__(/*! ./methods */ "./src/methods.js")); var _session = _interopRequireDefault(__webpack_require__(/*! ./session */ "./src/session.js")); var CONNECTION_MANAGE_EVENTS = [_constants.NativeSocketEvents.CONNECTING, _constants.NativeSocketEvents.CONNECT, _constants.NativeSocketEvents.CONNECT_ERROR, _constants.NativeSocketEvents.DISCONNECT, _constants.NativeSocketEvents.RECONNECT_ATTEMPT]; var RTClient = exports["default"] = /*#__PURE__*/function () { function RTClient(config) { var _this = this; (0, _classCallCheck2["default"])(this, RTClient); (0, _defineProperty2["default"])(this, "onConnectError", function () { if (!_this.subscriptions.hasActivity() && !_this.methods.hasActivity()) { _this.disconnect('There are no active subscriptions and methods'); _this.connectible = true; } }); (0, _defineProperty2["default"])(this, "connectOnMethod", function (method) { return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (_this.connectible) { var rtSocketPromise = _this.provideConnection(); if (_this.connected) { rtSocketPromise.then(function (rtSocket) { return rtSocket[method].apply(rtSocket, args); }); } } }; }); (0, _defineProperty2["default"])(this, "on", this.connectOnMethod('on')); (0, _defineProperty2["default"])(this, "emit", this.connectOnMethod('emit')); (0, _defineProperty2["default"])(this, "onSessionDisconnect", function () { _this.subscriptions.stop(); _this.methods.stop(); delete _this.session; _this.provideConnection(); }); (0, _defineProperty2["default"])(this, "emitSocketEventListeners", function (event) { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } if (_this.socketEvents[event]) { _this.socketEvents[event].forEach(function (callback) { return callback.apply(void 0, args); }); } }); /* eslint-disable max-len */ (0, _defineProperty2["default"])(this, "addConnectingEventListener", function (callback) { return _this.addSocketEventListener(_constants.NativeSocketEvents.CONNECTING, callback); }); (0, _defineProperty2["default"])(this, "removeConnectingEventListener", function (callback) { return _this.removeSocketEventListener(_constants.NativeSocketEvents.CONNECTING, callback); }); (0, _defineProperty2["default"])(this, "addConnectEventListener", function (callback) { return _this.addSocketEventListener(_constants.NativeSocketEvents.CONNECT, callback); }); (0, _defineProperty2["default"])(this, "removeConnectEventListener", function (callback) { return _this.removeSocketEventListener(_constants.NativeSocketEvents.CONNECT, callback); }); (0, _defineProperty2["default"])(this, "addConnectErrorEventListener", function (callback) { return _this.addSocketEventListener(_constants.NativeSocketEvents.CONNECT_ERROR, callback); }); (0, _defineProperty2["default"])(this, "removeConnectErrorEventListener", function (callback) { return _this.removeSocketEventListener(_constants.NativeSocketEvents.CONNECT_ERROR, callback); }); (0, _defineProperty2["default"])(this, "addDisconnectEventListener", function (callback) { return _this.addSocketEventListener(_constants.NativeSocketEvents.DISCONNECT, callback); }); (0, _defineProperty2["default"])(this, "removeDisconnectEventListener", function (callback) { return _this.removeSocketEventListener(_constants.NativeSocketEvents.DISCONNECT, callback); }); (0, _defineProperty2["default"])(this, "addReconnectAttemptEventListener", function (callback) { return _this.addSocketEventListener(_constants.NativeSocketEvents.RECONNECT_ATTEMPT, callback); }); (0, _defineProperty2["default"])(this, "removeReconnectAttemptEventListener", function (callback) { return _this.removeSocketEventListener(_constants.NativeSocketEvents.RECONNECT_ATTEMPT, callback); }); /* eslint-enable max-len */ (0, _defineProperty2["default"])(this, "removeConnectionListeners", function () { CONNECTION_MANAGE_EVENTS.forEach(function (event) { return _this.removeSocketEventListener(event); }); }); this.config = new _config["default"](config); this.resetSocketEvents(); var socketContext = { onMessage: this.on.bind(this), emitMessage: this.emit.bind(this) }; this.subscriptions = new _subscriptions["default"](socketContext); this.methods = new _methods["default"](socketContext); this.connectible = true; this.connected = false; } return (0, _createClass2["default"])(RTClient, [{ key: "resetSocketEvents", value: function resetSocketEvents() { this.socketEvents = {}; this.addConnectErrorEventListener(this.onConnectError); } }, { key: "setConfig", value: function setConfig(config) { this.config.set(config); if (this.session) { this.disconnect('Re-config socket connection'); this.connect(); } } }, { key: "provideConnection", value: function provideConnection() { var _this2 = this; if (!this.session) { this.session = new _session["default"](this.config, this.emitSocketEventListeners, this.onSessionDisconnect); this.session.getSocket().then(function () { _this2.connected = true; _this2.methods.initialize(); _this2.methods.restore(); _this2.subscriptions.initialize(); _this2.subscriptions.restore(); }); } return this.session.getSocket(); } }, { key: "getConnectionId", value: function () { var _getConnectionId = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (!this.session) { _context.next = 4; break; } _context.next = 3; return this.session.getConnectionId(); case 3: return _context.abrupt("return", _context.sent); case 4: return _context.abrupt("return", null); case 5: case "end": return _context.stop(); } }, _callee, this); })); function getConnectionId() { return _getConnectionId.apply(this, arguments); } return getConnectionId; }() }, { key: "connect", value: function connect() { this.connectible = true; this.provideConnection(); } }, { key: "disconnect", value: function disconnect(reason) { if (this.session) { this.subscriptions.stop(); this.methods.stop(); this.session.terminate(); delete this.session; this.emitSocketEventListeners(_constants.NativeSocketEvents.DISCONNECT, reason || 'disconnected by client'); } this.connectible = false; this.connected = false; } }, { key: "terminate", value: function terminate(reason) { this.resetSocketEvents(); this.subscriptions.reset(); this.methods.reset(); this.disconnect(reason || 'Terminated by client'); } }, { key: "addSocketEventListener", value: function addSocketEventListener(event, callback) { this.socketEvents[event] = this.socketEvents[event] || []; this.socketEvents[event].push(callback); return this; } }, { key: "removeSocketEventListener", value: function removeSocketEventListener(event, callback) { if (this.socketEvents[event]) { this.socketEvents[event] = callback ? this.socketEvents[event].filter(function (cb) { return cb !== callback; }) : []; if (!this.socketEvents[event].length) { delete this.socketEvents[event]; } } return this; } }]); }(); /***/ }), /***/ "./src/config.js": /*!***********************!*\ !*** ./src/config.js ***! \***********************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js")); var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js")); var isUndefined = function isUndefined(value) { return typeof value === 'undefined'; }; var isString = function isString(value) { return typeof value === 'string'; }; var isFunction = function isFunction(value) { return typeof value === 'function'; }; var isObject = function isObject(value) { return (0, _typeof2["default"])(value) === 'object' && value !== null; }; var RTConfig = exports["default"] = /*#__PURE__*/function () { function RTConfig(config) { (0, _classCallCheck2["default"])(this, RTConfig); this.appId = null; this.debugMode = false; this.connectQuery = {}; this.socketConfigTransform = null; this.hostResolver = null; this.socketConfig = null; this.set(config); } return (0, _createClass2["default"])(RTConfig, [{ key: "set", value: function set(config) { if (!config) { return; } if (!isUndefined(config.hostResolver)) { if (isFunction(config.hostResolver)) { this.hostResolver = config.hostResolver; } } if (!isUndefined(config.appId)) { if (!isString(config.appId)) { throw new Error('"appId" must be String.'); } this.appId = config.appId; } if (!isUndefined(config.debugMode)) { this.debugMode = !!config.debugMode; } if (!isUndefined(config.connectQuery)) { if (isFunction(config.connectQuery)) { this.getConnectQuery = config.connectQuery; } else if (isObject(config.connectQuery)) { this.connectQuery = config.connectQuery; } else { throw new Error('"connectQuery" must be Function or Object.'); } } if (!isUndefined(config.socketConfigTransform)) { if (isFunction(config.socketConfigTransform)) { this.socketConfigTransform = config.socketConfigTransform; } else { throw new Error('"socketConfigTransform" must be Function.'); } } } }, { key: "getConnectQuery", value: function getConnectQuery() { return this.connectQuery; } }, { key: "getSocketConfig", value: function getSocketConfig() { return this.socketConfig; } }, { key: "getHost", value: function () { var _getHost = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { var host; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (!(isUndefined(this.hostResolver) || !isFunction(this.hostResolver))) { _context.next = 2; break; } throw new Error('"hostResolver" must be a function'); case 2: _context.next = 4; return this.hostResolver(); case 4: host = _context.sent; if (!(!host || typeof host !== 'string')) { _context.next = 7; break; } throw new Error('"hostResolver" must return a valid string'); case 7: return _context.abrupt("return", host); case 8: case "end": return _context.stop(); } }, _callee, this); })); function getHost() { return _getHost.apply(this, arguments); } return getHost; }() }, { key: "prepare", value: function () { var _prepare = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() { var query, host, url, path; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: query = this.getConnectQuery(); _context2.next = 3; return this.getHost(); case 3: host = _context2.sent; url = this.appId ? "".concat(host, "/").concat(this.appId) : host; path = this.appId ? "/".concat(this.appId) : undefined; this.socketConfig = { host: host, url: url, options: { path: path, query: query, forceNew: true, autoConnect: false, reconnection: false } }; if (!this.socketConfigTransform) { _context2.next = 14; break; } _context2.next = 10; return this.socketConfigTransform(this.socketConfig); case 10: _context2.t0 = _context2.sent; if (_context2.t0) { _context2.next = 13; break; } _context2.t0 = this.socketConfig; case 13: this.socketConfig = _context2.t0; case 14: case "end": return _context2.stop(); } }, _callee2, this); })); function prepare() { return _prepare.apply(this, arguments); } return prepare; }() }]); }(); /***/ }), /***/ "./src/constants.js": /*!**************************!*\ !*** ./src/constants.js ***! \**************************/ /***/ ((__unused_webpack_module, exports) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.RTSubscriptionTypes = exports.RTSocketEvents = exports.RTMethodTypes = exports.NativeSocketEvents = void 0; var NativeSocketEvents = exports.NativeSocketEvents = { CONNECTING: 'connecting', CONNECT: 'connect', CONNECT_ERROR: 'connect_error', CONNECT_TIMEOUT: 'connect_timeout', DISCONNECT: 'disconnect', RECONNECT: 'reconnect', RECONNECT_ATTEMPT: 'reconnect_attempt', RECONNECTING: 'reconnecting', RECONNECT_ERROR: 'reconnect_error', RECONNECT_FAILED: 'reconnect_failed', ERROR: 'error', PING: 'ping', PONG: 'pong' }; var RTSocketEvents = exports.RTSocketEvents = { SUB_ON: 'SUB_ON', SUB_OFF: 'SUB_OFF', SUB_RES: 'SUB_RES', SUB_READY: 'SUB_READY', MET_REQ: 'MET_REQ', MET_RES: 'MET_RES' }; var RTSubscriptionTypes = exports.RTSubscriptionTypes = { OBJECTS_CHANGES: 'OBJECTS_CHANGES', RELATIONS_CHANGES: 'RELATIONS_CHANGES', PUB_SUB_CONNECT: 'PUB_SUB_CONNECT', PUB_SUB_MESSAGES: 'PUB_SUB_MESSAGES', PUB_SUB_COMMANDS: 'PUB_SUB_COMMANDS', PUB_SUB_USERS: 'PUB_SUB_USERS', RSO_CONNECT: 'RSO_CONNECT', RSO_CHANGES: 'RSO_CHANGES', RSO_CLEARED: 'RSO_CLEARED', RSO_COMMANDS: 'RSO_COMMANDS', RSO_INVOKE: 'RSO_INVOKE', RSO_USERS: 'RSO_USERS', //-----------------------------------------// //----------- FOR CONSOLE ONLY ------------// LOGGING_MESSAGES: 'LOGGING_MESSAGES', CONSOLE_MESSAGES: 'CONSOLE_MESSAGES', DEVELOPER_MESSAGES: 'DEVELOPER_MESSAGES', AUTOMATION_MESSAGES: 'AUTOMATION_MESSAGES' //----------- FOR CONSOLE ONLY ------------// //-----------------------------------------// }; var RTMethodTypes = exports.RTMethodTypes = { SET_USER_TOKEN: 'SET_USER_TOKEN', RSO_GET: 'RSO_GET', RSO_SET: 'RSO_SET', RSO_CLEAR: 'RSO_CLEAR', RSO_COMMAND: 'RSO_COMMAND', RSO_INVOKE: 'RSO_INVOKE', PUB_SUB_COMMAND: 'PUB_SUB_COMMAND' }; /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.RTScopeConnector = exports.RTListeners = void 0; var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js")); var _backendlessRequest = _interopRequireDefault(__webpack_require__(/*! backendless-request */ "./node_modules/backendless-request/dist/backendless-request.js")); var _client = _interopRequireDefault(__webpack_require__(/*! ./client */ "./src/client.js")); var _listeners = _interopRequireDefault(__webpack_require__(/*! ./listeners */ "./src/listeners.js")); var _scopeConnector = _interopRequireDefault(__webpack_require__(/*! ./scope-connector */ "./src/scope-connector.js")); var root = (typeof self === "undefined" ? "undefined" : (0, _typeof2["default"])(self)) === 'object' && self.self === self && self || (typeof __webpack_require__.g === "undefined" ? "undefined" : (0, _typeof2["default"])(__webpack_require__.g)) === 'object' && __webpack_require__.g.global === __webpack_require__.g && __webpack_require__.g; _client["default"].Request = _backendlessRequest["default"]; _client["default"].Listeners = _listeners["default"]; _client["default"].ScopeConnector = _scopeConnector["default"]; if (root) { root.BackendlessRTClient = _client["default"]; } module.exports = _client["default"]; var _default = exports["default"] = _client["default"]; var RTListeners = exports.RTListeners = _listeners["default"]; var RTScopeConnector = exports.RTScopeConnector = _scopeConnector["default"]; /***/ }), /***/ "./src/listeners.js": /*!**************************!*\ !*** ./src/listeners.js ***! \**************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js")); var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var RTListeners = exports["default"] = /*#__PURE__*/function () { function RTListeners() { (0, _classCallCheck2["default"])(this, RTListeners); this.subscriptions = {}; this.simpleListeners = {}; } return (0, _createClass2["default"])(RTListeners, [{ key: "addSubscription", value: function addSubscription(type, subscriberFn, _ref) { var _this = this; var callback = _ref.callback, onError = _ref.onError, onReady = _ref.onReady, parser = _ref.parser, params = _ref.params; this.subscriptions[type] = this.subscriptions[type] || []; var subscription = subscriberFn(_objectSpread(_objectSpread({}, params), this.getSubscriptionOptions()), { parser: parser, onData: callback, onError: onError, onReady: onReady, onStop: function onStop() { _this.subscriptions[type] = _this.subscriptions[type].filter(function (s) { return s.subscription !== subscription; }); } }); var subscriptionStore = { callback: callback, params: params, subscription: subscription, stop: function stop() { return subscription.stop(); } }; this.subscriptions[type].push(subscriptionStore); return subscriptionStore; } }, { key: "getSubscriptionOptions", value: function getSubscriptionOptions() { return {}; } }, { key: "stopSubscription", value: function stopSubscription(type, _ref2) { var callback = _ref2.callback, matcher = _ref2.matcher; var subscriptionsStack = this.subscriptions[type] = this.subscriptions[type] || []; if (matcher) { subscriptionsStack.forEach(function (subscriptionStore) { if (matcher(subscriptionStore)) { subscriptionStore.subscription.stop(); } }); } else { subscriptionsStack.forEach(function (subscriptionStore) { if (!callback || subscriptionStore.callback === callback) { subscriptionStore.subscription.stop(); } }); } } }, { key: "addSimpleListener", value: function addSimpleListener(type, callback) { var listenersStack = this.simpleListeners[type] = this.simpleListeners[type] || []; listenersStack.push(callback); } }, { key: "removeSimpleListener", value: function removeSimpleListener(type, callback) { if (this.simpleListeners[type]) { this.simpleListeners[type] = callback ? this.simpleListeners[type].filter(function (cb) { return cb !== callback; }) : []; } } }, { key: "runSimpleListeners", value: function runSimpleListeners(type) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } if (this.simpleListeners[type]) { this.simpleListeners[type].forEach(function (callback) { return callback.apply(void 0, args); }); } } }, { key: "removeAllListeners", value: function removeAllListeners() { var _this2 = this; Object.keys(this.subscriptions).forEach(function (listenerType) { _this2.subscriptions[listenerType].forEach(function (_ref3) { var subscription = _ref3.subscription; return subscription.stop(); }); }); this.simpleListeners = {}; } }]); }(); /***/ }), /***/ "./src/methods.js": /*!************************!*\ !*** ./src/methods.js ***! \************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js")); var _constants = __webpack_require__(/*! ./constants */ "./src/constants.js"); var _utils = _interopRequireDefault(__webpack_require__(/*! ./utils */ "./src/utils.js")); var method = function method(type) { return function (data) { return this.send(type, data); }; }; var RTMethods = exports["default"] = /*#__PURE__*/function () { function RTMethods(_ref) { var _this = this; var onMessage = _ref.onMessage, emitMessage = _ref.emitMessage; (0, _classCallCheck2["default"])(this, RTMethods); (0, _defineProperty2["default"])(this, "sendRequest", function (invocationId) { if (_this.invocations[invocationId]) { _this.emitMessage(_constants.RTSocketEvents.MET_REQ, _this.invocations[invocationId].data); } }); (0, _defineProperty2["default"])(this, "onResponse", function (_ref2) { var id = _ref2.id, error = _ref2.error, result = _ref2.result; if (_this.invocations[id]) { var invocation = _this.invocations[id]; if (error) { invocation.reject(error); } else { invocation.resolve(result); } delete _this.invocations[id]; } }); //---------------------------------// //----------- AUTH METHODS --------// (0, _defineProperty2["default"])(this, "setUserToken", method(_constants.RTMethodTypes.SET_USER_TOKEN).bind(this)); //----------- AUTH METHODS --------// //---------------------------------// //---------------------------------// //-------- PUB_SUB METHODS --------// (0, _defineProperty2["default"])(this, "sendPubSubCommand", method(_constants.RTMethodTypes.PUB_SUB_COMMAND).bind(this)); //-------- PUB_SUB METHODS --------// //---------------------------------// //---------------------------------// //----------- RSO METHODS ---------// (0, _defineProperty2["default"])(this, "getRSO", method(_constants.RTMethodTypes.RSO_GET).bind(this)); (0, _defineProperty2["default"])(this, "setRSO", method(_constants.RTMethodTypes.RSO_SET).bind(this)); (0, _defineProperty2["default"])(this, "clearRSO", method(_constants.RTMethodTypes.RSO_CLEAR).bind(this)); (0, _defineProperty2["default"])(this, "sendRSOCommand", method(_constants.RTMethodTypes.RSO_COMMAND).bind(this)); (0, _defineProperty2["default"])(this, "invokeRSOMethod", method(_constants.RTMethodTypes.RSO_INVOKE).bind(this)); this.onMessage = onMessage; this.emitMessage = emitMessage; this.invocations = {}; } return (0, _createClass2["default"])(RTMethods, [{ key: "initialize", value: function initialize() { this.onMessage(_constants.RTSocketEvents.MET_RES, this.onResponse); } }, { key: "restore", value: function restore() { var _this2 = this; Object.keys(this.invocations).forEach(function (invocationId) { _this2.sendRequest(invocationId); }); } }, { key: "stop", value: function stop() {} }, { key: "reset", value: function reset() { this.invocations = {}; } }, { key: "hasActivity", value: function hasActivity() { return !!Object.keys(this.invocations).length; } }, { key: "send", value: function send(name, options) { var _this3 = this; var invocationId = _utils["default"].generateUID(); this.invocations[invocationId] = { data: { id: invocationId, name: name, options: options } }; this.sendRequest(invocationId); return new Promise(function (resolve, reject) { _this3.invocations[invocationId].resolve = resolve; _this3.invocations[invocationId].reject = reject; }); } //----------- RSO METHODS ---------// //---------------------------------// }]); }(); /***/ }), /***/ "./src/scope-connector.js": /*!********************************!*\ !*** ./src/scope-connector.js ***! \********************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js")); var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js")); var _get2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/get */ "./node_modules/@babel/runtime/helpers/get.js")); var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js")); var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js")); var _applyDecoratedDescriptor2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/applyDecoratedDescriptor */ "./node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js")); var _listeners = _interopRequireDefault(__webpack_require__(/*! ./listeners */ "./src/listeners.js")); var _dec, _dec2, _dec3, _dec4, _dec5, _class, _RTScopeConnector; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } var ListenerTypes = { CONNECT: 'CONNECT', ERROR: 'ERROR', COMMAND: 'COMMAND', USER_STATUS: 'USER_STATUS' }; var RTScopeConnector = exports["default"] = (_dec = connectionRequired(), _dec2 = connectionRequired(), _dec3 = connectionRequired(), _dec4 = connectionRequired(), _dec5 = connectionRequired(true), _class = (_RTScopeConnector = /*#__PURE__*/function (_RTListeners) { function RTScopeConnector(options) { var _this2; (0, _classCallCheck2["default"])(this, RTScopeConnector); _this2 = _callSuper(this, RTScopeConnector); _this2.options = options; _this2.waitConnection = []; _this2.connect(); return _this2; } /** * @public method * * connect to connection scope, if you already connected the method do nothing **/ (0, _inherits2["default"])(RTScopeConnector, _RTListeners); return (0, _createClass2["default"])(RTScopeConnector, [{ key: "connectSubscriber", get: /** * @abstract getter, must be overridden in an inherited class * must returns a function for adding subscriptions to CONNECT to connection scope * For ex.: RTProvider.subscriptions.connectToRSO **/ function get() { return null; } /** * @abstract getter, must be overridden in an inherited class * * must returns a function for adding subscriptions to listening COMMANDS in connection scope * For ex.: RTProvider.subscriptions.onRSOCommand **/ }, { key: "commandSubscriber", get: function get() { return null; } /** * @abstract getter, must be overridden in an inherited class * * must returns a function for adding subscriptions to listening changes of USER_STATUS in connection scope * For ex.: RTProvider.subscriptions.onRSOUserStatus **/ }, { key: "usersSubscriber", get: function get() { return null; } /** * @abstract getter, must be overridden in an inherited class * * must returns a function for sending COMMAND into connection scope * For ex.: RTProvider.methods.sendRSOCommand **/ }, { key: "commandSender", get: function get() { return null; } }, { key: "connect", value: function connect() { var _this3 = this; if (!this.isConnected()) { this.connection = this.connectSubscriber(this.getScopeOptions(), { onError: function onError(error) { return _this3.onError(error); }, onReady: function onReady() { return _this3.onConnect(); }, onStop: function onStop() { return _this3.onDisconnect(); } }); } } /** * @public method * * disconnect from connection scope, if you already disconnect the method do nothing **/ }, { key: "disconnect", value: function disconnect() { if (this.isConnected()) { this.connection.stop(); } } /** * @public method * * returns TRUE if you connected to connection scope otherwise returns FALSE **/ }, { key: "isConnected", value: function isConnected() { return !!this.connection && this.connection.isReady(); } /** * @private method **/ }, { key: "getSubscriptionOptions", value: function getSubscriptionOptions() { return this.getScopeOptions(); } /** * @private method **/ }, { key: "getScopeOptions", value: function getScopeOptions() { return this.options; } /** * @private method **/ }, { key: "onConnect", value: function onConnect() { this.waitConnection.forEach(function (operation) { return operation(); }); this.waitConnection = []; this.runSimpleListeners(ListenerTypes.CONNECT); } /** * @private method **/ }, { key: "onError", value: function onError(error) { this.runSimpleListeners(ListenerTypes.ERROR, error); } /** * @private method **/ }, { key: "onDisconnect", value: function onDisconnect() { this.connection = null; } /** * @public method **/ }, { key: "removeAllListeners", value: function removeAllListeners() { this.waitConnection = []; _superPropGet(RTScopeConnector, "removeAllListeners", this, 3)([]); return this; } /** * @public method **/ }, { key: "addConnectListener", value: function addConnectListener(callback, onError) { this.addSimpleListener(ListenerTypes.CONNECT, callback); if (onError) { this.addSimpleListener(ListenerTypes.ERROR, onError); } return this; } /** * @public method **/ }, { key: "removeConnectListeners", value: function removeConnectListeners(callback, onError) { this.removeSimpleListener(ListenerTypes.CONNECT, callback); if (onError) { this.removeSimpleListener(ListenerTypes.ERROR, onError); } return this; } /** * @public method **/ }, { key: "addCommandListener", value: function addCommandListener(callback, onError) { this.addSubscription(ListenerTypes.COMMAND, this.commandSubscriber, { callback: callback, onError: onError }); return this; } /** * @public method **/ }, { key: "removeCommandListeners", value: function removeCommandListeners(callback) { this.stopSubscription(ListenerTypes.COMMAND, { callback: callback }); return this; } /** * @public method **/ }, { key: "addUserStatusListener", value: function addUserStatusListener(callback, onError) { this.addSubscription(ListenerTypes.USER_STATUS, this.usersSubscriber, { callback: callback, onError: onError }); return this; } /** * @public method **/ }, { key: "removeUserStatusListeners", value: function removeUserStatusListeners(callback) { this.stopSubscription(ListenerTypes.USER_STATUS, { callback: callback }); return this; } /** * @public method **/ }, { key: "send", value: function send(type, data) { return this.commandSender(_objectSpread(_objectSpread({}, this.getScopeOptions()), {}, { type: type, data: data })); } }]); }(_listeners["default"]), (0, _defineProperty2["default"])(_RTScopeConnector, "connectionRequired", connectionRequired), _RTScopeConnector), (0, _applyDecoratedDescriptor2["default"])(_class.prototype, "addCommandListener", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, "addCommandListener"), _class.prototype), (0, _applyDecoratedDescriptor2["default"])(_class.prototype, "removeCommandListeners", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, "removeCommandListeners"), _class.prototype), (0, _applyDecoratedDescriptor2["default"])(_class.prototype, "addUserStatusListener", [_dec3], Object.getOwnPropertyDescriptor(_class.prototype, "addUserStatusListener"), _class.prototype), (0, _applyDecoratedDescriptor2["default"])(_class.prototype, "removeUserStatusListeners", [_dec4], Object.getOwnPropertyDescriptor(_class.prototype, "removeUserStatusListeners"), _class.prototype), (0, _applyDecoratedDescriptor2["default"])(_class.prototype, "send", [_dec5], Object.getOwnPropertyDescriptor(_class.prototype, "send"), _class.prototype), _class); function connectionRequired(returnPromise) { return function (target, key, descriptor) { var decorated = descriptor.value; descriptor.value = function () { var _arguments = arguments, _this = this; var run = function run() { return decorated.apply(_this, _arguments); }; if (this.isConnected()) { return run(); } if (returnPromise) { return new Promise(function (resolve, reject) { return _this.waitConnection.push(function () { return run().then(resolve, reject); }); }); } this.waitConnection.push(run); return this; }; return descriptor; }; } /***/ }), /***/ "./src/session.js": /*!************************!*\ !*** ./src/session.js ***! \************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js")); var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js")); var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js")); var _constants = __webpack_require__(/*! ./constants */ "./src/constants.js"); var _socket = _interopRequireDefault(__webpack_require__(/*! ./socket */ "./src/socket.js")); var INCREASE_RECONNECTION_TIMEOUT_STEP = 10; var INITIAL_RECONNECTION_TIMEOUT = 200; var MAX_RECONNECTION_TIMEOUT = 60 * 1000; // a minute var wait = function wait(milliseconds) { return new Promise(function (resolve) { return setTimeout(resolve, milliseconds); }); }; var RTSession = exports["default"] = /*#__PURE__*/function () { function RTSession(config, dispatch, onDisconnect) { (0, _classCallCheck2["default"])(this, RTSession); this.config = config; this.dispatch = dispatch; this.onDisconnect = onDisconnect; this.connectAttempt = 0; this.socketPromise = this.connect(); } return (0, _createClass2["default"])(RTSession, [{ key: "terminate", value: function terminate() { if (!this.terminated) { this.terminated = true; this.dispatch = function () { //if sessions has been terminated don't need to dispatch any events }; this.socketPromise.then(function (rtSocket) { if (rtSocket) { rtSocket.close(); } }); } } }, { key: "getSocket", value: function getSocket() { var _this = this; return this.socketPromise.then(function (rtSocket) { if (_this.terminated) { return new Promise(function () { //return unresolvable promise for preventing errors //this connection session has been terminated and a new one will be created if it necessary }); } return rtSocket; }); } }, { key: "getConnectionId", value: function () { var _getConnectionId = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { var _socket$ioSocket; var socket; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return this.getSocket(); case 2: socket = _context.sent; return _context.abrupt("return", (socket === null || socket === void 0 || (_socket$ioSocket = socket.ioSocket) === null || _socket$ioSocket === void 0 || (_socket$ioSocket = _socket$ioSocket.io) === null || _socket$ioSocket === void 0 || (_socket$ioSocket = _socket$ioSocket.engine) === null || _socket$ioSocket === void 0 ? void 0 : _socket$ioSocket.id) || null); case 4: case "end": return _context.stop(); } }, _callee, this); })); function getConnectionId() { return _getConnectionId.apply(this, arguments); } return getConnectionId; }() }, { key: "connect", value: function connect() { var _this2 = this; if (this.terminated) { return; } this.connectAttempt = this.connectAttempt + 1; var nextReconnectionTimeout = this.getNextReconnectionTimeout(); this.onConnecting(); if (this.connectAttempt > 1) { this.onReconnectAttempt(this.connectAttempt - 1, nextReconnectionTimeout); } return _socket["default"].connect(this.config, this.onSocketDisconnect.bind(this)).then(function (rtSocket) { _this2.connectAt