@webex/internal-plugin-mercury 3.0.0-beta.34 → 3.0.0-beta.340

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
@@ -58,12 +58,12 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
58
58
  connect: function connect(webSocketUrl) {
59
59
  var _this = this;
60
60
  if (this.connected) {
61
- this.logger.info('mercury: already connected, will not connect again');
61
+ this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
62
62
  return _promise.default.resolve();
63
63
  }
64
64
  this.connecting = true;
65
65
  return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
66
- _this.logger.info('mercury: connecting');
66
+ _this.logger.info("".concat(_this.namespace, ": connecting"));
67
67
  return _this._connectWithBackoff(webSocketUrl);
68
68
  });
69
69
  },
@@ -71,14 +71,13 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
71
71
  var _this2 = this;
72
72
  return new _promise.default(function (resolve) {
73
73
  if (_this2.backoffCall) {
74
- _this2.logger.info('mercury: aborting connection');
74
+ _this2.logger.info("".concat(_this2.namespace, ": aborting connection"));
75
75
  _this2.backoffCall.abort();
76
76
  }
77
77
  if (_this2.socket) {
78
78
  _this2.socket.removeAllListeners('message');
79
79
  _this2.once('offline', resolve);
80
- _this2.socket.close();
81
- return;
80
+ resolve(_this2.socket.close());
82
81
  }
83
82
  resolve();
84
83
  });
@@ -158,7 +157,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
158
157
  webSocketUrl = _ref2[0],
159
158
  token = _ref2[1];
160
159
  if (!_this4.backoffCall) {
161
- var msg = 'mercury: prevent socket open when backoffCall no longer defined';
160
+ var msg = "".concat(_this4.namespace, ": prevent socket open when backoffCall no longer defined");
162
161
  _this4.logger.info(msg);
163
162
  return _promise.default.reject(new Error(msg));
164
163
  }
@@ -174,13 +173,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
174
173
 
175
174
  // if the consumer has supplied request options use them
176
175
  if (_this4.webex.config.defaultMercuryOptions) {
177
- _this4.logger.info('mercury: setting custom options');
176
+ _this4.logger.info("".concat(_this4.namespace, ": setting custom options"));
178
177
  options = _objectSpread(_objectSpread({}, options), _this4.webex.config.defaultMercuryOptions);
179
178
  }
180
179
 
181
180
  // Set the socket before opening it. This allows a disconnect() to close
182
181
  // the socket if it is in the process of being opened.
183
182
  _this4.socket = socket;
183
+ _this4.logger.info("".concat(_this4.namespace, " connection url: ").concat(webSocketUrl));
184
184
  return socket.open(webSocketUrl, options);
185
185
  }).then(function () {
186
186
  _this4.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {
@@ -188,6 +188,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
188
188
  success: true
189
189
  },
190
190
  tags: {
191
+ namespace: _this4.namespace,
191
192
  action: 'connected',
192
193
  url: attemptWSUrl
193
194
  }
@@ -209,18 +210,18 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
209
210
  retries: _this4.backoffCall.getNumRetries()
210
211
  });
211
212
  }
212
- _this4.logger.info('mercury: connection attempt failed', reason);
213
+ _this4.logger.info("".concat(_this4.namespace, ": connection attempt failed"), reason);
213
214
  // UnknownResponse is produced by IE for any 4XXX; treated it like a bad
214
215
  // web socket url and let WDM handle the token checking
215
216
  if (reason instanceof _errors.UnknownResponse) {
216
- _this4.logger.info('mercury: received unknown response code, refreshing device registration');
217
+ _this4.logger.info("".concat(_this4.namespace, ": received unknown response code, refreshing device registration"));
217
218
  return _this4.webex.internal.device.refresh().then(function () {
218
219
  return callback(reason);
219
220
  });
220
221
  }
221
222
  // NotAuthorized implies expired token
222
223
  if (reason instanceof _errors.NotAuthorized) {
223
- _this4.logger.info('mercury: received authorization error, reauthorizing');
224
+ _this4.logger.info("".concat(_this4.namespace, ": received authorization error, reauthorizing"));
224
225
  return _this4.webex.credentials.refresh({
225
226
  force: true
226
227
  }).then(function () {
@@ -236,19 +237,20 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
236
237
  // BadRequest implies current credentials are for a Service Account
237
238
  // Forbidden implies current user is not entitle for Webex
238
239
  if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
239
- _this4.logger.warn('mercury: received unrecoverable response from mercury');
240
+ _this4.logger.warn("".concat(_this4.namespace, ": received unrecoverable response from mercury"));
240
241
  _this4.backoffCall.abort();
241
242
  return callback(reason);
242
243
  }
243
244
  if (reason instanceof _errors.ConnectionError) {
244
245
  return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
245
246
  if (haMessagingEnabled) {
246
- _this4.logger.info('mercury: received a generic connection error, will try to connect to another datacenter');
247
+ _this4.logger.info("".concat(_this4.namespace, ": received a generic connection error, will try to connect to another datacenter"));
247
248
  _this4.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {
248
249
  fields: {
249
250
  success: false
250
251
  },
251
252
  tags: {
253
+ namespace: _this4.namespace,
252
254
  action: 'failed',
253
255
  error: reason.message,
254
256
  url: attemptWSUrl
@@ -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,7 +279,7 @@ 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;
@@ -287,7 +289,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
287
289
 
288
290
  // eslint-disable-next-line prefer-reflect
289
291
  call = _backoff.default.call(function (callback) {
290
- _this5.logger.info("mercury: executing connection attempt ".concat(call.getNumRetries()));
292
+ _this5.logger.info("".concat(_this5.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
291
293
  _this5._attemptConnection(webSocketUrl, callback);
292
294
  }, onComplete);
293
295
  call.setStrategy(new _backoff.default.ExponentialStrategy({
@@ -298,31 +300,37 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
298
300
  call.failAfter(_this5.config.maxRetries);
299
301
  }
300
302
  call.on('abort', function () {
301
- _this5.logger.info('mercury: connection aborted');
303
+ _this5.logger.info("".concat(_this5.namespace, ": connection aborted"));
302
304
  reject(new Error('Mercury Connection Aborted'));
303
305
  });
304
306
  call.on('callback', function (err) {
305
307
  if (err) {
306
308
  var number = call.getNumRetries();
307
309
  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"));
310
+ _this5.logger.info("".concat(_this5.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
309
311
  /* istanbul ignore if */
310
312
  if (process.env.NODE_ENV === 'development') {
311
- _this5.logger.debug('mercury: ', err, err.stack);
313
+ _this5.logger.debug("".concat(_this5.namespace, ": "), err, err.stack);
312
314
  }
313
315
  return;
314
316
  }
315
- _this5.logger.info('mercury: connected');
317
+ _this5.logger.info("".concat(_this5.namespace, ": connected"));
316
318
  });
317
319
  call.start();
318
320
  _this5.backoffCall = call;
319
321
  });
320
322
  },
321
323
  _emit: function _emit() {
324
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
325
+ args[_key2] = arguments[_key2];
326
+ }
322
327
  try {
323
- this.trigger.apply(this, arguments);
328
+ this.trigger.apply(this, args);
324
329
  } catch (error) {
325
- this.logger.error('mercury: error occurred in event handler', error);
330
+ this.logger.error("".concat(this.namespace, ": error occurred in event handler"), {
331
+ error: error,
332
+ arguments: args
333
+ });
326
334
  }
327
335
  },
328
336
  _getEventHandlers: function _getEventHandlers(eventType) {
@@ -357,19 +365,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
357
365
  switch (event.code) {
358
366
  case 1003:
359
367
  // metric: disconnect
360
- this.logger.info("mercury: Mercury service rejected last message; will not reconnect: ".concat(event.reason));
368
+ this.logger.info("".concat(this.namespace, ": Mercury service rejected last message; will not reconnect: ").concat(event.reason));
361
369
  this._emit('offline.permanent', event);
362
370
  break;
363
371
  case 4000:
364
372
  // metric: disconnect
365
- this.logger.info('mercury: socket replaced; will not reconnect');
373
+ this.logger.info("".concat(this.namespace, ": socket replaced; will not reconnect"));
366
374
  this._emit('offline.replaced', event);
367
375
  break;
368
376
  case 1001:
369
377
  case 1005:
370
378
  case 1006:
371
379
  case 1011:
372
- this.logger.info('mercury: socket disconnected; reconnecting');
380
+ this.logger.info("".concat(this.namespace, ": socket disconnected; reconnecting"));
373
381
  this._emit('offline.transient', event);
374
382
  this._reconnect(socketUrl);
375
383
  // metric: disconnect
@@ -377,30 +385,30 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
377
385
  break;
378
386
  case 1000:
379
387
  if (normalReconnectReasons.includes(reason)) {
380
- this.logger.info('mercury: socket disconnected; reconnecting');
388
+ this.logger.info("".concat(this.namespace, ": socket disconnected; reconnecting"));
381
389
  this._emit('offline.transient', event);
382
390
  this._reconnect(socketUrl);
383
391
  // metric: disconnect
384
392
  // if (reason === done forced) metric: force closure
385
393
  } else {
386
- this.logger.info('mercury: socket disconnected; will not reconnect');
394
+ this.logger.info("".concat(this.namespace, ": socket disconnected; will not reconnect"));
387
395
  this._emit('offline.permanent', event);
388
396
  }
389
397
  break;
390
398
  default:
391
- this.logger.info('mercury: socket disconnected unexpectedly; will not reconnect');
399
+ this.logger.info("".concat(this.namespace, ": socket disconnected unexpectedly; will not reconnect"));
392
400
  // unexpected disconnect
393
401
  this._emit('offline.permanent', event);
394
402
  }
395
403
  } catch (error) {
396
- this.logger.error('mercury: error occurred in close handler', error);
404
+ this.logger.error("".concat(this.namespace, ": error occurred in close handler"), error);
397
405
  }
398
406
  },
399
407
  _onmessage: function _onmessage(event) {
400
408
  var _this6 = this;
401
409
  var envelope = event.data;
402
410
  if (process.env.ENABLE_MERCURY_LOGGING) {
403
- this.logger.debug('mercury: message envelope: ', envelope);
411
+ this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
404
412
  }
405
413
  var data = envelope.data;
406
414
  this._applyOverrides(data);
@@ -411,7 +419,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
411
419
  return new _promise.default(function (resolve) {
412
420
  return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
413
421
  }).catch(function (reason) {
414
- return _this6.logger.error("mercury: error occurred in autowired event handler for ".concat(data.eventType), reason);
422
+ return _this6.logger.error("".concat(_this6.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
415
423
  });
416
424
  });
417
425
  }, _promise.default.resolve()).then(function () {
@@ -426,14 +434,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
426
434
  _this6._emit("event:".concat(data.eventType), envelope);
427
435
  }
428
436
  }).catch(function (reason) {
429
- _this6.logger.error('mercury: error occurred processing socket message', reason);
437
+ _this6.logger.error("".concat(_this6.namespace, ": error occurred processing socket message"), reason);
430
438
  });
431
439
  },
432
440
  _reconnect: function _reconnect(webSocketUrl) {
433
- this.logger.info('mercury: reconnecting');
441
+ this.logger.info("".concat(this.namespace, ": reconnecting"));
434
442
  return this.connect(webSocketUrl);
435
443
  },
436
- version: "3.0.0-beta.34"
444
+ version: "3.0.0-beta.340"
437
445
  }, ((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
446
  var _default = Mercury;
439
447
  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","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","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":["/*!\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(`${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\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.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {\n fields: {\n success: true,\n },\n tags: {\n namespace: this.namespace,\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(`${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`\n );\n this.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {\n fields: {\n success: false,\n },\n tags: {\n namespace: this.namespace,\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(`${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._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.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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"}
@@ -45,6 +45,7 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
45
45
  var _this;
46
46
  (0, _classCallCheck2.default)(this, Socket);
47
47
  _this = _super.call(this);
48
+ _this._domain = 'unknown-domain';
48
49
  _this.onmessage = _this.onmessage.bind((0, _assertThisInitialized2.default)(_this));
49
50
  _this.onclose = _this.onclose.bind((0, _assertThisInitialized2.default)(_this));
50
51
  return _this;
@@ -135,9 +136,9 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
135
136
  return;
136
137
  }
137
138
  // logger is defined once open is called
138
- _this2.logger.info('socket: closing');
139
+ _this2.logger.info("socket,".concat(_this2._domain, ": closing"));
139
140
  if (socket.readyState === 2 || socket.readyState === 3) {
140
- _this2.logger.info('socket: already closed');
141
+ _this2.logger.info("socket,".concat(_this2._domain, ": already closed"));
141
142
  resolve();
142
143
  return;
143
144
  }
@@ -152,17 +153,17 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
152
153
  });
153
154
  var closeTimer = (0, _commonTimers.safeSetTimeout)(function () {
154
155
  try {
155
- _this2.logger.info('socket: no close event received, forcing closure');
156
+ _this2.logger.info("socket,".concat(_this2._domain, ": no close event received, forcing closure"));
156
157
  resolve(_this2.onclose({
157
158
  code: 1000,
158
159
  reason: 'Done (forced)'
159
160
  }));
160
161
  } catch (error) {
161
- _this2.logger.warn('socket: force-close failed', error);
162
+ _this2.logger.warn("socket,".concat(_this2._domain, ": force-close failed"), error);
162
163
  }
163
164
  }, _this2.forceCloseDelay);
164
165
  socket.onclose = function (event) {
165
- _this2.logger.info('socket: close event fired', event.code, event.reason);
166
+ _this2.logger.info("socket,".concat(_this2._domain, ": close event fired"), event.code, event.reason);
166
167
  clearTimeout(closeTimer);
167
168
  _this2.onclose(event);
168
169
  resolve(event);
@@ -188,6 +189,11 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
188
189
  key: "open",
189
190
  value: function open(url, options) {
190
191
  var _this3 = this;
192
+ try {
193
+ this._domain = new URL(url).hostname;
194
+ } catch (_unused) {
195
+ this._domain = url;
196
+ }
191
197
  return new _promise.default(function (resolve, reject) {
192
198
  /* eslint complexity: [0] */
193
199
  if (!url) {
@@ -207,13 +213,13 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
207
213
  });
208
214
  });
209
215
  var WebSocket = Socket.getWebSocketConstructor();
210
- _this3.logger.info('socket: creating WebSocket');
216
+ _this3.logger.info("socket,".concat(_this3._domain, ": creating WebSocket"));
211
217
  var socket = new WebSocket(url, [], options);
212
218
  socket.binaryType = 'arraybuffer';
213
219
  socket.onmessage = _this3.onmessage;
214
220
  socket.onclose = function (event) {
215
221
  event = _this3._fixCloseCode(event);
216
- _this3.logger.info('socket: closed before open', event.code, event.reason);
222
+ _this3.logger.info("socket,".concat(_this3._domain, ": closed before open"), event.code, event.reason);
217
223
  switch (event.code) {
218
224
  case 1005:
219
225
  // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume
@@ -234,18 +240,18 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
234
240
  }
235
241
  };
236
242
  socket.onopen = function () {
237
- _this3.logger.info('socket: connected');
243
+ _this3.logger.info("socket,".concat(_this3._domain, ": connected"));
238
244
  _this3._authorize().then(function () {
239
- _this3.logger.info('socket: authorized');
245
+ _this3.logger.info("socket,".concat(_this3._domain, ": authorized"));
240
246
  socket.onclose = _this3.onclose;
241
247
  resolve();
242
248
  }).catch(reject);
243
249
  };
244
250
  socket.onerror = function (event) {
245
- _this3.logger.warn('socket: error event fired', event);
251
+ _this3.logger.warn("socket,".concat(_this3._domain, ": error event fired"), event);
246
252
  };
247
253
  sockets.set(_this3, socket);
248
- _this3.logger.info('socket: waiting for server');
254
+ _this3.logger.info("socket,".concat(_this3._domain, ": waiting for server"));
249
255
  });
250
256
  }
251
257
 
@@ -257,7 +263,7 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
257
263
  }, {
258
264
  key: "onclose",
259
265
  value: function onclose(event) {
260
- this.logger.info('socket: closed', event.code, event.reason);
266
+ this.logger.info("socket,".concat(this._domain, ": closed"), event.code, event.reason);
261
267
  clearTimeout(this.pongTimer);
262
268
  clearTimeout(this.pingTimer);
263
269
  event = this._fixCloseCode(event);
@@ -279,9 +285,9 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
279
285
  try {
280
286
  var data = JSON.parse(event.data);
281
287
  var sequenceNumber = (0, _parseInt2.default)(data.sequenceNumber, 10);
282
- this.logger.debug('socket: sequence number: ', sequenceNumber);
288
+ this.logger.debug("socket,".concat(this._domain, ": sequence number: "), sequenceNumber);
283
289
  if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {
284
- this.logger.debug("socket: sequence number mismatch indicates lost mercury message. expected: ".concat(this.expectedSequenceNumber, ", actual: ").concat(sequenceNumber));
290
+ this.logger.debug("socket,".concat(this._domain, ": sequence number mismatch indicates lost mercury message. expected: ").concat(this.expectedSequenceNumber, ", actual: ").concat(sequenceNumber));
285
291
  this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);
286
292
  }
287
293
  this.expectedSequenceNumber = sequenceNumber + 1;
@@ -303,7 +309,7 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
303
309
  // message from Mercury. At this time, the only action we have is to
304
310
  // ignore it and move on.
305
311
  /* istanbul ignore next */
306
- this.logger.warn('socket: error while receiving WebSocket message', error);
312
+ this.logger.warn("socket,".concat(this._domain, ": error while receiving WebSocket message"), error);
307
313
  }
308
314
  }
309
315
 
@@ -359,7 +365,7 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
359
365
  value: function _authorize() {
360
366
  var _this5 = this;
361
367
  return new _promise.default(function (resolve) {
362
- _this5.logger.info('socket: authorizing');
368
+ _this5.logger.info("socket,".concat(_this5._domain, ": authorizing"));
363
369
  _this5.send({
364
370
  id: _uuid.default.v4(),
365
371
  type: 'authorization',
@@ -393,12 +399,12 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
393
399
  if (event.code === 1005 && event.reason) {
394
400
  switch (event.reason.toLowerCase()) {
395
401
  case 'replaced':
396
- this.logger.info('socket: fixing CloseEvent code for reason: ', event.reason);
402
+ this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
397
403
  event.code = 4000;
398
404
  break;
399
405
  case 'authentication failed':
400
406
  case 'authentication did not happen within the timeout window of 30000 seconds.':
401
- this.logger.info('socket: fixing CloseEvent code for reason: ', event.reason);
407
+ this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
402
408
  event.code = 1008;
403
409
  break;
404
410
  default:
@@ -421,10 +427,10 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
421
427
  var _this6 = this;
422
428
  var confirmPongId = function confirmPongId(event) {
423
429
  try {
424
- _this6.logger.debug('socket: pong', event.data.id);
430
+ _this6.logger.debug("socket,".concat(_this6._domain, ": pong"), event.data.id);
425
431
  if (event.data && event.data.id !== id) {
426
- _this6.logger.info('socket: received pong for wrong ping id, closing socket');
427
- _this6.logger.debug('socket: expected', id, 'received', event.data.id);
432
+ _this6.logger.info("socket,".concat(_this6._domain, ": received pong for wrong ping id, closing socket"));
433
+ _this6.logger.debug("socket,".concat(_this6._domain, ": expected"), id, 'received', event.data.id);
428
434
  _this6.close({
429
435
  code: 1000,
430
436
  reason: 'Pong mismatch'
@@ -434,23 +440,23 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
434
440
  // This try/catch block was added as a debugging step; to the best of my
435
441
  // knowledge, the above can never throw.
436
442
  /* istanbul ignore next */
437
- _this6.logger.error('socket: error occurred in confirmPongId', error);
443
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in confirmPongId"), error);
438
444
  }
439
445
  };
440
446
  var onPongNotReceived = function onPongNotReceived() {
441
447
  try {
442
- _this6.logger.info('socket: pong not receive in expected period, closing socket');
448
+ _this6.logger.info("socket,".concat(_this6._domain, ": pong not receive in expected period, closing socket"));
443
449
  _this6.close({
444
450
  code: 1000,
445
451
  reason: 'Pong not received'
446
452
  }).catch(function (reason) {
447
- _this6.logger.warn('socket: failed to close socket after missed pong', reason);
453
+ _this6.logger.warn("socket,".concat(_this6._domain, ": failed to close socket after missed pong"), reason);
448
454
  });
449
455
  } catch (error) {
450
456
  // This try/catch block was added as a debugging step; to the best of my
451
457
  // knowledge, the above can never throw.
452
458
  /* istanbul ignore next */
453
- _this6.logger.error('socket: error occurred in onPongNotReceived', error);
459
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in onPongNotReceived"), error);
454
460
  }
455
461
  };
456
462
  var scheduleNextPingAndCancelPongTimer = function scheduleNextPingAndCancelPongTimer() {
@@ -463,14 +469,14 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
463
469
  // This try/catch block was added as a debugging step; to the best of my
464
470
  // knowledge, the above can never throw.
465
471
  /* istanbul ignore next */
466
- _this6.logger.error('socket: error occurred in scheduleNextPingAndCancelPongTimer', error);
472
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in scheduleNextPingAndCancelPongTimer"), error);
467
473
  }
468
474
  };
469
475
  id = id || _uuid.default.v4();
470
476
  this.pongTimer = (0, _commonTimers.safeSetTimeout)(onPongNotReceived, this.pongTimeout);
471
477
  this.once('pong', scheduleNextPingAndCancelPongTimer);
472
478
  this.once('pong', confirmPongId);
473
- this.logger.debug("socket: ping ".concat(id));
479
+ this.logger.debug("socket,".concat(this._domain, ": ping ").concat(id));
474
480
  return this.send({
475
481
  id: id,
476
482
  type: 'ping'