@webex/internal-plugin-mercury 3.0.0-beta.42 → 3.0.0-beta.420

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/README.md CHANGED
@@ -29,7 +29,9 @@ const webex = new WebexCore();
29
29
  webex.internal.mercury.WHATEVER;
30
30
  ```
31
31
 
32
- ## Using A Proxy Agent To Open A Websocket Connection
32
+ ## Config Options
33
+
34
+ ### Using A Proxy Agent To Open A Websocket Connection
33
35
 
34
36
  For consumers who are not using the SDK via the browser it may be necessary to configure a proxy agent in order to connect with Mercury and open a Websocket in a proxy environment.
35
37
 
@@ -51,6 +53,17 @@ webex.init({
51
53
  });
52
54
  ```
53
55
 
56
+ ### Retries
57
+
58
+
59
+ The default behaviour is for Mercury to continue to try to connect with an exponential back-off. This behavior can be adjusted with the following config params:
60
+
61
+ - `maxRetries` - the number of times it will retry before error. Default: 0
62
+ - `initialConnectionMaxRetries` - the number of times it will retry before error on the first connection. Once a connection has been established, any further connection attempts will use `maxRetries`. Default: 0
63
+ - `backoffTimeMax` - The maximum time between connection attempts in ms. Default: 32000
64
+ - `backoffTimeReset` - The time before the first retry in ms. Default: 1000
65
+
66
+
54
67
  ## Maintainers
55
68
 
56
69
  This package is maintained by [Cisco Webex for Developers](https://developer.webex.com/).
package/dist/mercury.js CHANGED
@@ -35,6 +35,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
35
35
  var normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];
36
36
  var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mercury#listen(): Use Mercury#connect() instead'), _dec2 = (0, _common.deprecated)('Mercury#stopListening(): Use Mercury#disconnect() instead'), (_obj = {
37
37
  namespace: 'Mercury',
38
+ lastError: undefined,
38
39
  session: {
39
40
  connected: {
40
41
  default: false,
@@ -44,6 +45,10 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
44
45
  default: false,
45
46
  type: 'boolean'
46
47
  },
48
+ hasEverConnected: {
49
+ default: false,
50
+ type: 'boolean'
51
+ },
47
52
  socket: 'object',
48
53
  localClusterServiceUrls: 'object'
49
54
  },
@@ -55,15 +60,22 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
55
60
  }
56
61
  }
57
62
  },
63
+ /**
64
+ * Get the last error.
65
+ * @returns {any} The last error.
66
+ */
67
+ getLastError: function getLastError() {
68
+ return this.lastError;
69
+ },
58
70
  connect: function connect(webSocketUrl) {
59
71
  var _this = this;
60
72
  if (this.connected) {
61
- this.logger.info('mercury: already connected, will not connect again');
73
+ this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
62
74
  return _promise.default.resolve();
63
75
  }
64
76
  this.connecting = true;
65
77
  return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
66
- _this.logger.info('mercury: connecting');
78
+ _this.logger.info("".concat(_this.namespace, ": connecting"));
67
79
  return _this._connectWithBackoff(webSocketUrl);
68
80
  });
69
81
  },
@@ -71,14 +83,13 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
71
83
  var _this2 = this;
72
84
  return new _promise.default(function (resolve) {
73
85
  if (_this2.backoffCall) {
74
- _this2.logger.info('mercury: aborting connection');
86
+ _this2.logger.info("".concat(_this2.namespace, ": aborting connection"));
75
87
  _this2.backoffCall.abort();
76
88
  }
77
89
  if (_this2.socket) {
78
90
  _this2.socket.removeAllListeners('message');
79
91
  _this2.once('offline', resolve);
80
- _this2.socket.close();
81
- return;
92
+ resolve(_this2.socket.close());
82
93
  }
83
94
  resolve();
84
95
  });
@@ -153,12 +164,18 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
153
164
  }
154
165
  return _this4._emit.apply(_this4, ['sequence-mismatch'].concat(args));
155
166
  });
167
+ socket.on('ping-pong-latency', function () {
168
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
169
+ args[_key2] = arguments[_key2];
170
+ }
171
+ return _this4._emit.apply(_this4, ['ping-pong-latency'].concat(args));
172
+ });
156
173
  _promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
157
174
  var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
158
175
  webSocketUrl = _ref2[0],
159
176
  token = _ref2[1];
160
177
  if (!_this4.backoffCall) {
161
- var msg = 'mercury: prevent socket open when backoffCall no longer defined';
178
+ var msg = "".concat(_this4.namespace, ": prevent socket open when backoffCall no longer defined");
162
179
  _this4.logger.info(msg);
163
180
  return _promise.default.reject(new Error(msg));
164
181
  }
@@ -174,24 +191,17 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
174
191
 
175
192
  // if the consumer has supplied request options use them
176
193
  if (_this4.webex.config.defaultMercuryOptions) {
177
- _this4.logger.info('mercury: setting custom options');
194
+ _this4.logger.info("".concat(_this4.namespace, ": setting custom options"));
178
195
  options = _objectSpread(_objectSpread({}, options), _this4.webex.config.defaultMercuryOptions);
179
196
  }
180
197
 
181
198
  // Set the socket before opening it. This allows a disconnect() to close
182
199
  // the socket if it is in the process of being opened.
183
200
  _this4.socket = socket;
201
+ _this4.logger.info("".concat(_this4.namespace, " connection url: ").concat(webSocketUrl));
184
202
  return socket.open(webSocketUrl, options);
185
203
  }).then(function () {
186
- _this4.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {
187
- fields: {
188
- success: true
189
- },
190
- tags: {
191
- action: 'connected',
192
- url: attemptWSUrl
193
- }
194
- });
204
+ _this4.logger.info("".concat(_this4.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
195
205
  callback();
196
206
  return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
197
207
  if (haMessagingEnabled) {
@@ -200,6 +210,8 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
200
210
  return _promise.default.resolve();
201
211
  });
202
212
  }).catch(function (reason) {
213
+ _this4.lastError = reason; // remember the last error
214
+
203
215
  // Suppress connection errors that appear to be network related. This
204
216
  // may end up suppressing metrics during outages, but we might not care
205
217
  // (especially since many of our outages happen in a way that client
@@ -209,18 +221,18 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
209
221
  retries: _this4.backoffCall.getNumRetries()
210
222
  });
211
223
  }
212
- _this4.logger.info('mercury: connection attempt failed', reason);
224
+ _this4.logger.info("".concat(_this4.namespace, ": connection attempt failed"), reason);
213
225
  // UnknownResponse is produced by IE for any 4XXX; treated it like a bad
214
226
  // web socket url and let WDM handle the token checking
215
227
  if (reason instanceof _errors.UnknownResponse) {
216
- _this4.logger.info('mercury: received unknown response code, refreshing device registration');
228
+ _this4.logger.info("".concat(_this4.namespace, ": received unknown response code, refreshing device registration"));
217
229
  return _this4.webex.internal.device.refresh().then(function () {
218
230
  return callback(reason);
219
231
  });
220
232
  }
221
233
  // NotAuthorized implies expired token
222
234
  if (reason instanceof _errors.NotAuthorized) {
223
- _this4.logger.info('mercury: received authorization error, reauthorizing');
235
+ _this4.logger.info("".concat(_this4.namespace, ": received authorization error, reauthorizing"));
224
236
  return _this4.webex.credentials.refresh({
225
237
  force: true
226
238
  }).then(function () {
@@ -236,24 +248,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
236
248
  // BadRequest implies current credentials are for a Service Account
237
249
  // Forbidden implies current user is not entitle for Webex
238
250
  if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
239
- _this4.logger.warn('mercury: received unrecoverable response from mercury');
251
+ _this4.logger.warn("".concat(_this4.namespace, ": received unrecoverable response from mercury"));
240
252
  _this4.backoffCall.abort();
241
253
  return callback(reason);
242
254
  }
243
255
  if (reason instanceof _errors.ConnectionError) {
244
256
  return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
245
257
  if (haMessagingEnabled) {
246
- _this4.logger.info('mercury: received a generic connection error, will try to connect to another datacenter');
247
- _this4.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {
248
- fields: {
249
- success: false
250
- },
251
- tags: {
252
- action: 'failed',
253
- error: reason.message,
254
- url: attemptWSUrl
255
- }
256
- });
258
+ _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));
257
259
  return _this4.webex.internal.services.markFailedUrl(attemptWSUrl);
258
260
  }
259
261
  return null;
@@ -263,7 +265,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
263
265
  }
264
266
  return callback(reason);
265
267
  }).catch(function (reason) {
266
- _this4.logger.error('mercury: failed to handle connection failure', reason);
268
+ _this4.logger.error("".concat(_this4.namespace, ": failed to handle connection failure"), reason);
267
269
  callback(reason);
268
270
  });
269
271
  },
@@ -277,52 +279,61 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
277
279
  _this5.connecting = false;
278
280
  _this5.backoffCall = undefined;
279
281
  if (err) {
280
- _this5.logger.info("mercury: failed to connect after ".concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
282
+ _this5.logger.info("".concat(_this5.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
281
283
  return reject(err);
282
284
  }
283
285
  _this5.connected = true;
286
+ _this5.hasEverConnected = true;
284
287
  _this5._emit('online');
285
288
  return resolve();
286
289
  };
287
290
 
288
291
  // eslint-disable-next-line prefer-reflect
289
292
  call = _backoff.default.call(function (callback) {
290
- _this5.logger.info("mercury: executing connection attempt ".concat(call.getNumRetries()));
293
+ _this5.logger.info("".concat(_this5.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
291
294
  _this5._attemptConnection(webSocketUrl, callback);
292
295
  }, onComplete);
293
296
  call.setStrategy(new _backoff.default.ExponentialStrategy({
294
297
  initialDelay: _this5.config.backoffTimeReset,
295
298
  maxDelay: _this5.config.backoffTimeMax
296
299
  }));
297
- if (_this5.config.maxRetries) {
300
+ if (_this5.config.initialConnectionMaxRetries && !_this5.hasEverConnected) {
301
+ call.failAfter(_this5.config.initialConnectionMaxRetries);
302
+ } else if (_this5.config.maxRetries) {
298
303
  call.failAfter(_this5.config.maxRetries);
299
304
  }
300
305
  call.on('abort', function () {
301
- _this5.logger.info('mercury: connection aborted');
306
+ _this5.logger.info("".concat(_this5.namespace, ": connection aborted"));
302
307
  reject(new Error('Mercury Connection Aborted'));
303
308
  });
304
309
  call.on('callback', function (err) {
305
310
  if (err) {
306
311
  var number = call.getNumRetries();
307
312
  var delay = Math.min(call.strategy_.nextBackoffDelay_, _this5.config.backoffTimeMax);
308
- _this5.logger.info("mercury: failed to connect; attempting retry ".concat(number + 1, " in ").concat(delay, " ms"));
313
+ _this5.logger.info("".concat(_this5.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
309
314
  /* istanbul ignore if */
310
315
  if (process.env.NODE_ENV === 'development') {
311
- _this5.logger.debug('mercury: ', err, err.stack);
316
+ _this5.logger.debug("".concat(_this5.namespace, ": "), err, err.stack);
312
317
  }
313
318
  return;
314
319
  }
315
- _this5.logger.info('mercury: connected');
320
+ _this5.logger.info("".concat(_this5.namespace, ": connected"));
316
321
  });
317
322
  call.start();
318
323
  _this5.backoffCall = call;
319
324
  });
320
325
  },
321
326
  _emit: function _emit() {
327
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
328
+ args[_key3] = arguments[_key3];
329
+ }
322
330
  try {
323
- this.trigger.apply(this, arguments);
331
+ this.trigger.apply(this, args);
324
332
  } catch (error) {
325
- this.logger.error('mercury: error occurred in event handler', error);
333
+ this.logger.error("".concat(this.namespace, ": error occurred in event handler"), {
334
+ error: error,
335
+ arguments: args
336
+ });
326
337
  }
327
338
  },
328
339
  _getEventHandlers: function _getEventHandlers(eventType) {
@@ -357,19 +368,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
357
368
  switch (event.code) {
358
369
  case 1003:
359
370
  // metric: disconnect
360
- this.logger.info("mercury: Mercury service rejected last message; will not reconnect: ".concat(event.reason));
371
+ this.logger.info("".concat(this.namespace, ": Mercury service rejected last message; will not reconnect: ").concat(event.reason));
361
372
  this._emit('offline.permanent', event);
362
373
  break;
363
374
  case 4000:
364
375
  // metric: disconnect
365
- this.logger.info('mercury: socket replaced; will not reconnect');
376
+ this.logger.info("".concat(this.namespace, ": socket replaced; will not reconnect"));
366
377
  this._emit('offline.replaced', event);
367
378
  break;
368
379
  case 1001:
369
380
  case 1005:
370
381
  case 1006:
371
382
  case 1011:
372
- this.logger.info('mercury: socket disconnected; reconnecting');
383
+ this.logger.info("".concat(this.namespace, ": socket disconnected; reconnecting"));
373
384
  this._emit('offline.transient', event);
374
385
  this._reconnect(socketUrl);
375
386
  // metric: disconnect
@@ -377,30 +388,30 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
377
388
  break;
378
389
  case 1000:
379
390
  if (normalReconnectReasons.includes(reason)) {
380
- this.logger.info('mercury: socket disconnected; reconnecting');
391
+ this.logger.info("".concat(this.namespace, ": socket disconnected; reconnecting"));
381
392
  this._emit('offline.transient', event);
382
393
  this._reconnect(socketUrl);
383
394
  // metric: disconnect
384
395
  // if (reason === done forced) metric: force closure
385
396
  } else {
386
- this.logger.info('mercury: socket disconnected; will not reconnect');
397
+ this.logger.info("".concat(this.namespace, ": socket disconnected; will not reconnect"));
387
398
  this._emit('offline.permanent', event);
388
399
  }
389
400
  break;
390
401
  default:
391
- this.logger.info('mercury: socket disconnected unexpectedly; will not reconnect');
402
+ this.logger.info("".concat(this.namespace, ": socket disconnected unexpectedly; will not reconnect"));
392
403
  // unexpected disconnect
393
404
  this._emit('offline.permanent', event);
394
405
  }
395
406
  } catch (error) {
396
- this.logger.error('mercury: error occurred in close handler', error);
407
+ this.logger.error("".concat(this.namespace, ": error occurred in close handler"), error);
397
408
  }
398
409
  },
399
410
  _onmessage: function _onmessage(event) {
400
411
  var _this6 = this;
401
412
  var envelope = event.data;
402
413
  if (process.env.ENABLE_MERCURY_LOGGING) {
403
- this.logger.debug('mercury: message envelope: ', envelope);
414
+ this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
404
415
  }
405
416
  var data = envelope.data;
406
417
  this._applyOverrides(data);
@@ -411,7 +422,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
411
422
  return new _promise.default(function (resolve) {
412
423
  return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
413
424
  }).catch(function (reason) {
414
- return _this6.logger.error("mercury: error occurred in autowired event handler for ".concat(data.eventType), reason);
425
+ return _this6.logger.error("".concat(_this6.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
415
426
  });
416
427
  });
417
428
  }, _promise.default.resolve()).then(function () {
@@ -426,14 +437,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
426
437
  _this6._emit("event:".concat(data.eventType), envelope);
427
438
  }
428
439
  }).catch(function (reason) {
429
- _this6.logger.error('mercury: error occurred processing socket message', reason);
440
+ _this6.logger.error("".concat(_this6.namespace, ": error occurred processing socket message"), reason);
430
441
  });
431
442
  },
432
443
  _reconnect: function _reconnect(webSocketUrl) {
433
- this.logger.info('mercury: reconnecting');
444
+ this.logger.info("".concat(this.namespace, ": reconnecting"));
434
445
  return this.connect(webSocketUrl);
435
446
  },
436
- version: "3.0.0-beta.42"
447
+ version: "3.0.0-beta.420"
437
448
  }, ((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)));
438
449
  var _default = Mercury;
439
450
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","session","connected","default","type","connecting","socket","localClusterServiceUrls","derived","listening","deps","fn","connect","webSocketUrl","logger","info","resolve","webex","internal","device","registered","register","then","_connectWithBackoff","disconnect","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","forEach","keyPath","_prepareUrl","feature","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","multipleConnections","format","_attemptConnection","socketUrl","callback","Socket","attemptWSUrl","on","_onclose","_onmessage","args","_emit","all","credentials","getUserToken","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","open","metrics","submitClientMetrics","fields","success","tags","action","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","error","markFailedUrl","call","onComplete","err","undefined","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","maxRetries","failAfter","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","trigger","_getEventHandlers","eventType","split","name","handlers","handlerName","push","toLowerCase","unset","_reconnect","includes","envelope","data","ENABLE_MERCURY_LOGGING","reduce","promise","handler","oneFlight"],"sources":["mercury.js"],"sourcesContent":["/*!\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\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\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 @oneFlight\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info('mercury: 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('mercury: 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('mercury: aborting connection');\n this.backoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n this.socket.close();\n\n return;\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\n Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()])\n .then(([webSocketUrl, token]) => {\n if (!this.backoffCall) {\n const msg = 'mercury: 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('mercury: 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 return socket.open(webSocketUrl, options);\n })\n .then(() => {\n this.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {\n fields: {\n success: true,\n },\n tags: {\n action: 'connected',\n url: attemptWSUrl,\n },\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 // 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('mercury: 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 'mercury: 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('mercury: 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('mercury: 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 'mercury: received a generic connection error, will try to connect to another datacenter'\n );\n this.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {\n fields: {\n success: false,\n },\n tags: {\n action: 'failed',\n error: reason.message,\n url: attemptWSUrl,\n },\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('mercury: 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 `mercury: 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._emit('online');\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n this.logger.info(`mercury: 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.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n call.on('abort', () => {\n this.logger.info('mercury: 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 `mercury: 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('mercury: ', err, err.stack);\n }\n\n return;\n }\n this.logger.info('mercury: 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('mercury: error occurred in event handler', error);\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 `mercury: 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('mercury: 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('mercury: 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('mercury: 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('mercury: socket disconnected; will not reconnect');\n this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info('mercury: socket disconnected unexpectedly; will not reconnect');\n // unexpected disconnect\n this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error('mercury: 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('mercury: 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 `mercury: 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('mercury: error occurred processing socket message', reason);\n });\n },\n\n _reconnect(webSocketUrl) {\n this.logger.info('mercury: reconnecting');\n\n return this.connect(webSocketUrl);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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"}
1
+ {"version":3,"names":["normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","default","type","connecting","hasEverConnected","socket","localClusterServiceUrls","derived","listening","deps","fn","getLastError","connect","webSocketUrl","logger","info","resolve","webex","internal","device","registered","register","then","_connectWithBackoff","disconnect","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","forEach","keyPath","_prepareUrl","feature","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","multipleConnections","format","_attemptConnection","socketUrl","callback","Socket","attemptWSUrl","on","_onclose","_onmessage","args","_emit","all","credentials","getUserToken","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","open","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","markFailedUrl","error","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","trigger","arguments","_getEventHandlers","eventType","split","name","handlers","handlerName","push","toLowerCase","unset","_reconnect","includes","envelope","data","ENABLE_MERCURY_LOGGING","reduce","promise","handler","oneFlight"],"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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"}