@webex/internal-plugin-mercury 3.3.1 → 3.4.0

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,6 +62,20 @@ 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
+ },
65
79
  /**
66
80
  * Get the last error.
67
81
  * @returns {any} The last error.
@@ -70,28 +84,28 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
70
84
  return this.lastError;
71
85
  },
72
86
  connect: function connect(webSocketUrl) {
73
- var _this = this;
87
+ var _this2 = this;
74
88
  if (this.connected) {
75
89
  this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
76
90
  return _promise.default.resolve();
77
91
  }
78
92
  this.connecting = true;
79
93
  return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
80
- _this.logger.info("".concat(_this.namespace, ": connecting"));
81
- return _this._connectWithBackoff(webSocketUrl);
94
+ _this2.logger.info("".concat(_this2.namespace, ": connecting"));
95
+ return _this2._connectWithBackoff(webSocketUrl);
82
96
  });
83
97
  },
84
98
  disconnect: function disconnect() {
85
- var _this2 = this;
99
+ var _this3 = this;
86
100
  return new _promise.default(function (resolve) {
87
- if (_this2.backoffCall) {
88
- _this2.logger.info("".concat(_this2.namespace, ": aborting connection"));
89
- _this2.backoffCall.abort();
101
+ if (_this3.backoffCall) {
102
+ _this3.logger.info("".concat(_this3.namespace, ": aborting connection"));
103
+ _this3.backoffCall.abort();
90
104
  }
91
- if (_this2.socket) {
92
- _this2.socket.removeAllListeners('message');
93
- _this2.once('offline', resolve);
94
- resolve(_this2.socket.close());
105
+ if (_this3.socket) {
106
+ _this3.socket.removeAllListeners('message');
107
+ _this3.once('offline', resolve);
108
+ resolve(_this3.socket.close());
95
109
  }
96
110
  resolve();
97
111
  });
@@ -117,19 +131,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
117
131
  });
118
132
  },
119
133
  _prepareUrl: function _prepareUrl(webSocketUrl) {
120
- var _this3 = this;
134
+ var _this4 = this;
121
135
  if (!webSocketUrl) {
122
136
  webSocketUrl = this.webex.internal.device.webSocketUrl;
123
137
  }
124
138
  return this.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
125
139
  if (haMessagingEnabled) {
126
- return _this3.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
140
+ return _this4.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
127
141
  }
128
142
  return webSocketUrl;
129
143
  }).then(function (wsUrl) {
130
144
  webSocketUrl = wsUrl;
131
145
  }).then(function () {
132
- return _this3.webex.internal.feature.getFeature('developer', 'web-shared-mercury');
146
+ return _this4.webex.internal.feature.getFeature('developer', 'web-shared-mercury');
133
147
  }).then(function (webSharedMercury) {
134
148
  webSocketUrl = _url.default.parse(webSocketUrl, true);
135
149
  (0, _assign.default)(webSocketUrl.query, {
@@ -144,98 +158,98 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
144
158
  });
145
159
  (0, _deleteProperty.default)(webSocketUrl.query, 'bufferStates');
146
160
  }
147
- if ((0, _lodash.get)(_this3, 'webex.config.device.ephemeral', false)) {
161
+ if ((0, _lodash.get)(_this4, 'webex.config.device.ephemeral', false)) {
148
162
  webSocketUrl.query.multipleConnections = true;
149
163
  }
150
164
  return _url.default.format(webSocketUrl);
151
165
  });
152
166
  },
153
167
  _attemptConnection: function _attemptConnection(socketUrl, callback) {
154
- var _this4 = this;
168
+ var _this5 = this;
155
169
  var socket = new _socket.default();
156
170
  var attemptWSUrl;
157
171
  socket.on('close', function () {
158
- return _this4._onclose.apply(_this4, arguments);
172
+ return _this5._onclose.apply(_this5, arguments);
159
173
  });
160
174
  socket.on('message', function () {
161
- return _this4._onmessage.apply(_this4, arguments);
175
+ return _this5._onmessage.apply(_this5, arguments);
162
176
  });
163
177
  socket.on('sequence-mismatch', function () {
164
178
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
165
179
  args[_key] = arguments[_key];
166
180
  }
167
- return _this4._emit.apply(_this4, ['sequence-mismatch'].concat(args));
181
+ return _this5._emit.apply(_this5, ['sequence-mismatch'].concat(args));
168
182
  });
169
183
  socket.on('ping-pong-latency', function () {
170
184
  for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
171
185
  args[_key2] = arguments[_key2];
172
186
  }
173
- return _this4._emit.apply(_this4, ['ping-pong-latency'].concat(args));
187
+ return _this5._emit.apply(_this5, ['ping-pong-latency'].concat(args));
174
188
  });
175
189
  _promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
176
190
  var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
177
191
  webSocketUrl = _ref2[0],
178
192
  token = _ref2[1];
179
- if (!_this4.backoffCall) {
180
- var msg = "".concat(_this4.namespace, ": prevent socket open when backoffCall no longer defined");
181
- _this4.logger.info(msg);
193
+ if (!_this5.backoffCall) {
194
+ var msg = "".concat(_this5.namespace, ": prevent socket open when backoffCall no longer defined");
195
+ _this5.logger.info(msg);
182
196
  return _promise.default.reject(new Error(msg));
183
197
  }
184
198
  attemptWSUrl = webSocketUrl;
185
199
  var options = {
186
- forceCloseDelay: _this4.config.forceCloseDelay,
187
- pingInterval: _this4.config.pingInterval,
188
- pongTimeout: _this4.config.pongTimeout,
200
+ forceCloseDelay: _this5.config.forceCloseDelay,
201
+ pingInterval: _this5.config.pingInterval,
202
+ pongTimeout: _this5.config.pongTimeout,
189
203
  token: token.toString(),
190
- trackingId: "".concat(_this4.webex.sessionId, "_").concat((0, _now.default)()),
191
- logger: _this4.logger
204
+ trackingId: "".concat(_this5.webex.sessionId, "_").concat((0, _now.default)()),
205
+ logger: _this5.logger
192
206
  };
193
207
 
194
208
  // if the consumer has supplied request options use them
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);
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);
198
212
  }
199
213
 
200
214
  // Set the socket before opening it. This allows a disconnect() to close
201
215
  // the socket if it is in the process of being opened.
202
- _this4.socket = socket;
203
- _this4.logger.info("".concat(_this4.namespace, " connection url: ").concat(webSocketUrl));
216
+ _this5.socket = socket;
217
+ _this5.logger.info("".concat(_this5.namespace, " connection url: ").concat(webSocketUrl));
204
218
  return socket.open(webSocketUrl, options);
205
219
  }).then(function () {
206
- _this4.logger.info("".concat(_this4.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
220
+ _this5.logger.info("".concat(_this5.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
207
221
  callback();
208
- return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
222
+ return _this5.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
209
223
  if (haMessagingEnabled) {
210
- return _this4.webex.internal.device.refresh();
224
+ return _this5.webex.internal.device.refresh();
211
225
  }
212
226
  return _promise.default.resolve();
213
227
  });
214
228
  }).catch(function (reason) {
215
- _this4.lastError = reason; // remember the last error
229
+ _this5.lastError = reason; // remember the last error
216
230
 
217
231
  // Suppress connection errors that appear to be network related. This
218
232
  // may end up suppressing metrics during outages, but we might not care
219
233
  // (especially since many of our outages happen in a way that client
220
234
  // metrics can't be trusted).
221
- if (reason.code !== 1006 && _this4.backoffCall && _this4.backoffCall.getNumRetries() > 0) {
222
- _this4._emit('connection_failed', reason, {
223
- retries: _this4.backoffCall.getNumRetries()
235
+ if (reason.code !== 1006 && _this5.backoffCall && _this5.backoffCall.getNumRetries() > 0) {
236
+ _this5._emit('connection_failed', reason, {
237
+ retries: _this5.backoffCall.getNumRetries()
224
238
  });
225
239
  }
226
- _this4.logger.info("".concat(_this4.namespace, ": connection attempt failed"), reason);
240
+ _this5.logger.info("".concat(_this5.namespace, ": connection attempt failed"), reason);
227
241
  // UnknownResponse is produced by IE for any 4XXX; treated it like a bad
228
242
  // web socket url and let WDM handle the token checking
229
243
  if (reason instanceof _errors.UnknownResponse) {
230
- _this4.logger.info("".concat(_this4.namespace, ": received unknown response code, refreshing device registration"));
231
- return _this4.webex.internal.device.refresh().then(function () {
244
+ _this5.logger.info("".concat(_this5.namespace, ": received unknown response code, refreshing device registration"));
245
+ return _this5.webex.internal.device.refresh().then(function () {
232
246
  return callback(reason);
233
247
  });
234
248
  }
235
249
  // NotAuthorized implies expired token
236
250
  if (reason instanceof _errors.NotAuthorized) {
237
- _this4.logger.info("".concat(_this4.namespace, ": received authorization error, reauthorizing"));
238
- return _this4.webex.credentials.refresh({
251
+ _this5.logger.info("".concat(_this5.namespace, ": received authorization error, reauthorizing"));
252
+ return _this5.webex.credentials.refresh({
239
253
  force: true
240
254
  }).then(function () {
241
255
  return callback(reason);
@@ -250,15 +264,15 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
250
264
  // BadRequest implies current credentials are for a Service Account
251
265
  // Forbidden implies current user is not entitle for Webex
252
266
  if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
253
- _this4.logger.warn("".concat(_this4.namespace, ": received unrecoverable response from mercury"));
254
- _this4.backoffCall.abort();
267
+ _this5.logger.warn("".concat(_this5.namespace, ": received unrecoverable response from mercury"));
268
+ _this5.backoffCall.abort();
255
269
  return callback(reason);
256
270
  }
257
271
  if (reason instanceof _errors.ConnectionError) {
258
- return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
272
+ return _this5.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
259
273
  if (haMessagingEnabled) {
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);
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);
262
276
  }
263
277
  return null;
264
278
  }).then(function () {
@@ -267,62 +281,62 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
267
281
  }
268
282
  return callback(reason);
269
283
  }).catch(function (reason) {
270
- _this4.logger.error("".concat(_this4.namespace, ": failed to handle connection failure"), reason);
284
+ _this5.logger.error("".concat(_this5.namespace, ": failed to handle connection failure"), reason);
271
285
  callback(reason);
272
286
  });
273
287
  },
274
288
  _connectWithBackoff: function _connectWithBackoff(webSocketUrl) {
275
- var _this5 = this;
289
+ var _this6 = this;
276
290
  return new _promise.default(function (resolve, reject) {
277
291
  // eslint gets confused about whether or not call is actually used
278
292
  // eslint-disable-next-line prefer-const
279
293
  var call;
280
294
  var onComplete = function onComplete(err) {
281
- _this5.connecting = false;
282
- _this5.backoffCall = undefined;
295
+ _this6.connecting = false;
296
+ _this6.backoffCall = undefined;
283
297
  if (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));
298
+ _this6.logger.info("".concat(_this6.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
285
299
  return reject(err);
286
300
  }
287
- _this5.connected = true;
288
- _this5.hasEverConnected = true;
289
- _this5._emit('online');
301
+ _this6.connected = true;
302
+ _this6.hasEverConnected = true;
303
+ _this6._emit('online');
290
304
  return resolve();
291
305
  };
292
306
 
293
307
  // eslint-disable-next-line prefer-reflect
294
308
  call = _backoff.default.call(function (callback) {
295
- _this5.logger.info("".concat(_this5.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
296
- _this5._attemptConnection(webSocketUrl, callback);
309
+ _this6.logger.info("".concat(_this6.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
310
+ _this6._attemptConnection(webSocketUrl, callback);
297
311
  }, onComplete);
298
312
  call.setStrategy(new _backoff.default.ExponentialStrategy({
299
- initialDelay: _this5.config.backoffTimeReset,
300
- maxDelay: _this5.config.backoffTimeMax
313
+ initialDelay: _this6.config.backoffTimeReset,
314
+ maxDelay: _this6.config.backoffTimeMax
301
315
  }));
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);
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);
306
320
  }
307
321
  call.on('abort', function () {
308
- _this5.logger.info("".concat(_this5.namespace, ": connection aborted"));
322
+ _this6.logger.info("".concat(_this6.namespace, ": connection aborted"));
309
323
  reject(new Error('Mercury Connection Aborted'));
310
324
  });
311
325
  call.on('callback', function (err) {
312
326
  if (err) {
313
327
  var number = call.getNumRetries();
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"));
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"));
316
330
  /* istanbul ignore if */
317
331
  if (process.env.NODE_ENV === 'development') {
318
- _this5.logger.debug("".concat(_this5.namespace, ": "), err, err.stack);
332
+ _this6.logger.debug("".concat(_this6.namespace, ": "), err, err.stack);
319
333
  }
320
334
  return;
321
335
  }
322
- _this5.logger.info("".concat(_this5.namespace, ": connected"));
336
+ _this6.logger.info("".concat(_this6.namespace, ": connected"));
323
337
  });
324
338
  call.start();
325
- _this5.backoffCall = call;
339
+ _this6.backoffCall = call;
326
340
  });
327
341
  },
328
342
  _emit: function _emit() {
@@ -410,7 +424,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
410
424
  }
411
425
  },
412
426
  _onmessage: function _onmessage(event) {
413
- var _this6 = this;
427
+ var _this7 = this;
414
428
  var envelope = event.data;
415
429
  if (process.env.ENABLE_MERCURY_LOGGING) {
416
430
  this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
@@ -422,31 +436,31 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
422
436
  var namespace = handler.namespace,
423
437
  name = handler.name;
424
438
  return new _promise.default(function (resolve) {
425
- return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
439
+ return resolve((_this7.webex[namespace] || _this7.webex.internal[namespace])[name](data));
426
440
  }).catch(function (reason) {
427
- return _this6.logger.error("".concat(_this6.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
441
+ return _this7.logger.error("".concat(_this7.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
428
442
  });
429
443
  });
430
444
  }, _promise.default.resolve()).then(function () {
431
- _this6._emit('event', event.data);
445
+ _this7._emit('event', event.data);
432
446
  var _data$eventType$split = data.eventType.split('.'),
433
447
  _data$eventType$split2 = (0, _slicedToArray2.default)(_data$eventType$split, 1),
434
448
  namespace = _data$eventType$split2[0];
435
449
  if (namespace === data.eventType) {
436
- _this6._emit("event:".concat(namespace), envelope);
450
+ _this7._emit("event:".concat(namespace), envelope);
437
451
  } else {
438
- _this6._emit("event:".concat(namespace), envelope);
439
- _this6._emit("event:".concat(data.eventType), envelope);
452
+ _this7._emit("event:".concat(namespace), envelope);
453
+ _this7._emit("event:".concat(data.eventType), envelope);
440
454
  }
441
455
  }).catch(function (reason) {
442
- _this6.logger.error("".concat(_this6.namespace, ": error occurred processing socket message"), reason);
456
+ _this7.logger.error("".concat(_this7.namespace, ": error occurred processing socket message"), reason);
443
457
  });
444
458
  },
445
459
  _reconnect: function _reconnect(webSocketUrl) {
446
460
  this.logger.info("".concat(this.namespace, ": reconnecting"));
447
461
  return this.connect(webSocketUrl);
448
462
  },
449
- version: "3.3.1"
463
+ version: "3.4.0"
450
464
  }, ((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)));
451
465
  var _default = exports.default = Mercury;
452
466
  //# 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","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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"}
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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"}
package/package.json CHANGED
@@ -29,31 +29,31 @@
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.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",
32
+ "@webex/test-helper-chai": "3.4.0",
33
+ "@webex/test-helper-mocha": "3.4.0",
34
+ "@webex/test-helper-mock-webex": "3.4.0",
35
+ "@webex/test-helper-test-users": "3.4.0",
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.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",
41
+ "@webex/common": "3.4.0",
42
+ "@webex/common-timers": "3.4.0",
43
+ "@webex/internal-plugin-device": "3.4.0",
44
+ "@webex/internal-plugin-feature": "3.4.0",
45
+ "@webex/internal-plugin-metrics": "3.4.0",
46
+ "@webex/test-helper-chai": "3.4.0",
47
+ "@webex/test-helper-mocha": "3.4.0",
48
+ "@webex/test-helper-mock-web-socket": "3.4.0",
49
+ "@webex/test-helper-mock-webex": "3.4.0",
50
+ "@webex/test-helper-refresh-callback": "3.4.0",
51
+ "@webex/test-helper-test-users": "3.4.0",
52
+ "@webex/webex-core": "3.4.0",
53
53
  "backoff": "^2.5.0",
54
54
  "lodash": "^4.17.21",
55
55
  "uuid": "^3.3.2",
56
- "ws": "^8.2.2"
56
+ "ws": "^8.17.1"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "yarn build:src",
@@ -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"
67
+ "version": "3.4.0"
68
68
  }
package/src/mercury.js CHANGED
@@ -52,6 +52,20 @@ 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
+
55
69
  /**
56
70
  * Get the last error.
57
71
  * @returns {any} The last error.
@@ -138,7 +138,15 @@ describe('plugin-mercury', () => {
138
138
  });
139
139
 
140
140
  it('connects to Mercury using default url', () => {
141
+ webex.internal.feature.updateFeature = sinon.stub();
141
142
  const promise = mercury.connect();
143
+ const envelope = {
144
+ data: {
145
+ featureToggle: {
146
+ 'feature-name': true
147
+ }
148
+ }
149
+ };
142
150
 
143
151
  assert.isFalse(mercury.connected, 'Mercury is not connected');
144
152
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
@@ -148,6 +156,21 @@ describe('plugin-mercury', () => {
148
156
  assert.isTrue(mercury.connected, 'Mercury is connected');
149
157
  assert.isFalse(mercury.connecting, 'Mercury is not connecting');
150
158
  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();
151
174
  });
152
175
  });
153
176