} 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 _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(key, mutator, itemMetadataUpdates) {
var _this3 = this;
var input;
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
input = itemMetadataUpdates || {};
utils_1.validateOptionalTtl(input.ttl);
return _context4.abrupt("return", this.updateMergingQueue.add(key, input, function (input) {
return _this3._putItemWithIfMatch(key, mutator, input.ttl);
}));
case 3:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
function mutate(_x6, _x7, _x8) {
return _ref4.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 _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(key, obj, itemMetadataUpdates) {
return _regenerator2.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
return _context5.abrupt("return", this.mutate(key, function (remote) {
return (0, _assign2.default)(remote, obj);
}, itemMetadataUpdates));
case 1:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
function update(_x9, _x10, _x11) {
return _ref5.apply(this, arguments);
}
return update;
}()
}, {
key: "_putItemUnconditionally",
value: function () {
var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(key, data, ttl) {
var result, item;
return _regenerator2.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return this._putItemToServer(key, data, undefined, ttl);
case 2:
result = _context6.sent;
item = result.item;
this._handleItemMutated(item.key, item.url, item.last_event_id, item.revision, item.data, item.date_updated, item.date_expires, result.added, false);
return _context6.abrupt("return", this.cache.get(item.key));
case 6:
case "end":
return _context6.stop();
}
}
}, _callee6, this);
}));
function _putItemUnconditionally(_x12, _x13, _x14) {
return _ref6.apply(this, arguments);
}
return _putItemUnconditionally;
}()
}, {
key: "_putItemWithIfMatch",
value: function () {
var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(key, mutatorFunction, ttl) {
var currentItem, data, ifMatch, result, item;
return _regenerator2.default.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return this.get(key).catch(function (error) {
if (error.status === 404) {
// PUT /Items/myKey with `If-Match: -1` acts as "put if not exists"
return new mapitem_1.MapItem({ key: key, data: {}, last_event_id: -1, revision: '-1', url: null, date_updated: null, date_expires: null });
} else {
throw error;
}
});
case 2:
currentItem = _context7.sent;
data = mutatorFunction(utils_1.deepClone(currentItem.value));
if (!data) {
_context7.next = 26;
break;
}
ifMatch = currentItem.revision;
_context7.prev = 6;
_context7.next = 9;
return this._putItemToServer(key, data, ifMatch, ttl);
case 9:
result = _context7.sent;
item = result.item;
this._handleItemMutated(item.key, item.url, item.last_event_id, item.revision, item.data, item.date_updated, item.date_expires, result.added, false);
return _context7.abrupt("return", this.cache.get(item.key));
case 15:
_context7.prev = 15;
_context7.t0 = _context7["catch"](6);
if (!(_context7.t0.status === 412)) {
_context7.next = 23;
break;
}
_context7.next = 20;
return this._getItemFromServer(key);
case 20:
return _context7.abrupt("return", this._putItemWithIfMatch(key, mutatorFunction, ttl));
case 23:
throw _context7.t0;
case 24:
_context7.next = 27;
break;
case 26:
return _context7.abrupt("return", currentItem);
case 27:
case "end":
return _context7.stop();
}
}
}, _callee7, this, [[6, 15]]);
}));
function _putItemWithIfMatch(_x15, _x16, _x17) {
return _ref7.apply(this, arguments);
}
return _putItemWithIfMatch;
}()
}, {
key: "_putItemToServer",
value: function () {
var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(key, data, ifMatch, ttl) {
var url, requestBody, response, mapItemDescriptor, added;
return _regenerator2.default.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
url = new utils_1.UriBuilder(this.links.items).pathSegment(key).build();
requestBody = { data: data };
if (typeof ttl === 'number') {
requestBody.ttl = ttl;
}
_context8.prev = 3;
_context8.next = 6;
return this.services.network.put(url, requestBody, ifMatch);
case 6:
response = _context8.sent;
mapItemDescriptor = response.body;
mapItemDescriptor.data = data; // The server does not return the data in the response
mapItemDescriptor.date_updated = new Date(mapItemDescriptor.date_updated);
added = response.status.code === 201;
return _context8.abrupt("return", { added: added, item: mapItemDescriptor });
case 14:
_context8.prev = 14;
_context8.t0 = _context8["catch"](3);
if (_context8.t0.status === 404) {
this.onRemoved(false);
}
throw _context8.t0;
case 18:
case "end":
return _context8.stop();
}
}
}, _callee8, this, [[3, 14]]);
}));
function _putItemToServer(_x18, _x19, _x20, _x21) {
return _ref8.apply(this, arguments);
}
return _putItemToServer;
}()
/**
* 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 _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(key) {
var item, response;
return _regenerator2.default.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
if (!(typeof key === 'undefined')) {
_context9.next = 2;
break;
}
throw new Error('Key argument is invalid');
case 2:
_context9.next = 4;
return this.get(key);
case 4:
item = _context9.sent;
_context9.next = 7;
return this.services.network.delete(item.uri);
case 7:
response = _context9.sent;
this._handleItemRemoved(key, response.body.last_event_id, undefined, new Date(response.body.date_updated), false);
case 9:
case "end":
return _context9.stop();
}
}
}, _callee9, this);
}));
function remove(_x22) {
return _ref9.apply(this, arguments);
}
return remove;
}()
/**
* @private
*/
}, {
key: "queryItems",
value: function () {
var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(args) {
var _this4 = this;
var uri, response, items, meta;
return _regenerator2.default.wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
args = args || {};
uri = new utils_1.UriBuilder(this.links.items).queryParam('From', args.from).queryParam('PageSize', args.limit).queryParam('Key', args.key).queryParam('PageToken', args.pageToken).queryParam('Order', args.order).build();
_context10.next = 4;
return this.services.network.get(uri);
case 4:
response = _context10.sent;
items = response.body.items.map(function (el) {
el.date_updated = new Date(el.date_updated);
var itemInCache = _this4.cache.get(el.key);
if (itemInCache) {
_this4._handleItemMutated(el.key, el.url, el.last_event_id, el.revision, el.data, el.date_updated, el.date_expires, false, true);
} else {
_this4.cache.store(el.key, new mapitem_1.MapItem(el), el.last_event_id);
}
return _this4.cache.get(el.key);
});
meta = response.body.meta;
return _context10.abrupt("return", new paginator_1.Paginator(items, function (pageToken) {
return _this4.queryItems({ pageToken: pageToken });
}, meta.previous_token, meta.next_token));
case 8:
case "end":
return _context10.stop();
}
}
}, _callee10, this);
}));
function queryItems(_x23) {
return _ref10.apply(this, arguments);
}
return queryItems;
}()
/**
* 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 _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(args) {
return _regenerator2.default.wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
args = args || {};
utils_1.validatePageSize(args.pageSize);
args.limit = args.pageSize || args.limit || 50;
args.order = args.order || 'asc';
return _context11.abrupt("return", this.queryItems(args));
case 5:
case "end":
return _context11.stop();
}
}
}, _callee11, this);
}));
function getItems(_x24) {
return _ref11.apply(this, arguments);
}
return getItems;
}()
/**
* Enumerate all items in this Map.
* This always triggers server interaction when being called for the first time on a Map; this may be latent.
* This method not supported now and not meant to be used externally.
* @param {Function} handler Function to handle each argument.
* @private
*/
}, {
key: "forEach",
value: function forEach(handler) {
var _this5 = this;
return new _promise2.default(function (resolve, reject) {
function processPage(page) {
page.items.forEach(function (x) {
return handler(x);
});
if (page.hasNextPage) {
page.nextPage().then(processPage).catch(reject);
} else {
resolve();
}
}
_this5.queryItems().then(processPage).catch(reject);
});
}
}, {
key: "shouldIgnoreEvent",
value: function shouldIgnoreEvent(key, eventId) {
return this.cache.isKnown(key, eventId);
}
/**
* Handle update from the server
* @private
*/
}, {
key: "_update",
value: function _update(update, isStrictlyOrdered) {
update.date_created = new Date(update.date_created);
switch (update.type) {
case 'map_item_added':
case 'map_item_updated':
{
this._handleItemMutated(update.item_key, update.item_url, update.id, update.item_revision, update.item_data, update.date_created, undefined, // orchestration events do not include date_expires
update.type === 'map_item_added', true);
}
break;
case 'map_item_removed':
{
this._handleItemRemoved(update.item_key, update.id, update.item_data, update.date_created, true);
}
break;
case 'map_removed':
{
this.onRemoved(false);
}
break;
}
if (isStrictlyOrdered) {
this._advanceLastEventId(update.id, update.map_revision);
}
}
}, {
key: "_advanceLastEventId",
value: function _advanceLastEventId(eventId, revision) {
if (this.lastEventId < eventId) {
this.descriptor.last_event_id = eventId;
if (revision) {
this.descriptor.revision = revision;
}
}
}
}, {
key: "_updateRootDateUpdated",
value: function _updateRootDateUpdated(dateUpdated) {
if (!this.descriptor.date_updated || dateUpdated.getTime() > this.descriptor.date_updated.getTime()) {
this.descriptor.date_updated = dateUpdated;
this.services.storage.update(this.type, this.sid, this.uniqueName, { date_updated: dateUpdated });
}
}
}, {
key: "_handleItemMutated",
value: function _handleItemMutated(key, url, lastEventId, revision, value, dateUpdated, dateExpires, added, remote) {
if (this.shouldIgnoreEvent(key, lastEventId)) {
logger_1.default.trace('Item ', key, ' update skipped, current:', this.lastEventId, ', remote:', lastEventId);
return;
} else {
this._updateRootDateUpdated(dateUpdated);
var item = this.cache.get(key);
if (!item) {
item = new mapitem_1.MapItem({ key: key, url: url, last_event_id: lastEventId, revision: revision, data: value, date_updated: dateUpdated, date_expires: dateExpires });
this.cache.store(key, item, lastEventId);
this.emitItemMutationEvent(item, remote, added);
} else if (item.lastEventId < lastEventId) {
item.update(lastEventId, revision, value, dateUpdated);
if (dateExpires !== undefined) {
item.updateDateExpires(dateExpires);
}
this.emitItemMutationEvent(item, remote, false);
}
}
}
}, {
key: "emitItemMutationEvent",
value: function emitItemMutationEvent(item, remote, added) {
var eventName = added ? 'itemAdded' : 'itemUpdated';
this.emit(eventName, { item: item, isLocal: !remote });
}
/**
* @private
*/
}, {
key: "_handleItemRemoved",
value: function _handleItemRemoved(key, eventId, oldData, dateUpdated, remote) {
this._updateRootDateUpdated(dateUpdated);
this.cache.delete(key, eventId);
this.emit('itemRemoved', { key: key, isLocal: !remote, value: oldData });
}
}, {
key: "onRemoved",
value: function onRemoved(locally) {
this._unsubscribe();
this.removalHandler(this.type, this.sid, this.uniqueName);
//
// Should also do some cleanup here
this.emit('removed', { isLocal: locally });
}
/**
* 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 _ref12 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(ttl) {
var requestBody, response;
return _regenerator2.default.wrap(function _callee12$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
utils_1.validateMandatoryTtl(ttl);
_context12.prev = 1;
requestBody = { ttl: ttl };
_context12.next = 5;
return this.services.network.post(this.uri, requestBody);
case 5:
response = _context12.sent;
this.descriptor.date_expires = response.body.date_expires;
_context12.next = 13;
break;
case 9:
_context12.prev = 9;
_context12.t0 = _context12["catch"](1);
if (_context12.t0.status === 404) {
this.onRemoved(false);
}
throw _context12.t0;
case 13:
case "end":
return _context12.stop();
}
}
}, _callee12, this, [[1, 9]]);
}));
function setTtl(_x25) {
return _ref12.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 _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(key, ttl) {
var existingItem, requestBody, response;
return _regenerator2.default.wrap(function _callee13$(_context13) {
while (1) {
switch (_context13.prev = _context13.next) {
case 0:
utils_1.validateMandatoryTtl(ttl);
_context13.next = 3;
return this.get(key);
case 3:
existingItem = _context13.sent;
requestBody = { ttl: ttl };
_context13.next = 7;
return this.services.network.post(existingItem.uri, requestBody);
case 7:
response = _context13.sent;
existingItem.updateDateExpires(response.body.date_expires);
case 9:
case "end":
return _context13.stop();
}
}
}, _callee13, this);
}));
function setItemTtl(_x26, _x27) {
return _ref13.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 _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14() {
return _regenerator2.default.wrap(function _callee14$(_context14) {
while (1) {
switch (_context14.prev = _context14.next) {
case 0:
_context14.next = 2;
return this.services.network.delete(this.uri);
case 2:
this.onRemoved(true);
case 3:
case "end":
return _context14.stop();
}
}
}, _callee14, this);
}));
function removeMap() {
return _ref14.apply(this, arguments);
}
return removeMap;
}()
}, {
key: "uri",
get: function get() {
return this.descriptor.url;
}
}, {
key: "links",
get: function get() {
return this.descriptor.links;
}
}, {
key: "revision",
get: function get() {
return this.descriptor.revision;
}
}, {
key: "lastEventId",
get: function get() {
return this.descriptor.last_event_id;
}
}, {
key: "dateExpires",
get: function get() {
return this.descriptor.date_expires;
}
}, {
key: "type",
get: function get() {
return 'map';
}
// public props, documented along with class description
}, {
key: "sid",
get: function get() {
return this.descriptor.sid;
}
}, {
key: "uniqueName",
get: function get() {
return this.descriptor.unique_name || null;
}
}, {
key: "dateUpdated",
get: function get() {
return this.descriptor.date_updated;
}
}], [{
key: "type",
get: function get() {
return 'map';
}
}]);
return SyncMap;
}(entity_1.SyncEntity);
exports.SyncMap = SyncMap;
exports.default = SyncMap;
/**
* Contains Map Item metadata.
* @typedef {Object} Map#ItemMetadata
* @property {String} [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":234,"./entity":239,"./logger":242,"./mapitem":243,"./mergingqueue":244,"./paginator":246,"./syncerror":253,"./utils":256,"babel-runtime/core-js/object/assign":37,"babel-runtime/core-js/object/get-prototype-of":41,"babel-runtime/core-js/promise":43,"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}],256:[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 _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 });
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 validateOptionalTtl(ttl) {
var validTtl = ttl === undefined || isNonNegativeInteger(ttl);
if (!validTtl) {
throw new syncerror_1.default("Invalid TTL value, expected a positive integer, was '" + ttl + "'", 400, 54011);
}
}
exports.validateOptionalTtl = validateOptionalTtl;
function validateMandatoryTtl(ttl) {
var validTtl = isNonNegativeInteger(ttl);
if (!validTtl) {
throw new syncerror_1.default("Invalid TTL value, expected a positive integer, was '" + ttl + "'", 400, 54011);
}
}
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;
}
/**
* 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;
},{"./syncerror":253,"babel-runtime/core-js/json/stringify":34,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],257:[function(_dereq_,module,exports){
module.exports={
"_from": "twilio-sync@^0.8.2",
"_id": "twilio-sync@0.8.2",
"_inBundle": false,
"_integrity": "sha512-6aK4cKltG6CN4oHfnUsFkwkeJEMcdNcxdLASqEww5ZSV6UT3C1v3/UZY225v/RPCdt6jhB0JcHCFexRekl64vg==",
"_location": "/twilio-sync",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "twilio-sync@^0.8.2",
"name": "twilio-sync",
"escapedName": "twilio-sync",
"rawSpec": "^0.8.2",
"saveSpec": null,
"fetchSpec": "^0.8.2"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/twilio-sync/-/twilio-sync-0.8.2.tgz",
"_shasum": "7ee4b66b0fbd978ba95f375f0d69576862169b28",
"_spec": "twilio-sync@^0.8.2",
"_where": "/home/travis/build/twilio/twilio-chat.js",
"author": {
"name": "Twilio"
},
"browserify": {
"transform": [
"babelify"
]
},
"bundleDependencies": false,
"dependencies": {
"backoff": "^2.5.0",
"karibu": "^2.0.0",
"loglevel": "^1.6.1",
"operation-retrier": "^2.0.0",
"platform": "^1.3.5",
"rfc6902": "^2.2.2",
"twilio-notifications": "^0.5.0",
"twilsock": "^0.5.4",
"update": "^0.7.4",
"uuid": "^3.2.1"
},
"deprecated": false,
"description": "Twilio Sync client library",
"devDependencies": {
"@types/chai": "^4.1.2",
"@types/chai-as-promised": "7.1.0",
"@types/loglevel": "^1.5.3",
"@types/mocha": "^2.2.48",
"@types/node": "^8.9.1",
"@types/sinon": "^4.1.3",
"@types/sinon-chai": "^2.7.29",
"async-test-tools": "^1.0.7",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-array-includes": "^2.0.3",
"babel-plugin-transform-builtin-extend": "^1.1.2",
"babel-plugin-transform-object-assign": "^6.22.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.6.1",
"babel-runtime": "^6.26.0",
"babelify": "^8.0.0",
"browserify": "^16.0.0",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"cheerio": "^1.0.0-rc.2",
"del": "^3.0.0",
"gulp": "^4.0.0",
"gulp-babel": "^7.0.1",
"gulp-derequire": "^2.1.0",
"gulp-exit": "0.0.2",
"gulp-insert": "^0.5.0",
"gulp-istanbul": "^1.1.3",
"gulp-mocha": "^5.0.0",
"gulp-rename": "^1.2.2",
"gulp-replace": "^0.6.1",
"gulp-tap": "^1.0.1",
"gulp-tslint": "^8.1.2",
"gulp-typescript": "^4.0.1",
"gulp-uglify-es": "^1.0.0",
"gulp-util": "^3.0.8",
"ink-docstrap": "^1.3.2",
"isparta": "^4.0.0",
"jsdoc": "^3.5.5",
"jsonwebtoken": "^8.1.1",
"karma": "^2.0.0",
"karma-browserify": "^5.2.0",
"karma-browserstack-launcher": "^1.3.0",
"karma-mocha": "^1.3.0",
"karma-mocha-reporter": "^2.2.5",
"mocha": "^5.0.0",
"run-sequence": "^2.2.1",
"sinon": "^4.2.2",
"sinon-chai": "^2.14.0",
"ts-node": "^4.1.0",
"tslint": "^5.9.1",
"twilio": "^3.11.2",
"typescript": "^2.8.1",
"uglify-es": "^3.3.10",
"uglify-save-license": "^0.4.1",
"underscore": "^1.8.3",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"watchify": "^3.10.0"
},
"engines": {
"node": ">=8"
},
"license": "MIT",
"main": "lib/index.js",
"name": "twilio-sync",
"scripts": {
"prepare": "gulp build",
"test": "gulp unit-test"
},
"types": "./lib/index.d.ts",
"version": "0.8.2"
}
},{}],258:[function(_dereq_,module,exports){
(function (global){
"use strict";
var _stringify = _dereq_("babel-runtime/core-js/json/stringify");
var _stringify2 = _interopRequireDefault(_stringify);
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 });
var transporterror_1 = _dereq_("./transporterror");
var XHR = global['XMLHttpRequest'] || _dereq_('xmlhttprequest').XMLHttpRequest;
function parseResponseHeaders(headerString) {
if (!headerString) {
return {};
}
return headerString.split("\r\n").map(function (el) {
return el.split(": ");
}).filter(function (el) {
return el.length === 2 && el[1].length > 0;
}).reduce(function (prev, curr) {
prev[curr[0]] = curr[1];return prev;
}, {});
}
function extractBody(xhr) {
var contentType = xhr.getResponseHeader('Content-Type');
if (!contentType || contentType.indexOf('application/json') !== 0 || xhr.responseText.length === 0) {
return xhr.responseText;
}
try {
return JSON.parse(xhr.responseText);
} catch (e) {
return xhr.responseText;
}
}
function adaptHttpResponse(response) {
try {
response.body = JSON.parse(response.body);
} catch (e) {} // eslint-disable-line no-empty
return response;
}
/**
* Provides generic network interface
*/
var Transport = function () {
function Transport() {
(0, _classCallCheck3.default)(this, Transport);
}
(0, _createClass3.default)(Transport, [{
key: "get",
/**
* Make a GET request by given URL
*/
value: function get(url, headers) {
return Transport.request('GET', url, headers);
}
/**
* Make a POST request by given URL
*/
}, {
key: "post",
value: function post(url, headers, body) {
return Transport.request('POST', url, headers, body);
}
/**
* Make a PUT request by given URL
*/
}, {
key: "put",
value: function put(url, headers, body) {
return Transport.request('PUT', url, headers, body);
}
/**
* Make a DELETE request by given URL
*/
}, {
key: "delete",
value: function _delete(url, headers) {
return Transport.request('PUT', url, headers);
}
}], [{
key: "request",
value: function request(method, url, headers, body) {
return new _promise2.default(function (resolve, reject) {
var xhr = new XHR();
xhr.open(method, url, true);
xhr.onreadystatechange = function onreadystatechange() {
if (xhr.readyState !== 4) {
return;
}
var headers = parseResponseHeaders(xhr.getAllResponseHeaders());
var body = extractBody(xhr);
if (200 <= xhr.status && xhr.status < 300) {
resolve({ status: xhr.status, headers: headers, body: body });
} else {
var status = xhr.statusText && xhr.statusText.code ? xhr.statusText.code : 'NONE';
var bodyRepresentation = void 0;
if (typeof body === 'string') {
bodyRepresentation = body && body.split('\n', 2).length === 1 ? body : '';
} else {
bodyRepresentation = (0, _stringify2.default)(body);
}
var message = xhr.status + ": [" + status + "] " + bodyRepresentation;
reject(new transporterror_1.TransportError(message, xhr.status, body, status, headers));
}
};
for (var headerName in headers) {
xhr.setRequestHeader(headerName, headers[headerName]);
if (headerName === 'Content-Type' && headers[headerName] === 'application/json') {
body = (0, _stringify2.default)(body);
}
}
xhr.send(body);
});
}
}]);
return Transport;
}();
exports.Transport = Transport;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./transporterror":259,"babel-runtime/core-js/json/stringify":34,"babel-runtime/core-js/promise":43,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"xmlhttprequest":64}],259:[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 });
var TransportError = function (_extendableBuiltin2) {
(0, _inherits3.default)(TransportError, _extendableBuiltin2);
function TransportError(message, code, body, status, headers) {
(0, _classCallCheck3.default)(this, TransportError);
var _this = (0, _possibleConstructorReturn3.default)(this, (TransportError.__proto__ || (0, _getPrototypeOf2.default)(TransportError)).call(this, message));
_this.code = code;
_this.body = body;
_this.status = status;
_this.headers = headers;
return _this;
}
return TransportError;
}(_extendableBuiltin(Error));
exports.TransportError = TransportError;
},{"babel-runtime/core-js/array/from":31,"babel-runtime/core-js/object/create":38,"babel-runtime/core-js/object/get-prototype-of":41,"babel-runtime/core-js/object/set-prototype-of":42,"babel-runtime/core-js/reflect/construct":44,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],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 _possibleConstructorReturn2 = _dereq_("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _createClass2 = _dereq_("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
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 });
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);
(0, _createClass3.default)(BackoffRetrier, [{
key: "inProgress",
get: function get() {
return !!this.retrier;
}
}]);
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;
}
/**
* Should be called once per attempt series to start retrier.
*/
(0, _createClass3.default)(BackoffRetrier, [{
key: "start",
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: "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.default(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) {});
}
}]);
return BackoffRetrier;
}(events_1.EventEmitter);
exports.BackoffRetrier = BackoffRetrier;
},{"babel-runtime/core-js/object/assign":37,"babel-runtime/core-js/object/get-prototype-of":41,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"events":199,"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 _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 });
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 index_1 = _dereq_("./index");
var offlinestorage_1 = _dereq_("./offlinestorage");
var tokenStorage_1 = _dereq_("./tokenStorage");
/**
* @alias Twilsock
* @classdesc Client library for the Twilsock service
* It allows to recevie service-generated updates as well as bi-directional transport
*/
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);
_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('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);
});
_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('stateChanged', function (state) {
return setTimeout(function () {
return _this.emit('stateChanged', state);
}, 0);
});
_this.channel.on('disconnected', function () {
return _this.offlineStorageDeferred.fail(new index_1.TwilsockError('Client disconnected'));
});
_this.channel.on('initialized', function (initReply) {
_this.handleStorageId(productId, initReply);
tokenStorage_1.TokenStorage.storeToken(initReply.continuationToken, productId);
});
_this.offlineStorageDeferred.promise.catch(function () {});
return _this;
}
(0, _createClass3.default)(TwilsockClient, [{
key: "handleStorageId",
value: function handleStorageId(productId, initReply) {
if (!initReply.offlineStorage) {
this.offlineStorageDeferred.fail(new index_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 index_1.TwilsockError("Failed to parse offline storage for " + productId + " " + (0, _stringify2.default)(initReply.offlineStorage[productId]) + ". " + e + "."));
}
} else {
this.offlineStorageDeferred.fail(new index_1.TwilsockError("No offline storage id for '" + productId + "' product: " + (0, _stringify2.default)(initReply.offlineStorage)));
}
}
}, {
key: "storageId",
value: function storageId() {
return this.offlineStorageDeferred.promise;
}
/**
* Indicates if twilsock is connected now
*/
}, {
key: "updateToken",
/**
* Update token
* @param {String} token
*/
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 TwilsockClient#connected
* @public
*/
}, {
key: "connect",
value: function connect() {
return this.channel.connect();
}
/**
* Disconnect from the server
* @fires TwilsockClient#disconnected
* @public
*/
}, {
key: "disconnect",
value: function disconnect() {
return this.channel.disconnect();
}
/**
* Get HTTP request to upstream service
* @param {string} url Upstream service url
* @param {headers} headers Set of custom headers
*/
}, {
key: "get",
value: function get(url, headers) {
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
*/
}, {
key: "post",
value: function post(url, headers, body) {
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
*/
}, {
key: "put",
value: function put(url, headers, body) {
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
*/
}, {
key: "delete",
value: function _delete(url, headers) {
return this.upstream.send('DELETE', url, headers);
}
}, {
key: "isConnected",
get: function get() {
return this.channel.isConnected;
}
}, {
key: "state",
get: function get() {
return this.channel.state;
}
}]);
return TwilsockClient;
}(events_1.EventEmitter);
exports.TwilsockClient = TwilsockClient;
exports.Twilsock = TwilsockClient;
},{"./configuration":262,"./deferred":263,"./index":268,"./logger":269,"./offlinestorage":271,"./packetinterface":272,"./services/registrations":282,"./services/upstream":283,"./tokenStorage":284,"./twilsock":285,"./websocketchannel":286,"babel-runtime/core-js/json/stringify":34,"babel-runtime/core-js/object/get-prototype-of":41,"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":199}],262:[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 });
var packageVersion = '0.5.4';
/**
* 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.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;
}
(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/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 });
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":43,"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 });
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":41,"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 });
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":31,"babel-runtime/core-js/object/create":38,"babel-runtime/core-js/object/get-prototype-of":41,"babel-runtime/core-js/object/set-prototype-of":42,"babel-runtime/core-js/reflect/construct":44,"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 });
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":41,"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 });
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":41,"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 });
var client_1 = _dereq_("./client");
exports.TwilsockClient = client_1.TwilsockClient;
exports.Twilsock = client_1.TwilsockClient;
var twilsockerror_1 = _dereq_("./error/twilsockerror");
exports.TwilsockError = twilsockerror_1.TwilsockError;
var transportunavailableerror_1 = _dereq_("./error/transportunavailableerror");
exports.TransportUnavailableError = 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 });
var log = _dereq_("loglevel");
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":31,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"loglevel":204}],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 });
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":206}],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 });
var index_1 = _dereq_("./index");
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 index_1.TwilsockError('Field "storage_id" is missing');
}
}
}]);
return OfflineProductStorage;
}();
exports.OfflineProductStorage = OfflineProductStorage;
},{"./index":268,"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 _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 });
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);
_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));
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();
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":34,"babel-runtime/core-js/map":35,"babel-runtime/core-js/promise":43,"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":290}],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 });
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":34,"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 });
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":290}],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 });
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":41,"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 });
var init_1 = _dereq_("./init");
exports.Init = init_1.Init;
var initReply_1 = _dereq_("./initReply");
exports.InitReply = initReply_1.InitReply;
var update_1 = _dereq_("./update");
exports.Update = update_1.Update;
var message_1 = _dereq_("./message");
exports.Message = message_1.Message;
var reply_1 = _dereq_("./reply");
exports.Reply = reply_1.Reply;
var close_1 = _dereq_("./close");
exports.Close = close_1.Close;
},{"./close":275,"./init":277,"./initReply":278,"./message":279,"./reply":280,"./update":281}],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 });
var abstractmessage_1 = _dereq_("./abstractmessage");
var Init = function (_abstractmessage_1$Ab) {
(0, _inherits3.default)(Init, _abstractmessage_1$Ab);
function Init(token, continuationToken, metadata) {
(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.capabilities = ['client_update', 'offline_storage'];
return _this;
}
return Init;
}(abstractmessage_1.AbstractMessage);
exports.Init = Init;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":41,"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 });
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) {
(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;
return _this;
}
return InitReply;
}(abstractmessage_1.AbstractMessage);
exports.InitReply = InitReply;
},{"./abstractmessage":274,"babel-runtime/core-js/object/get-prototype-of":41,"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 });
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":41,"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 });
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":41,"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 _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 });
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":41,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53}],282:[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 });
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":35,"babel-runtime/core-js/object/get-prototype-of":41,"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":199,"uuid":290}],283:[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 });
var logger_1 = _dereq_("../logger");
var twilsockerror_1 = _dereq_("../error/twilsockerror");
var twilsockupstreamerror_1 = _dereq_("../error/twilsockupstreamerror");
var Messages = _dereq_("../protocol/messages");
var index_1 = _dereq_("../index");
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,
timeout: setTimeout(function () {
logger_1.log.debug('request is timed out');
reject(new twilsockerror_1.TwilsockError('Twilsock: request timeout'));
}, REQUEST_TIMEOUT)
};
_this.pendingMessages.push(requestDescriptor);
});
}
}, {
key: "sendPendingMessages",
value: function sendPendingMessages() {
var _this2 = this;
var _loop = function _loop() {
var request = _this2.pendingMessages[0];
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() {
this.pendingMessages.forEach(function (message) {
message.reject(new index_1.TransportUnavailableError("Can't connect to twilsock"));
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 index_1.TransportUnavailableError("Can't connect to twilsock"));
}
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/twilsockerror":265,"../error/twilsockupstreamerror":267,"../index":268,"../logger":269,"../protocol/messages":276,"babel-runtime/core-js/promise":43,"babel-runtime/helpers/asyncToGenerator":48,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/regenerator":57}],284:[function(_dereq_,module,exports){
(function (global){
"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 });
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);
if (key.startsWith(TokenStorage.tokenStoragePrefix)) {
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: "canStore",
get: function get() {
return TokenStorage.sessionStorage && TokenStorage.window;
}
}]);
return TokenStorage;
}();
TokenStorage.initializedFlag = 'twilio_twilsock_token_storage';
TokenStorage.tokenStoragePrefix = 'twilio_continuation_token_';
TokenStorage.sessionStorage = global['sessionStorage'];
TokenStorage.window = global['window'];
exports.TokenStorage = TokenStorage;
TokenStorage.initialize();
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50}],285:[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 _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);
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 });
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 ACTIVITY_CHECK_INTERVAL = 5000;
var ACTIVITY_TIMEOUT = 43000;
var INIT_TIMEOUT = 5000;
var UPDATE_TIMEOUT = 5000;
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.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.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: online');
_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.startWatchdogTimer();
_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: "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 + "'" + (args.length > 0 ? ' with ' + args.length + ' argument/s' : ''));
return (_get2 = (0, _get4.default)(TwilsockChannel.prototype.__proto__ || (0, _getPrototypeOf2.default)(TwilsockChannel.prototype), "emit", this)).call.apply(_get2, [this, event].concat(args));
}
}, {
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() {
logger_1.log.trace('retry');
this.websocket.close();
this.fsm.userRetry();
}
}, {
key: "onConnected",
value: function onConnected() {
this.emit('connected');
}
}, {
key: "finalizeSocket",
value: function finalizeSocket() {
logger_1.log.trace('finalizeSocket');
this.stopWatchdogTimer();
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.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;
this.updateActivityTimestamp();
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
logger_1.log.error("Server closed connection because can't parse protocol: " + (0, _stringify2.default)(header.status));
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;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
logger_1.log.trace('sendInit');
_context.prev = 1;
_context.next = 4;
return this.transport.sendInit();
case 4:
reply = _context.sent;
this.config.updateContinuationToken(reply.continuationToken);
this.fsm.initSuccess(reply);
this.emit('initialized', reply);
this.emit('tokenUpdated');
_context.next = 15;
break;
case 11:
_context.prev = 11;
_context.t0 = _context["catch"](1);
if (_context.t0 instanceof twilsockreplyerror_1.TwilsockReplyError) {
logger_1.log.warn("Init rejected by server: " + (0, _stringify2.default)(_context.t0.reply.status));
if (_context.t0.reply.status.code === 401 || _context.t0.reply.status.code === 403) {
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);
}
} else {
this.fsm.initError(true);
}
this.emit('tokenUpdated', _context.t0);
case 15:
case "end":
return _context.stop();
}
}
}, _callee, this, [[1, 11]]);
}));
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;
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) {
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) {
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);
}
} else {
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: "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 {
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: "startWatchdogTimer",
value: function startWatchdogTimer() {
var _this6 = this;
logger_1.log.trace('startWatchdogTimer');
this.recentActivityTimestamp = Date.now();
this.watchTimer = setInterval(function () {
if (Date.now() - _this6.recentActivityTimestamp > ACTIVITY_TIMEOUT && _this6.websocket.isConnected) {
_this6.websocket.close();
}
}, ACTIVITY_CHECK_INTERVAL);
}
}, {
key: "stopWatchdogTimer",
value: function stopWatchdogTimer() {
logger_1.log.trace('stopWatchdogTimer');
clearInterval(this.watchTimer);
}
}, {
key: "updateActivityTimestamp",
value: function updateActivityTimestamp() {
logger_1.log.trace('updateActivityTimestamp');
this.recentActivityTimestamp = Date.now();
}
}, {
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;
}
}]);
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":34,"babel-runtime/core-js/object/get-prototype-of":41,"babel-runtime/core-js/promise":43,"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/helpers/typeof":56,"babel-runtime/regenerator":57,"events":199,"javascript-state-machine":202}],286:[function(_dereq_,module,exports){
(function (global){
"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 });
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);
};
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;
this.socket.close();
}
}
}, {
key: "isConnected",
get: function get() {
return this.socket && this.socket.readyState === 1;
}
}]);
return WebSocketChannel;
}(events_1.EventEmitter);
exports.WebSocketChannel = WebSocketChannel;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./logger":269,"babel-runtime/core-js/object/get-prototype-of":41,"babel-runtime/helpers/classCallCheck":49,"babel-runtime/helpers/createClass":50,"babel-runtime/helpers/inherits":52,"babel-runtime/helpers/possibleConstructorReturn":53,"events":199,"ws":64}],287:[function(_dereq_,module,exports){
if (typeof Object.create === 'function') {
// implementation from standard node.js 'util' module
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
} else {
// old school shim for old browsers
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
}
}
},{}],288:[function(_dereq_,module,exports){
module.exports = function isBuffer(arg) {
return arg && typeof arg === 'object'
&& typeof arg.copy === 'function'
&& typeof arg.fill === 'function'
&& typeof arg.readUInt8 === 'function';
}
},{}],289:[function(_dereq_,module,exports){
(function (process,global){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
var formatRegExp = /%[sdj%]/g;
exports.format = function(f) {
if (!isString(f)) {
var objects = [];
for (var i = 0; i < arguments.length; i++) {
objects.push(inspect(arguments[i]));
}
return objects.join(' ');
}
var i = 1;
var args = arguments;
var len = args.length;
var str = String(f).replace(formatRegExp, function(x) {
if (x === '%%') return '%';
if (i >= len) return x;
switch (x) {
case '%s': return String(args[i++]);
case '%d': return Number(args[i++]);
case '%j':
try {
return JSON.stringify(args[i++]);
} catch (_) {
return '[Circular]';
}
default:
return x;
}
});
for (var x = args[i]; i < len; x = args[++i]) {
if (isNull(x) || !isObject(x)) {
str += ' ' + x;
} else {
str += ' ' + inspect(x);
}
}
return str;
};
// Mark that a method should not be used.
// Returns a modified function which warns once by default.
// If --no-deprecation is set, then it is a no-op.
exports.deprecate = function(fn, msg) {
// Allow for deprecating things in the process of starting up.
if (isUndefined(global.process)) {
return function() {
return exports.deprecate(fn, msg).apply(this, arguments);
};
}
if (process.noDeprecation === true) {
return fn;
}
var warned = false;
function deprecated() {
if (!warned) {
if (process.throwDeprecation) {
throw new Error(msg);
} else if (process.traceDeprecation) {
console.trace(msg);
} else {
console.error(msg);
}
warned = true;
}
return fn.apply(this, arguments);
}
return deprecated;
};
var debugs = {};
var debugEnviron;
exports.debuglog = function(set) {
if (isUndefined(debugEnviron))
debugEnviron = process.env.NODE_DEBUG || '';
set = set.toUpperCase();
if (!debugs[set]) {
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
var pid = process.pid;
debugs[set] = function() {
var msg = exports.format.apply(exports, arguments);
console.error('%s %d: %s', set, pid, msg);
};
} else {
debugs[set] = function() {};
}
}
return debugs[set];
};
/**
* Echos the value of a value. Trys to print the value out
* in the best way possible given the different types.
*
* @param {Object} obj The object to print out.
* @param {Object} opts Optional options object that alters the output.
*/
/* legacy: obj, showHidden, depth, colors*/
function inspect(obj, opts) {
// default options
var ctx = {
seen: [],
stylize: stylizeNoColor
};
// legacy...
if (arguments.length >= 3) ctx.depth = arguments[2];
if (arguments.length >= 4) ctx.colors = arguments[3];
if (isBoolean(opts)) {
// legacy...
ctx.showHidden = opts;
} else if (opts) {
// got an "options" object
exports._extend(ctx, opts);
}
// set default options
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
if (isUndefined(ctx.depth)) ctx.depth = 2;
if (isUndefined(ctx.colors)) ctx.colors = false;
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
if (ctx.colors) ctx.stylize = stylizeWithColor;
return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect.colors = {
'bold' : [1, 22],
'italic' : [3, 23],
'underline' : [4, 24],
'inverse' : [7, 27],
'white' : [37, 39],
'grey' : [90, 39],
'black' : [30, 39],
'blue' : [34, 39],
'cyan' : [36, 39],
'green' : [32, 39],
'magenta' : [35, 39],
'red' : [31, 39],
'yellow' : [33, 39]
};
// Don't use 'blue' not visible on cmd.exe
inspect.styles = {
'special': 'cyan',
'number': 'yellow',
'boolean': 'yellow',
'undefined': 'grey',
'null': 'bold',
'string': 'green',
'date': 'magenta',
// "name": intentionally not styling
'regexp': 'red'
};
function stylizeWithColor(str, styleType) {
var style = inspect.styles[styleType];
if (style) {
return '\u001b[' + inspect.colors[style][0] + 'm' + str +
'\u001b[' + inspect.colors[style][1] + 'm';
} else {
return str;
}
}
function stylizeNoColor(str, styleType) {
return str;
}
function arrayToHash(array) {
var hash = {};
array.forEach(function(val, idx) {
hash[val] = true;
});
return hash;
}
function formatValue(ctx, value, recurseTimes) {
// Provide a hook for user-specified inspect functions.
// Check that value is an object with an inspect function on it
if (ctx.customInspect &&
value &&
isFunction(value.inspect) &&
// Filter out the util module, it's inspect function is special
value.inspect !== exports.inspect &&
// Also filter out any prototype objects using the circular check.
!(value.constructor && value.constructor.prototype === value)) {
var ret = value.inspect(recurseTimes, ctx);
if (!isString(ret)) {
ret = formatValue(ctx, ret, recurseTimes);
}
return ret;
}
// Primitive types cannot have properties
var primitive = formatPrimitive(ctx, value);
if (primitive) {
return primitive;
}
// Look up the keys of the object.
var keys = Object.keys(value);
var visibleKeys = arrayToHash(keys);
if (ctx.showHidden) {
keys = Object.getOwnPropertyNames(value);
}
// IE doesn't make error fields non-enumerable
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
if (isError(value)
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
return formatError(value);
}
// Some type of object without properties can be shortcutted.
if (keys.length === 0) {
if (isFunction(value)) {
var name = value.name ? ': ' + value.name : '';
return ctx.stylize('[Function' + name + ']', 'special');
}
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
}
if (isDate(value)) {
return ctx.stylize(Date.prototype.toString.call(value), 'date');
}
if (isError(value)) {
return formatError(value);
}
}
var base = '', array = false, braces = ['{', '}'];
// Make Array say that they are Array
if (isArray(value)) {
array = true;
braces = ['[', ']'];
}
// Make functions say that they are functions
if (isFunction(value)) {
var n = value.name ? ': ' + value.name : '';
base = ' [Function' + n + ']';
}
// Make RegExps say that they are RegExps
if (isRegExp(value)) {
base = ' ' + RegExp.prototype.toString.call(value);
}
// Make dates with properties first say the date
if (isDate(value)) {
base = ' ' + Date.prototype.toUTCString.call(value);
}
// Make error with message first say the error
if (isError(value)) {
base = ' ' + formatError(value);
}
if (keys.length === 0 && (!array || value.length == 0)) {
return braces[0] + base + braces[1];
}
if (recurseTimes < 0) {
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
} else {
return ctx.stylize('[Object]', 'special');
}
}
ctx.seen.push(value);
var output;
if (array) {
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
} else {
output = keys.map(function(key) {
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
});
}
ctx.seen.pop();
return reduceToSingleString(output, base, braces);
}
function formatPrimitive(ctx, value) {
if (isUndefined(value))
return ctx.stylize('undefined', 'undefined');
if (isString(value)) {
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
.replace(/'/g, "\\'")
.replace(/\\"/g, '"') + '\'';
return ctx.stylize(simple, 'string');
}
if (isNumber(value))
return ctx.stylize('' + value, 'number');
if (isBoolean(value))
return ctx.stylize('' + value, 'boolean');
// For some reason typeof null is "object", so special case here.
if (isNull(value))
return ctx.stylize('null', 'null');
}
function formatError(value) {
return '[' + Error.prototype.toString.call(value) + ']';
}
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
var output = [];
for (var i = 0, l = value.length; i < l; ++i) {
if (hasOwnProperty(value, String(i))) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
String(i), true));
} else {
output.push('');
}
}
keys.forEach(function(key) {
if (!key.match(/^\d+$/)) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
key, true));
}
});
return output;
}
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
var name, str, desc;
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
if (desc.get) {
if (desc.set) {
str = ctx.stylize('[Getter/Setter]', 'special');
} else {
str = ctx.stylize('[Getter]', 'special');
}
} else {
if (desc.set) {
str = ctx.stylize('[Setter]', 'special');
}
}
if (!hasOwnProperty(visibleKeys, key)) {
name = '[' + key + ']';
}
if (!str) {
if (ctx.seen.indexOf(desc.value) < 0) {
if (isNull(recurseTimes)) {
str = formatValue(ctx, desc.value, null);
} else {
str = formatValue(ctx, desc.value, recurseTimes - 1);
}
if (str.indexOf('\n') > -1) {
if (array) {
str = str.split('\n').map(function(line) {
return ' ' + line;
}).join('\n').substr(2);
} else {
str = '\n' + str.split('\n').map(function(line) {
return ' ' + line;
}).join('\n');
}
}
} else {
str = ctx.stylize('[Circular]', 'special');
}
}
if (isUndefined(name)) {
if (array && key.match(/^\d+$/)) {
return str;
}
name = JSON.stringify('' + key);
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
name = name.substr(1, name.length - 2);
name = ctx.stylize(name, 'name');
} else {
name = name.replace(/'/g, "\\'")
.replace(/\\"/g, '"')
.replace(/(^"|"$)/g, "'");
name = ctx.stylize(name, 'string');
}
}
return name + ': ' + str;
}
function reduceToSingleString(output, base, braces) {
var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
numLinesEst++;
if (cur.indexOf('\n') >= 0) numLinesEst++;
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
}, 0);
if (length > 60) {
return braces[0] +
(base === '' ? '' : base + '\n ') +
' ' +
output.join(',\n ') +
' ' +
braces[1];
}
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}
// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;
function isBoolean(arg) {
return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;
function isNull(arg) {
return arg === null;
}
exports.isNull = isNull;
function isNullOrUndefined(arg) {
return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;
function isNumber(arg) {
return typeof arg === 'number';
}
exports.isNumber = isNumber;
function isString(arg) {
return typeof arg === 'string';
}
exports.isString = isString;
function isSymbol(arg) {
return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;
function isUndefined(arg) {
return arg === void 0;
}
exports.isUndefined = isUndefined;
function isRegExp(re) {
return isObject(re) && objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;
function isObject(arg) {
return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;
function isDate(d) {
return isObject(d) && objectToString(d) === '[object Date]';
}
exports.isDate = isDate;
function isError(e) {
return isObject(e) &&
(objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;
function isFunction(arg) {
return typeof arg === 'function';
}
exports.isFunction = isFunction;
function isPrimitive(arg) {
return arg === null ||
typeof arg === 'boolean' ||
typeof arg === 'number' ||
typeof arg === 'string' ||
typeof arg === 'symbol' || // ES6 symbol
typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;
exports.isBuffer = _dereq_('./support/isBuffer');
function objectToString(o) {
return Object.prototype.toString.call(o);
}
function pad(n) {
return n < 10 ? '0' + n.toString(10) : n.toString(10);
}
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
'Oct', 'Nov', 'Dec'];
// 26 Feb 16:19:34
function timestamp() {
var d = new Date();
var time = [pad(d.getHours()),
pad(d.getMinutes()),
pad(d.getSeconds())].join(':');
return [d.getDate(), months[d.getMonth()], time].join(' ');
}
// log is just a thin wrapper to console.log that prepends a timestamp
exports.log = function() {
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
};
/**
* Inherit the prototype methods from one constructor into another.
*
* The Function.prototype.inherits from lang.js rewritten as a standalone
* function (not on Function.prototype). NOTE: If this file is to be loaded
* during bootstrapping this function needs to be rewritten using some native
* functions as prototype setup using normal JavaScript does not work as
* expected during bootstrapping (see mirror.js in r114903).
*
* @param {function} ctor Constructor function which needs to inherit the
* prototype.
* @param {function} superCtor Constructor function to inherit prototype from.
*/
exports.inherits = _dereq_('inherits');
exports._extend = function(origin, add) {
// Don't do anything if add isn't an object
if (!add || !isObject(add)) return origin;
var keys = Object.keys(add);
var i = keys.length;
while (i--) {
origin[keys[i]] = add[keys[i]];
}
return origin;
};
function hasOwnProperty(obj, prop) {
return Object.prototype.hasOwnProperty.call(obj, prop);
}
}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./support/isBuffer":288,"_process":210,"inherits":287}],290:[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":293,"./v4":294}],291:[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;
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++]];
}
module.exports = bytesToUuid;
},{}],292:[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.
var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues.bind(crypto)) ||
(typeof(msCrypto) != 'undefined' && 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;
};
}
},{}],293:[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/broofa/node-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":291,"./lib/rng":292}],294:[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":291,"./lib/rng":292}],295:[function(_dereq_,module,exports){
module.exports={
"name": "twilio-chat",
"version": "3.0.0",
"description": "Twilio Chat service client library",
"main": "lib/index.js",
"browser": "browser/index.js",
"types": "./lib/client.d.ts",
"author": "Twilio",
"license": "MIT",
"dependencies": {
"twilio-mcs-client": "^0.2.1",
"twilio-notifications": "^0.5.0",
"twilio-sync": "^0.8.2",
"twilsock": "^0.5.4",
"iso8601-duration": "^1.1.1",
"isomorphic-form-data": "^1.0.0",
"loglevel": "^1.6.1",
"operation-retrier": "latest",
"platform": "^1.3.5",
"rfc6902": "^2.2.2",
"uuid": "^3.2.1"
},
"devDependencies": {
"@types/chai": "^4.1.2",
"@types/chai-as-promised": "7.1.0",
"@types/chai-string": "^1.4.1",
"@types/core-js": "^0.9.46",
"@types/loglevel": "^1.5.3",
"@types/mocha": "^5.0.0",
"@types/node": "^9.6.5",
"@types/sinon": "^4.3.2",
"@types/sinon-chai": "^2.7.30",
"async": "^2.6.0",
"async-test-tools": "^1.0.7",
"babel-core": "^6.26.0",
"babel-eslint": "^8.2.3",
"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",
"backoff": "^2.5.0",
"browserify": "^16.0.0",
"browserify-replace": "^0.9.0",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chai-string": "^1.4.0",
"cheerio": "^1.0.0-rc.2",
"del": "^3.0.0",
"fancy-log": "^1.3.2",
"fs": "0.0.1-security",
"gulp": "^4.0.0",
"gulp-babel": "^7.0.1",
"gulp-derequire": "^2.1.0",
"gulp-if": "^2.0.2",
"gulp-insert": "^0.5.0",
"gulp-rename": "^1.2.2",
"gulp-sourcemaps": "^2.6.4",
"gulp-tap": "^1.0.1",
"gulp-tslint": "^8.1.2",
"gulp-typescript": "^4.0.2",
"gulp-uglify-es": "^1.0.1",
"ink-docstrap": "^1.3.2",
"jsdoc": "^3.5.5",
"jsdoc-strip-async-await": "^0.1.0",
"mocha": "^5.0.2",
"mocha.parallel": "^0.15.5",
"nyc": "^11.7.3",
"path": "^0.12.7",
"sinon": "^5.0.7",
"sinon-chai": "^3.0.0",
"source-map-explorer": "^1.5.0",
"ts-node": "^4.1.0",
"tslint": "^5.9.1",
"twilio": "^3.15.0",
"typescript": "^2.8.1",
"uglify-save-license": "^0.4.1",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0"
},
"engines": {
"node": ">=6"
}
}
},{}]},{},[3])(3)
});