@webex/internal-plugin-mercury 3.0.0-beta.9 → 3.0.0-bnr.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mercury.js CHANGED
@@ -1,69 +1,38 @@
1
1
  "use strict";
2
2
 
3
3
  var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
4
-
5
4
  var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
6
-
7
5
  var _Object$getOwnPropertyDescriptor2 = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
8
-
9
6
  var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
10
-
11
7
  var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
12
-
13
8
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
14
-
15
9
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
16
-
17
10
  _Object$defineProperty(exports, "__esModule", {
18
11
  value: true
19
12
  });
20
-
21
13
  exports.default = void 0;
22
-
23
14
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
24
-
25
15
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
26
-
27
16
  var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
28
-
29
17
  var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/delete-property"));
30
-
31
18
  var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
32
-
33
19
  var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
34
-
35
20
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
36
-
37
21
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
38
-
39
22
  var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/applyDecoratedDescriptor"));
40
-
41
23
  var _set2 = _interopRequireDefault(require("lodash/set"));
42
-
43
24
  var _get2 = _interopRequireDefault(require("lodash/get"));
44
-
45
25
  var _camelCase2 = _interopRequireDefault(require("lodash/camelCase"));
46
-
47
26
  var _url = _interopRequireDefault(require("url"));
48
-
49
27
  var _webexCore = require("@webex/webex-core");
50
-
51
28
  var _common = require("@webex/common");
52
-
53
29
  var _backoff = _interopRequireDefault(require("backoff"));
54
-
55
30
  var _socket = _interopRequireDefault(require("./socket"));
56
-
57
31
  var _errors = require("./errors");
58
-
59
32
  var _dec, _dec2, _obj;
60
-
61
33
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor2(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
62
-
63
34
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor2(source, key)); }); } return target; }
64
-
65
35
  var normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];
66
-
67
36
  var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mercury#listen(): Use Mercury#connect() instead'), _dec2 = (0, _common.deprecated)('Mercury#stopListening(): Use Mercury#disconnect() instead'), (_obj = {
68
37
  namespace: 'Mercury',
69
38
  session: {
@@ -88,39 +57,29 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
88
57
  },
89
58
  connect: function connect(webSocketUrl) {
90
59
  var _this = this;
91
-
92
60
  if (this.connected) {
93
61
  this.logger.info('mercury: already connected, will not connect again');
94
62
  return _promise.default.resolve();
95
63
  }
96
-
97
64
  this.connecting = true;
98
65
  return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
99
66
  _this.logger.info('mercury: connecting');
100
-
101
67
  return _this._connectWithBackoff(webSocketUrl);
102
68
  });
103
69
  },
104
70
  disconnect: function disconnect() {
105
71
  var _this2 = this;
106
-
107
72
  return new _promise.default(function (resolve) {
108
73
  if (_this2.backoffCall) {
109
74
  _this2.logger.info('mercury: aborting connection');
110
-
111
75
  _this2.backoffCall.abort();
112
76
  }
113
-
114
77
  if (_this2.socket) {
115
78
  _this2.socket.removeAllListeners('message');
116
-
117
79
  _this2.once('offline', resolve);
118
-
119
80
  _this2.socket.close();
120
-
121
81
  return;
122
82
  }
123
-
124
83
  resolve();
125
84
  });
126
85
  },
@@ -139,7 +98,6 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
139
98
  if (!event || !event.headers) {
140
99
  return;
141
100
  }
142
-
143
101
  var headerKeys = (0, _keys.default)(event.headers);
144
102
  headerKeys.forEach(function (keyPath) {
145
103
  (0, _set2.default)(event, keyPath, event.headers[keyPath]);
@@ -147,16 +105,13 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
147
105
  },
148
106
  _prepareUrl: function _prepareUrl(webSocketUrl) {
149
107
  var _this3 = this;
150
-
151
108
  if (!webSocketUrl) {
152
109
  webSocketUrl = this.webex.internal.device.webSocketUrl;
153
110
  }
154
-
155
111
  return this.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
156
112
  if (haMessagingEnabled) {
157
113
  return _this3.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
158
114
  }
159
-
160
115
  return webSocketUrl;
161
116
  }).then(function (wsUrl) {
162
117
  webSocketUrl = wsUrl;
@@ -169,7 +124,6 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
169
124
  bufferStates: true,
170
125
  aliasHttpStatus: true
171
126
  });
172
-
173
127
  if (webSharedMercury) {
174
128
  (0, _assign.default)(webSocketUrl.query, {
175
129
  mercuryRegistrationStatus: true,
@@ -177,17 +131,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
177
131
  });
178
132
  (0, _deleteProperty.default)(webSocketUrl.query, 'bufferStates');
179
133
  }
180
-
181
134
  if ((0, _get2.default)(_this3, 'webex.config.device.ephemeral', false)) {
182
135
  webSocketUrl.query.multipleConnections = true;
183
136
  }
184
-
185
137
  return _url.default.format(webSocketUrl);
186
138
  });
187
139
  },
188
140
  _attemptConnection: function _attemptConnection(socketUrl, callback) {
189
141
  var _this4 = this;
190
-
191
142
  var socket = new _socket.default();
192
143
  var attemptWSUrl;
193
144
  socket.on('close', function () {
@@ -200,23 +151,17 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
200
151
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
201
152
  args[_key] = arguments[_key];
202
153
  }
203
-
204
154
  return _this4._emit.apply(_this4, ['sequence-mismatch'].concat(args));
205
155
  });
206
-
207
156
  _promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
208
157
  var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
209
- webSocketUrl = _ref2[0],
210
- token = _ref2[1];
211
-
158
+ webSocketUrl = _ref2[0],
159
+ token = _ref2[1];
212
160
  if (!_this4.backoffCall) {
213
161
  var msg = 'mercury: prevent socket open when backoffCall no longer defined';
214
-
215
162
  _this4.logger.info(msg);
216
-
217
163
  return _promise.default.reject(new Error(msg));
218
164
  }
219
-
220
165
  attemptWSUrl = webSocketUrl;
221
166
  var options = {
222
167
  forceCloseDelay: _this4.config.forceCloseDelay,
@@ -225,16 +170,16 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
225
170
  token: token.toString(),
226
171
  trackingId: "".concat(_this4.webex.sessionId, "_").concat((0, _now.default)()),
227
172
  logger: _this4.logger
228
- }; // if the consumer has supplied request options use them
173
+ };
229
174
 
175
+ // if the consumer has supplied request options use them
230
176
  if (_this4.webex.config.defaultMercuryOptions) {
231
177
  _this4.logger.info('mercury: setting custom options');
232
-
233
178
  options = _objectSpread(_objectSpread({}, options), _this4.webex.config.defaultMercuryOptions);
234
- } // Set the socket before opening it. This allows a disconnect() to close
235
- // the socket if it is in the process of being opened.
236
-
179
+ }
237
180
 
181
+ // Set the socket before opening it. This allows a disconnect() to close
182
+ // the socket if it is in the process of being opened.
238
183
  _this4.socket = socket;
239
184
  return socket.open(webSocketUrl, options);
240
185
  }).then(function () {
@@ -247,13 +192,11 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
247
192
  url: attemptWSUrl
248
193
  }
249
194
  });
250
-
251
195
  callback();
252
196
  return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
253
197
  if (haMessagingEnabled) {
254
198
  return _this4.webex.internal.device.refresh();
255
199
  }
256
-
257
200
  return _promise.default.resolve();
258
201
  });
259
202
  }).catch(function (reason) {
@@ -266,29 +209,25 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
266
209
  retries: _this4.backoffCall.getNumRetries()
267
210
  });
268
211
  }
269
-
270
- _this4.logger.info('mercury: connection attempt failed', reason); // UnknownResponse is produced by IE for any 4XXX; treated it like a bad
212
+ _this4.logger.info('mercury: connection attempt failed', reason);
213
+ // UnknownResponse is produced by IE for any 4XXX; treated it like a bad
271
214
  // web socket url and let WDM handle the token checking
272
-
273
-
274
215
  if (reason instanceof _errors.UnknownResponse) {
275
216
  _this4.logger.info('mercury: received unknown response code, refreshing device registration');
276
-
277
217
  return _this4.webex.internal.device.refresh().then(function () {
278
218
  return callback(reason);
279
219
  });
280
- } // NotAuthorized implies expired token
281
-
282
-
220
+ }
221
+ // NotAuthorized implies expired token
283
222
  if (reason instanceof _errors.NotAuthorized) {
284
223
  _this4.logger.info('mercury: received authorization error, reauthorizing');
285
-
286
224
  return _this4.webex.credentials.refresh({
287
225
  force: true
288
226
  }).then(function () {
289
227
  return callback(reason);
290
228
  });
291
- } // // NotFound implies expired web socket url
229
+ }
230
+ // // NotFound implies expired web socket url
292
231
  // else if (reason instanceof NotFound) {
293
232
  // this.logger.info(`mercury: received not found error, refreshing device registration`);
294
233
  // return this.webex.internal.device.refresh()
@@ -296,21 +235,15 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
296
235
  // }
297
236
  // BadRequest implies current credentials are for a Service Account
298
237
  // Forbidden implies current user is not entitle for Webex
299
-
300
-
301
238
  if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
302
239
  _this4.logger.warn('mercury: received unrecoverable response from mercury');
303
-
304
240
  _this4.backoffCall.abort();
305
-
306
241
  return callback(reason);
307
242
  }
308
-
309
243
  if (reason instanceof _errors.ConnectionError) {
310
244
  return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
311
245
  if (haMessagingEnabled) {
312
246
  _this4.logger.info('mercury: received a generic connection error, will try to connect to another datacenter');
313
-
314
247
  _this4.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {
315
248
  fields: {
316
249
  success: false
@@ -321,84 +254,64 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
321
254
  url: attemptWSUrl
322
255
  }
323
256
  });
324
-
325
257
  return _this4.webex.internal.services.markFailedUrl(attemptWSUrl);
326
258
  }
327
-
328
259
  return null;
329
260
  }).then(function () {
330
261
  return callback(reason);
331
262
  });
332
263
  }
333
-
334
264
  return callback(reason);
335
265
  }).catch(function (reason) {
336
266
  _this4.logger.error('mercury: failed to handle connection failure', reason);
337
-
338
267
  callback(reason);
339
268
  });
340
269
  },
341
270
  _connectWithBackoff: function _connectWithBackoff(webSocketUrl) {
342
271
  var _this5 = this;
343
-
344
272
  return new _promise.default(function (resolve, reject) {
345
273
  // eslint gets confused about whether or not call is actually used
346
274
  // eslint-disable-next-line prefer-const
347
275
  var call;
348
-
349
276
  var onComplete = function onComplete(err) {
350
277
  _this5.connecting = false;
351
278
  _this5.backoffCall = undefined;
352
-
353
279
  if (err) {
354
280
  _this5.logger.info("mercury: failed to connect after ".concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
355
-
356
281
  return reject(err);
357
282
  }
358
-
359
283
  _this5.connected = true;
360
-
361
284
  _this5._emit('online');
362
-
363
285
  return resolve();
364
- }; // eslint-disable-next-line prefer-reflect
365
-
286
+ };
366
287
 
288
+ // eslint-disable-next-line prefer-reflect
367
289
  call = _backoff.default.call(function (callback) {
368
290
  _this5.logger.info("mercury: executing connection attempt ".concat(call.getNumRetries()));
369
-
370
291
  _this5._attemptConnection(webSocketUrl, callback);
371
292
  }, onComplete);
372
293
  call.setStrategy(new _backoff.default.ExponentialStrategy({
373
294
  initialDelay: _this5.config.backoffTimeReset,
374
295
  maxDelay: _this5.config.backoffTimeMax
375
296
  }));
376
-
377
297
  if (_this5.config.maxRetries) {
378
298
  call.failAfter(_this5.config.maxRetries);
379
299
  }
380
-
381
300
  call.on('abort', function () {
382
301
  _this5.logger.info('mercury: connection aborted');
383
-
384
302
  reject(new Error('Mercury Connection Aborted'));
385
303
  });
386
304
  call.on('callback', function (err) {
387
305
  if (err) {
388
306
  var number = call.getNumRetries();
389
307
  var delay = Math.min(call.strategy_.nextBackoffDelay_, _this5.config.backoffTimeMax);
390
-
391
308
  _this5.logger.info("mercury: failed to connect; attempting retry ".concat(number + 1, " in ").concat(delay, " ms"));
392
309
  /* istanbul ignore if */
393
-
394
-
395
310
  if (process.env.NODE_ENV === 'development') {
396
311
  _this5.logger.debug('mercury: ', err, err.stack);
397
312
  }
398
-
399
313
  return;
400
314
  }
401
-
402
315
  _this5.logger.info('mercury: connected');
403
316
  });
404
317
  call.start();
@@ -414,93 +327,70 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
414
327
  },
415
328
  _getEventHandlers: function _getEventHandlers(eventType) {
416
329
  var _eventType$split = eventType.split('.'),
417
- _eventType$split2 = (0, _slicedToArray2.default)(_eventType$split, 2),
418
- namespace = _eventType$split2[0],
419
- name = _eventType$split2[1];
420
-
330
+ _eventType$split2 = (0, _slicedToArray2.default)(_eventType$split, 2),
331
+ namespace = _eventType$split2[0],
332
+ name = _eventType$split2[1];
421
333
  var handlers = [];
422
-
423
334
  if (!this.webex[namespace] && !this.webex.internal[namespace]) {
424
335
  return handlers;
425
336
  }
426
-
427
337
  var handlerName = (0, _camelCase2.default)("process_".concat(name, "_event"));
428
-
429
338
  if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {
430
339
  handlers.push({
431
340
  name: handlerName,
432
341
  namespace: namespace
433
342
  });
434
343
  }
435
-
436
344
  return handlers;
437
345
  },
438
346
  _onclose: function _onclose(event) {
439
347
  // I don't see any way to avoid the complexity or statement count in here.
440
-
441
348
  /* eslint complexity: [0] */
349
+
442
350
  try {
443
351
  var reason = event.reason && event.reason.toLowerCase();
444
352
  var socketUrl = this.socket.url;
445
353
  this.socket.removeAllListeners();
446
354
  this.unset('socket');
447
355
  this.connected = false;
448
-
449
356
  this._emit('offline', event);
450
-
451
357
  switch (event.code) {
452
358
  case 1003:
453
359
  // metric: disconnect
454
360
  this.logger.info("mercury: Mercury service rejected last message; will not reconnect: ".concat(event.reason));
455
-
456
361
  this._emit('offline.permanent', event);
457
-
458
362
  break;
459
-
460
363
  case 4000:
461
364
  // metric: disconnect
462
365
  this.logger.info('mercury: socket replaced; will not reconnect');
463
-
464
366
  this._emit('offline.replaced', event);
465
-
466
367
  break;
467
-
468
368
  case 1001:
469
369
  case 1005:
470
370
  case 1006:
471
371
  case 1011:
472
372
  this.logger.info('mercury: socket disconnected; reconnecting');
473
-
474
373
  this._emit('offline.transient', event);
475
-
476
- this._reconnect(socketUrl); // metric: disconnect
374
+ this._reconnect(socketUrl);
375
+ // metric: disconnect
477
376
  // if (code == 1011 && reason !== ping error) metric: unexpected disconnect
478
-
479
-
480
377
  break;
481
-
482
378
  case 1000:
483
379
  if (normalReconnectReasons.includes(reason)) {
484
380
  this.logger.info('mercury: socket disconnected; reconnecting');
485
-
486
381
  this._emit('offline.transient', event);
487
-
488
- this._reconnect(socketUrl); // metric: disconnect
382
+ this._reconnect(socketUrl);
383
+ // metric: disconnect
489
384
  // if (reason === done forced) metric: force closure
490
-
491
385
  } else {
492
386
  this.logger.info('mercury: socket disconnected; will not reconnect');
493
-
494
387
  this._emit('offline.permanent', event);
495
388
  }
496
-
497
389
  break;
498
-
499
390
  default:
500
- this.logger.info('mercury: socket disconnected unexpectedly; will not reconnect'); // unexpected disconnect
501
-
391
+ this.logger.info('mercury: socket disconnected unexpectedly; will not reconnect');
392
+ // unexpected disconnect
502
393
  this._emit('offline.permanent', event);
503
-
504
394
  }
505
395
  } catch (error) {
506
396
  this.logger.error('mercury: error occurred in close handler', error);
@@ -508,21 +398,16 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
508
398
  },
509
399
  _onmessage: function _onmessage(event) {
510
400
  var _this6 = this;
511
-
512
401
  var envelope = event.data;
513
-
514
402
  if (process.env.ENABLE_MERCURY_LOGGING) {
515
403
  this.logger.debug('mercury: message envelope: ', envelope);
516
404
  }
517
-
518
405
  var data = envelope.data;
519
-
520
406
  this._applyOverrides(data);
521
-
522
407
  return this._getEventHandlers(data.eventType).reduce(function (promise, handler) {
523
408
  return promise.then(function () {
524
409
  var namespace = handler.namespace,
525
- name = handler.name;
410
+ name = handler.name;
526
411
  return new _promise.default(function (resolve) {
527
412
  return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
528
413
  }).catch(function (reason) {
@@ -531,16 +416,13 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
531
416
  });
532
417
  }, _promise.default.resolve()).then(function () {
533
418
  _this6._emit('event', event.data);
534
-
535
419
  var _data$eventType$split = data.eventType.split('.'),
536
- _data$eventType$split2 = (0, _slicedToArray2.default)(_data$eventType$split, 1),
537
- namespace = _data$eventType$split2[0];
538
-
420
+ _data$eventType$split2 = (0, _slicedToArray2.default)(_data$eventType$split, 1),
421
+ namespace = _data$eventType$split2[0];
539
422
  if (namespace === data.eventType) {
540
423
  _this6._emit("event:".concat(namespace), envelope);
541
424
  } else {
542
425
  _this6._emit("event:".concat(namespace), envelope);
543
-
544
426
  _this6._emit("event:".concat(data.eventType), envelope);
545
427
  }
546
428
  }).catch(function (reason) {
@@ -551,9 +433,8 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
551
433
  this.logger.info('mercury: reconnecting');
552
434
  return this.connect(webSocketUrl);
553
435
  },
554
- version: "3.0.0-beta.9"
436
+ version: "3.0.0-bnr.2"
555
437
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "connect", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "connect"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "disconnect", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "disconnect"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "listen", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "listen"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "stopListening", [_dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "stopListening"), _obj)), _obj)));
556
-
557
438
  var _default = Mercury;
558
439
  exports.default = _default;
559
440
  //# sourceMappingURL=mercury.js.map