backendless-rt-client
Version:
Backendless RT Client for connect to Backendless RT Server
1,280 lines (1,213 loc) • 279 kB
JavaScript
/*!
* ********************************************************************************************************************
* * Backendless RT Client for JavaScript. Version: 1.0.2
* *
* * Copyright 2012-2026 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__ = ({
/***/ "./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 (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!this.session) {
_context.next = 2;
break;
}
_context.next = 1;
return this.session.getConnectionId();
case 1:
return _context.abrupt("return", _context.sent);
case 2:
return _context.abrupt("return", null);
case 3:
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 (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!(isUndefined(this.hostResolver) || !isFunction(this.hostResolver))) {
_context.next = 1;
break;
}
throw new Error('"hostResolver" must be a function');
case 1:
_context.next = 2;
return this.hostResolver();
case 2:
host = _context.sent;
if (!(!host || typeof host !== 'string')) {
_context.next = 3;
break;
}
throw new Error('"hostResolver" must return a valid string');
case 3:
return _context.abrupt("return", host);
case 4:
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, _t;
return _regenerator["default"].wrap(function (_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
query = this.getConnectQuery();
_context2.next = 1;
return this.getHost();
case 1:
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 = 4;
break;
}
_context2.next = 2;
return this.socketConfigTransform(this.socketConfig);
case 2:
_t = _context2.sent;
if (_t) {
_context2.next = 3;
break;
}
_t = this.socketConfig;
case 3:
this.socketConfig = _t;
case 4:
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 _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"].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 (_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 1;
return this.getSocket();
case 1:
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 2:
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.connectAttempt = 0;
_this2.onConnect();
return rtSocket;
})["catch"](function (error) {
_this2.onConnectError(error);
if (!_this2.terminated) {
// wait for 400|800|1600|...|MAX_RECONNECTION_TIMEOUT milliseconds
return wait(nextReconnectionTimeout).then(function () {
return _this2.connect();
});
}
});
}
}, {
key: "getNextReconnectionTimeout",
value: function getNextReconnectionTimeout() {
var factor = Math.ceil(this.connectAttempt / INCREASE_RECONNECTION_TIMEOUT_STEP);
var timeout = INITIAL_RECONNECTION_TIMEOUT * Math.pow(2, factor);
return Math.min(timeout, MAX_RECONNECTION_TIMEOUT);
}
}, {
key: "onSocketDisconnect",
value: function onSocketDisconnect(reason) {
this.dispatch(_constants.NativeSocketEvents.DISCONNECT, reason);
if (!this.terminated) {
this.terminate();
this.onDisconnect();
}
}
}, {
key: "onConnecting",
value: function onConnecting() {
this.dispatch(_constants.NativeSocketEvents.CONNECTING);
}
}, {
key: "onConnect",
value: function onConnect() {
this.dispatch(_constants.NativeSocketEvents.CONNECT);
}
}, {
key: "onConnectError",
value: function onConnectError(error) {
this.dispatch(_constants.NativeSocketEvents.CONNECT_ERROR, error && error.message || error);
}
}, {
key: "onReconnectAttempt",
value: function onReconnectAttempt(attempt, timeout) {
this.dispatch(_constants.NativeSocketEvents.RECONNECT_ATTEMPT, attempt, timeout);
}
}]);
}();
/***/ },
/***/ "./src/socket.js"
/*!***********************!*\
!*** ./src/socket.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/