} Resolves with the most recent item state, the output of a successful
* mutation or a state that prompted graceful cancellation (mutator returned null
).
* @public
* @example
* var mutatorFunction = function(currentValue) {
* currentValue.viewCount = (currentValue.viewCount || 0) + 1;
* return currentValue;
* };
* map.mutate('myKey', mutatorFunction, { ttl: 86400 })
* .then(function(item) {
* console.log('Map Item mutate() successful, new value:', item.value)
* })
* .catch(function(error) {
* console.error('Map Item mutate() failed', error);
* });
*/
}, {
key: "mutate",
value: function () {
var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(key, mutator, itemMetadataUpdates) {
return _regenerator2.default.wrap(function _callee17$(_context17) {
while (1) {
switch (_context17.prev = _context17.next) {
case 0:
this.ensureNotClosed();
return _context17.abrupt("return", this.syncMapImpl.mutate(key, mutator, itemMetadataUpdates));
case 2:
case "end":
return _context17.stop();
}
}
}, _callee17, this);
}));
function mutate(_x32, _x33, _x34) {
return _ref17.apply(this, arguments);
}
return mutate;
}()
/**
* Modify a map item by appending new fields (or by overwriting existing ones) with the values from
* the provided Object. Creates a new item if no item by this key exists, copying all given fields and values
* into it.
* This is equivalent to
*
* map.mutate('myKey', function(currentValue) {
* return Object.assign(currentValue, obj));
* });
*
* @param {String} key Selects the map item to update.
* @param {Object} obj Specifies the particular (top-level) attributes that will receive new values.
* @param {Map#ItemMetadata} [itemMetadataUpdates] New item metadata.
* @returns {Promise} A promise resolving to the modified item in its new state.
* @public
* @example
* // Say, the Map Item (key: 'myKey') value is { name: 'John Smith' }
* map.update('myKey', { age: 34 }, { ttl: 86400 })
* .then(function(item) {
* // Now the Map Item value is { name: 'John Smith', age: 34 }
* console.log('Map Item update() successful, new value:', item.value);
* })
* .catch(function(error) {
* console.error('Map Item update() failed', error);
* });
*/
}, {
key: "update",
value: function () {
var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(key, obj, itemMetadataUpdates) {
return _regenerator2.default.wrap(function _callee18$(_context18) {
while (1) {
switch (_context18.prev = _context18.next) {
case 0:
this.ensureNotClosed();
return _context18.abrupt("return", this.syncMapImpl.update(key, obj, itemMetadataUpdates));
case 2:
case "end":
return _context18.stop();
}
}
}, _callee18, this);
}));
function update(_x35, _x36, _x37) {
return _ref18.apply(this, arguments);
}
return update;
}()
/**
* Delete an item, given its key.
* @param {String} key Selects the item to delete.
* @returns {Promise} A promise to remove an item.
* The promise will be rejected if 'key' is undefined or an item was not found.
* @public
* @example
* map.remove('myKey')
* .then(function() {
* console.log('Map Item remove() successful');
* })
* .catch(function(error) {
* console.error('Map Item remove() failed', error);
* });
*/
}, {
key: "remove",
value: function () {
var _ref19 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee19(key) {
return _regenerator2.default.wrap(function _callee19$(_context19) {
while (1) {
switch (_context19.prev = _context19.next) {
case 0:
this.ensureNotClosed();
return _context19.abrupt("return", this.syncMapImpl.remove(key));
case 2:
case "end":
return _context19.stop();
}
}
}, _callee19, this);
}));
function remove(_x38) {
return _ref19.apply(this, arguments);
}
return remove;
}()
/**
* Get a complete list of items from the map.
* @param {Object} [args] Arguments for query.
* @param {String} [args.from] Item key, which should be used as the offset. If undefined, starts from the beginning or end depending on args.order.
* @param {Number} [args.pageSize=50] Result page size.
* @param {'asc'|'desc'} [args.order='asc'] Lexicographical order of results.
* @return {Promise>}
* @public
* @example
* var pageHandler = function(paginator) {
* paginator.items.forEach(function(item) {
* console.log('Item ' + item.key + ': ', item.value);
* });
* return paginator.hasNextPage ? paginator.nextPage().then(pageHandler)
* : null;
* };
* map.getItems({ from: 'myKey', order: 'asc' })
* .then(pageHandler)
* .catch(function(error) {
* console.error('Map getItems() failed', error);
* });
*/
}, {
key: "getItems",
value: function () {
var _ref20 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee20(args) {
return _regenerator2.default.wrap(function _callee20$(_context20) {
while (1) {
switch (_context20.prev = _context20.next) {
case 0:
this.ensureNotClosed();
return _context20.abrupt("return", this.syncMapImpl.getItems(args));
case 2:
case "end":
return _context20.stop();
}
}
}, _callee20, this);
}));
function getItems(_x39) {
return _ref20.apply(this, arguments);
}
return getItems;
}()
/**
* Update the time-to-live of the map.
* @param {Number} ttl Specifies the TTL in seconds after which the map is subject to automatic deletion. The value 0 means infinity.
* @return {Promise} A promise that resolves after the TTL update was successful.
* @public
* @example
* map.setTtl(3600)
* .then(function() {
* console.log('Map setTtl() successful');
* })
* .catch(function(error) {
* console.error('Map setTtl() failed', error);
* });
*/
}, {
key: "setTtl",
value: function () {
var _ref21 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee21(ttl) {
return _regenerator2.default.wrap(function _callee21$(_context21) {
while (1) {
switch (_context21.prev = _context21.next) {
case 0:
this.ensureNotClosed();
return _context21.abrupt("return", this.syncMapImpl.setTtl(ttl));
case 2:
case "end":
return _context21.stop();
}
}
}, _callee21, this);
}));
function setTtl(_x40) {
return _ref21.apply(this, arguments);
}
return setTtl;
}()
/**
* Update the time-to-live of a map item.
* @param {Number} key Item key.
* @param {Number} ttl Specifies the TTL in seconds after which the map item is subject to automatic deletion. The value 0 means infinity.
* @return {Promise} A promise that resolves after the TTL update was successful.
* @public
* @example
* map.setItemTtl('myKey', 86400)
* .then(function() {
* console.log('Map setItemTtl() successful');
* })
* .catch(function(error) {
* console.error('Map setItemTtl() failed', error);
* });
*/
}, {
key: "setItemTtl",
value: function () {
var _ref22 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee22(key, ttl) {
return _regenerator2.default.wrap(function _callee22$(_context22) {
while (1) {
switch (_context22.prev = _context22.next) {
case 0:
this.ensureNotClosed();
return _context22.abrupt("return", this.syncMapImpl.setItemTtl(key, ttl));
case 2:
case "end":
return _context22.stop();
}
}
}, _callee22, this);
}));
function setItemTtl(_x41, _x42) {
return _ref22.apply(this, arguments);
}
return setItemTtl;
}()
/**
* Delete this map. It will be impossible to restore it.
* @return {Promise} A promise that resolves when the map has been deleted.
* @public
* @example
* map.removeMap()
* .then(function() {
* console.log('Map removeMap() successful');
* })
* .catch(function(error) {
* console.error('Map removeMap() failed', error);
* });
*/
}, {
key: "removeMap",
value: function () {
var _ref23 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee23() {
return _regenerator2.default.wrap(function _callee23$(_context23) {
while (1) {
switch (_context23.prev = _context23.next) {
case 0:
this.ensureNotClosed();
_context23.next = 3;
return this.syncMapImpl.removeMap();
case 3:
case "end":
return _context23.stop();
}
}
}, _callee23, this);
}));
function removeMap() {
return _ref23.apply(this, arguments);
}
return removeMap;
}()
/**
* Conclude work with the map instance and remove all event listeners attached to it.
* Any subsequent operation on this object will be rejected with error.
* Other local copies of this map will continue operating and receiving events normally.
* @public
* @example
* map.close();
*/
}, {
key: "close",
value: function close() {
(0, _get3.default)(SyncMap.prototype.__proto__ || (0, _getPrototypeOf2.default)(SyncMap.prototype), "close", this).call(this);
this.syncMapImpl.detach(this.listenerUuid);
}
}, {
key: "uri",
get: function get() {
return this.syncMapImpl.uri;
}
}, {
key: "links",
get: function get() {
return this.syncMapImpl.links;
}
}, {
key: "revision",
get: function get() {
return this.syncMapImpl.revision;
}
}, {
key: "lastEventId",
get: function get() {
return this.syncMapImpl.lastEventId;
}
}, {
key: "dateExpires",
get: function get() {
return this.syncMapImpl.dateExpires;
}
}, {
key: "type",
get: function get() {
return SyncMapImpl.type;
}
// public props, documented along with class description
}, {
key: "sid",
get: function get() {
return this.syncMapImpl.sid;
}
}, {
key: "uniqueName",
get: function get() {
return this.syncMapImpl.uniqueName;
}
}, {
key: "dateUpdated",
get: function get() {
return this.syncMapImpl.dateUpdated;
}
}], [{
key: "type",
get: function get() {
return SyncMapImpl.type;
}
}]);
return SyncMap;
}(closeable_1.Closeable);
exports.SyncMap = SyncMap;
exports.default = SyncMap;
/**
* Contains Map Item metadata.
* @typedef {Object} Map#ItemMetadata
* @property {Number} [ttl] Specifies the time-to-live in seconds after which the map item is subject to automatic deletion.
* The value 0 means infinity.
*/
/**
* Applies a transformation to the item value. May be called multiple times on the
* same datum in case of collisions with remote code.
* @callback Map~Mutator
* @param {Object} currentValue The current value of the item in the cloud.
* @return {Object} The desired new value for the item or null
to gracefully cancel the mutation.
*/
/**
* Fired when a new item appears in the map, whether its creator was local or remote.
* @event Map#itemAdded
* @param {Object} args Arguments provided with the event.
* @param {MapItem} args.item Added item.
* @param {Boolean} args.isLocal Equals 'true' if item was added by local actor, 'false' otherwise.
* @example
* map.on('itemAdded', function(args) {
* console.log('Map item ' + args.item.key + ' was added');
* console.log('args.item.value:', args.item.value);
* console.log('args.isLocal:', args.isLocal);
* });
*/
/**
* Fired when a map item is updated (not added or removed, but changed), whether the updater was local or remote.
* @event Map#itemUpdated
* @param {Object} args Arguments provided with the event.
* @param {MapItem} args.item Updated item.
* @param {Boolean} args.isLocal Equals 'true' if item was updated by local actor, 'false' otherwise.
* @example
* map.on('itemUpdated', function(args) {
* console.log('Map item ' + args.item.key + ' was updated');
* console.log('args.item.value:', args.item.value);
* console.log('args.isLocal:', args.isLocal);
* });
*/
/**
* Fired when a map item is removed, whether the remover was local or remote.
* @event Map#itemRemoved
* @param {Object} args Arguments provided with the event.
* @param {String} args.key The key of the removed item.
* @param {Boolean} args.isLocal Equals 'true' if item was removed by local actor, 'false' otherwise.
* @param {Object} args.value In case item was removed by a remote actor, contains a snapshot of item data before removal.
* @example
* map.on('itemRemoved', function(args) {
* console.log('Map item ' + args.key + ' was removed');
* console.log('args.value:', args.value);
* console.log('args.isLocal:', args.isLocal);
* });
*/
/**
* Fired when a map is deleted entirely, by any actor local or remote.
* @event Map#removed
* @param {Object} args Arguments provided with the event.
* @param {Boolean} args.isLocal Equals 'true' if map was removed by local actor, 'false' otherwise.
* @example
* map.on('removed', function(args) {
* console.log('Map ' + map.sid + ' was removed');
* console.log('args.isLocal:', args.isLocal);
* });
*/
},{"./cache":233,"./closeable":236,"./entity":239,"./mapitem":243,"./mergingqueue":244,"./paginator":245,"./utils/logger":254,"./utils/sanitize":255,"./utils/syncerror":256,"./utils/uri":258,"babel-runtime/core-js/object/assign":35,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/get":51,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"babel-runtime/regenerator":57}],254:[function(_dereq_,module,exports){
"use strict";
var _from = _dereq_("babel-runtime/core-js/array/from");
var _from2 = _interopRequireDefault(_from);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
var loglevelLog = _dereq_("loglevel");
var log = loglevelLog.getLogger('twilio-sync'); // twilio-sync is used by Flex SDK. Please DO NOT change
function prepareLine(prefix, args) {
return [new Date().toISOString() + " Sync " + prefix + ":"].concat((0, _from2.default)(args));
}
exports.default = {
setLevel: function setLevel(level) {
log.setLevel(level);
},
trace: function trace() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
log.trace.apply(null, prepareLine('T', args));
},
debug: function debug() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
log.debug.apply(null, prepareLine('D', args));
},
info: function info() {
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
log.info.apply(null, prepareLine('I', args));
},
warn: function warn() {
for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
args[_key4] = arguments[_key4];
}
log.warn.apply(null, prepareLine('W', args));
},
error: function error() {
for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
args[_key5] = arguments[_key5];
}
log.error.apply(null, prepareLine('E', args));
}
};
},{"babel-runtime/core-js/array/from":29,"loglevel":203}],255:[function(_dereq_,module,exports){
"use strict";
var _typeof2 = _dereq_("babel-runtime/helpers/typeof");
var _typeof3 = _interopRequireDefault(_typeof2);
var _stringify = _dereq_("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateId = exports.validatePageSize = exports.validateMandatoryTtl = exports.validateOptionalTtl = exports.deepClone = void 0;
var syncerror_1 = _dereq_("./syncerror");
/**
* Deep-clone an object. Note that this does not work on object containing
* functions.
* @param {object} obj - the object to deep-clone
* @returns {object}
*/
function deepClone(obj) {
return JSON.parse((0, _stringify2.default)(obj));
}
exports.deepClone = deepClone;
function validateTtl(ttl, optional) {
if (optional && ttl === undefined) {
return;
}
var ttlType = typeof ttl === "undefined" ? "undefined" : (0, _typeof3.default)(ttl);
if (ttlType !== 'number' || !isNonNegativeInteger(ttl)) {
var providedValue = ttlType === 'object' ? 'object' : "'" + ttl + "' of type '" + ttlType + "'";
throw new syncerror_1.default("Invalid TTL, expected a positive integer of type number, was " + providedValue, 400, 54011);
}
}
function validateId(id) {
if (id === undefined) {
return;
}
var idType = typeof id === "undefined" ? "undefined" : (0, _typeof3.default)(id);
if (idType !== 'string') {
throw new Error("Invalid ID type, expected a string, got '" + idType + "'");
}
}
exports.validateId = validateId;
function validateOptionalTtl(ttl) {
validateTtl(ttl, true);
}
exports.validateOptionalTtl = validateOptionalTtl;
function validateMandatoryTtl(ttl) {
validateTtl(ttl, false);
}
exports.validateMandatoryTtl = validateMandatoryTtl;
function validatePageSize(pageSize) {
var validPageSize = pageSize === undefined || isPositiveInteger(pageSize);
if (!validPageSize) {
throw new syncerror_1.default("Invalid pageSize parameter. Expected a positive integer, was '" + pageSize + "'.", 400, 54455);
}
}
exports.validatePageSize = validatePageSize;
function isInteger(number) {
return !isNaN(parseInt(number)) && isFinite(number);
}
function isPositiveInteger(number) {
return isInteger(number) && number > 0;
}
function isNonNegativeInteger(number) {
return isInteger(number) && number >= 0;
}
},{"./syncerror":256,"babel-runtime/core-js/json/stringify":32,"babel-runtime/helpers/typeof":56}],256:[function(_dereq_,module,exports){
"use strict";
var _create = _dereq_("babel-runtime/core-js/object/create");
var _create2 = _interopRequireDefault(_create);
var _setPrototypeOf = _dereq_("babel-runtime/core-js/object/set-prototype-of");
var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
var _from = _dereq_("babel-runtime/core-js/array/from");
var _from2 = _interopRequireDefault(_from);
var _construct = _dereq_("babel-runtime/core-js/reflect/construct");
var _construct2 = _interopRequireDefault(_construct);
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extendableBuiltin(cls) {
function ExtendableBuiltin() {
var instance = (0, _construct2.default)(cls, (0, _from2.default)(arguments));
(0, _setPrototypeOf2.default)(instance, (0, _getPrototypeOf2.default)(this));
return instance;
}
ExtendableBuiltin.prototype = (0, _create2.default)(cls.prototype, {
constructor: {
value: cls,
enumerable: false,
writable: true,
configurable: true
}
});
if (_setPrototypeOf2.default) {
(0, _setPrototypeOf2.default)(ExtendableBuiltin, cls);
} else {
ExtendableBuiltin.__proto__ = cls;
}
return ExtendableBuiltin;
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.SyncNetworkError = exports.SyncError = void 0;
/**
* Generic SyncLibrary error class
*/
var SyncError = function (_extendableBuiltin2) {
(0, _inherits3.default)(SyncError, _extendableBuiltin2);
function SyncError(message) {
var status = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var code = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
(0, _classCallCheck3.default)(this, SyncError);
var _this = (0, _possibleConstructorReturn3.default)(this, (SyncError.__proto__ || (0, _getPrototypeOf2.default)(SyncError)).call(this));
_this.name = _this.constructor.name;
_this.message = message + " (status: " + status + ", code: " + code + ")";
_this.status = status;
_this.code = code;
return _this;
}
return SyncError;
}(_extendableBuiltin(Error));
exports.SyncError = SyncError;
var SyncNetworkError = function (_SyncError) {
(0, _inherits3.default)(SyncNetworkError, _SyncError);
function SyncNetworkError(message) {
var status = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var code = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var body = arguments[3];
(0, _classCallCheck3.default)(this, SyncNetworkError);
var _this2 = (0, _possibleConstructorReturn3.default)(this, (SyncNetworkError.__proto__ || (0, _getPrototypeOf2.default)(SyncNetworkError)).call(this, message, status, code));
_this2.body = body;
return _this2;
}
return SyncNetworkError;
}(SyncError);
exports.SyncNetworkError = SyncNetworkError;
exports.default = SyncError;
},{"babel-runtime/core-js/array/from":29,"babel-runtime/core-js/object/create":36,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/core-js/object/set-prototype-of":41,"babel-runtime/core-js/reflect/construct":43,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],257:[function(_dereq_,module,exports){
"use strict";
var _regenerator = _dereq_("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = _dereq_("babel-runtime/core-js/get-iterator");
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _iterator2 = _dereq_("babel-runtime/core-js/symbol/iterator");
var _iterator3 = _interopRequireDefault(_iterator2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TreeMap = void 0;
var Node = function () {
function Node(key, value) {
(0, _classCallCheck3.default)(this, Node);
this.balanceFactor = 0;
this.key = key;
this.value = value;
this.parent = null;
this.left = null;
this.right = null;
}
(0, _createClass3.default)(Node, [{
key: "update",
value: function update(value) {
this.value = value;
}
}, {
key: "replace",
value: function replace(target, replacement) {
if (!target) {
return;
}
if (this.left === replacement) {
this.left = replacement;
} else if (this.right === replacement) {
this.right = replacement;
}
}
}, {
key: "isRoot",
get: function get() {
return this.parent === null;
}
}, {
key: "isLeaf",
get: function get() {
return this.left === null && this.right === null;
}
}, {
key: "isLeftChild",
get: function get() {
return this.parent.left === this;
}
}]);
return Node;
}();
/**
* @property length
*/
var TreeMap = function () {
function TreeMap(less, equal) {
(0, _classCallCheck3.default)(this, TreeMap);
this.isLessThan = less || function (x, y) {
return x < y;
};
this.isEqual = equal || function (x, y) {
return x === y;
};
this.root = null;
this.count = null;
}
(0, _createClass3.default)(TreeMap, [{
key: "clear",
value: function clear() {
this.root = null;
this.count = 0;
}
}, {
key: "set",
value: function set(key, value) {
var node = this.getNode(key);
if (node) {
node.update(value);
} else {
this.insert(key, value);
}
// return node;
}
}, {
key: "insert",
value: function insert(key, value) {
var node = new Node(key, value);
this.count++;
if (!this.root) {
this.root = node;
// return node;
return;
}
var currNode = this.root;
for (;;) {
if (this.isLessThan(key, currNode.key)) {
if (currNode.left) {
currNode = currNode.left;
} else {
currNode.left = node;
break;
}
} else {
if (currNode.right) {
// eslint-disable-line no-lonely-if
currNode = currNode.right;
} else {
currNode.right = node;
break;
}
}
}
node.parent = currNode;
currNode = node;
while (currNode.parent) {
var parent = currNode.parent;
var prevBalanceFactor = parent.balanceFactor;
if (currNode.isLeftChild) {
parent.balanceFactor++;
} else {
parent.balanceFactor--;
}
if (Math.abs(parent.balanceFactor) < Math.abs(prevBalanceFactor)) {
break;
}
if (parent.balanceFactor < -1 || parent.balanceFactor > 1) {
this.rebalance(parent);
break;
}
currNode = parent;
}
// return node;
}
}, {
key: "get",
value: function get(key) {
var currentNode = this.root;
while (currentNode) {
if (this.isEqual(key, currentNode.key)) {
return currentNode.value;
}
if (this.isLessThan(key, currentNode.key)) {
currentNode = currentNode.left;
} else {
currentNode = currentNode.right;
}
}
return null;
}
}, {
key: "delete",
value: function _delete(key) {
// update this algorithm and remove any
var node = this.getNode(key);
if (!node || node.key !== key) {
return null;
}
var parent = node.parent;
var left = node.left;
var right = node.right;
if (!!left !== !!right) {
// one child
var child = left || right;
if (!parent && !child) {
this.root = null;
} else if (parent && !child) {
this.root = child;
} else {
parent.replace(node, null);
this.rebalance(parent);
}
} else {
// two children
var maxLeft = node.left;
while (maxLeft.right) {
maxLeft = maxLeft.right;
}
if (node.left === maxLeft) {
if (node.isRoot) {
this.root = maxLeft;
maxLeft.parent = null;
} else {
if (node.isLeftChild) {
node.parent.left = maxLeft;
} else {
node.parent.right = maxLeft;
}
maxLeft.parent = node.parent;
}
maxLeft.right = node.right;
maxLeft.right.parent = maxLeft;
maxLeft.balanceFactor = node.balanceFactor;
node = {
parent: maxLeft, isLeftChild: true
};
} else {
var mlParent = maxLeft.parent;
var mlLeft = maxLeft.left;
mlParent.right = mlLeft;
if (mlLeft) {
mlLeft.parent = mlParent;
}
if (node.isRoot) {
this.root = maxLeft;
maxLeft.parent = null;
} else {
if (node.isLeftChild) {
node.parent.left = maxLeft;
} else {
node.parent.right = maxLeft;
}
maxLeft.parent = node.parent;
}
maxLeft.right = node.right;
maxLeft.right.parent = maxLeft;
maxLeft.left = node.left;
maxLeft.left.parent = maxLeft;
maxLeft.balanceFactor = node.balanceFactor;
node = {
parent: mlParent, isLeftChild: false
};
}
}
this.count--;
while (node.parent) {
var _parent = node.parent;
var prevBalanceFactor = _parent.balanceFactor;
if (node.isLeftChild) {
_parent.balanceFactor -= 1;
} else {
_parent.balanceFactor += 1;
}
if (Math.abs(_parent.balanceFactor) > Math.abs(prevBalanceFactor)) {
if (_parent.balanceFactor < -1 || _parent.balanceFactor > 1) {
this.rebalance(_parent);
if (_parent.parent.balanceFactor === 0) {
node = _parent.parent;
} else {
break;
}
} else {
break;
}
} else {
node = _parent;
}
}
return null;
}
}, {
key: "getNode",
value: function getNode(key) {
var currentNode = this.root;
while (currentNode) {
if (this.isEqual(key, currentNode.key)) {
return currentNode;
}
if (this.isLessThan(key, currentNode.key)) {
currentNode = currentNode.left;
} else {
currentNode = currentNode.right;
}
}
return null;
}
}, {
key: "rebalance",
value: function rebalance(node) {
if (node.balanceFactor < 0) {
if (node.right.balanceFactor > 0) {
this.rotateRight(node.right);
this.rotateLeft(node);
} else {
this.rotateLeft(node);
}
} else if (node.balanceFactor > 0) {
if (node.left.balanceFactor < 0) {
this.rotateLeft(node.left);
this.rotateRight(node);
} else {
this.rotateRight(node);
}
}
}
}, {
key: "rotateLeft",
value: function rotateLeft(pivot) {
var root = pivot.right;
pivot.right = root.left;
if (root.left !== null) {
root.left.parent = pivot;
}
root.parent = pivot.parent;
if (root.parent === null) {
this.root = root;
} else if (pivot.isLeftChild) {
root.parent.left = root;
} else {
root.parent.right = root;
}
root.left = pivot;
pivot.parent = root;
pivot.balanceFactor = pivot.balanceFactor + 1 - Math.min(root.balanceFactor, 0);
root.balanceFactor = root.balanceFactor + 1 - Math.max(pivot.balanceFactor, 0);
}
}, {
key: "rotateRight",
value: function rotateRight(pivot) {
var root = pivot.left;
pivot.left = root.right;
if (root.right !== null) {
root.right.parent = pivot;
}
root.parent = pivot.parent;
if (root.parent === null) {
this.root = root;
} else if (pivot.isLeftChild) {
root.parent.left = root;
} else {
root.parent.right = root;
}
root.right = pivot;
pivot.parent = root;
pivot.balanceFactor = pivot.balanceFactor - 1 - Math.min(root.balanceFactor, 0);
root.balanceFactor = root.balanceFactor - 1 - Math.max(pivot.balanceFactor, 0);
}
}, {
key: _iterator3.default,
value: /*#__PURE__*/_regenerator2.default.mark(function value() {
var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, iter;
return _regenerator2.default.wrap(function value$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context.prev = 3;
_iterator = (0, _getIterator3.default)(this.getIterator());
case 5:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context.next = 12;
break;
}
iter = _step.value;
_context.next = 9;
return iter;
case 9:
_iteratorNormalCompletion = true;
_context.next = 5;
break;
case 12:
_context.next = 18;
break;
case 14:
_context.prev = 14;
_context.t0 = _context["catch"](3);
_didIteratorError = true;
_iteratorError = _context.t0;
case 18:
_context.prev = 18;
_context.prev = 19;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 21:
_context.prev = 21;
if (!_didIteratorError) {
_context.next = 24;
break;
}
throw _iteratorError;
case 24:
return _context.finish(21);
case 25:
return _context.finish(18);
case 26:
case "end":
return _context.stop();
}
}
}, value, this, [[3, 14, 18, 26], [19,, 21, 25]]);
})
}, {
key: "getIterator",
value: /*#__PURE__*/_regenerator2.default.mark(function getIterator() {
var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var currentNode, fromleft;
return _regenerator2.default.wrap(function getIterator$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
currentNode = this.root;
case 1:
if (!currentNode) {
_context2.next = 7;
break;
}
if (!(this.isEqual(key, currentNode.key) || key === null && !currentNode.left)) {
_context2.next = 4;
break;
}
return _context2.abrupt("break", 7);
case 4:
if (this.isLessThan(key, currentNode.key) || key === null) {
currentNode = currentNode.left;
} else {
currentNode = currentNode.right;
}
_context2.next = 1;
break;
case 7:
if (currentNode) {
_context2.next = 9;
break;
}
return _context2.abrupt("return", null);
case 9:
fromleft = true;
case 10:
if (!fromleft) {
_context2.next = 28;
break;
}
_context2.next = 13;
return [currentNode.key, currentNode.value];
case 13:
fromleft = false;
if (!currentNode.right) {
_context2.next = 20;
break;
}
currentNode = currentNode.right;
while (currentNode.left) {
currentNode = currentNode.left;
}
fromleft = true;
_context2.next = 26;
break;
case 20:
if (!currentNode.parent) {
_context2.next = 25;
break;
}
fromleft = currentNode.parent.left === currentNode;
currentNode = currentNode.parent;
_context2.next = 26;
break;
case 25:
return _context2.abrupt("break", 36);
case 26:
_context2.next = 34;
break;
case 28:
if (!currentNode.parent) {
_context2.next = 33;
break;
}
fromleft = currentNode.parent.left === currentNode;
currentNode = currentNode.parent;
_context2.next = 34;
break;
case 33:
return _context2.abrupt("break", 36);
case 34:
_context2.next = 10;
break;
case 36:
return _context2.abrupt("return", null);
case 37:
case "end":
return _context2.stop();
}
}
}, getIterator, this);
})
}, {
key: "getReverseIterator",
value: /*#__PURE__*/_regenerator2.default.mark(function getReverseIterator() {
var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var currentNode, fromright;
return _regenerator2.default.wrap(function getReverseIterator$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
currentNode = this.root;
case 1:
if (!currentNode) {
_context3.next = 7;
break;
}
if (!(this.isEqual(key, currentNode.key) || key === null && !currentNode.right)) {
_context3.next = 4;
break;
}
return _context3.abrupt("break", 7);
case 4:
if (!this.isLessThan(key, currentNode.key) || key === null) {
currentNode = currentNode.right;
} else {
currentNode = currentNode.left;
}
_context3.next = 1;
break;
case 7:
if (currentNode) {
_context3.next = 9;
break;
}
return _context3.abrupt("return", null);
case 9:
fromright = true;
case 10:
if (!fromright) {
_context3.next = 28;
break;
}
_context3.next = 13;
return [currentNode.key, currentNode.value];
case 13:
fromright = false;
if (!currentNode.left) {
_context3.next = 20;
break;
}
currentNode = currentNode.left;
while (currentNode.right) {
currentNode = currentNode.right;
}
fromright = true;
_context3.next = 26;
break;
case 20:
if (!currentNode.parent) {
_context3.next = 25;
break;
}
fromright = currentNode.parent.right === currentNode;
currentNode = currentNode.parent;
_context3.next = 26;
break;
case 25:
return _context3.abrupt("break", 36);
case 26:
_context3.next = 34;
break;
case 28:
if (!currentNode.parent) {
_context3.next = 33;
break;
}
fromright = currentNode.parent.right === currentNode;
currentNode = currentNode.parent;
_context3.next = 34;
break;
case 33:
return _context3.abrupt("break", 36);
case 34:
_context3.next = 10;
break;
case 36:
return _context3.abrupt("return", null);
case 37:
case "end":
return _context3.stop();
}
}
}, getReverseIterator, this);
})
}, {
key: "size",
get: function get() {
return this.count;
}
}]);
return TreeMap;
}();
exports.TreeMap = TreeMap;
},{"babel-runtime/core-js/get-iterator":30,"babel-runtime/core-js/symbol/iterator":47,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/regenerator":57}],258:[function(_dereq_,module,exports){
"use strict";
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.UriBuilder = void 0;
/**
* Construct URI with query parameters
*/
var UriBuilder = function () {
function UriBuilder(base) {
(0, _classCallCheck3.default)(this, UriBuilder);
this.base = base;
this.args = new Array();
this.paths = new Array();
}
(0, _createClass3.default)(UriBuilder, [{
key: "pathSegment",
value: function pathSegment(name) {
this.paths.push(encodeURIComponent(name));
return this;
}
}, {
key: "queryParam",
value: function queryParam(name, value) {
if (typeof value !== 'undefined') {
this.args.push(encodeURIComponent(name) + '=' + encodeURIComponent(value));
}
return this;
}
}, {
key: "build",
value: function build() {
var result = this.base;
if (this.paths.length) {
result += '/' + this.paths.join('/');
}
if (this.args.length) {
result += '?' + this.args.join('&');
}
return result;
}
}]);
return UriBuilder;
}();
exports.UriBuilder = UriBuilder;
},{"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],259:[function(_dereq_,module,exports){
module.exports={
"_from": "twilio-sync@^0.12.4",
"_id": "twilio-sync@0.12.4",
"_inBundle": false,
"_integrity": "sha512-9kJFRXIE0kAykB6Gerxf2+hMSIrTFPenlWDo05WYU1zjz0npg62zrmrq1s/7Zff1IKe1M24b6tmU0j9h/0uvdg==",
"_location": "/twilio-sync",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "twilio-sync@^0.12.4",
"name": "twilio-sync",
"escapedName": "twilio-sync",
"rawSpec": "^0.12.4",
"saveSpec": null,
"fetchSpec": "^0.12.4"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/twilio-sync/-/twilio-sync-0.12.4.tgz",
"_shasum": "a278d5da65cd0e63f4964f3687b5ed2712a10e02",
"_spec": "twilio-sync@^0.12.4",
"_where": "/home/travis/build/twilio/twilio-conversations.js",
"author": {
"name": "Twilio"
},
"browserify": {
"transform": [
"babelify"
]
},
"bundleDependencies": false,
"dependencies": {
"loglevel": "^1.6.3",
"operation-retrier": "^3.0.0",
"platform": "^1.3.5",
"twilio-notifications": "^0.5.11",
"twilsock": "^0.5.14",
"uuid": "^3.3.2"
},
"deprecated": false,
"description": "Twilio Sync client library",
"devDependencies": {
"@types/chai": "^4.1.7",
"@types/chai-as-promised": "7.1.0",
"@types/chai-string": "^1.4.1",
"@types/mocha": "^5.2.7",
"@types/node": "^12.0.4",
"@types/sinon": "^7.0.12",
"@types/sinon-chai": "^3.2.2",
"async-test-tools": "^1.0.7",
"babel-core": "^6.26.0",
"babel-plugin-transform-builtin-extend": "^1.1.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.6.1",
"babel-runtime": "^6.26.0",
"babelify": "^8.0.0",
"browserify": "^16.2.3",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"chai-string": "^1.5.0",
"cheerio": "^1.0.0-rc.2",
"cross-env": "^5.2.0",
"del": "^4.1.1",
"fancy-log": "^1.3.3",
"fs": "0.0.2",
"gulp": "^4.0.2",
"gulp-babel": "^7.0.1",
"gulp-derequire": "^2.1.0",
"gulp-if": "^2.0.2",
"gulp-insert": "^0.5.0",
"gulp-rename": "^1.4.0",
"gulp-sourcemaps": "^2.6.5",
"gulp-tap": "^1.0.1",
"gulp-tslint": "^8.1.4",
"gulp-typescript": "^5.0.1",
"gulp-uglify-es": "^1.0.4",
"ink-docstrap": "^1.3.2",
"jsdoc": "~3.5.5",
"jsonwebtoken": "^8.5.1",
"karma": "^4.1.0",
"karma-browserify": "^6.0.0",
"karma-browserstack-launcher": "^1.5.1",
"karma-mocha": "^1.3.0",
"karma-mocha-reporter": "^2.2.5",
"mocha": "^6.1.4",
"nyc": "^14.1.1",
"path": "^0.12.7",
"sinon": "^7.3.2",
"sinon-chai": "^3.3.0",
"source-map-explorer": "^1.8.0",
"ts-node": "^8.2.0",
"tslint": "^5.17.0",
"twilio": "^3.31.1",
"typescript": "^3.5.1",
"uglify-es": "^3.3.10",
"uglify-save-license": "^0.4.1",
"underscore": "^1.9.1",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"watchify": "^3.11.1"
},
"engines": {
"node": ">=8"
},
"license": "MIT",
"main": "lib/index.js",
"name": "twilio-sync",
"types": "./lib/index.d.ts",
"version": "0.12.4"
}
},{}],260:[function(_dereq_,module,exports){
"use strict";
var _assign = _dereq_("babel-runtime/core-js/object/assign");
var _assign2 = _interopRequireDefault(_assign);
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.BackoffRetrier = void 0;
var events_1 = _dereq_("events");
var operation_retrier_1 = _dereq_("operation-retrier");
/**
* Retrier with backoff override capability
*/
var BackoffRetrier = function (_events_1$EventEmitte) {
(0, _inherits3.default)(BackoffRetrier, _events_1$EventEmitte);
function BackoffRetrier(options) {
(0, _classCallCheck3.default)(this, BackoffRetrier);
var _this = (0, _possibleConstructorReturn3.default)(this, (BackoffRetrier.__proto__ || (0, _getPrototypeOf2.default)(BackoffRetrier)).call(this));
_this.options = options ? (0, _assign2.default)({}, options) : {};
return _this;
}
(0, _createClass3.default)(BackoffRetrier, [{
key: "start",
/**
* Should be called once per attempt series to start retrier.
*/
value: function start() {
if (this.inProgress) {
throw new Error('Already waiting for next attempt, call finishAttempt(success : boolean) to finish it');
}
this.createRetrier();
}
/**
* Should be called to stop retrier entirely.
*/
}, {
key: "stop",
value: function stop() {
this.cleanRetrier();
this.newBackoff = null;
this.usedBackoff = null;
}
/**
* Modifies backoff for next attempt.
* Expected behavior:
* - If there was no backoff passed previously reschedulling next attempt to given backoff
* - If previous backoff was longer then ignoring this one.
* - If previous backoff was shorter then reschedulling with this one.
* With or without backoff retrier will keep growing normally.
* @param delay delay of next attempts in ms.
*/
}, {
key: "modifyBackoff",
value: function modifyBackoff(delay) {
this.newBackoff = delay;
}
/**
* Mark last emmited attempt as failed, initiating either next of fail if limits were hit.
*/
}, {
key: "attemptFailed",
value: function attemptFailed() {
if (!this.inProgress) {
throw new Error('No attempt is in progress');
}
if (this.newBackoff) {
var shouldUseNewBackoff = !this.usedBackoff || this.usedBackoff < this.newBackoff;
if (shouldUseNewBackoff) {
this.createRetrier();
} else {
this.retrier.failed(new Error());
}
} else {
this.retrier.failed(new Error());
}
}
}, {
key: "cancel",
value: function cancel() {
if (this.retrier) {
this.retrier.cancel();
}
}
}, {
key: "cleanRetrier",
value: function cleanRetrier() {
if (this.retrier) {
this.retrier.removeAllListeners();
this.retrier.cancel();
this.retrier = null;
}
}
}, {
key: "getRetryPolicy",
value: function getRetryPolicy() {
var clone = (0, _assign2.default)({}, this.options);
if (this.newBackoff) {
clone.min = this.newBackoff;
clone.max = this.options.max && this.options.max > this.newBackoff ? this.options.max : this.newBackoff;
}
// As we're always skipping first attempt we should add one extra if limit is present
clone.maxAttemptsCount = this.options.maxAttemptsCount ? this.options.maxAttemptsCount + 1 : undefined;
return clone;
}
}, {
key: "createRetrier",
value: function createRetrier() {
var _this2 = this;
this.cleanRetrier();
var retryPolicy = this.getRetryPolicy();
this.retrier = new operation_retrier_1.Retrier(retryPolicy);
this.retrier.once('attempt', function () {
_this2.retrier.on('attempt', function () {
return _this2.emit('attempt');
});
_this2.retrier.failed(new Error('Skipping first attempt'));
});
this.retrier.on('failed', function (err) {
return _this2.emit('failed', err);
});
this.usedBackoff = this.newBackoff;
this.newBackoff = null;
this.retrier.start().catch(function (err) {});
}
}, {
key: "inProgress",
get: function get() {
return !!this.retrier;
}
}]);
return BackoffRetrier;
}(events_1.EventEmitter);
exports.BackoffRetrier = BackoffRetrier;
},{"babel-runtime/core-js/object/assign":35,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"events":200,"operation-retrier":205}],261:[function(_dereq_,module,exports){
"use strict";
var _regenerator = _dereq_("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = _dereq_("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _stringify = _dereq_("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _get3 = _dereq_("babel-runtime/helpers/get");
var _get4 = _interopRequireDefault(_get3);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Twilsock = exports.TwilsockClient = exports.TelemetryEvents = void 0;
var events_1 = _dereq_("events");
var logger_1 = _dereq_("./logger");
var configuration_1 = _dereq_("./configuration");
var twilsock_1 = _dereq_("./twilsock");
var packetinterface_1 = _dereq_("./packetinterface");
var websocketchannel_1 = _dereq_("./websocketchannel");
var registrations_1 = _dereq_("./services/registrations");
var upstream_1 = _dereq_("./services/upstream");
var deferred_1 = _dereq_("./deferred");
var twilsockerror_1 = _dereq_("./error/twilsockerror");
var offlinestorage_1 = _dereq_("./offlinestorage");
var tokenStorage_1 = _dereq_("./tokenStorage");
var telemetrytracker_1 = _dereq_("./services/telemetrytracker");
var TelemetryEvents = function TelemetryEvents() {
(0, _classCallCheck3.default)(this, TelemetryEvents);
};
exports.TelemetryEvents = TelemetryEvents;
TelemetryEvents.TWILSOCK_CONNECT = 'twilsock.sdk.connect'; // establish WebSocket connection (with WebSocket handshake finished)
TelemetryEvents.TWILSOCK_INIT = 'twilsock.sdk.init'; // send "init" message and receive reply
/**
* @alias Twilsock
* @classdesc Client library for the Twilsock service
* It allows to recevie service-generated updates as well as bi-directional transport
* @fires Twilsock#message
* @fires Twilsock#connected
* @fires Twilsock#disconnected
* @fires Twilsock#tokenAboutToExpire
* @fires Twilsock#stateChanged
* @fires Twilsock#connectionError
*/
var TwilsockClient = function (_events_1$EventEmitte) {
(0, _inherits3.default)(TwilsockClient, _events_1$EventEmitte);
/**
* @param {string} token Twilio access token
* @param {string} productId Product identifier. Should be the same as a grant name in token
*/
function TwilsockClient(token, productId) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
(0, _classCallCheck3.default)(this, TwilsockClient);
var _this = (0, _possibleConstructorReturn3.default)(this, (TwilsockClient.__proto__ || (0, _getPrototypeOf2.default)(TwilsockClient)).call(this));
_this.offlineStorageDeferred = new deferred_1.Deferred();
options.continuationToken = options.continuationToken ? options.continuationToken : tokenStorage_1.TokenStorage.getStoredToken(productId);
var config = _this.config = new configuration_1.Configuration(token, productId, options);
logger_1.log.setLevel(config.logLevel);
var websocket = new websocketchannel_1.WebSocketChannel(config.url);
var transport = options.transport ? options.transport : new packetinterface_1.PacketInterface(websocket, config);
_this.channel = options.channel ? options.channel : new twilsock_1.TwilsockImpl(websocket, transport, config);
_this.registrations = options.registrations ? options.registrations : new registrations_1.Registrations(transport);
_this.upstream = new upstream_1.Upstream(transport, _this.channel, config);
// Send telemetry only when connected and initialised
_this.telemetryTracker = new telemetrytracker_1.TelemetryTracker(config, transport);
_this.channel.on('initialized', function () {
return _this.telemetryTracker.canSendTelemetry = true;
});
websocket.on('disconnected', function () {
return _this.telemetryTracker.canSendTelemetry = false;
});
_this.registrations.on('registered', function (id) {
return _this.emit('registered', id);
});
_this.channel.on('message', function (type, message) {
return setTimeout(function () {
return _this.emit('message', type, message);
}, 0);
});
_this.channel.on('stateChanged', function (state) {
return setTimeout(function () {
return _this.emit('stateChanged', state);
}, 0);
});
_this.channel.on('connectionError', function (connectionError) {
return setTimeout(function () {
return _this.emit('connectionError', connectionError);
}, 0);
});
_this.channel.on('tokenAboutToExpire', function () {
return setTimeout(function () {
return _this.emit('tokenAboutToExpire');
}, 0);
});
_this.channel.on('tokenExpired', function () {
return setTimeout(function () {
return _this.emit('tokenExpired');
}, 0);
});
_this.channel.on('connected', function () {
return _this.registrations.updateRegistrations();
});
_this.channel.on('connected', function () {
return _this.upstream.sendPendingMessages();
});
_this.channel.on('connected', function () {
return setTimeout(function () {
return _this.emit('connected');
}, 0);
});
// Twilsock telemetry events
_this.channel.on('beforeConnect', function () {
return _this.telemetryTracker.addPartialEvent(new telemetrytracker_1.TelemetryEventDescription('Establish WebSocket connection', '', new Date()), TelemetryEvents.TWILSOCK_CONNECT, telemetrytracker_1.TelemetryPoint.Start);
});
_this.channel.on('connected', function () {
return _this.telemetryTracker.addPartialEvent(new telemetrytracker_1.TelemetryEventDescription('Establish WebSocket connection', '', new Date(), new Date()), TelemetryEvents.TWILSOCK_CONNECT, telemetrytracker_1.TelemetryPoint.End);
});
_this.channel.on('beforeSendInit', function () {
return _this.telemetryTracker.addPartialEvent(new telemetrytracker_1.TelemetryEventDescription('Send Twilsock init', '', new Date()), TelemetryEvents.TWILSOCK_INIT, telemetrytracker_1.TelemetryPoint.Start);
});
_this.channel.on('initialized', function () {
return _this.telemetryTracker.addPartialEvent(new telemetrytracker_1.TelemetryEventDescription('Send Twilsock init', 'Succeeded', new Date(), new Date()), TelemetryEvents.TWILSOCK_INIT, telemetrytracker_1.TelemetryPoint.End);
});
_this.channel.on('sendInitFailed', function () {
return _this.telemetryTracker.addPartialEvent(new telemetrytracker_1.TelemetryEventDescription('Send Twilsock init', 'Failed', new Date(), new Date()), TelemetryEvents.TWILSOCK_INIT, telemetrytracker_1.TelemetryPoint.End);
});
_this.channel.on('initialized', function (initReply) {
_this.handleStorageId(productId, initReply);
tokenStorage_1.TokenStorage.storeToken(initReply.continuationToken, productId);
setTimeout(function () {
return _this.emit('initialized', initReply);
}, 0);
});
_this.channel.on('disconnected', function () {
return setTimeout(function () {
return _this.emit('disconnected');
}, 0);
});
_this.channel.on('disconnected', function () {
return _this.upstream.rejectPendingMessages();
});
_this.channel.on('disconnected', function () {
return _this.offlineStorageDeferred.fail(new twilsockerror_1.TwilsockError('Client disconnected'));
});
_this.offlineStorageDeferred.promise.catch(function () {});
return _this;
}
(0, _createClass3.default)(TwilsockClient, [{
key: "emit",
value: function emit(event) {
var _get2;
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
logger_1.log.debug("Emitting " + event.toString() + "(" + args.map(function (a) {
return (0, _stringify2.default)(a);
}).join(', ') + ")");
return (_get2 = (0, _get4.default)(TwilsockClient.prototype.__proto__ || (0, _getPrototypeOf2.default)(TwilsockClient.prototype), "emit", this)).call.apply(_get2, [this, event].concat(args));
}
}, {
key: "handleStorageId",
value: function handleStorageId(productId, initReply) {
if (!initReply.offlineStorage) {
this.offlineStorageDeferred.fail(new twilsockerror_1.TwilsockError('No offline storage id'));
} else if (initReply.offlineStorage.hasOwnProperty(productId)) {
try {
this.offlineStorageDeferred.set(offlinestorage_1.OfflineProductStorage.create(initReply.offlineStorage[productId]));
logger_1.log.debug("Offline storage for '" + productId + "' product: " + (0, _stringify2.default)(initReply.offlineStorage[productId]) + ".");
} catch (e) {
this.offlineStorageDeferred.fail(new twilsockerror_1.TwilsockError("Failed to parse offline storage for " + productId + " " + (0, _stringify2.default)(initReply.offlineStorage[productId]) + ". " + e + "."));
}
} else {
this.offlineStorageDeferred.fail(new twilsockerror_1.TwilsockError("No offline storage id for '" + productId + "' product: " + (0, _stringify2.default)(initReply.offlineStorage)));
}
}
/**
* Get offline storage ID
* @returns {Promise}
*/
}, {
key: "storageId",
value: function storageId() {
return this.offlineStorageDeferred.promise;
}
/**
* Indicates if twilsock is connected now
* @returns {Boolean}
*/
}, {
key: "updateToken",
/**
* Update token
* @param {String} token
* @returns {Promise}
*/
value: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(token) {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
logger_1.log.trace("updating token '" + token + "'");
if (!(this.config.token === token)) {
_context.next = 3;
break;
}
return _context.abrupt("return");
case 3:
this.config.updateToken(token);
return _context.abrupt("return", this.channel.updateToken(token));
case 5:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function updateToken(_x2) {
return _ref.apply(this, arguments);
}
return updateToken;
}()
/**
* Updates notification context.
* This method shouldn't be used anyone except twilio notifications library
* @param contextId id of notification context
* @param context value of notification context
* @private
*/
}, {
key: "setNotificationsContext",
value: function setNotificationsContext(contextId, context) {
this.registrations.setNotificationsContext(contextId, context);
}
/**
* Remove notification context.
* This method shouldn't be used anyone except twilio notifications library
* @param contextId id of notification context
* @private
*/
}, {
key: "removeNotificationsContext",
value: function removeNotificationsContext(contextId) {
this.registrations.removeNotificationsContext(contextId);
}
/**
* Connect to the server
* @fires Twilsock#connected
* @public
* @returns {void}
*/
}, {
key: "connect",
value: function connect() {
return this.channel.connect();
}
/**
* Disconnect from the server
* @fires Twilsock#disconnected
* @public
* @returns {Promise}
*/
}, {
key: "disconnect",
value: function disconnect() {
this.telemetryTracker.sendTelemetry(telemetrytracker_1.EventSendingLimitation.AnyEventsIncludingUnfinished);
return this.channel.disconnect();
}
/**
* Get HTTP request to upstream service
* @param {string} url Upstream service url
* @param {headers} headers Set of custom headers
* @returns {Promise}
*/
}, {
key: "get",
value: function get(url, headers) {
this.telemetryTracker.sendTelemetry(telemetrytracker_1.EventSendingLimitation.AnyEvents); // send collected telemetry (if any) before upstream message shipment
return this.upstream.send('GET', url, headers);
}
/**
* Post HTTP request to upstream service
* @param {string} url Upstream service url
* @param {headers} headers Set of custom headers
* @param {body} body Body to send
* @returns {Promise}
*/
}, {
key: "post",
value: function post(url, headers, body) {
this.telemetryTracker.sendTelemetry(telemetrytracker_1.EventSendingLimitation.AnyEvents); // send collected telemetry (if any) before upstream message shipment
return this.upstream.send('POST', url, headers, body);
}
/**
* Put HTTP request to upstream service
* @param {string} url Upstream service url
* @param {headers} headers Set of custom headers
* @param {body} body Body to send
* @returns {Promise}
*/
}, {
key: "put",
value: function put(url, headers, body) {
this.telemetryTracker.sendTelemetry(telemetrytracker_1.EventSendingLimitation.AnyEvents); // send collected telemetry (if any) before upstream message shipment
return this.upstream.send('PUT', url, headers, body);
}
/**
* Delete HTTP request to upstream service
* @param {string} url Upstream service url
* @param {headers} headers Set of custom headers
* @returns {Promise}
*/
}, {
key: "delete",
value: function _delete(url, headers) {
this.telemetryTracker.sendTelemetry(telemetrytracker_1.EventSendingLimitation.AnyEvents); // send collected telemetry (if any) before upstream message shipment
return this.upstream.send('DELETE', url, headers);
}
/**
* Submits internal telemetry event. Not to be used for any customer and/or sensitive data.
* @param {TelemetryEventDescription} event Event details.
* @returns {void}
*/
}, {
key: "addTelemetryEvent",
value: function addTelemetryEvent(event) {
this.telemetryTracker.addTelemetryEvent(event);
this.telemetryTracker.sendTelemetryIfMinimalPortionCollected(); // send telemetry if need
}
/**
* Submits internal telemetry event. Not to be used for any customer and/or sensitive data.
* @param {TelemetryEventDescription} event Event details.
* @param {string} eventKey Unique event key.
* @param {TelemetryPoint} point Is this partial event for start or end of measurement.
* @returns {void}
*/
}, {
key: "addPartialTelemetryEvent",
value: function addPartialTelemetryEvent(event, eventKey, point) {
this.telemetryTracker.addPartialEvent(event, eventKey, point);
if (point === telemetrytracker_1.TelemetryPoint.End) {
// this telemetry event is complete, so minimal portion could become ready to send
this.telemetryTracker.sendTelemetryIfMinimalPortionCollected(); // send telemetry if need
}
}
}, {
key: "isConnected",
get: function get() {
return this.channel.isConnected;
}
/**
* Current state
* @returns {String}
*/
}, {
key: "state",
get: function get() {
return this.channel.state;
}
}]);
return TwilsockClient;
}(events_1.EventEmitter);
exports.TwilsockClient = TwilsockClient;
exports.Twilsock = TwilsockClient;
/**
* Twilsock destination address descriptor
* @typedef {Object} Twilsock#Address
* @property {String} method - HTTP method. (POST, PUT, etc)
* @property {String} host - host name without path. (e.g. my.company.com)
* @property {String} path - path on the host (e.g. /my/app/to/call.php)
*/
/**
* Twilsock upstream message
* @typedef {Object} Twilsock#Message
* @property {Twilsock#Address} to - destination address
* @property {Object} headers - HTTP headers
* @property {Object} body - Body
*/
/**
* Fired when new message received
* @param {Twilsock#Message} message
* @event Twilsock#message
*/
/**
* Fired when socket connected
* @param {String} URI of endpoint
* @event Twilsock#connected
*/
/**
* Fired when socket disconnected
* @event Twilsock#disconnected
*/
/**
* Fired when token is about to expire and should be updated
* @event Twilsock#tokenAboutToExpire
*/
/**
* Fired when socket connected
* @param {('connecting'|'connected'|'rejected'|'disconnecting'|'disconnected')} state - general twilsock state
* @event Twilsock#stateChanged
*/
/**
* Fired when connection is interrupted by unexpected reason
* @type {Object}
* @property {Boolean} terminal - twilsock will stop connection attempts
* @property {String} message - root cause
* @property {Number} [httpStatusCode] - http status code if available
* @property {Number} [errorCode] - Twilio public error code if available
* @event Twilsock#connectionError
*/
},{"./configuration":262,"./deferred":263,"./error/twilsockerror":265,"./logger":269,"./offlinestorage":271,"./packetinterface":272,"./services/registrations":283,"./services/telemetrytracker":284,"./services/upstream":285,"./tokenStorage":286,"./twilsock":287,"./websocketchannel":288,"babel-runtime/core-js/json/stringify":32,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/get":51,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"babel-runtime/regenerator":57,"events":200}],262:[function(_dereq_,module,exports){
"use strict";
var _set = _dereq_("babel-runtime/core-js/set");
var _set2 = _interopRequireDefault(_set);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Configuration = void 0;
var packageVersion = '0.5.14';
/**
* Settings container for the Twilsock client library
*/
var Configuration = function () {
/**
* @param {String} token - authentication token
* @param {Object} options - options to override defaults
*/
function Configuration(token, activeGrant) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
(0, _classCallCheck3.default)(this, Configuration);
this.confirmedCapabilities = new _set2.default();
this.activeGrant = activeGrant;
this._token = token;
var region = options.region || 'us1';
var defaultTwilsockUrl = "wss://tsock." + region + ".twilio.com/v3/wsconnect";
var twilsockOptions = options.twilsock || options.Twilsock || {};
this.url = twilsockOptions.uri || defaultTwilsockUrl;
this._continuationToken = options.continuationToken ? options.continuationToken : null;
this.logLevel = options.logLevel ? options.logLevel : 'error';
this.retryPolicy = options.retryPolicy ? options.retryPolicy : {
min: 1 * 1000,
max: 2 * 60 * 1000,
randomness: 0.2
};
this.clientMetadata = options.clientMetadata ? options.clientMetadata : {};
this.clientMetadata.ver = packageVersion;
this.initRegistrations = options.initRegistrations ? options.initRegistrations : null;
this.tweaks = options.tweaks ? options.tweaks : null;
}
(0, _createClass3.default)(Configuration, [{
key: "updateToken",
value: function updateToken(token) {
this._token = token;
}
}, {
key: "updateContinuationToken",
value: function updateContinuationToken(continuationToken) {
this._continuationToken = continuationToken;
}
}, {
key: "token",
get: function get() {
return this._token;
}
}, {
key: "continuationToken",
get: function get() {
return this._continuationToken;
}
}]);
return Configuration;
}();
exports.Configuration = Configuration;
},{"babel-runtime/core-js/set":45,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],263:[function(_dereq_,module,exports){
"use strict";
var _promise = _dereq_("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Deferred = void 0;
var Deferred = function () {
function Deferred() {
var _this = this;
(0, _classCallCheck3.default)(this, Deferred);
this._promise = new _promise2.default(function (resolve, reject) {
_this._resolve = resolve;
_this._reject = reject;
});
}
(0, _createClass3.default)(Deferred, [{
key: "update",
value: function update(value) {
this._resolve(value);
}
}, {
key: "set",
value: function set(value) {
this.current = value;
this._resolve(value);
}
}, {
key: "fail",
value: function fail(e) {
this._reject(e);
}
}, {
key: "promise",
get: function get() {
return this._promise;
}
}]);
return Deferred;
}();
exports.Deferred = Deferred;
},{"babel-runtime/core-js/promise":42,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],264:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransportUnavailableError = void 0;
var twilsockerror_1 = _dereq_("./twilsockerror");
var TransportUnavailableError = function (_twilsockerror_1$Twil) {
(0, _inherits3.default)(TransportUnavailableError, _twilsockerror_1$Twil);
function TransportUnavailableError(description) {
(0, _classCallCheck3.default)(this, TransportUnavailableError);
return (0, _possibleConstructorReturn3.default)(this, (TransportUnavailableError.__proto__ || (0, _getPrototypeOf2.default)(TransportUnavailableError)).call(this, description));
}
return TransportUnavailableError;
}(twilsockerror_1.TwilsockError);
exports.TransportUnavailableError = TransportUnavailableError;
},{"./twilsockerror":265,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],265:[function(_dereq_,module,exports){
"use strict";
var _create = _dereq_("babel-runtime/core-js/object/create");
var _create2 = _interopRequireDefault(_create);
var _setPrototypeOf = _dereq_("babel-runtime/core-js/object/set-prototype-of");
var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
var _from = _dereq_("babel-runtime/core-js/array/from");
var _from2 = _interopRequireDefault(_from);
var _construct = _dereq_("babel-runtime/core-js/reflect/construct");
var _construct2 = _interopRequireDefault(_construct);
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _extendableBuiltin(cls) {
function ExtendableBuiltin() {
var instance = (0, _construct2.default)(cls, (0, _from2.default)(arguments));
(0, _setPrototypeOf2.default)(instance, (0, _getPrototypeOf2.default)(this));
return instance;
}
ExtendableBuiltin.prototype = (0, _create2.default)(cls.prototype, {
constructor: {
value: cls,
enumerable: false,
writable: true,
configurable: true
}
});
if (_setPrototypeOf2.default) {
(0, _setPrototypeOf2.default)(ExtendableBuiltin, cls);
} else {
ExtendableBuiltin.__proto__ = cls;
}
return ExtendableBuiltin;
}
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwilsockError = void 0;
var TwilsockError = function (_extendableBuiltin2) {
(0, _inherits3.default)(TwilsockError, _extendableBuiltin2);
function TwilsockError(description) {
(0, _classCallCheck3.default)(this, TwilsockError);
return (0, _possibleConstructorReturn3.default)(this, (TwilsockError.__proto__ || (0, _getPrototypeOf2.default)(TwilsockError)).call(this, description));
}
return TwilsockError;
}(_extendableBuiltin(Error));
exports.TwilsockError = TwilsockError;
},{"babel-runtime/core-js/array/from":29,"babel-runtime/core-js/object/create":36,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/core-js/object/set-prototype-of":41,"babel-runtime/core-js/reflect/construct":43,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],266:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwilsockReplyError = void 0;
var twilsockerror_1 = _dereq_("./twilsockerror");
var TwilsockReplyError = function (_twilsockerror_1$Twil) {
(0, _inherits3.default)(TwilsockReplyError, _twilsockerror_1$Twil);
function TwilsockReplyError(description, reply) {
(0, _classCallCheck3.default)(this, TwilsockReplyError);
var _this = (0, _possibleConstructorReturn3.default)(this, (TwilsockReplyError.__proto__ || (0, _getPrototypeOf2.default)(TwilsockReplyError)).call(this, description));
_this.reply = reply;
return _this;
}
return TwilsockReplyError;
}(twilsockerror_1.TwilsockError);
exports.TwilsockReplyError = TwilsockReplyError;
},{"./twilsockerror":265,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],267:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwilsockUpstreamError = void 0;
var twilsockerror_1 = _dereq_("./twilsockerror");
var TwilsockUpstreamError = function (_twilsockerror_1$Twil) {
(0, _inherits3.default)(TwilsockUpstreamError, _twilsockerror_1$Twil);
function TwilsockUpstreamError(status, description, body) {
(0, _classCallCheck3.default)(this, TwilsockUpstreamError);
var _this = (0, _possibleConstructorReturn3.default)(this, (TwilsockUpstreamError.__proto__ || (0, _getPrototypeOf2.default)(TwilsockUpstreamError)).call(this, description));
_this.status = status;
_this.description = description;
_this.body = body;
return _this;
}
return TwilsockUpstreamError;
}(twilsockerror_1.TwilsockError);
exports.TwilsockUpstreamError = TwilsockUpstreamError;
},{"./twilsockerror":265,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],268:[function(_dereq_,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransportUnavailableError = exports.TwilsockError = exports.Twilsock = exports.TwilsockClient = void 0;
var client_1 = _dereq_("./client");
Object.defineProperty(exports, "TwilsockClient", { enumerable: true, get: function get() {
return client_1.TwilsockClient;
} });
Object.defineProperty(exports, "Twilsock", { enumerable: true, get: function get() {
return client_1.TwilsockClient;
} });
var twilsockerror_1 = _dereq_("./error/twilsockerror");
Object.defineProperty(exports, "TwilsockError", { enumerable: true, get: function get() {
return twilsockerror_1.TwilsockError;
} });
var transportunavailableerror_1 = _dereq_("./error/transportunavailableerror");
Object.defineProperty(exports, "TransportUnavailableError", { enumerable: true, get: function get() {
return transportunavailableerror_1.TransportUnavailableError;
} });
},{"./client":261,"./error/transportunavailableerror":264,"./error/twilsockerror":265}],269:[function(_dereq_,module,exports){
"use strict";
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _from = _dereq_("babel-runtime/core-js/array/from");
var _from2 = _interopRequireDefault(_from);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.log = exports.Logger = void 0;
var loglevelLog = _dereq_("loglevel");
var log = loglevelLog.getLogger('twilsock'); // twilsock is used by Flex SDK. Please DO NOT change
function prepareLine(prefix, args) {
return [new Date().toISOString() + " Twilsock " + prefix + ":"].concat((0, _from2.default)(args));
}
var Logger = function () {
function Logger(prefix) {
(0, _classCallCheck3.default)(this, Logger);
this.prefix = '';
this.prefix = prefix !== null && prefix !== undefined && prefix.length > 0 ? ' ' + prefix + ':' : '';
}
(0, _createClass3.default)(Logger, [{
key: "setLevel",
value: function setLevel(level) {
log.setLevel(level);
}
}, {
key: "trace",
value: function trace() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
log.debug.apply(null, prepareLine('T', args));
}
}, {
key: "debug",
value: function debug() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
log.debug.apply(null, prepareLine('D', args));
}
}, {
key: "info",
value: function info() {
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
log.info.apply(null, prepareLine('I', args));
}
}, {
key: "warn",
value: function warn() {
for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
args[_key4] = arguments[_key4];
}
log.warn.apply(null, prepareLine('W', args));
}
}, {
key: "error",
value: function error() {
for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
args[_key5] = arguments[_key5];
}
log.error.apply(null, prepareLine('E', args));
}
}], [{
key: "setLevel",
value: function setLevel(level) {
log.setLevel(level);
}
}, {
key: "trace",
value: function trace() {
for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
args[_key6] = arguments[_key6];
}
log.trace.apply(null, prepareLine('T', args));
}
}, {
key: "debug",
value: function debug() {
for (var _len7 = arguments.length, args = Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
args[_key7] = arguments[_key7];
}
log.debug.apply(null, prepareLine('D', args));
}
}, {
key: "info",
value: function info() {
for (var _len8 = arguments.length, args = Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
args[_key8] = arguments[_key8];
}
log.info.apply(null, prepareLine('I', args));
}
}, {
key: "warn",
value: function warn() {
for (var _len9 = arguments.length, args = Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
args[_key9] = arguments[_key9];
}
log.warn.apply(null, prepareLine('W', args));
}
}, {
key: "error",
value: function error() {
for (var _len10 = arguments.length, args = Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
args[_key10] = arguments[_key10];
}
log.error.apply(null, prepareLine('E', args));
}
}]);
return Logger;
}();
exports.Logger = Logger;
var logInstance = new Logger('');
exports.log = logInstance;
},{"babel-runtime/core-js/array/from":29,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"loglevel":203}],270:[function(_dereq_,module,exports){
"use strict";
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Metadata = void 0;
var platform = _dereq_("platform");
var Metadata = function () {
function Metadata() {
(0, _classCallCheck3.default)(this, Metadata);
}
(0, _createClass3.default)(Metadata, null, [{
key: "getMetadata",
value: function getMetadata(options) {
var platformInfo = typeof navigator !== 'undefined' ? platform.parse(navigator.userAgent) : platform;
var overrides = options && options.clientMetadata ? options.clientMetadata : {};
var fieldNames = ['ver', 'env', 'envv', 'os', 'osv', 'osa', 'type', 'sdk', 'sdkv', 'dev', 'devv', 'devt', 'app', 'appv'];
var defaults = {
'env': platform.name,
'envv': platform.version,
'os': platform.os.family,
'osv': platform.os.version,
'osa': platform.os.architecture,
'sdk': 'js-default'
};
var finalClientMetadata = {};
fieldNames.filter(function (key) {
return key in overrides || key in defaults;
}).forEach(function (key) {
return finalClientMetadata[key] = key in overrides ? overrides[key] : defaults[key];
});
return finalClientMetadata;
}
}]);
return Metadata;
}();
exports.Metadata = Metadata;
},{"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"platform":207}],271:[function(_dereq_,module,exports){
"use strict";
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.OfflineProductStorage = void 0;
var twilsockerror_1 = _dereq_("./error/twilsockerror");
var OfflineProductStorage = function () {
function OfflineProductStorage(id) {
(0, _classCallCheck3.default)(this, OfflineProductStorage);
this.id = id;
}
(0, _createClass3.default)(OfflineProductStorage, null, [{
key: "create",
value: function create(productPayload) {
if (productPayload instanceof Object && 'storage_id' in productPayload) {
return new OfflineProductStorage(productPayload.storage_id);
} else {
throw new twilsockerror_1.TwilsockError('Field "storage_id" is missing');
}
}
}]);
return OfflineProductStorage;
}();
exports.OfflineProductStorage = OfflineProductStorage;
},{"./error/twilsockerror":265,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],272:[function(_dereq_,module,exports){
"use strict";
var _promise = _dereq_("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
var _regenerator = _dereq_("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _set = _dereq_("babel-runtime/core-js/set");
var _set2 = _interopRequireDefault(_set);
var _asyncToGenerator2 = _dereq_("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _map = _dereq_("babel-runtime/core-js/map");
var _map2 = _interopRequireDefault(_map);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _stringify = _dereq_("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
var _typeof2 = _dereq_("babel-runtime/helpers/typeof");
var _typeof3 = _interopRequireDefault(_typeof2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.PacketInterface = exports.PacketResponse = void 0;
var logger_1 = _dereq_("./logger");
var uuid_1 = _dereq_("uuid");
var twilsockerror_1 = _dereq_("./error/twilsockerror");
var twilsockreplyerror_1 = _dereq_("./error/twilsockreplyerror");
var parser_1 = _dereq_("./parser");
var Messages = _dereq_("./protocol/messages");
var metadata_1 = _dereq_("./metadata");
var REQUEST_TIMEOUT = 30000;
function isHttpSuccess(code) {
return code >= 200 && code < 300;
}
/**
* Makes sure that body is properly stringified
*/
function preparePayload(payload) {
switch (typeof payload === "undefined" ? "undefined" : (0, _typeof3.default)(payload)) {
case 'undefined':
return '';
case 'object':
return (0, _stringify2.default)(payload);
default:
return payload;
}
}
var PacketRequest = function PacketRequest() {
(0, _classCallCheck3.default)(this, PacketRequest);
};
var PacketResponse = function PacketResponse() {
(0, _classCallCheck3.default)(this, PacketResponse);
};
exports.PacketResponse = PacketResponse;
var PacketInterface = function () {
function PacketInterface(channel, config) {
var _this = this;
(0, _classCallCheck3.default)(this, PacketInterface);
this.config = config;
this.activeRequests = new _map2.default();
this.channel = channel;
this.channel.on('reply', function (reply) {
return _this.processReply(reply);
});
this.channel.on('disconnected', function () {
_this.activeRequests.forEach(function (descriptor) {
clearTimeout(descriptor.timeout);
descriptor.reject(new twilsockerror_1.TwilsockError('disconnected'));
});
_this.activeRequests.clear();
});
}
(0, _createClass3.default)(PacketInterface, [{
key: "processReply",
value: function processReply(reply) {
var request = this.activeRequests.get(reply.id);
if (request) {
clearTimeout(request.timeout);
this.activeRequests.delete(reply.id);
if (!isHttpSuccess(reply.status.code)) {
request.reject(new twilsockreplyerror_1.TwilsockReplyError('Transport failure: ' + reply.status.status, reply));
logger_1.log.trace('message rejected');
} else {
request.resolve(reply);
}
}
}
}, {
key: "storeRequest",
value: function storeRequest(id, resolve, reject) {
var requestDescriptor = {
resolve: resolve,
reject: reject,
timeout: setTimeout(function () {
logger_1.log.trace('request', id, 'is timed out');
reject(new twilsockerror_1.TwilsockError('Twilsock: request timeout: ' + id));
}, REQUEST_TIMEOUT)
};
this.activeRequests.set(id, requestDescriptor);
}
}, {
key: "shutdown",
value: function shutdown() {
this.activeRequests.forEach(function (descriptor) {
clearTimeout(descriptor.timeout);
descriptor.reject(new twilsockerror_1.TwilsockError('Twilsock: request cancelled by user'));
});
this.activeRequests.clear();
}
}, {
key: "sendInit",
value: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
var metadata, message, response;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
logger_1.log.trace('sendInit');
metadata = metadata_1.Metadata.getMetadata(this.config);
message = new Messages.Init(this.config.token, this.config.continuationToken, metadata, this.config.initRegistrations, this.config.tweaks);
_context.next = 5;
return this.sendWithReply(message);
case 5:
response = _context.sent;
return _context.abrupt("return", new Messages.InitReply(response.id, response.header.continuation_token, response.header.continuation_token_status, response.header.offline_storage, response.header.init_registrations, response.header.debug_info, new _set2.default(response.header.capabilities)));
case 7:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function sendInit() {
return _ref.apply(this, arguments);
}
return sendInit;
}()
}, {
key: "sendClose",
value: function sendClose() {
var message = new Messages.Close();
//@todo send telemetry AnyEventsIncludingUnfinished
this.send(message);
}
}, {
key: "sendWithReply",
value: function sendWithReply(header, payload) {
var _this2 = this;
return new _promise2.default(function (resolve, reject) {
var id = _this2.send(header, payload);
_this2.storeRequest(id, resolve, reject);
});
}
}, {
key: "send",
value: function send(header, payload) {
header.id = header.id || "TM" + uuid_1.v4();
var message = parser_1.Parser.createPacket(header, preparePayload(payload));
try {
this.channel.send(message);
return header.id;
} catch (e) {
logger_1.log.debug('failed to send ', header, e);
logger_1.log.trace(e.stack);
throw e;
}
}
}, {
key: "isConnected",
get: function get() {
return this.channel.isConnected;
}
}]);
return PacketInterface;
}();
exports.PacketInterface = PacketInterface;
},{"./error/twilsockerror":265,"./error/twilsockreplyerror":266,"./logger":269,"./metadata":270,"./parser":273,"./protocol/messages":276,"babel-runtime/core-js/json/stringify":32,"babel-runtime/core-js/map":33,"babel-runtime/core-js/promise":42,"babel-runtime/core-js/set":45,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/typeof":56,"babel-runtime/regenerator":57,"uuid":289}],273:[function(_dereq_,module,exports){
"use strict";
var _stringify = _dereq_("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Parser = void 0;
var logger_1 = _dereq_("./logger");
function byteLength(s) {
var escstr = encodeURIComponent(s);
var binstr = escstr.replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
});
return binstr.length;
}
function stringToUint8Array(s) {
var escstr = encodeURIComponent(s);
var binstr = escstr.replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
});
var ua = new Uint8Array(binstr.length);
Array.prototype.forEach.call(binstr, function (ch, i) {
ua[i] = ch.charCodeAt(0);
});
return ua;
}
function uint8ArrayToString(ua) {
var binstr = Array.prototype.map.call(ua, function (ch) {
return String.fromCharCode(ch);
}).join('');
var escstr = binstr.replace(/(.)/g, function (m, p) {
var code = p.charCodeAt(0).toString(16).toUpperCase();
if (code.length < 2) {
code = '0' + code;
}
return '%' + code;
});
return decodeURIComponent(escstr);
}
function getJsonObject(array) {
return JSON.parse(uint8ArrayToString(array));
}
function getMagic(buffer) {
var strMagic = '';
var idx = 0;
for (; idx < buffer.length; ++idx) {
var chr = String.fromCharCode(buffer[idx]);
strMagic += chr;
if (chr === '\r') {
idx += 2;
break;
}
}
var magics = strMagic.split(' ');
return {
size: idx,
protocol: magics[0],
version: magics[1],
headerSize: Number(magics[2])
};
}
var Parser = function () {
function Parser() {
(0, _classCallCheck3.default)(this, Parser);
}
(0, _createClass3.default)(Parser, null, [{
key: "parse",
value: function parse(message) {
var fieldMargin = 2;
var dataView = new Uint8Array(message);
var magic = getMagic(dataView);
if (magic.protocol !== 'TWILSOCK' || magic.version !== 'V3.0') {
logger_1.log.error("unsupported protocol: " + magic.protocol + " ver " + magic.version);
//throw new Error('Unsupported protocol');
//this.fsm.unsupportedProtocol();
return;
}
var header = null;
try {
header = getJsonObject(dataView.subarray(magic.size, magic.size + magic.headerSize));
} catch (e) {
logger_1.log.error('failed to parse message header', e, message);
//throw new Error('Failed to parse message');
//this.fsm.protocolError();
return;
}
logger_1.log.debug('message received: ', header.method);
logger_1.log.trace('message received: ', header);
var payload = null;
if (header.payload_size > 0) {
var payloadOffset = fieldMargin + magic.size + magic.headerSize;
var payloadSize = header.payload_size;
if (!header.hasOwnProperty('payload_type') || header.payload_type.indexOf('application/json') === 0) {
try {
payload = getJsonObject(dataView.subarray(payloadOffset, payloadOffset + payloadSize));
} catch (e) {
logger_1.log.error('failed to parse message body', e, message);
//this.fsm.protocolError();
return;
}
} else if (header.payload_type.indexOf('text/plain') === 0) {
payload = uint8ArrayToString(dataView.subarray(payloadOffset, payloadOffset + payloadSize));
}
}
return { method: header.method, header: header, payload: payload };
}
}, {
key: "createPacket",
value: function createPacket(header) {
var payloadString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
header.payload_size = byteLength(payloadString); // eslint-disable-line camelcase
var headerString = (0, _stringify2.default)(header) + '\r\n';
var magicString = 'TWILSOCK V3.0 ' + (byteLength(headerString) - 2) + '\r\n';
logger_1.log.debug('send request:', magicString + headerString + payloadString);
var message = stringToUint8Array(magicString + headerString + payloadString);
return message.buffer;
}
}]);
return Parser;
}();
exports.Parser = Parser;
},{"./logger":269,"babel-runtime/core-js/json/stringify":32,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],274:[function(_dereq_,module,exports){
"use strict";
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractMessage = void 0;
var uuid_1 = _dereq_("uuid");
var AbstractMessage = function AbstractMessage(id) {
(0, _classCallCheck3.default)(this, AbstractMessage);
this.id = id || "TM" + uuid_1.v4();
};
exports.AbstractMessage = AbstractMessage;
},{"babel-runtime/helpers/classCallCheck":49,"uuid":289}],275:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Close = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var Close = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Close, _abstractmessage_1$Ab);
function Close() {
(0, _classCallCheck3.default)(this, Close);
var _this = (0, _possibleConstructorReturn3.default)(this, (Close.__proto__ || (0, _getPrototypeOf2.default)(Close)).call(this));
_this.method = 'close';
return _this;
}
return Close;
}(abstractmessage_1.AbstractMessage);
exports.Close = Close;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],276:[function(_dereq_,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Telemetry = exports.Close = exports.Reply = exports.Message = exports.Update = exports.InitReply = exports.Init = void 0;
var init_1 = _dereq_("./init");
Object.defineProperty(exports, "Init", { enumerable: true, get: function get() {
return init_1.Init;
} });
var initReply_1 = _dereq_("./initReply");
Object.defineProperty(exports, "InitReply", { enumerable: true, get: function get() {
return initReply_1.InitReply;
} });
var update_1 = _dereq_("./update");
Object.defineProperty(exports, "Update", { enumerable: true, get: function get() {
return update_1.Update;
} });
var message_1 = _dereq_("./message");
Object.defineProperty(exports, "Message", { enumerable: true, get: function get() {
return message_1.Message;
} });
var reply_1 = _dereq_("./reply");
Object.defineProperty(exports, "Reply", { enumerable: true, get: function get() {
return reply_1.Reply;
} });
var close_1 = _dereq_("./close");
Object.defineProperty(exports, "Close", { enumerable: true, get: function get() {
return close_1.Close;
} });
var telemetry_1 = _dereq_("./telemetry");
Object.defineProperty(exports, "Telemetry", { enumerable: true, get: function get() {
return telemetry_1.Telemetry;
} });
},{"./close":275,"./init":277,"./initReply":278,"./message":279,"./reply":280,"./telemetry":281,"./update":282}],277:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Init = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var Init = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Init, _abstractmessage_1$Ab);
function Init(token, continuationToken, metadata) {
var registrations = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
var tweaks = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
(0, _classCallCheck3.default)(this, Init);
var _this = (0, _possibleConstructorReturn3.default)(this, (Init.__proto__ || (0, _getPrototypeOf2.default)(Init)).call(this));
_this.method = 'init';
_this.token = token;
_this.continuation_token = continuationToken;
_this.metadata = metadata;
_this.registrations = registrations;
_this.tweaks = tweaks;
_this.capabilities = ['client_update', 'offline_storage', 'telemetry.v1'];
return _this;
}
return Init;
}(abstractmessage_1.AbstractMessage);
exports.Init = Init;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],278:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.InitReply = exports.ContinuationTokenStatus = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var ContinuationTokenStatus = function ContinuationTokenStatus() {
(0, _classCallCheck3.default)(this, ContinuationTokenStatus);
};
exports.ContinuationTokenStatus = ContinuationTokenStatus;
var InitReply = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(InitReply, _abstractmessage_1$Ab);
function InitReply(id, continuationToken, continuationTokenStatus, offlineStorage, initRegistrations, debugInfo, confirmedCapabilities) {
(0, _classCallCheck3.default)(this, InitReply);
var _this = (0, _possibleConstructorReturn3.default)(this, (InitReply.__proto__ || (0, _getPrototypeOf2.default)(InitReply)).call(this, id));
_this.continuationToken = continuationToken;
_this.continuationTokenStatus = continuationTokenStatus;
_this.offlineStorage = offlineStorage;
_this.initRegistrations = initRegistrations;
_this.debugInfo = debugInfo;
_this.confirmedCapabilities = confirmedCapabilities;
return _this;
}
return InitReply;
}(abstractmessage_1.AbstractMessage);
exports.InitReply = InitReply;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],279:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Message = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var Message = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Message, _abstractmessage_1$Ab);
function Message(grant, contentType, request) {
(0, _classCallCheck3.default)(this, Message);
var _this = (0, _possibleConstructorReturn3.default)(this, (Message.__proto__ || (0, _getPrototypeOf2.default)(Message)).call(this));
_this.method = 'message';
_this.active_grant = grant;
_this.payload_type = contentType;
_this.http_request = request;
return _this;
}
return Message;
}(abstractmessage_1.AbstractMessage);
exports.Message = Message;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],280:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Reply = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var Reply = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Reply, _abstractmessage_1$Ab);
function Reply(id) {
(0, _classCallCheck3.default)(this, Reply);
var _this = (0, _possibleConstructorReturn3.default)(this, (Reply.__proto__ || (0, _getPrototypeOf2.default)(Reply)).call(this, id));
_this.method = 'reply';
_this.payload_type = 'application/json';
_this.status = { code: 200, status: 'OK' };
return _this;
}
return Reply;
}(abstractmessage_1.AbstractMessage);
exports.Reply = Reply;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],281:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TelemetryEvent = exports.Telemetry = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var TelemetryEvent = function TelemetryEvent(start, // relative to event send time
end, // relative to event send time
title, details, id, // optional, default will be random assigned by backend
type) {
(0, _classCallCheck3.default)(this, TelemetryEvent);
this.start = start;
this.end = end;
this.title = title;
this.details = details;
this.id = id;
this.type = type;
} // optional, default will be "SDK" assigned by backend
;
exports.TelemetryEvent = TelemetryEvent;
var Telemetry = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Telemetry, _abstractmessage_1$Ab);
function Telemetry(events) {
(0, _classCallCheck3.default)(this, Telemetry);
var _this = (0, _possibleConstructorReturn3.default)(this, (Telemetry.__proto__ || (0, _getPrototypeOf2.default)(Telemetry)).call(this));
_this.method = 'telemetry.v1';
_this.events = events;
return _this;
}
return Telemetry;
}(abstractmessage_1.AbstractMessage);
exports.Telemetry = Telemetry;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],282:[function(_dereq_,module,exports){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Update = void 0;
var abstractmessage_1 = _dereq_("./abstractmessage");
var Update = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Update, _abstractmessage_1$Ab);
function Update(token) {
(0, _classCallCheck3.default)(this, Update);
var _this = (0, _possibleConstructorReturn3.default)(this, (Update.__proto__ || (0, _getPrototypeOf2.default)(Update)).call(this));
_this.method = 'update';
_this.token = token;
return _this;
}
return Update;
}(abstractmessage_1.AbstractMessage);
exports.Update = Update;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],283:[function(_dereq_,module,exports){
"use strict";
var _set = _dereq_("babel-runtime/core-js/set");
var _set2 = _interopRequireDefault(_set);
var _regenerator = _dereq_("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = _dereq_("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _map = _dereq_("babel-runtime/core-js/map");
var _map2 = _interopRequireDefault(_map);
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Registrations = void 0;
var logger_1 = _dereq_("../logger");
var events_1 = _dereq_("events");
var uuid_1 = _dereq_("uuid");
var twilsockerror_1 = _dereq_("../error/twilsockerror");
/**
* Registrations module handles all operations with registration contexts through twilsock
* Main role: it automatically refreshes all registrations after reconnect.
*/
var Registrations = function (_events_1$EventEmitte) {
(0, _inherits3.default)(Registrations, _events_1$EventEmitte);
function Registrations(transport) {
(0, _classCallCheck3.default)(this, Registrations);
var _this = (0, _possibleConstructorReturn3.default)(this, (Registrations.__proto__ || (0, _getPrototypeOf2.default)(Registrations)).call(this));
_this.transport = transport;
_this.registrations = new _map2.default();
_this.registrationsInProgress = new _map2.default();
return _this;
}
(0, _createClass3.default)(Registrations, [{
key: "putNotificationContext",
value: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(contextId, context) {
var header, reply;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
header = { method: 'put_notification_ctx', notification_ctx_id: contextId };
_context.next = 3;
return this.transport.sendWithReply(header, context);
case 3:
reply = _context.sent;
case 4:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function putNotificationContext(_x, _x2) {
return _ref.apply(this, arguments);
}
return putNotificationContext;
}()
}, {
key: "deleteNotificationContext",
value: function () {
var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(contextId) {
var message, reply;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
message = { method: 'delete_notification_ctx', notification_ctx_id: contextId };
_context2.next = 3;
return this.transport.sendWithReply(message);
case 3:
reply = _context2.sent;
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function deleteNotificationContext(_x3) {
return _ref2.apply(this, arguments);
}
return deleteNotificationContext;
}()
}, {
key: "updateRegistration",
value: function () {
var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(contextId, context) {
var registrationAttempts, attemptId;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
logger_1.log.debug('update registration for context', contextId);
registrationAttempts = this.registrationsInProgress.get(contextId);
if (!registrationAttempts) {
registrationAttempts = new _set2.default();
this.registrationsInProgress.set(contextId, registrationAttempts);
}
attemptId = uuid_1.v4();
registrationAttempts.add(attemptId);
_context3.prev = 5;
_context3.next = 8;
return this.putNotificationContext(contextId, context);
case 8:
logger_1.log.debug('registration attempt succeeded for context', context);
registrationAttempts.delete(attemptId);
if (registrationAttempts.size === 0) {
this.registrationsInProgress.delete(contextId);
this.emit('registered', contextId);
}
_context3.next = 19;
break;
case 13:
_context3.prev = 13;
_context3.t0 = _context3["catch"](5);
logger_1.log.warn('registration attempt failed for context', context);
logger_1.log.debug(_context3.t0);
registrationAttempts.delete(attemptId);
if (registrationAttempts.size === 0) {
this.registrationsInProgress.delete(contextId);
this.emit('registrationFailed', contextId, _context3.t0);
}
case 19:
case "end":
return _context3.stop();
}
}
}, _callee3, this, [[5, 13]]);
}));
function updateRegistration(_x4, _x5) {
return _ref3.apply(this, arguments);
}
return updateRegistration;
}()
}, {
key: "updateRegistrations",
value: function updateRegistrations() {
var _this2 = this;
logger_1.log.trace("refreshing " + this.registrations.size + " registrations");
this.registrations.forEach(function (context, id) {
_this2.updateRegistration(id, context);
});
}
}, {
key: "setNotificationsContext",
value: function setNotificationsContext(contextId, context) {
if (!contextId || !context) {
throw new twilsockerror_1.TwilsockError('Invalid arguments provided');
}
this.registrations.set(contextId, context);
if (this.transport.isConnected) {
this.updateRegistration(contextId, context);
}
}
}, {
key: "removeNotificationsContext",
value: function () {
var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(contextId) {
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
if (this.registrations.has(contextId)) {
_context4.next = 2;
break;
}
return _context4.abrupt("return");
case 2:
_context4.next = 4;
return this.deleteNotificationContext(contextId);
case 4:
if (this.transport.isConnected) {
this.registrations.delete(contextId);
}
case 5:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function removeNotificationsContext(_x6) {
return _ref4.apply(this, arguments);
}
return removeNotificationsContext;
}()
}]);
return Registrations;
}(events_1.EventEmitter);
exports.Registrations = Registrations;
},{"../error/twilsockerror":265,"../logger":269,"babel-runtime/core-js/map":33,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/core-js/set":45,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"babel-runtime/regenerator":57,"events":200,"uuid":289}],284:[function(_dereq_,module,exports){
"use strict";
var _map = _dereq_("babel-runtime/core-js/map");
var _map2 = _interopRequireDefault(_map);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventSendingLimitation = exports.TelemetryPoint = exports.TelemetryEventDescription = exports.TelemetryTracker = void 0;
var telemetry_1 = _dereq_("../protocol/messages/telemetry");
var logger_1 = _dereq_("../logger");
var TelemetryEventDescription = function () {
function TelemetryEventDescription(title, details, start, end, type, id) {
(0, _classCallCheck3.default)(this, TelemetryEventDescription);
this.title = title;
this.details = details;
this.start = start;
this.type = type;
this.id = id;
this.end = end;
}
// Prepare telemetry event right before sending it.
// Convert times to relative.
(0, _createClass3.default)(TelemetryEventDescription, [{
key: "toTelemetryEvent",
value: function toTelemetryEvent() {
// Fix dates
var now = new Date();
var actualStart = this.start;
var actualEnd = this.end ? this.end : now;
if (actualEnd < actualStart) {
var tmp = actualEnd;
actualEnd = actualStart;
actualStart = tmp;
}
// Converting dates to relative offset from current moment in ms
var startOffset = actualStart.getTime() - now.getTime();
var endOffset = actualEnd.getTime() - now.getTime();
var result = new telemetry_1.TelemetryEvent(startOffset, endOffset, this.title, this.details, this.id, this.type);
return result;
}
}]);
return TelemetryEventDescription;
}();
exports.TelemetryEventDescription = TelemetryEventDescription;
var TelemetryPoint;
(function (TelemetryPoint) {
TelemetryPoint[TelemetryPoint["Start"] = 0] = "Start";
TelemetryPoint[TelemetryPoint["End"] = 1] = "End";
})(TelemetryPoint || (TelemetryPoint = {}));
exports.TelemetryPoint = TelemetryPoint;
var EventSendingLimitation;
(function (EventSendingLimitation) {
EventSendingLimitation[EventSendingLimitation["MinEventsPortion"] = 0] = "MinEventsPortion";
EventSendingLimitation[EventSendingLimitation["AnyEvents"] = 1] = "AnyEvents";
EventSendingLimitation[EventSendingLimitation["AnyEventsIncludingUnfinished"] = 2] = "AnyEventsIncludingUnfinished";
})(EventSendingLimitation || (EventSendingLimitation = {}));
exports.EventSendingLimitation = EventSendingLimitation;
var TelemetryTracker = function () {
function TelemetryTracker(config, packetInterface) {
(0, _classCallCheck3.default)(this, TelemetryTracker);
// accumulated events count that is big enough to be sent out of schedule (not on timer but on new event registration)
this.minEventsPortionToSend = 50;
// max events batch size to be sent in a single Telemetry message
this.maxEventsPortionToSend = 100;
this.pendingEvents = new _map2.default(); // started events: have TelemetryEvent::startTime only
this.readyEvents = []; // events ready to send
this.hasInitializationFinished = false;
this._canSendTelemetry = false;
this.config = config;
this.packetInterface = packetInterface;
}
// Keeping this private prevents the type declaration from being generated properly.
// Ideally, this should be private.
(0, _createClass3.default)(TelemetryTracker, [{
key: "addTelemetryEvent",
// Add complete event
value: function addTelemetryEvent(event) {
// Allow adding events before initialization.
if (!this.canSendTelemetry && this.hasInitializationFinished) {
return;
}
this.readyEvents.push(event);
}
// Add incomplete event (with either starting or ending time point)
}, {
key: "addPartialEvent",
value: function addPartialEvent(incompleteEvent, eventKey, point) {
logger_1.log.debug("Adding " + (point === TelemetryPoint.Start ? 'starting' : 'ending') + " timepoint for '" + eventKey + "' event");
var exists = this.pendingEvents.has(eventKey);
if (point === TelemetryPoint.Start) {
if (exists) {
logger_1.log.debug("Overwriting starting point for '" + eventKey + "' event");
}
this.pendingEvents.set(eventKey, incompleteEvent);
} else {
if (!exists) {
logger_1.log.error("Could not find started event for '" + eventKey + "' event");
return;
}
this.addTelemetryEvent(this.merge(this.pendingEvents.get(eventKey), incompleteEvent));
this.pendingEvents.delete(eventKey);
}
}
}, {
key: "getTelemetryToSend",
value: function getTelemetryToSend(sendingLimit) {
if (!this.canSendTelemetry || this.readyEvents.length == 0) {
return []; // Events are collected but not sent until telemetry is enabled
}
if (sendingLimit == EventSendingLimitation.MinEventsPortion && this.readyEvents.length < this.minEventsPortionToSend) {
return [];
}
return this.getTelemetryPortion(sendingLimit == EventSendingLimitation.AnyEventsIncludingUnfinished);
}
}, {
key: "getTelemetryPortion",
value: function getTelemetryPortion(includeUnfinished) {
var _this = this;
var eventsPortionToSend = Math.min(this.readyEvents.length, this.maxEventsPortionToSend);
var res = this.readyEvents.splice(0, eventsPortionToSend);
if (includeUnfinished && res.length < this.maxEventsPortionToSend) {
this.pendingEvents.forEach(function (value, key) {
if (res.length >= _this.maxEventsPortionToSend) {
return; // @fixme does not end the loop early
}
var event = _this.pendingEvents.get(key);
_this.pendingEvents.delete(key);
res.push(new TelemetryEventDescription("[UNFINISHED] " + event.title, // add prefix title to mark unfinished events for CleanSock
event.details, event.start, null, // Not ended, on sending will be replaced with now
event.type, event.id));
});
}
return res;
}
// Merging 2 partial events:
// use start.startTime & end.endTime.
// For other fields,
// if there are values in end, use them,
// else use values from start.
}, {
key: "merge",
value: function merge(start, end) {
return new TelemetryEventDescription(end.title ? end.title : start.title, end.details ? end.details : start.details, start.start, end.end, end.type ? end.type : start.type, end.id ? end.id : start.id);
}
}, {
key: "sendTelemetryIfMinimalPortionCollected",
value: function sendTelemetryIfMinimalPortionCollected() {
this.sendTelemetry(EventSendingLimitation.MinEventsPortion);
}
// NB: getTelemetryToSend will return non-empty array only if we have already received initReply
// and telemetry.v1 capability is enabled there.
}, {
key: "sendTelemetry",
value: function sendTelemetry(limit) {
var events = this.getTelemetryToSend(limit);
if (events.length === 0) {
return; // not enough telemetry data collected
}
try {
this.packetInterface.send(new telemetry_1.Telemetry(events.map(function (e) {
return e.toTelemetryEvent();
})));
} catch (err) {
logger_1.log.debug("Error while sending " + events.length + " telemetry events due to " + err + "; they will be resubmitted");
this.readyEvents = this.readyEvents.concat(events);
}
}
}, {
key: "isTelemetryEnabled",
get: function get() {
return this.config.confirmedCapabilities.has('telemetry.v1');
}
}, {
key: "canSendTelemetry",
get: function get() {
return this._canSendTelemetry && this.isTelemetryEnabled;
},
set: function set(enable) {
logger_1.log.debug("TelemetryTracker.canSendTelemetry: " + enable + " TelemetryTracker.isTelemetryEnabled: " + this.isTelemetryEnabled);
// We want to keep telemetry events added in advance but
// we need to purge events from previous connection when being disconnected
if (this._canSendTelemetry && !enable) {
this.pendingEvents.clear();
this.readyEvents = [];
}
this._canSendTelemetry = enable;
if (enable) {
this.sendTelemetry(EventSendingLimitation.AnyEvents);
}
if (enable && !this.hasInitializationFinished) {
this.hasInitializationFinished = true;
}
}
}]);
return TelemetryTracker;
}();
exports.TelemetryTracker = TelemetryTracker;
},{"../logger":269,"../protocol/messages/telemetry":281,"babel-runtime/core-js/map":33,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],285:[function(_dereq_,module,exports){
"use strict";
var _regenerator = _dereq_("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = _dereq_("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _promise = _dereq_("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.Upstream = void 0;
var logger_1 = _dereq_("../logger");
var twilsockerror_1 = _dereq_("../error/twilsockerror");
var twilsockupstreamerror_1 = _dereq_("../error/twilsockupstreamerror");
var Messages = _dereq_("../protocol/messages");
var transportunavailableerror_1 = _dereq_("../error/transportunavailableerror");
var REQUEST_TIMEOUT = 20000;
function isHttpSuccess(code) {
return code >= 200 && code < 300;
}
function isHttpReply(packet) {
return packet && packet.header && packet.header.http_status;
}
var Request = function Request() {
(0, _classCallCheck3.default)(this, Request);
};
function parseUri(uri) {
var match = uri.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)(\/[^?#]*)(\?[^#]*|)(#.*|)$/);
if (match) {
var uriStruct = {
protocol: match[1],
host: match[2],
hostname: match[3],
port: match[4],
pathname: match[5],
search: match[6],
hash: match[7],
params: null
};
if (uriStruct.search.length > 0) {
var paramsString = uriStruct.search.substring(1);
uriStruct.params = paramsString.split('&').map(function (el) {
return el.split('=');
}).reduce(function (prev, curr) {
if (!prev.hasOwnProperty(curr[0])) {
prev[curr[0]] = curr[1];
} else if (Array.isArray(prev[curr[0]])) {
prev[curr[0]].push(curr[1]);
} else {
prev[curr[0]] = [prev[curr[0]], curr[1]];
}
return prev;
}, {});
}
return uriStruct;
}
throw new twilsockerror_1.TwilsockError('Incorrect URI: ' + uri);
}
function twilsockAddress(method, uri) {
var parsedUri = parseUri(uri);
var to = {
method: method,
host: parsedUri.host,
path: parsedUri.pathname
};
if (parsedUri.params) {
to.params = parsedUri.params;
}
return to;
}
function twilsockParams(method, uri, headers, body) {
return {
to: twilsockAddress(method, uri),
headers: headers,
body: body
};
}
var Upstream = function () {
function Upstream(transport, twilsock, config) {
(0, _classCallCheck3.default)(this, Upstream);
this.config = config;
this.transport = transport;
this.pendingMessages = [];
this.twilsock = twilsock;
}
(0, _createClass3.default)(Upstream, [{
key: "saveMessage",
value: function saveMessage(message) {
var _this = this;
return new _promise2.default(function (resolve, reject) {
var requestDescriptor = {
message: message,
resolve: resolve,
reject: reject,
alreadyRejected: false,
timeout: setTimeout(function () {
logger_1.log.debug('request is timed out');
reject(new twilsockerror_1.TwilsockError('Twilsock: request timeout'));
requestDescriptor.alreadyRejected = true;
}, REQUEST_TIMEOUT)
};
_this.pendingMessages.push(requestDescriptor);
});
}
}, {
key: "sendPendingMessages",
value: function sendPendingMessages() {
var _this2 = this;
var _loop = function _loop() {
var request = _this2.pendingMessages[0];
// Do not send message if we've rejected its promise already
if (!request.alreadyRejected) {
try {
var message = request.message;
_this2.actualSend(message).then(function (response) {
return request.resolve(response);
}).catch(function (e) {
return request.reject(e);
});
clearTimeout(request.timeout);
} catch (e) {
logger_1.log.debug('Failed to send pending message', e);
return "break";
}
}
_this2.pendingMessages.splice(0, 1);
};
while (this.pendingMessages.length) {
var _ret = _loop();
if (_ret === "break") break;
}
}
}, {
key: "rejectPendingMessages",
value: function rejectPendingMessages() {
var _this3 = this;
this.pendingMessages.forEach(function (message) {
message.reject(new transportunavailableerror_1.TransportUnavailableError('Unable to connect: ' + _this3.twilsock.getTerminationReason));
clearTimeout(message.timeout);
});
this.pendingMessages.splice(0, this.pendingMessages.length);
}
}, {
key: "actualSend",
value: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(message) {
var address, headers, body, httpRequest, upstreamMessage, reply;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
address = message.to;
headers = message.headers;
body = message.body;
httpRequest = {
host: address.host,
path: address.path,
method: address.method,
params: address.params,
headers: headers
};
upstreamMessage = new Messages.Message(this.config.activeGrant, headers['Content-Type'] || 'application/json', httpRequest);
_context.next = 7;
return this.transport.sendWithReply(upstreamMessage, body);
case 7:
reply = _context.sent;
if (!(isHttpReply(reply) && !isHttpSuccess(reply.header.http_status.code))) {
_context.next = 10;
break;
}
throw new twilsockupstreamerror_1.TwilsockUpstreamError(reply.header.http_status.code, reply.header.http_status.status, reply.body);
case 10:
return _context.abrupt("return", {
status: reply.header.http_status,
headers: reply.header.http_headers,
body: reply.body
});
case 11:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function actualSend(_x) {
return _ref.apply(this, arguments);
}
return actualSend;
}()
/**
* Send an upstream message
* @param {Twilsock#Message} message Message structure with header, body and remote address
* @returns {Promise} Result from remote side
*/
}, {
key: "send",
value: function send(method, url) {
var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var body = arguments[3];
if (this.twilsock.isTerminalState) {
return _promise2.default.reject(new transportunavailableerror_1.TransportUnavailableError('Unable to connect: ' + this.twilsock.getTerminationReason));
}
var twilsockMessage = twilsockParams(method, url, headers, body);
if (!this.twilsock.isConnected) {
return this.saveMessage(twilsockMessage);
}
return this.actualSend(twilsockMessage);
}
}]);
return Upstream;
}();
exports.Upstream = Upstream;
},{"../error/transportunavailableerror":264,"../error/twilsockerror":265,"../error/twilsockupstreamerror":267,"../logger":269,"../protocol/messages":276,"babel-runtime/core-js/promise":42,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/regenerator":57}],286:[function(_dereq_,module,exports){
(function (global){(function (){
"use strict";
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TokenStorage = void 0;
var TokenStorage = function () {
function TokenStorage() {
(0, _classCallCheck3.default)(this, TokenStorage);
}
(0, _createClass3.default)(TokenStorage, null, [{
key: "storeToken",
value: function storeToken(continuationToken, productId) {
if (TokenStorage.canStore) {
TokenStorage.sessionStorage.setItem(TokenStorage.getKeyName(productId), continuationToken);
}
}
}, {
key: "getStoredToken",
value: function getStoredToken(productId) {
if (!TokenStorage.canStore) {
return null;
}
return TokenStorage.sessionStorage.getItem(TokenStorage.getKeyName(productId));
}
}, {
key: "initialize",
value: function initialize() {
if (TokenStorage.canStore) {
var flag = TokenStorage.sessionStorage.getItem(TokenStorage.initializedFlag);
// Duplicated tab, cleaning up all stored keys
if (flag) {
this.clear();
}
TokenStorage.sessionStorage.setItem(TokenStorage.initializedFlag, 'true');
// When leaving page or refreshing
TokenStorage.window.addEventListener('unload', function () {
TokenStorage.sessionStorage.removeItem(TokenStorage.initializedFlag);
});
}
}
}, {
key: "clear",
value: function clear() {
if (TokenStorage.canStore) {
var keyToDelete = [];
for (var i = 0; i < TokenStorage.sessionStorage.length; i++) {
var key = TokenStorage.sessionStorage.key(i);
// We manually removed startsWith here due to some problems with babel polyfill setup.
// Restore it when we figure out what's wrong.
//if (key.startsWith(TokenStorage.tokenStoragePrefix)) {
if (key.indexOf(TokenStorage.tokenStoragePrefix) === 0) {
keyToDelete.push(key);
}
}
keyToDelete.forEach(function (key) {
return TokenStorage.sessionStorage.removeItem(key);
});
TokenStorage.sessionStorage.removeItem(TokenStorage.initializedFlag);
}
}
}, {
key: "getKeyName",
value: function getKeyName(productId) {
return "" + TokenStorage.tokenStoragePrefix + productId;
}
}, {
key: "sessionStorage",
get: function get() {
try {
return global['sessionStorage'];
} catch (err) {
return null;
}
}
}, {
key: "window",
get: function get() {
try {
return global['window'];
} catch (err) {
return null;
}
}
}, {
key: "canStore",
get: function get() {
return TokenStorage.sessionStorage && TokenStorage.window;
}
}]);
return TokenStorage;
}();
exports.TokenStorage = TokenStorage;
TokenStorage.initializedFlag = 'twilio_twilsock_token_storage';
TokenStorage.tokenStoragePrefix = 'twilio_continuation_token_';
TokenStorage.initialize();
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],287:[function(_dereq_,module,exports){
"use strict";
var _promise = _dereq_("babel-runtime/core-js/promise");
var _promise2 = _interopRequireDefault(_promise);
var _regenerator = _dereq_("babel-runtime/regenerator");
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = _dereq_("babel-runtime/helpers/asyncToGenerator");
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _stringify = _dereq_("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
var _typeof2 = _dereq_("babel-runtime/helpers/typeof");
var _typeof3 = _interopRequireDefault(_typeof2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwilsockImpl = exports.TwilsockChannel = exports.Response = void 0;
var events_1 = _dereq_("events");
var StateMachine = _dereq_("javascript-state-machine");
var logger_1 = _dereq_("./logger");
var Messages = _dereq_("./protocol/messages");
var parser_1 = _dereq_("./parser");
var twilsockreplyerror_1 = _dereq_("./error/twilsockreplyerror");
var backoffretrier_1 = _dereq_("./backoffretrier");
var DISCONNECTING_TIMEOUT = 3000;
// Wraps asynchronous rescheduling
// Just makes it simpler to find these hacks over the code
function trampoline(f) {
setTimeout(f, 0);
}
/**
* Makes sure that body is properly stringified
*/
function preparePayload(payload) {
switch (typeof payload === "undefined" ? "undefined" : (0, _typeof3.default)(payload)) {
case 'undefined':
return '';
case 'object':
return (0, _stringify2.default)(payload);
default:
return payload;
}
}
var Request = function Request() {
(0, _classCallCheck3.default)(this, Request);
};
var Response = function Response() {
(0, _classCallCheck3.default)(this, Response);
};
exports.Response = Response;
/**
* Twilsock channel level protocol implementation
*/
var TwilsockChannel = function (_events_1$EventEmitte) {
(0, _inherits3.default)(TwilsockChannel, _events_1$EventEmitte);
function TwilsockChannel(websocket, transport, config) {
(0, _classCallCheck3.default)(this, TwilsockChannel);
var _this = (0, _possibleConstructorReturn3.default)(this, (TwilsockChannel.__proto__ || (0, _getPrototypeOf2.default)(TwilsockChannel)).call(this));
_this.terminalStates = ['disconnected', 'rejected'];
_this.lastEmittedState = undefined;
_this.tokenExpiredSasCode = 20104;
_this.terminationReason = 'Connection is not initialized';
_this.websocket = websocket;
_this.websocket.on('connected', function () {
return _this.fsm.socketConnected();
});
_this.websocket.on('disconnected', function (e) {
return _this.fsm.socketClosed();
});
_this.websocket.on('message', function (message) {
return _this.onIncomingMessage(message);
});
_this.websocket.on('socketError', function (e) {
return _this.emit('connectionError', { terminal: false, message: e.message, httpStatusCode: null, errorCode: null });
});
_this.transport = transport;
_this.config = config;
_this.retrier = new backoffretrier_1.BackoffRetrier(config.retryPolicy);
_this.retrier.on('attempt', function () {
return _this.retry();
});
_this.retrier.on('failed', function (err) {
logger_1.log.warn("Retrying failed: " + err.message);
_this.disconnect();
});
if (typeof window !== 'undefined' && typeof window.addEventListener !== 'undefined') {
window.addEventListener('online', function () {
logger_1.log.debug('Browser reported connectivity state: online');
_this.fsm.systemOnline();
});
window.addEventListener('offline', function () {
logger_1.log.debug('Browser reported connectivity state: offline');
_this.websocket.close();
_this.fsm.socketClosed();
});
}
_this.fsm = new StateMachine({
init: 'disconnected',
transitions: [{ name: 'userConnect', from: ['disconnected', 'rejected'], to: 'connecting' }, { name: 'userConnect', from: ['connecting', 'connected'] }, { name: 'userDisconnect', from: ['connecting', 'initialising', 'connected', 'updating', 'retrying', 'rejected', 'waitSocketClosed', 'waitOffloadSocketClosed'], to: 'disconnecting' }, { name: 'userRetry', from: ['retrying'], to: 'connecting' }, { name: 'socketConnected', from: ['connecting'], to: 'initialising' }, { name: 'socketClosed', from: ['connecting', 'initialising', 'connected', 'updating', 'error', 'waitOffloadSocketClosed'], to: 'retrying' }, { name: 'socketClosed', from: ['disconnecting'], to: 'disconnected' }, { name: 'socketClosed', from: ['waitSocketClosed'], to: 'disconnected' }, { name: 'socketClosed', from: ['rejected'], to: 'rejected' }, { name: 'initSuccess', from: ['initialising'], to: 'connected' }, { name: 'initError', from: ['initialising'], to: 'error' }, { name: 'tokenRejected', from: ['initialising', 'updating'], to: 'rejected' }, { name: 'protocolError', from: ['initialising', 'connected', 'updating'], to: 'error' }, { name: 'receiveClose', from: ['initialising', 'connected', 'updating'], to: 'waitSocketClosed' }, { name: 'receiveOffload', from: ['initialising', 'connected', 'updating'], to: 'waitOffloadSocketClosed' }, { name: 'unsupportedProtocol', from: ['initialising', 'connected', 'updating'], to: 'unsupported' }, { name: 'receiveFatalClose', from: ['initialising', 'connected', 'updating'], to: 'unsupported' }, { name: 'userUpdateToken', from: ['disconnected', 'rejected', 'connecting', 'retrying'], to: 'connecting' }, { name: 'userUpdateToken', from: ['connected'], to: 'updating' }, { name: 'updateSuccess', from: ['updating'], to: 'connected' }, { name: 'updateError', from: ['updating'], to: 'error' }, { name: 'userSend', from: ['connected'], to: 'connected' }, { name: 'systemOnline', from: ['retrying'], to: 'connecting' }],
methods: {
onConnecting: function onConnecting() {
_this.setupSocket();
_this.emit('connecting');
},
onEnterInitialising: function onEnterInitialising() {
_this.sendInit();
},
onLeaveInitialising: function onLeaveInitialising() {
_this.cancelInit();
},
onEnterUpdating: function onEnterUpdating() {
_this.sendUpdate();
},
onLeaveUpdating: function onLeaveUpdating() {
_this.cancelUpdate();
},
onEnterRetrying: function onEnterRetrying() {
_this.initRetry();
_this.emit('connecting');
},
onEnterConnected: function onEnterConnected() {
_this.resetBackoff();
_this.onConnected();
},
onUserUpdateToken: function onUserUpdateToken() {
_this.resetBackoff();
},
onTokenRejected: function onTokenRejected() {
_this.resetBackoff();
_this.closeSocket(true);
_this.finalizeSocket();
},
onUserDisconnect: function onUserDisconnect() {
_this.closeSocket(true);
},
onEnterDisconnecting: function onEnterDisconnecting() {
_this.startDisconnectTimer();
},
onLeaveDisconnecting: function onLeaveDisconnecting() {
_this.cancelDisconnectTimer();
},
onEnterWaitSocketClosed: function onEnterWaitSocketClosed() {
_this.startDisconnectTimer();
},
onLeaveWaitSocketClosed: function onLeaveWaitSocketClosed() {
_this.cancelDisconnectTimer();
},
onEnterWaitOffloadSocketClosed: function onEnterWaitOffloadSocketClosed() {
_this.startDisconnectTimer();
},
onLeaveWaitOffloadSocketClosed: function onLeaveWaitOffloadSocketClosed() {
_this.cancelDisconnectTimer();
},
onDisconnected: function onDisconnected() {
_this.resetBackoff();
_this.finalizeSocket();
},
onReceiveClose: function onReceiveClose(event, args) {
_this.onCloseReceived(args);
},
onReceiveOffload: function onReceiveOffload(event, args) {
logger_1.log.debug('onreceiveoffload: ', args);
_this.modifyBackoff(args.body);
_this.onCloseReceived(args.status);
},
onUnsupported: function onUnsupported() {
_this.closeSocket(true);
_this.finalizeSocket();
},
onError: function onError(lifecycle, graceful) {
_this.closeSocket(graceful);
_this.finalizeSocket();
},
onEnterState: function onEnterState(event) {
if (event.from !== 'none') {
_this.changeState(event);
}
},
onInvalidTransition: function onInvalidTransition(transition, from, to) {
logger_1.log.warn('FSM: unexpected transition', from, to);
}
}
});
return _this;
}
(0, _createClass3.default)(TwilsockChannel, [{
key: "changeState",
value: function changeState(event) {
logger_1.log.debug("FSM: " + event.transition + ": " + event.from + " --> " + event.to);
if (this.lastEmittedState !== this.state) {
this.lastEmittedState = this.state;
this.emit('stateChanged', this.state);
}
}
}, {
key: "resetBackoff",
value: function resetBackoff() {
logger_1.log.trace('resetBackoff');
this.retrier.stop();
}
}, {
key: "modifyBackoff",
value: function modifyBackoff(body) {
logger_1.log.trace('modifyBackoff', body);
var backoffPolicy = body ? body.backoff_policy : null;
if (backoffPolicy && typeof backoffPolicy.reconnect_min_ms === 'number') {
this.retrier.modifyBackoff(backoffPolicy.reconnect_min_ms);
}
}
}, {
key: "startDisconnectTimer",
value: function startDisconnectTimer() {
var _this2 = this;
logger_1.log.trace('startDisconnectTimer');
if (this.disconnectingTimer) {
clearTimeout(this.disconnectingTimer);
this.disconnectingTimer = null;
}
this.disconnectingTimer = setTimeout(function () {
logger_1.log.debug('disconnecting is timed out');
_this2.closeSocket(true);
}, DISCONNECTING_TIMEOUT);
}
}, {
key: "cancelDisconnectTimer",
value: function cancelDisconnectTimer() {
logger_1.log.trace('cancelDisconnectTimer');
if (this.disconnectingTimer) {
clearTimeout(this.disconnectingTimer);
this.disconnectingTimer = null;
}
}
}, {
key: "initRetry",
value: function initRetry() {
logger_1.log.debug('initRetry');
if (this.retrier.inProgress) {
this.retrier.attemptFailed();
} else {
this.retrier.start();
}
}
}, {
key: "retry",
value: function retry() {
if (this.fsm.state != 'connecting') {
logger_1.log.trace('retry');
this.websocket.close();
this.fsm.userRetry();
} else {
logger_1.log.trace('can\t retry as already connecting');
}
}
}, {
key: "onConnected",
value: function onConnected() {
this.emit('connected');
}
}, {
key: "finalizeSocket",
value: function finalizeSocket() {
logger_1.log.trace('finalizeSocket');
this.websocket.close();
this.emit('disconnected');
if (this.disconnectedPromiseResolve) {
this.disconnectedPromiseResolve();
this.disconnectedPromiseResolve = null;
}
}
}, {
key: "setupSocket",
value: function setupSocket() {
logger_1.log.trace('setupSocket:', this.config.token);
this.emit('beforeConnect'); // This is used by client to record startup telemetry event
this.websocket.connect();
}
}, {
key: "onIncomingMessage",
value: function onIncomingMessage(message) {
var _parser_1$Parser$pars = parser_1.Parser.parse(message),
method = _parser_1$Parser$pars.method,
header = _parser_1$Parser$pars.header,
payload = _parser_1$Parser$pars.payload;
if (method !== 'reply') {
this.confirmReceiving(header);
}
if (method === 'notification') {
this.emit('message', header.message_type, payload);
} else if (header.method === 'reply') {
this.transport.processReply({
id: header.id,
status: header.status,
header: header,
body: payload
});
} else if (header.method === 'client_update') {
if (header.client_update_type === 'token_about_to_expire') {
this.emit('tokenAboutToExpire');
}
} else if (header.method === 'close') {
if (header.status.code === 308) {
logger_1.log.debug('Connection has been offloaded');
this.fsm.receiveOffload({ status: header.status.status, body: payload });
} else if (header.status.code === 406) {
// Not acceptable message
var _message = "Server closed connection because can't parse protocol: " + (0, _stringify2.default)(header.status);
this.emitReplyConnectionError(_message, header, true);
logger_1.log.error(_message);
this.fsm.receiveFatalClose();
} else if (header.status.code === 417) {
// Protocol error
logger_1.log.error("Server closed connection because can't parse client reply: " + (0, _stringify2.default)(header.status));
this.fsm.receiveFatalClose(header.status.status);
} else if (header.status.code === 410) {
// Expired token
logger_1.log.warn("Server closed connection: " + (0, _stringify2.default)(header.status));
this.fsm.receiveClose(header.status.status);
this.emit('tokenExpired');
} else if (header.status.code === 401) {
// Authentication fail
logger_1.log.error("Server closed connection: " + (0, _stringify2.default)(header.status));
this.fsm.receiveClose(header.status.status);
} else {
logger_1.log.warn('unexpected message: ', header.status);
// Try to reconnect
this.fsm.receiveOffload({ status: header.status.status, body: null });
}
}
}
}, {
key: "sendInit",
value: function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
var reply, isTerminalError;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
logger_1.log.trace('sendInit');
_context.prev = 1;
this.emit('beforeSendInit'); // This is used by client to record startup telemetry event
_context.next = 5;
return this.transport.sendInit();
case 5:
reply = _context.sent;
this.config.updateContinuationToken(reply.continuationToken);
this.config.confirmedCapabilities = reply.confirmedCapabilities;
this.fsm.initSuccess(reply);
this.emit('initialized', reply);
this.emit('tokenUpdated');
_context.next = 17;
break;
case 13:
_context.prev = 13;
_context.t0 = _context["catch"](1);
if (_context.t0 instanceof twilsockreplyerror_1.TwilsockReplyError) {
isTerminalError = false;
logger_1.log.warn("Init rejected by server: " + (0, _stringify2.default)(_context.t0.reply.status));
this.emit('sendInitFailed'); // This is used by client to record startup telemetry event
// @todo emit telemetry from inside "if" below for more granularity...
if (_context.t0.reply.status.code === 401 || _context.t0.reply.status.code === 403) {
isTerminalError = true;
this.fsm.tokenRejected(_context.t0.reply.status);
if (_context.t0.reply.status.errorCode === this.tokenExpiredSasCode) {
this.emit('tokenExpired');
}
} else if (_context.t0.reply.status.code === 429) {
this.modifyBackoff(_context.t0.reply.body);
this.fsm.initError(true);
} else if (_context.t0.reply.status.code === 500) {
this.fsm.initError(false);
} else {
this.fsm.initError(true);
}
this.emitReplyConnectionError(_context.t0.message, _context.t0.reply, isTerminalError);
} else {
this.terminationReason = _context.t0.message;
this.emit('connectionError', { terminal: true, message: _context.t0.message, httpStatusCode: null, errorCode: null });
this.fsm.initError(true);
}
this.emit('tokenUpdated', _context.t0);
case 17:
case "end":
return _context.stop();
}
}
}, _callee, this, [[1, 13]]);
}));
function sendInit() {
return _ref.apply(this, arguments);
}
return sendInit;
}()
}, {
key: "sendUpdate",
value: function () {
var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
var message, reply, isTerminalError;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
logger_1.log.trace('sendUpdate');
message = new Messages.Update(this.config.token);
_context2.prev = 2;
_context2.next = 5;
return this.transport.sendWithReply(message);
case 5:
reply = _context2.sent;
this.fsm.updateSuccess(reply.body);
this.emit('tokenUpdated');
_context2.next = 14;
break;
case 10:
_context2.prev = 10;
_context2.t0 = _context2["catch"](2);
if (_context2.t0 instanceof twilsockreplyerror_1.TwilsockReplyError) {
isTerminalError = false;
logger_1.log.warn("Token update rejected by server: " + (0, _stringify2.default)(_context2.t0.reply.status));
if (_context2.t0.reply.status.code === 401 || _context2.t0.reply.status.code === 403) {
isTerminalError = true;
this.fsm.tokenRejected(_context2.t0.reply.status);
if (_context2.t0.reply.status.errorCode === this.tokenExpiredSasCode) {
this.emit('tokenExpired');
}
} else if (_context2.t0.reply.status.code === 429) {
this.modifyBackoff(_context2.t0.reply.body);
this.fsm.updateError(_context2.t0.reply.status);
} else {
this.fsm.updateError(_context2.t0.reply.status);
}
this.emitReplyConnectionError(_context2.t0.message, _context2.t0.reply, isTerminalError);
} else {
this.emit('error', false, _context2.t0.message, null, null);
this.fsm.updateError(_context2.t0);
}
this.emit('tokenUpdated', _context2.t0);
case 14:
case "end":
return _context2.stop();
}
}
}, _callee2, this, [[2, 10]]);
}));
function sendUpdate() {
return _ref2.apply(this, arguments);
}
return sendUpdate;
}()
}, {
key: "emitReplyConnectionError",
value: function emitReplyConnectionError(message, header, terminal) {
var description = header.status && header.status.description ? header.status.description : message;
var httpStatusCode = header.status.code;
var errorCode = header.status && header.status.errorCode ? header.status.errorCode : null;
if (terminal) {
this.terminationReason = description;
}
this.emit('connectionError', { terminal: terminal, message: description, httpStatusCode: httpStatusCode, errorCode: errorCode });
}
}, {
key: "cancelInit",
value: function cancelInit() {
logger_1.log.trace('cancelInit');
// TODO: implement
}
}, {
key: "cancelUpdate",
value: function cancelUpdate() {
logger_1.log.trace('cancelUpdate');
// TODO: implement
}
/**
* Should be called for each message to confirm it received
*/
}, {
key: "confirmReceiving",
value: function confirmReceiving(messageHeader) {
logger_1.log.trace('confirmReceiving');
try {
//@todo send telemetry events AnyEvents
this.transport.send(new Messages.Reply(messageHeader.id));
} catch (e) {
logger_1.log.debug('failed to confirm packet receiving', e);
}
}
/**
* Shutdown connection
*/
}, {
key: "closeSocket",
value: function closeSocket(graceful) {
var _this3 = this;
logger_1.log.trace("closeSocket (graceful: " + graceful + ")");
if (graceful && this.transport.isConnected) {
this.transport.sendClose();
}
this.websocket.close();
trampoline(function () {
return _this3.fsm.socketClosed();
});
}
/**
* Initiate the twilsock connection
* If already connected, it does nothing
*/
}, {
key: "connect",
value: function connect() {
logger_1.log.trace('connect');
this.fsm.userConnect();
}
/**
* Close twilsock connection
* If already disconnected, it does nothing
*/
}, {
key: "disconnect",
value: function disconnect() {
var _this4 = this;
logger_1.log.trace('disconnect');
if (this.fsm.is('disconnected')) {
return _promise2.default.resolve();
}
return new _promise2.default(function (resolve) {
_this4.disconnectedPromiseResolve = resolve;
_this4.fsm.userDisconnect();
});
}
/**
* Update fpa token for twilsock connection
*/
}, {
key: "updateToken",
value: function updateToken(token) {
var _this5 = this;
logger_1.log.trace('updateToken:', token);
return new _promise2.default(function (resolve, reject) {
_this5.once('tokenUpdated', function (e) {
if (e) {
reject(e);
} else {
resolve();
}
});
_this5.fsm.userUpdateToken();
});
}
}, {
key: "onCloseReceived",
value: function onCloseReceived(reason) {
this.websocket.close();
}
}, {
key: "isConnected",
get: function get() {
return this.state === 'connected' && this.websocket.isConnected;
}
}, {
key: "state",
get: function get() {
switch (this.fsm.state) {
case 'connecting':
case 'initialising':
case 'retrying':
case 'error':
return 'connecting';
case 'updating':
case 'connected':
return 'connected';
case 'rejected':
return 'rejected';
case 'disconnecting':
case 'waitSocketClosed':
case 'waitOffloadSocketClosed':
return 'disconnecting';
case 'disconnected':
default:
return 'disconnected';
}
}
}, {
key: "isTerminalState",
get: function get() {
return this.terminalStates.indexOf(this.fsm.state) !== -1;
}
}, {
key: "getTerminationReason",
get: function get() {
return this.terminationReason;
}
}]);
return TwilsockChannel;
}(events_1.EventEmitter);
exports.TwilsockChannel = TwilsockChannel;
exports.TwilsockImpl = TwilsockChannel;
},{"./backoffretrier":260,"./error/twilsockreplyerror":266,"./logger":269,"./parser":273,"./protocol/messages":276,"babel-runtime/core-js/json/stringify":32,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/core-js/promise":42,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"babel-runtime/helpers/typeof":56,"babel-runtime/regenerator":57,"events":200,"javascript-state-machine":202}],288:[function(_dereq_,module,exports){
(function (global){(function (){
"use strict";
var _getPrototypeOf = _dereq_("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = _dereq_("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = _dereq_("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebSocketChannel = void 0;
var events_1 = _dereq_("events");
var logger_1 = _dereq_("./logger");
var WebSocketChannel = function (_events_1$EventEmitte) {
(0, _inherits3.default)(WebSocketChannel, _events_1$EventEmitte);
function WebSocketChannel(url) {
(0, _classCallCheck3.default)(this, WebSocketChannel);
var _this = (0, _possibleConstructorReturn3.default)(this, (WebSocketChannel.__proto__ || (0, _getPrototypeOf2.default)(WebSocketChannel)).call(this));
_this.url = url;
_this.WebSocket = global['WebSocket'] || global['MozWebSocket'] || _dereq_('ws');
return _this;
}
(0, _createClass3.default)(WebSocketChannel, [{
key: "connect",
value: function connect() {
var _this2 = this;
logger_1.log.trace('connecting to socket');
var socket = new this.WebSocket(this.url);
socket.binaryType = 'arraybuffer';
socket.onopen = function () {
logger_1.log.debug("socket opened " + _this2.url);
_this2.emit('connected');
};
socket.onclose = function (e) {
logger_1.log.debug('socket closed', e);
_this2.emit('disconnected', e);
};
socket.onerror = function (e) {
logger_1.log.debug('error:', e);
_this2.emit('socketError', e);
};
socket.onmessage = function (message) {
_this2.emit('message', message.data);
};
this.socket = socket;
}
}, {
key: "send",
value: function send(message) {
this.socket.send(message);
}
}, {
key: "close",
value: function close() {
logger_1.log.trace('closing socket');
if (this.socket) {
this.socket.onopen = null;
this.socket.onclose = null;
this.socket.onerror = null;
this.socket.onmessage = null;
try {
this.socket.close();
} finally {}
}
}
}, {
key: "isConnected",
get: function get() {
return this.socket && this.socket.readyState === 1;
}
}]);
return WebSocketChannel;
}(events_1.EventEmitter);
exports.WebSocketChannel = WebSocketChannel;
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./logger":269,"babel-runtime/core-js/object/get-prototype-of":39,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"events":200,"ws":58}],289:[function(_dereq_,module,exports){
var v1 = _dereq_('./v1');
var v4 = _dereq_('./v4');
var uuid = v4;
uuid.v1 = v1;
uuid.v4 = v4;
module.exports = uuid;
},{"./v1":292,"./v4":293}],290:[function(_dereq_,module,exports){
/**
* Convert array of 16 byte values to UUID string format of the form:
* XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
*/
var byteToHex = [];
for (var i = 0; i < 256; ++i) {
byteToHex[i] = (i + 0x100).toString(16).substr(1);
}
function bytesToUuid(buf, offset) {
var i = offset || 0;
var bth = byteToHex;
// join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
return ([
bth[buf[i++]], bth[buf[i++]],
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]], '-',
bth[buf[i++]], bth[buf[i++]],
bth[buf[i++]], bth[buf[i++]],
bth[buf[i++]], bth[buf[i++]]
]).join('');
}
module.exports = bytesToUuid;
},{}],291:[function(_dereq_,module,exports){
// Unique ID creation requires a high quality random # generator. In the
// browser this is a little complicated due to unknown quality of Math.random()
// and inconsistent support for the `crypto` API. We do the best we can via
// feature-detection
// getRandomValues needs to be invoked in a context where "this" is a Crypto
// implementation. Also, find the complete implementation of crypto on IE11.
var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||
(typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));
if (getRandomValues) {
// WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto
var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef
module.exports = function whatwgRNG() {
getRandomValues(rnds8);
return rnds8;
};
} else {
// Math.random()-based (RNG)
//
// If all else fails, use Math.random(). It's fast, but is of unspecified
// quality.
var rnds = new Array(16);
module.exports = function mathRNG() {
for (var i = 0, r; i < 16; i++) {
if ((i & 0x03) === 0) r = Math.random() * 0x100000000;
rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
}
return rnds;
};
}
},{}],292:[function(_dereq_,module,exports){
var rng = _dereq_('./lib/rng');
var bytesToUuid = _dereq_('./lib/bytesToUuid');
// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
var _nodeId;
var _clockseq;
// Previous uuid creation time
var _lastMSecs = 0;
var _lastNSecs = 0;
// See https://github.com/uuidjs/uuid for API details
function v1(options, buf, offset) {
var i = buf && offset || 0;
var b = buf || [];
options = options || {};
var node = options.node || _nodeId;
var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;
// node and clockseq need to be initialized to random values if they're not
// specified. We do this lazily to minimize issues related to insufficient
// system entropy. See #189
if (node == null || clockseq == null) {
var seedBytes = rng();
if (node == null) {
// Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
node = _nodeId = [
seedBytes[0] | 0x01,
seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]
];
}
if (clockseq == null) {
// Per 4.2.2, randomize (14 bit) clockseq
clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
}
}
// UUID timestamps are 100 nano-second units since the Gregorian epoch,
// (1582-10-15 00:00). JSNumbers aren't precise enough for this, so
// time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
// (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();
// Per 4.2.1.2, use count of uuid's generated during the current clock
// cycle to simulate higher resolution clock
var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;
// Time since last uuid creation (in msecs)
var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
// Per 4.2.1.2, Bump clockseq on clock regression
if (dt < 0 && options.clockseq === undefined) {
clockseq = clockseq + 1 & 0x3fff;
}
// Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
// time interval
if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
nsecs = 0;
}
// Per 4.2.1.2 Throw error if too many uuids are requested
if (nsecs >= 10000) {
throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
}
_lastMSecs = msecs;
_lastNSecs = nsecs;
_clockseq = clockseq;
// Per 4.1.4 - Convert from unix epoch to Gregorian epoch
msecs += 12219292800000;
// `time_low`
var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
b[i++] = tl >>> 24 & 0xff;
b[i++] = tl >>> 16 & 0xff;
b[i++] = tl >>> 8 & 0xff;
b[i++] = tl & 0xff;
// `time_mid`
var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
b[i++] = tmh >>> 8 & 0xff;
b[i++] = tmh & 0xff;
// `time_high_and_version`
b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
b[i++] = tmh >>> 16 & 0xff;
// `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
b[i++] = clockseq >>> 8 | 0x80;
// `clock_seq_low`
b[i++] = clockseq & 0xff;
// `node`
for (var n = 0; n < 6; ++n) {
b[i + n] = node[n];
}
return buf ? buf : bytesToUuid(b);
}
module.exports = v1;
},{"./lib/bytesToUuid":290,"./lib/rng":291}],293:[function(_dereq_,module,exports){
var rng = _dereq_('./lib/rng');
var bytesToUuid = _dereq_('./lib/bytesToUuid');
function v4(options, buf, offset) {
var i = buf && offset || 0;
if (typeof(options) == 'string') {
buf = options === 'binary' ? new Array(16) : null;
options = null;
}
options = options || {};
var rnds = options.random || (options.rng || rng)();
// Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
rnds[6] = (rnds[6] & 0x0f) | 0x40;
rnds[8] = (rnds[8] & 0x3f) | 0x80;
// Copy bytes to buffer, if provided
if (buf) {
for (var ii = 0; ii < 16; ++ii) {
buf[i + ii] = rnds[ii];
}
}
return buf || bytesToUuid(rnds);
}
module.exports = v4;
},{"./lib/bytesToUuid":290,"./lib/rng":291}],294:[function(_dereq_,module,exports){
module.exports={
"name": "@twilio/conversations",
"version": "1.1.0",
"description": "Twilio Conversations client library",
"main": "lib/index.js",
"browser": "browser/index.js",
"types": "./lib/client.d.ts",
"author": "Twilio",
"license": "MIT",
"dependencies": {
"twilio-mcs-client": "^0.3.3",
"twilio-notifications": "^0.5.11",
"twilio-sync": "^0.12.4",
"twilsock": "^0.5.14",
"babel-runtime": "^6.26.0",
"iso8601-duration": "^1.2.0",
"loglevel": "^1.6.6",
"operation-retrier": "^3.0.0",
"platform": "^1.3.5",
"rfc6902": "^3.0.2",
"uuid": "^3.3.2"
},
"devDependencies": {
"@types/chai": "^4.2.5",
"@types/chai-as-promised": "^7.1.2",
"@types/chai-string": "^1.4.1",
"@types/core-js": "^2.5.0",
"@types/mocha": "^5.2.7",
"@types/node": "^12.12.12",
"@types/sinon": "^7.5.1",
"@types/sinon-chai": "^3.2.2",
"async": "^3.0.1",
"async-test-tools": "^1.0.7",
"babel-core": "^6.26.0",
"babel-plugin-transform-builtin-extend": "^1.1.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.6.1",
"babelify": "^8.0.0",
"backoff": "^2.5.0",
"browserify": "^16.2.3",
"browserify-replace": "^1.0.0",
"browserslist": "^4.13.0",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",
"chai-string": "^1.5.0",
"cheerio": "^1.0.0-rc.2",
"cross-env": "^5.2.0",
"del": "^5.1.0",
"fancy-log": "^1.3.3",
"fs": "0.0.2",
"gulp": "^4.0.2",
"gulp-babel": "^7.0.1",
"gulp-derequire": "^2.1.0",
"gulp-if": "^2.0.2",
"gulp-insert": "^0.5.0",
"gulp-rename": "^1.4.0",
"gulp-sourcemaps": "^2.6.5",
"gulp-sri": "^0.3.1",
"gulp-tap": "^1.0.1",
"gulp-tslint": "^8.1.4",
"gulp-typescript": "^5.0.1",
"gulp-uglify-es": "^1.0.4",
"ink-docstrap": "^1.3.2",
"isomorphic-form-data": "^2.0.0",
"jsdoc": "~3.5.5",
"jsdoc-strip-async-await": "^0.1.0",
"mocha": "^6.2.2",
"mocha.parallel": "^0.15.6",
"node-fetch": "^2.6.0",
"nyc": "^14.1.1",
"path": "^0.12.7",
"sinon": "^7.5.0",
"sinon-chai": "^3.3.0",
"source-map-explorer": "^2.1.1",
"ts-node": "^8.5.2",
"tslint": "^5.20.1",
"twilio": "^3.37.1",
"typescript": "^3.7.2",
"uglify-save-license": "^0.4.1",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"browserslist": [
"IE 11",
"last 3 Chrome versions",
"last 3 Firefox versions",
"last 3 Safari versions",
"last 3 Edge versions",
"last 2 iOS version",
"last 2 ChromeAndroid version",
"last 2 FirefoxAndroid version",
"last 2 Samsung versions",
"last 2 UCAndroid versions"
]
}
},{}]},{},[2])(2)
});