@webex/internal-plugin-mercury 3.3.1-next.1 → 3.3.1

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
@@ -62,20 +62,6 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
62
62
  }
63
63
  }
64
64
  },
65
- initialize: function initialize() {
66
- var _this = this;
67
- /*
68
- When one of these legacy feature gets updated, this event would be triggered
69
- * group-message-notifications
70
- * mention-notifications
71
- * thread-notifications
72
- */
73
- this.on('event:featureToggle_update', function (envelope) {
74
- if (envelope && envelope.data) {
75
- _this.webex.internal.feature.updateFeature(envelope.data.featureToggle);
76
- }
77
- });
78
- },
79
65
  /**
80
66
  * Get the last error.
81
67
  * @returns {any} The last error.
@@ -84,28 +70,28 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
84
70
  return this.lastError;
85
71
  },
86
72
  connect: function connect(webSocketUrl) {
87
- var _this2 = this;
73
+ var _this = this;
88
74
  if (this.connected) {
89
75
  this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
90
76
  return _promise.default.resolve();
91
77
  }
92
78
  this.connecting = true;
93
79
  return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
94
- _this2.logger.info("".concat(_this2.namespace, ": connecting"));
95
- return _this2._connectWithBackoff(webSocketUrl);
80
+ _this.logger.info("".concat(_this.namespace, ": connecting"));
81
+ return _this._connectWithBackoff(webSocketUrl);
96
82
  });
97
83
  },
98
84
  disconnect: function disconnect() {
99
- var _this3 = this;
85
+ var _this2 = this;
100
86
  return new _promise.default(function (resolve) {
101
- if (_this3.backoffCall) {
102
- _this3.logger.info("".concat(_this3.namespace, ": aborting connection"));
103
- _this3.backoffCall.abort();
87
+ if (_this2.backoffCall) {
88
+ _this2.logger.info("".concat(_this2.namespace, ": aborting connection"));
89
+ _this2.backoffCall.abort();
104
90
  }
105
- if (_this3.socket) {
106
- _this3.socket.removeAllListeners('message');
107
- _this3.once('offline', resolve);
108
- resolve(_this3.socket.close());
91
+ if (_this2.socket) {
92
+ _this2.socket.removeAllListeners('message');
93
+ _this2.once('offline', resolve);
94
+ resolve(_this2.socket.close());
109
95
  }
110
96
  resolve();
111
97
  });
@@ -131,19 +117,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
131
117
  });
132
118
  },
133
119
  _prepareUrl: function _prepareUrl(webSocketUrl) {
134
- var _this4 = this;
120
+ var _this3 = this;
135
121
  if (!webSocketUrl) {
136
122
  webSocketUrl = this.webex.internal.device.webSocketUrl;
137
123
  }
138
124
  return this.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
139
125
  if (haMessagingEnabled) {
140
- return _this4.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
126
+ return _this3.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
141
127
  }
142
128
  return webSocketUrl;
143
129
  }).then(function (wsUrl) {
144
130
  webSocketUrl = wsUrl;
145
131
  }).then(function () {
146
- return _this4.webex.internal.feature.getFeature('developer', 'web-shared-mercury');
132
+ return _this3.webex.internal.feature.getFeature('developer', 'web-shared-mercury');
147
133
  }).then(function (webSharedMercury) {
148
134
  webSocketUrl = _url.default.parse(webSocketUrl, true);
149
135
  (0, _assign.default)(webSocketUrl.query, {
@@ -158,98 +144,98 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
158
144
  });
159
145
  (0, _deleteProperty.default)(webSocketUrl.query, 'bufferStates');
160
146
  }
161
- if ((0, _lodash.get)(_this4, 'webex.config.device.ephemeral', false)) {
147
+ if ((0, _lodash.get)(_this3, 'webex.config.device.ephemeral', false)) {
162
148
  webSocketUrl.query.multipleConnections = true;
163
149
  }
164
150
  return _url.default.format(webSocketUrl);
165
151
  });
166
152
  },
167
153
  _attemptConnection: function _attemptConnection(socketUrl, callback) {
168
- var _this5 = this;
154
+ var _this4 = this;
169
155
  var socket = new _socket.default();
170
156
  var attemptWSUrl;
171
157
  socket.on('close', function () {
172
- return _this5._onclose.apply(_this5, arguments);
158
+ return _this4._onclose.apply(_this4, arguments);
173
159
  });
174
160
  socket.on('message', function () {
175
- return _this5._onmessage.apply(_this5, arguments);
161
+ return _this4._onmessage.apply(_this4, arguments);
176
162
  });
177
163
  socket.on('sequence-mismatch', function () {
178
164
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
179
165
  args[_key] = arguments[_key];
180
166
  }
181
- return _this5._emit.apply(_this5, ['sequence-mismatch'].concat(args));
167
+ return _this4._emit.apply(_this4, ['sequence-mismatch'].concat(args));
182
168
  });
183
169
  socket.on('ping-pong-latency', function () {
184
170
  for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
185
171
  args[_key2] = arguments[_key2];
186
172
  }
187
- return _this5._emit.apply(_this5, ['ping-pong-latency'].concat(args));
173
+ return _this4._emit.apply(_this4, ['ping-pong-latency'].concat(args));
188
174
  });
189
175
  _promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
190
176
  var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
191
177
  webSocketUrl = _ref2[0],
192
178
  token = _ref2[1];
193
- if (!_this5.backoffCall) {
194
- var msg = "".concat(_this5.namespace, ": prevent socket open when backoffCall no longer defined");
195
- _this5.logger.info(msg);
179
+ if (!_this4.backoffCall) {
180
+ var msg = "".concat(_this4.namespace, ": prevent socket open when backoffCall no longer defined");
181
+ _this4.logger.info(msg);
196
182
  return _promise.default.reject(new Error(msg));
197
183
  }
198
184
  attemptWSUrl = webSocketUrl;
199
185
  var options = {
200
- forceCloseDelay: _this5.config.forceCloseDelay,
201
- pingInterval: _this5.config.pingInterval,
202
- pongTimeout: _this5.config.pongTimeout,
186
+ forceCloseDelay: _this4.config.forceCloseDelay,
187
+ pingInterval: _this4.config.pingInterval,
188
+ pongTimeout: _this4.config.pongTimeout,
203
189
  token: token.toString(),
204
- trackingId: "".concat(_this5.webex.sessionId, "_").concat((0, _now.default)()),
205
- logger: _this5.logger
190
+ trackingId: "".concat(_this4.webex.sessionId, "_").concat((0, _now.default)()),
191
+ logger: _this4.logger
206
192
  };
207
193
 
208
194
  // if the consumer has supplied request options use them
209
- if (_this5.webex.config.defaultMercuryOptions) {
210
- _this5.logger.info("".concat(_this5.namespace, ": setting custom options"));
211
- options = _objectSpread(_objectSpread({}, options), _this5.webex.config.defaultMercuryOptions);
195
+ if (_this4.webex.config.defaultMercuryOptions) {
196
+ _this4.logger.info("".concat(_this4.namespace, ": setting custom options"));
197
+ options = _objectSpread(_objectSpread({}, options), _this4.webex.config.defaultMercuryOptions);
212
198
  }
213
199
 
214
200
  // Set the socket before opening it. This allows a disconnect() to close
215
201
  // the socket if it is in the process of being opened.
216
- _this5.socket = socket;
217
- _this5.logger.info("".concat(_this5.namespace, " connection url: ").concat(webSocketUrl));
202
+ _this4.socket = socket;
203
+ _this4.logger.info("".concat(_this4.namespace, " connection url: ").concat(webSocketUrl));
218
204
  return socket.open(webSocketUrl, options);
219
205
  }).then(function () {
220
- _this5.logger.info("".concat(_this5.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
206
+ _this4.logger.info("".concat(_this4.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
221
207
  callback();
222
- return _this5.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
208
+ return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
223
209
  if (haMessagingEnabled) {
224
- return _this5.webex.internal.device.refresh();
210
+ return _this4.webex.internal.device.refresh();
225
211
  }
226
212
  return _promise.default.resolve();
227
213
  });
228
214
  }).catch(function (reason) {
229
- _this5.lastError = reason; // remember the last error
215
+ _this4.lastError = reason; // remember the last error
230
216
 
231
217
  // Suppress connection errors that appear to be network related. This
232
218
  // may end up suppressing metrics during outages, but we might not care
233
219
  // (especially since many of our outages happen in a way that client
234
220
  // metrics can't be trusted).
235
- if (reason.code !== 1006 && _this5.backoffCall && _this5.backoffCall.getNumRetries() > 0) {
236
- _this5._emit('connection_failed', reason, {
237
- retries: _this5.backoffCall.getNumRetries()
221
+ if (reason.code !== 1006 && _this4.backoffCall && _this4.backoffCall.getNumRetries() > 0) {
222
+ _this4._emit('connection_failed', reason, {
223
+ retries: _this4.backoffCall.getNumRetries()
238
224
  });
239
225
  }
240
- _this5.logger.info("".concat(_this5.namespace, ": connection attempt failed"), reason);
226
+ _this4.logger.info("".concat(_this4.namespace, ": connection attempt failed"), reason);
241
227
  // UnknownResponse is produced by IE for any 4XXX; treated it like a bad
242
228
  // web socket url and let WDM handle the token checking
243
229
  if (reason instanceof _errors.UnknownResponse) {
244
- _this5.logger.info("".concat(_this5.namespace, ": received unknown response code, refreshing device registration"));
245
- return _this5.webex.internal.device.refresh().then(function () {
230
+ _this4.logger.info("".concat(_this4.namespace, ": received unknown response code, refreshing device registration"));
231
+ return _this4.webex.internal.device.refresh().then(function () {
246
232
  return callback(reason);
247
233
  });
248
234
  }
249
235
  // NotAuthorized implies expired token
250
236
  if (reason instanceof _errors.NotAuthorized) {
251
- _this5.logger.info("".concat(_this5.namespace, ": received authorization error, reauthorizing"));
252
- return _this5.webex.credentials.refresh({
237
+ _this4.logger.info("".concat(_this4.namespace, ": received authorization error, reauthorizing"));
238
+ return _this4.webex.credentials.refresh({
253
239
  force: true
254
240
  }).then(function () {
255
241
  return callback(reason);
@@ -264,15 +250,15 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
264
250
  // BadRequest implies current credentials are for a Service Account
265
251
  // Forbidden implies current user is not entitle for Webex
266
252
  if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
267
- _this5.logger.warn("".concat(_this5.namespace, ": received unrecoverable response from mercury"));
268
- _this5.backoffCall.abort();
253
+ _this4.logger.warn("".concat(_this4.namespace, ": received unrecoverable response from mercury"));
254
+ _this4.backoffCall.abort();
269
255
  return callback(reason);
270
256
  }
271
257
  if (reason instanceof _errors.ConnectionError) {
272
- return _this5.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
258
+ return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
273
259
  if (haMessagingEnabled) {
274
- _this5.logger.info("".concat(_this5.namespace, ": received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ").concat(attemptWSUrl, " error: ").concat(reason.message));
275
- return _this5.webex.internal.services.markFailedUrl(attemptWSUrl);
260
+ _this4.logger.info("".concat(_this4.namespace, ": received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ").concat(attemptWSUrl, " error: ").concat(reason.message));
261
+ return _this4.webex.internal.services.markFailedUrl(attemptWSUrl);
276
262
  }
277
263
  return null;
278
264
  }).then(function () {
@@ -281,62 +267,62 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
281
267
  }
282
268
  return callback(reason);
283
269
  }).catch(function (reason) {
284
- _this5.logger.error("".concat(_this5.namespace, ": failed to handle connection failure"), reason);
270
+ _this4.logger.error("".concat(_this4.namespace, ": failed to handle connection failure"), reason);
285
271
  callback(reason);
286
272
  });
287
273
  },
288
274
  _connectWithBackoff: function _connectWithBackoff(webSocketUrl) {
289
- var _this6 = this;
275
+ var _this5 = this;
290
276
  return new _promise.default(function (resolve, reject) {
291
277
  // eslint gets confused about whether or not call is actually used
292
278
  // eslint-disable-next-line prefer-const
293
279
  var call;
294
280
  var onComplete = function onComplete(err) {
295
- _this6.connecting = false;
296
- _this6.backoffCall = undefined;
281
+ _this5.connecting = false;
282
+ _this5.backoffCall = undefined;
297
283
  if (err) {
298
- _this6.logger.info("".concat(_this6.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
284
+ _this5.logger.info("".concat(_this5.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
299
285
  return reject(err);
300
286
  }
301
- _this6.connected = true;
302
- _this6.hasEverConnected = true;
303
- _this6._emit('online');
287
+ _this5.connected = true;
288
+ _this5.hasEverConnected = true;
289
+ _this5._emit('online');
304
290
  return resolve();
305
291
  };
306
292
 
307
293
  // eslint-disable-next-line prefer-reflect
308
294
  call = _backoff.default.call(function (callback) {
309
- _this6.logger.info("".concat(_this6.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
310
- _this6._attemptConnection(webSocketUrl, callback);
295
+ _this5.logger.info("".concat(_this5.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
296
+ _this5._attemptConnection(webSocketUrl, callback);
311
297
  }, onComplete);
312
298
  call.setStrategy(new _backoff.default.ExponentialStrategy({
313
- initialDelay: _this6.config.backoffTimeReset,
314
- maxDelay: _this6.config.backoffTimeMax
299
+ initialDelay: _this5.config.backoffTimeReset,
300
+ maxDelay: _this5.config.backoffTimeMax
315
301
  }));
316
- if (_this6.config.initialConnectionMaxRetries && !_this6.hasEverConnected) {
317
- call.failAfter(_this6.config.initialConnectionMaxRetries);
318
- } else if (_this6.config.maxRetries) {
319
- call.failAfter(_this6.config.maxRetries);
302
+ if (_this5.config.initialConnectionMaxRetries && !_this5.hasEverConnected) {
303
+ call.failAfter(_this5.config.initialConnectionMaxRetries);
304
+ } else if (_this5.config.maxRetries) {
305
+ call.failAfter(_this5.config.maxRetries);
320
306
  }
321
307
  call.on('abort', function () {
322
- _this6.logger.info("".concat(_this6.namespace, ": connection aborted"));
308
+ _this5.logger.info("".concat(_this5.namespace, ": connection aborted"));
323
309
  reject(new Error('Mercury Connection Aborted'));
324
310
  });
325
311
  call.on('callback', function (err) {
326
312
  if (err) {
327
313
  var number = call.getNumRetries();
328
- var delay = Math.min(call.strategy_.nextBackoffDelay_, _this6.config.backoffTimeMax);
329
- _this6.logger.info("".concat(_this6.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
314
+ var delay = Math.min(call.strategy_.nextBackoffDelay_, _this5.config.backoffTimeMax);
315
+ _this5.logger.info("".concat(_this5.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
330
316
  /* istanbul ignore if */
331
317
  if (process.env.NODE_ENV === 'development') {
332
- _this6.logger.debug("".concat(_this6.namespace, ": "), err, err.stack);
318
+ _this5.logger.debug("".concat(_this5.namespace, ": "), err, err.stack);
333
319
  }
334
320
  return;
335
321
  }
336
- _this6.logger.info("".concat(_this6.namespace, ": connected"));
322
+ _this5.logger.info("".concat(_this5.namespace, ": connected"));
337
323
  });
338
324
  call.start();
339
- _this6.backoffCall = call;
325
+ _this5.backoffCall = call;
340
326
  });
341
327
  },
342
328
  _emit: function _emit() {
@@ -424,7 +410,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
424
410
  }
425
411
  },
426
412
  _onmessage: function _onmessage(event) {
427
- var _this7 = this;
413
+ var _this6 = this;
428
414
  var envelope = event.data;
429
415
  if (process.env.ENABLE_MERCURY_LOGGING) {
430
416
  this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
@@ -436,31 +422,31 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
436
422
  var namespace = handler.namespace,
437
423
  name = handler.name;
438
424
  return new _promise.default(function (resolve) {
439
- return resolve((_this7.webex[namespace] || _this7.webex.internal[namespace])[name](data));
425
+ return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
440
426
  }).catch(function (reason) {
441
- return _this7.logger.error("".concat(_this7.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
427
+ return _this6.logger.error("".concat(_this6.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
442
428
  });
443
429
  });
444
430
  }, _promise.default.resolve()).then(function () {
445
- _this7._emit('event', event.data);
431
+ _this6._emit('event', event.data);
446
432
  var _data$eventType$split = data.eventType.split('.'),
447
433
  _data$eventType$split2 = (0, _slicedToArray2.default)(_data$eventType$split, 1),
448
434
  namespace = _data$eventType$split2[0];
449
435
  if (namespace === data.eventType) {
450
- _this7._emit("event:".concat(namespace), envelope);
436
+ _this6._emit("event:".concat(namespace), envelope);
451
437
  } else {
452
- _this7._emit("event:".concat(namespace), envelope);
453
- _this7._emit("event:".concat(data.eventType), envelope);
438
+ _this6._emit("event:".concat(namespace), envelope);
439
+ _this6._emit("event:".concat(data.eventType), envelope);
454
440
  }
455
441
  }).catch(function (reason) {
456
- _this7.logger.error("".concat(_this7.namespace, ": error occurred processing socket message"), reason);
442
+ _this6.logger.error("".concat(_this6.namespace, ": error occurred processing socket message"), reason);
457
443
  });
458
444
  },
459
445
  _reconnect: function _reconnect(webSocketUrl) {
460
446
  this.logger.info("".concat(this.namespace, ": reconnecting"));
461
447
  return this.connect(webSocketUrl);
462
448
  },
463
- version: "3.3.1-next.1"
449
+ version: "3.3.1"
464
450
  }, ((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)));
465
451
  var _default = exports.default = Mercury;
466
452
  //# sourceMappingURL=mercury.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","type","connecting","hasEverConnected","socket","localClusterServiceUrls","derived","listening","deps","fn","initialize","_this","on","envelope","data","webex","internal","feature","updateFeature","featureToggle","getLastError","connect","webSocketUrl","_this2","logger","info","concat","_promise","resolve","device","registered","register","then","_connectWithBackoff","disconnect","_this3","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","_keys","keyPath","set","_prepareUrl","_this4","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","get","multipleConnections","format","_attemptConnection","socketUrl","callback","_this5","Socket","attemptWSUrl","_onclose","_onmessage","_len","args","Array","_key","_emit","_len2","_key2","all","credentials","getUserToken","_ref","_ref2","_slicedToArray2","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","_now","defaultMercuryOptions","open","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","markFailedUrl","error","_this6","call","onComplete","err","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","initialConnectionMaxRetries","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","_len3","_key3","trigger","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","name","handlers","handlerName","camelCase","toLowerCase","unset","_reconnect","includes","_this7","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","version","_applyDecoratedDescriptor2","oneFlight","_getOwnPropertyDescriptor","_default","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated, oneFlight} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n lastError: undefined,\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n hasEverConnected: {\n default: false,\n type: 'boolean',\n },\n socket: 'object',\n localClusterServiceUrls: 'object',\n },\n\n derived: {\n listening: {\n deps: ['connected'],\n fn() {\n return this.connected;\n },\n },\n },\n\n initialize() {\n /*\n When one of these legacy feature gets updated, this event would be triggered\n * group-message-notifications\n * mention-notifications\n * thread-notifications\n */\n this.on('event:featureToggle_update', (envelope) => {\n if (envelope && envelope.data) {\n this.webex.internal.feature.updateFeature(envelope.data.featureToggle);\n }\n });\n },\n\n /**\n * Get the last error.\n * @returns {any} The last error.\n */\n getLastError() {\n return this.lastError;\n },\n\n @oneFlight\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info(`${this.namespace}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n this.connecting = true;\n\n return Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n ).then(() => {\n this.logger.info(`${this.namespace}: connecting`);\n\n return this._connectWithBackoff(webSocketUrl);\n });\n },\n\n @oneFlight\n disconnect() {\n return new Promise((resolve) => {\n if (this.backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection`);\n this.backoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n resolve(this.socket.close());\n }\n\n resolve();\n });\n },\n\n @deprecated('Mercury#listen(): Use Mercury#connect() instead')\n listen() {\n /* eslint no-invalid-this: [0] */\n return this.connect();\n },\n\n @deprecated('Mercury#stopListening(): Use Mercury#disconnect() instead')\n stopListening() {\n /* eslint no-invalid-this: [0] */\n return this.disconnect();\n },\n\n processRegistrationStatusEvent(message) {\n this.localClusterServiceUrls = message.localClusterServiceUrls;\n },\n\n _applyOverrides(event) {\n if (!event || !event.headers) {\n return;\n }\n const headerKeys = Object.keys(event.headers);\n\n headerKeys.forEach((keyPath) => {\n set(event, keyPath, event.headers[keyPath]);\n });\n },\n\n _prepareUrl(webSocketUrl) {\n if (!webSocketUrl) {\n webSocketUrl = this.webex.internal.device.webSocketUrl;\n }\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);\n }\n\n return webSocketUrl;\n })\n .then((wsUrl) => {\n webSocketUrl = wsUrl;\n })\n .then(() => this.webex.internal.feature.getFeature('developer', 'web-shared-mercury'))\n .then((webSharedMercury) => {\n webSocketUrl = url.parse(webSocketUrl, true);\n Object.assign(webSocketUrl.query, {\n outboundWireFormat: 'text',\n bufferStates: true,\n aliasHttpStatus: true,\n });\n\n if (webSharedMercury) {\n Object.assign(webSocketUrl.query, {\n mercuryRegistrationStatus: true,\n isRegistrationRefreshEnabled: true,\n });\n Reflect.deleteProperty(webSocketUrl.query, 'bufferStates');\n }\n\n if (get(this, 'webex.config.device.ephemeral', false)) {\n webSocketUrl.query.multipleConnections = true;\n }\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, callback) {\n const socket = new Socket();\n let attemptWSUrl;\n\n socket.on('close', (...args) => this._onclose(...args));\n socket.on('message', (...args) => this._onmessage(...args));\n socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));\n socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args));\n\n Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()])\n .then(([webSocketUrl, token]) => {\n if (!this.backoffCall) {\n const msg = `${this.namespace}: prevent socket open when backoffCall no longer defined`;\n\n this.logger.info(msg);\n\n return Promise.reject(new Error(msg));\n }\n\n attemptWSUrl = webSocketUrl;\n\n let options = {\n forceCloseDelay: this.config.forceCloseDelay,\n pingInterval: this.config.pingInterval,\n pongTimeout: this.config.pongTimeout,\n token: token.toString(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n // if the consumer has supplied request options use them\n if (this.webex.config.defaultMercuryOptions) {\n this.logger.info(`${this.namespace}: setting custom options`);\n options = {...options, ...this.webex.config.defaultMercuryOptions};\n }\n\n // Set the socket before opening it. This allows a disconnect() to close\n // the socket if it is in the process of being opened.\n this.socket = socket;\n\n this.logger.info(`${this.namespace} connection url: ${webSocketUrl}`);\n\n return socket.open(webSocketUrl, options);\n })\n .then(() => {\n this.logger.info(\n `${this.namespace}: connected to mercury, success, action: connected, url: ${attemptWSUrl}`\n );\n callback();\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.device.refresh();\n }\n\n return Promise.resolve();\n });\n })\n .catch((reason) => {\n this.lastError = reason; // remember the last error\n\n // Suppress connection errors that appear to be network related. This\n // may end up suppressing metrics during outages, but we might not care\n // (especially since many of our outages happen in a way that client\n // metrics can't be trusted).\n if (reason.code !== 1006 && this.backoffCall && this.backoffCall.getNumRetries() > 0) {\n this._emit('connection_failed', reason, {retries: this.backoffCall.getNumRetries()});\n }\n this.logger.info(`${this.namespace}: connection attempt failed`, reason);\n // UnknownResponse is produced by IE for any 4XXX; treated it like a bad\n // web socket url and let WDM handle the token checking\n if (reason instanceof UnknownResponse) {\n this.logger.info(\n `${this.namespace}: received unknown response code, refreshing device registration`\n );\n\n return this.webex.internal.device.refresh().then(() => callback(reason));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(`${this.namespace}: received authorization error, reauthorizing`);\n\n return this.webex.credentials.refresh({force: true}).then(() => callback(reason));\n }\n // // NotFound implies expired web socket url\n // else if (reason instanceof NotFound) {\n // this.logger.info(`mercury: received not found error, refreshing device registration`);\n // return this.webex.internal.device.refresh()\n // .then(() => callback(reason));\n // }\n // BadRequest implies current credentials are for a Service Account\n // Forbidden implies current user is not entitle for Webex\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(`${this.namespace}: received unrecoverable response from mercury`);\n this.backoffCall.abort();\n\n return callback(reason);\n }\n if (reason instanceof ConnectionError) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n this.logger.info(\n `${this.namespace}: received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ${attemptWSUrl} error: ${reason.message}`\n );\n\n return this.webex.internal.services.markFailedUrl(attemptWSUrl);\n }\n\n return null;\n })\n .then(() => callback(reason));\n }\n\n return callback(reason);\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: failed to handle connection failure`, reason);\n callback(reason);\n });\n },\n\n _connectWithBackoff(webSocketUrl) {\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether or not call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err) => {\n this.connecting = false;\n\n this.backoffCall = undefined;\n if (err) {\n this.logger.info(\n `${\n this.namespace\n }: failed to connect after ${call.getNumRetries()} retries; log statement about next retry was inaccurate; ${err}`\n );\n\n return reject(err);\n }\n this.connected = true;\n this.hasEverConnected = true;\n this._emit('online');\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n this.logger.info(`${this.namespace}: executing connection attempt ${call.getNumRetries()}`);\n this._attemptConnection(webSocketUrl, callback);\n }, onComplete);\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (this.config.initialConnectionMaxRetries && !this.hasEverConnected) {\n call.failAfter(this.config.initialConnectionMaxRetries);\n } else if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n call.on('abort', () => {\n this.logger.info(`${this.namespace}: connection aborted`);\n reject(new Error('Mercury Connection Aborted'));\n });\n\n call.on('callback', (err) => {\n if (err) {\n const number = call.getNumRetries();\n const delay = Math.min(call.strategy_.nextBackoffDelay_, this.config.backoffTimeMax);\n\n this.logger.info(\n `${this.namespace}: failed to connect; attempting retry ${number + 1} in ${delay} ms`\n );\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'development') {\n this.logger.debug(`${this.namespace}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${this.namespace}: connected`);\n });\n\n call.start();\n\n this.backoffCall = call;\n });\n },\n\n _emit(...args) {\n try {\n this.trigger(...args);\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in event handler`, {\n error,\n arguments: args,\n });\n }\n },\n\n _getEventHandlers(eventType) {\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _onclose(event) {\n // I don't see any way to avoid the complexity or statement count in here.\n /* eslint complexity: [0] */\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n const socketUrl = this.socket.url;\n\n this.socket.removeAllListeners();\n this.unset('socket');\n this.connected = false;\n this._emit('offline', event);\n\n switch (event.code) {\n case 1003:\n // metric: disconnect\n this.logger.info(\n `${this.namespace}: Mercury service rejected last message; will not reconnect: ${event.reason}`\n );\n this._emit('offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n this.logger.info(`${this.namespace}: socket replaced; will not reconnect`);\n this._emit('offline.replaced', event);\n break;\n case 1001:\n case 1005:\n case 1006:\n case 1011:\n this.logger.info(`${this.namespace}: socket disconnected; reconnecting`);\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (code == 1011 && reason !== ping error) metric: unexpected disconnect\n break;\n case 1000:\n if (normalReconnectReasons.includes(reason)) {\n this.logger.info(`${this.namespace}: socket disconnected; reconnecting`);\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(`${this.namespace}: socket disconnected; will not reconnect`);\n this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in close handler`, error);\n }\n },\n\n _onmessage(event) {\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope: `, envelope);\n }\n\n const {data} = envelope;\n\n this._applyOverrides(data);\n\n return this._getEventHandlers(data.eventType)\n .reduce(\n (promise, handler) =>\n promise.then(() => {\n const {namespace, name} = handler;\n\n return new Promise((resolve) =>\n resolve((this.webex[namespace] || this.webex.internal[namespace])[name](data))\n ).catch((reason) =>\n this.logger.error(\n `${this.namespace}: error occurred in autowired event handler for ${data.eventType}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit('event', event.data);\n const [namespace] = data.eventType.split('.');\n\n if (namespace === data.eventType) {\n this._emit(`event:${namespace}`, envelope);\n } else {\n this._emit(`event:${namespace}`, envelope);\n this._emit(`event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: error occurred processing socket message`, reason);\n });\n },\n\n _reconnect(webSocketUrl) {\n this.logger.info(`${this.namespace}: reconnecting`);\n\n return this.connect(webSocketUrl);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","type","connecting","hasEverConnected","socket","localClusterServiceUrls","derived","listening","deps","fn","getLastError","connect","webSocketUrl","_this","logger","info","concat","_promise","resolve","webex","internal","device","registered","register","then","_connectWithBackoff","disconnect","_this2","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","_keys","keyPath","set","_prepareUrl","_this3","feature","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","get","multipleConnections","format","_attemptConnection","socketUrl","callback","_this4","Socket","attemptWSUrl","on","_onclose","_onmessage","_len","args","Array","_key","_emit","_len2","_key2","all","credentials","getUserToken","_ref","_ref2","_slicedToArray2","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","_now","defaultMercuryOptions","open","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","markFailedUrl","error","_this5","call","onComplete","err","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","initialConnectionMaxRetries","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","_len3","_key3","trigger","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","name","handlers","handlerName","camelCase","toLowerCase","unset","_reconnect","includes","_this6","envelope","data","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","version","_applyDecoratedDescriptor2","oneFlight","_getOwnPropertyDescriptor","_default","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated, oneFlight} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n lastError: undefined,\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n hasEverConnected: {\n default: false,\n type: 'boolean',\n },\n socket: 'object',\n localClusterServiceUrls: 'object',\n },\n\n derived: {\n listening: {\n deps: ['connected'],\n fn() {\n return this.connected;\n },\n },\n },\n\n /**\n * Get the last error.\n * @returns {any} The last error.\n */\n getLastError() {\n return this.lastError;\n },\n\n @oneFlight\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info(`${this.namespace}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n this.connecting = true;\n\n return Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n ).then(() => {\n this.logger.info(`${this.namespace}: connecting`);\n\n return this._connectWithBackoff(webSocketUrl);\n });\n },\n\n @oneFlight\n disconnect() {\n return new Promise((resolve) => {\n if (this.backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection`);\n this.backoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n resolve(this.socket.close());\n }\n\n resolve();\n });\n },\n\n @deprecated('Mercury#listen(): Use Mercury#connect() instead')\n listen() {\n /* eslint no-invalid-this: [0] */\n return this.connect();\n },\n\n @deprecated('Mercury#stopListening(): Use Mercury#disconnect() instead')\n stopListening() {\n /* eslint no-invalid-this: [0] */\n return this.disconnect();\n },\n\n processRegistrationStatusEvent(message) {\n this.localClusterServiceUrls = message.localClusterServiceUrls;\n },\n\n _applyOverrides(event) {\n if (!event || !event.headers) {\n return;\n }\n const headerKeys = Object.keys(event.headers);\n\n headerKeys.forEach((keyPath) => {\n set(event, keyPath, event.headers[keyPath]);\n });\n },\n\n _prepareUrl(webSocketUrl) {\n if (!webSocketUrl) {\n webSocketUrl = this.webex.internal.device.webSocketUrl;\n }\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);\n }\n\n return webSocketUrl;\n })\n .then((wsUrl) => {\n webSocketUrl = wsUrl;\n })\n .then(() => this.webex.internal.feature.getFeature('developer', 'web-shared-mercury'))\n .then((webSharedMercury) => {\n webSocketUrl = url.parse(webSocketUrl, true);\n Object.assign(webSocketUrl.query, {\n outboundWireFormat: 'text',\n bufferStates: true,\n aliasHttpStatus: true,\n });\n\n if (webSharedMercury) {\n Object.assign(webSocketUrl.query, {\n mercuryRegistrationStatus: true,\n isRegistrationRefreshEnabled: true,\n });\n Reflect.deleteProperty(webSocketUrl.query, 'bufferStates');\n }\n\n if (get(this, 'webex.config.device.ephemeral', false)) {\n webSocketUrl.query.multipleConnections = true;\n }\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, callback) {\n const socket = new Socket();\n let attemptWSUrl;\n\n socket.on('close', (...args) => this._onclose(...args));\n socket.on('message', (...args) => this._onmessage(...args));\n socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));\n socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args));\n\n Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()])\n .then(([webSocketUrl, token]) => {\n if (!this.backoffCall) {\n const msg = `${this.namespace}: prevent socket open when backoffCall no longer defined`;\n\n this.logger.info(msg);\n\n return Promise.reject(new Error(msg));\n }\n\n attemptWSUrl = webSocketUrl;\n\n let options = {\n forceCloseDelay: this.config.forceCloseDelay,\n pingInterval: this.config.pingInterval,\n pongTimeout: this.config.pongTimeout,\n token: token.toString(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n // if the consumer has supplied request options use them\n if (this.webex.config.defaultMercuryOptions) {\n this.logger.info(`${this.namespace}: setting custom options`);\n options = {...options, ...this.webex.config.defaultMercuryOptions};\n }\n\n // Set the socket before opening it. This allows a disconnect() to close\n // the socket if it is in the process of being opened.\n this.socket = socket;\n\n this.logger.info(`${this.namespace} connection url: ${webSocketUrl}`);\n\n return socket.open(webSocketUrl, options);\n })\n .then(() => {\n this.logger.info(\n `${this.namespace}: connected to mercury, success, action: connected, url: ${attemptWSUrl}`\n );\n callback();\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.device.refresh();\n }\n\n return Promise.resolve();\n });\n })\n .catch((reason) => {\n this.lastError = reason; // remember the last error\n\n // Suppress connection errors that appear to be network related. This\n // may end up suppressing metrics during outages, but we might not care\n // (especially since many of our outages happen in a way that client\n // metrics can't be trusted).\n if (reason.code !== 1006 && this.backoffCall && this.backoffCall.getNumRetries() > 0) {\n this._emit('connection_failed', reason, {retries: this.backoffCall.getNumRetries()});\n }\n this.logger.info(`${this.namespace}: connection attempt failed`, reason);\n // UnknownResponse is produced by IE for any 4XXX; treated it like a bad\n // web socket url and let WDM handle the token checking\n if (reason instanceof UnknownResponse) {\n this.logger.info(\n `${this.namespace}: received unknown response code, refreshing device registration`\n );\n\n return this.webex.internal.device.refresh().then(() => callback(reason));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(`${this.namespace}: received authorization error, reauthorizing`);\n\n return this.webex.credentials.refresh({force: true}).then(() => callback(reason));\n }\n // // NotFound implies expired web socket url\n // else if (reason instanceof NotFound) {\n // this.logger.info(`mercury: received not found error, refreshing device registration`);\n // return this.webex.internal.device.refresh()\n // .then(() => callback(reason));\n // }\n // BadRequest implies current credentials are for a Service Account\n // Forbidden implies current user is not entitle for Webex\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(`${this.namespace}: received unrecoverable response from mercury`);\n this.backoffCall.abort();\n\n return callback(reason);\n }\n if (reason instanceof ConnectionError) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n this.logger.info(\n `${this.namespace}: received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ${attemptWSUrl} error: ${reason.message}`\n );\n\n return this.webex.internal.services.markFailedUrl(attemptWSUrl);\n }\n\n return null;\n })\n .then(() => callback(reason));\n }\n\n return callback(reason);\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: failed to handle connection failure`, reason);\n callback(reason);\n });\n },\n\n _connectWithBackoff(webSocketUrl) {\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether or not call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err) => {\n this.connecting = false;\n\n this.backoffCall = undefined;\n if (err) {\n this.logger.info(\n `${\n this.namespace\n }: failed to connect after ${call.getNumRetries()} retries; log statement about next retry was inaccurate; ${err}`\n );\n\n return reject(err);\n }\n this.connected = true;\n this.hasEverConnected = true;\n this._emit('online');\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n this.logger.info(`${this.namespace}: executing connection attempt ${call.getNumRetries()}`);\n this._attemptConnection(webSocketUrl, callback);\n }, onComplete);\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (this.config.initialConnectionMaxRetries && !this.hasEverConnected) {\n call.failAfter(this.config.initialConnectionMaxRetries);\n } else if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n call.on('abort', () => {\n this.logger.info(`${this.namespace}: connection aborted`);\n reject(new Error('Mercury Connection Aborted'));\n });\n\n call.on('callback', (err) => {\n if (err) {\n const number = call.getNumRetries();\n const delay = Math.min(call.strategy_.nextBackoffDelay_, this.config.backoffTimeMax);\n\n this.logger.info(\n `${this.namespace}: failed to connect; attempting retry ${number + 1} in ${delay} ms`\n );\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'development') {\n this.logger.debug(`${this.namespace}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${this.namespace}: connected`);\n });\n\n call.start();\n\n this.backoffCall = call;\n });\n },\n\n _emit(...args) {\n try {\n this.trigger(...args);\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in event handler`, {\n error,\n arguments: args,\n });\n }\n },\n\n _getEventHandlers(eventType) {\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _onclose(event) {\n // I don't see any way to avoid the complexity or statement count in here.\n /* eslint complexity: [0] */\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n const socketUrl = this.socket.url;\n\n this.socket.removeAllListeners();\n this.unset('socket');\n this.connected = false;\n this._emit('offline', event);\n\n switch (event.code) {\n case 1003:\n // metric: disconnect\n this.logger.info(\n `${this.namespace}: Mercury service rejected last message; will not reconnect: ${event.reason}`\n );\n this._emit('offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n this.logger.info(`${this.namespace}: socket replaced; will not reconnect`);\n this._emit('offline.replaced', event);\n break;\n case 1001:\n case 1005:\n case 1006:\n case 1011:\n this.logger.info(`${this.namespace}: socket disconnected; reconnecting`);\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (code == 1011 && reason !== ping error) metric: unexpected disconnect\n break;\n case 1000:\n if (normalReconnectReasons.includes(reason)) {\n this.logger.info(`${this.namespace}: socket disconnected; reconnecting`);\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(`${this.namespace}: socket disconnected; will not reconnect`);\n this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in close handler`, error);\n }\n },\n\n _onmessage(event) {\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope: `, envelope);\n }\n\n const {data} = envelope;\n\n this._applyOverrides(data);\n\n return this._getEventHandlers(data.eventType)\n .reduce(\n (promise, handler) =>\n promise.then(() => {\n const {namespace, name} = handler;\n\n return new Promise((resolve) =>\n resolve((this.webex[namespace] || this.webex.internal[namespace])[name](data))\n ).catch((reason) =>\n this.logger.error(\n `${this.namespace}: error occurred in autowired event handler for ${data.eventType}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit('event', event.data);\n const [namespace] = data.eventType.split('.');\n\n if (namespace === data.eventType) {\n this._emit(`event:${namespace}`, envelope);\n } else {\n this._emit(`event:${namespace}`, envelope);\n this._emit(`event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: error occurred processing socket message`, reason);\n });\n },\n\n _reconnect(webSocketUrl) {\n this.logger.info(`${this.namespace}: reconnecting`);\n\n return this.connect(webSocketUrl);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -29,27 +29,27 @@
29
29
  "@webex/eslint-config-legacy": "0.0.0",
30
30
  "@webex/jest-config-legacy": "0.0.0",
31
31
  "@webex/legacy-tools": "0.0.0",
32
- "@webex/test-helper-chai": "3.1.0-next.3",
33
- "@webex/test-helper-mocha": "3.1.0-next.3",
34
- "@webex/test-helper-mock-webex": "3.1.0-next.3",
35
- "@webex/test-helper-test-users": "3.1.0-next.3",
32
+ "@webex/test-helper-chai": "3.3.1",
33
+ "@webex/test-helper-mocha": "3.3.1",
34
+ "@webex/test-helper-mock-webex": "3.3.1",
35
+ "@webex/test-helper-test-users": "3.3.1",
36
36
  "eslint": "^8.24.0",
37
37
  "prettier": "^2.7.1",
38
38
  "sinon": "^9.2.4"
39
39
  },
40
40
  "dependencies": {
41
- "@webex/common": "3.1.0-next.3",
42
- "@webex/common-timers": "3.1.0-next.3",
43
- "@webex/internal-plugin-device": "3.1.0-next.3",
44
- "@webex/internal-plugin-feature": "3.3.1-next.1",
45
- "@webex/internal-plugin-metrics": "3.1.0-next.3",
46
- "@webex/test-helper-chai": "3.1.0-next.3",
47
- "@webex/test-helper-mocha": "3.1.0-next.3",
48
- "@webex/test-helper-mock-web-socket": "3.1.0-next.3",
49
- "@webex/test-helper-mock-webex": "3.1.0-next.3",
50
- "@webex/test-helper-refresh-callback": "3.1.0-next.3",
51
- "@webex/test-helper-test-users": "3.1.0-next.3",
52
- "@webex/webex-core": "3.1.0-next.3",
41
+ "@webex/common": "3.3.1",
42
+ "@webex/common-timers": "3.3.1",
43
+ "@webex/internal-plugin-device": "3.3.1",
44
+ "@webex/internal-plugin-feature": "3.3.1",
45
+ "@webex/internal-plugin-metrics": "3.3.1",
46
+ "@webex/test-helper-chai": "3.3.1",
47
+ "@webex/test-helper-mocha": "3.3.1",
48
+ "@webex/test-helper-mock-web-socket": "3.3.1",
49
+ "@webex/test-helper-mock-webex": "3.3.1",
50
+ "@webex/test-helper-refresh-callback": "3.3.1",
51
+ "@webex/test-helper-test-users": "3.3.1",
52
+ "@webex/webex-core": "3.3.1",
53
53
  "backoff": "^2.5.0",
54
54
  "lodash": "^4.17.21",
55
55
  "uuid": "^3.3.2",
@@ -64,5 +64,5 @@
64
64
  "test:style": "eslint ./src/**/*.*",
65
65
  "test:unit": "webex-legacy-tools test --unit --runner mocha"
66
66
  },
67
- "version": "3.3.1-next.1"
67
+ "version": "3.3.1"
68
68
  }
package/src/mercury.js CHANGED
@@ -52,20 +52,6 @@ const Mercury = WebexPlugin.extend({
52
52
  },
53
53
  },
54
54
 
55
- initialize() {
56
- /*
57
- When one of these legacy feature gets updated, this event would be triggered
58
- * group-message-notifications
59
- * mention-notifications
60
- * thread-notifications
61
- */
62
- this.on('event:featureToggle_update', (envelope) => {
63
- if (envelope && envelope.data) {
64
- this.webex.internal.feature.updateFeature(envelope.data.featureToggle);
65
- }
66
- });
67
- },
68
-
69
55
  /**
70
56
  * Get the last error.
71
57
  * @returns {any} The last error.
@@ -138,15 +138,7 @@ describe('plugin-mercury', () => {
138
138
  });
139
139
 
140
140
  it('connects to Mercury using default url', () => {
141
- webex.internal.feature.updateFeature = sinon.stub();
142
141
  const promise = mercury.connect();
143
- const envelope = {
144
- data: {
145
- featureToggle: {
146
- 'feature-name': true
147
- }
148
- }
149
- };
150
142
 
151
143
  assert.isFalse(mercury.connected, 'Mercury is not connected');
152
144
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
@@ -156,21 +148,6 @@ describe('plugin-mercury', () => {
156
148
  assert.isTrue(mercury.connected, 'Mercury is connected');
157
149
  assert.isFalse(mercury.connecting, 'Mercury is not connecting');
158
150
  assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match.any);
159
- mercury._emit('event:featureToggle_update', envelope);
160
- assert.calledOnceWithExactly(webex.internal.feature.updateFeature, envelope.data.featureToggle);
161
- sinon.restore();
162
- });
163
- });
164
-
165
- it('connects to Mercury but does not call updateFeature', () => {
166
- webex.internal.feature.updateFeature = sinon.stub();
167
- const promise = mercury.connect();
168
- const envelope = {};
169
-
170
- return promise.then(() => {
171
- mercury._emit('event:featureToggle_update', envelope);
172
- assert.notCalled(webex.internal.feature.updateFeature);
173
- sinon.restore();
174
151
  });
175
152
  });
176
153