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

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.
@@ -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,24 @@ 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
  };
475
+ var calculateLatency = function calculateLatency(pingTimestamp) {
476
+ var now = performance.now();
477
+ var latency = now - pingTimestamp;
478
+ _this6.logger.debug("socket,".concat(_this6._domain, ": latency: "), latency);
479
+ _this6.emit('ping-pong-latency', latency);
480
+ };
469
481
  id = id || _uuid.default.v4();
482
+ var pingTimestamp = performance.now();
470
483
  this.pongTimer = (0, _commonTimers.safeSetTimeout)(onPongNotReceived, this.pongTimeout);
471
484
  this.once('pong', scheduleNextPingAndCancelPongTimer);
472
485
  this.once('pong', confirmPongId);
473
- this.logger.debug("socket: ping ".concat(id));
486
+ this.once('pong', function () {
487
+ return calculateLatency(pingTimestamp);
488
+ });
489
+ this.logger.debug("socket,".concat(this._domain, ": ping ").concat(id));
474
490
  return this.send({
475
491
  id: id,
476
492
  type: 'ping'
@@ -1 +1 @@
1
- {"version":3,"names":["sockets","Socket","onmessage","bind","onclose","get","binaryType","bufferedAmount","extensions","protocol","readyState","url","options","resolve","reject","socket","logger","info","code","Error","reason","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","close","checkRequired","forEach","key","enumerable","value","WebSocket","getWebSocketConstructor","_fixCloseCode","UnknownResponse","BadRequest","NotAuthorized","Forbidden","ConnectionError","onopen","_authorize","then","catch","onerror","set","pongTimer","pingTimer","emit","removeAllListeners","data","JSON","parse","sequenceNumber","debug","expectedSequenceNumber","processedEvent","_acknowledge","type","send","messageId","id","uuid","v4","token","trackingId","logLevelToken","waitForBufferState","eventType","removeListener","_ping","once","toLowerCase","confirmPongId","onPongNotReceived","scheduleNextPingAndCancelPongTimer","pingInterval","pongTimeout","EventEmitter"],"sources":["socket-base.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\nimport {checkRequired} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\nimport uuid from 'uuid';\n\nimport {\n BadRequest,\n ConnectionError,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n // NotFound\n} from '../errors';\n\nconst sockets = new WeakMap();\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n /**\n * constructor\n * @returns {Socket}\n */\n constructor() {\n super();\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get binaryType() {\n return sockets.get(this).binaryType;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n get bufferedAmount() {\n return sockets.get(this).bufferedAmount;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get extensions() {\n return sockets.get(this).extensions;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get protocol() {\n return sockets.get(this).protocol;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n get readyState() {\n return sockets.get(this).readyState;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get url() {\n return sockets.get(this).url;\n }\n\n /**\n * Provides the environmentally appropriate constructor (ws in NodeJS,\n * WebSocket in browsers)\n * @returns {WebSocket}\n */\n static getWebSocketConstructor() {\n throw new Error(\n 'Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way'\n );\n }\n\n /**\n * Closes the socket\n * @param {Object} options\n * @param {string} options.reason\n * @param {number} options.code\n * @returns {Promise}\n */\n close(options) {\n return new Promise((resolve, reject) => {\n const socket = sockets.get(this);\n\n if (!socket) {\n // Open has not been called yet so there is no socket to close\n resolve();\n\n return;\n }\n // logger is defined once open is called\n this.logger.info('socket: closing');\n\n if (socket.readyState === 2 || socket.readyState === 3) {\n this.logger.info('socket: already closed');\n resolve();\n\n return;\n }\n\n options = options || {};\n if (options.code && options.code !== 1000 && (options.code < 3000 || options.code > 4999)) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\n }\n\n options = defaults(options, {\n code: 1000,\n reason: 'Done',\n });\n\n const closeTimer = safeSetTimeout(() => {\n try {\n this.logger.info('socket: no close event received, forcing closure');\n resolve(\n this.onclose({\n code: 1000,\n reason: 'Done (forced)',\n })\n );\n } catch (error) {\n this.logger.warn('socket: force-close failed', error);\n }\n }, this.forceCloseDelay);\n\n socket.onclose = (event) => {\n this.logger.info('socket: close event fired', event.code, event.reason);\n clearTimeout(closeTimer);\n this.onclose(event);\n resolve(event);\n };\n\n socket.close(options.code, options.reason);\n });\n }\n\n /**\n * Opens a WebSocket\n * @param {string} url\n * @param {options} options\n * @param {number} options.forceCloseDelay (required)\n * @param {number} options.pingInterval (required)\n * @param {number} options.pongTimeout (required)\n * @param {string} options.token (required)\n * @param {string} options.trackingId (required)\n * @param {Logger} options.logger (required)\n * @param {string} options.logLevelToken\n * @returns {Promise}\n */\n open(url, options) {\n return new Promise((resolve, reject) => {\n /* eslint complexity: [0] */\n if (!url) {\n reject(new Error('`url` is required'));\n\n return;\n }\n\n if (sockets.get(this)) {\n reject(new Error('Socket#open() can only be called once per instance'));\n\n return;\n }\n\n options = options || {};\n\n checkRequired(\n ['forceCloseDelay', 'pingInterval', 'pongTimeout', 'token', 'trackingId', 'logger'],\n options\n );\n\n Object.keys(options).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: options[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor();\n\n this.logger.info('socket: creating WebSocket');\n const socket = new WebSocket(url, [], options);\n\n socket.binaryType = 'arraybuffer';\n socket.onmessage = this.onmessage;\n\n socket.onclose = (event) => {\n event = this._fixCloseCode(event);\n this.logger.info('socket: closed before open', event.code, event.reason);\n switch (event.code) {\n case 1005:\n // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume\n // it's a bad websocket url. That'll trigger a device refresh; if it\n // turns out we had a bad token, the device refresh should 401 and\n // trigger a token refresh.\n return reject(new UnknownResponse(event));\n case 4400:\n return reject(new BadRequest(event));\n case 4401:\n return reject(new NotAuthorized(event));\n case 4403:\n return reject(new Forbidden(event));\n // case 4404:\n // return reject(new NotFound(event));\n default:\n return reject(new ConnectionError(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info('socket: connected');\n this._authorize()\n .then(() => {\n this.logger.info('socket: authorized');\n socket.onclose = this.onclose;\n resolve();\n })\n .catch(reject);\n };\n\n socket.onerror = (event) => {\n this.logger.warn('socket: error event fired', event);\n };\n\n sockets.set(this, socket);\n this.logger.info('socket: waiting for server');\n });\n }\n\n /**\n * Handles incoming CloseEvents\n * @param {CloseEvent} event\n * @returns {undefined}\n */\n onclose(event) {\n this.logger.info('socket: closed', event.code, event.reason);\n clearTimeout(this.pongTimer);\n clearTimeout(this.pingTimer);\n\n event = this._fixCloseCode(event);\n this.emit('close', event);\n\n // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure\n // we don't have a retain cycle.\n this.removeAllListeners();\n }\n\n /**\n * Handles incoming message events\n * @param {MessageEvent} event\n * @returns {undefined}\n */\n onmessage(event) {\n try {\n const data = JSON.parse(event.data);\n const sequenceNumber = parseInt(data.sequenceNumber, 10);\n\n this.logger.debug('socket: sequence number: ', sequenceNumber);\n if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {\n this.logger.debug(\n `socket: sequence number mismatch indicates lost mercury message. expected: ${this.expectedSequenceNumber}, actual: ${sequenceNumber}`\n );\n this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);\n }\n this.expectedSequenceNumber = sequenceNumber + 1;\n\n // Yes, it's a little weird looking; we want to emit message events that\n // look like normal socket message events, but event.data cannot be\n // modified and we don't actually care about anything but the data property\n const processedEvent = {data};\n\n this._acknowledge(processedEvent);\n if (data.type === 'pong') {\n this.emit('pong', processedEvent);\n } else {\n this.emit('message', processedEvent);\n }\n } catch (error) {\n // The above code should only be able to throw if we receive an unparsable\n // message from Mercury. At this time, the only action we have is to\n // ignore it and move on.\n /* istanbul ignore next */\n this.logger.warn('socket: error while receiving WebSocket message', error);\n }\n }\n\n /**\n * Sends a message up the socket\n * @param {mixed} data\n * @returns {Promise}\n */\n send(data) {\n return new Promise((resolve, reject) => {\n if (this.readyState !== 1) {\n return reject(new Error('INVALID_STATE_ERROR'));\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n socket.send(data);\n\n return resolve();\n });\n }\n\n /**\n * Sends an acknowledgment for a specific event\n * @param {MessageEvent} event\n * @returns {Promise}\n */\n _acknowledge(event) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.id')) {\n return Promise.reject(new Error('`event.data.id` is required'));\n }\n\n return this.send({\n messageId: event.data.id,\n type: 'ack',\n });\n }\n\n /**\n * Sends an auth message up the socket\n * @private\n * @returns {Promise}\n */\n _authorize() {\n return new Promise((resolve) => {\n this.logger.info('socket: authorizing');\n this.send({\n id: uuid.v4(),\n type: 'authorization',\n data: {\n token: this.token,\n },\n trackingId: this.trackingId,\n logLevelToken: this.logLevelToken,\n });\n\n const waitForBufferState = (event) => {\n if (\n !event.data.type &&\n (event.data.data.eventType === 'mercury.buffer_state' ||\n event.data.data.eventType === 'mercury.registration_status')\n ) {\n this.removeListener('message', waitForBufferState);\n this._ping();\n resolve();\n }\n };\n\n this.once('message', waitForBufferState);\n });\n }\n\n /**\n * Deals with the fact that some browsers drop some close codes (but not\n * close reasons).\n * @param {CloseEvent} event\n * @private\n * @returns {CloseEvent}\n */\n _fixCloseCode(event) {\n if (event.code === 1005 && event.reason) {\n switch (event.reason.toLowerCase()) {\n case 'replaced':\n this.logger.info('socket: fixing CloseEvent code for reason: ', event.reason);\n event.code = 4000;\n break;\n case 'authentication failed':\n case 'authentication did not happen within the timeout window of 30000 seconds.':\n this.logger.info('socket: fixing CloseEvent code for reason: ', event.reason);\n event.code = 1008;\n break;\n default:\n // do nothing\n }\n }\n\n return event;\n }\n\n /**\n * Sends a ping up the socket and confirms we get it back\n * @param {[type]} id\n * @private\n * @returns {[type]}\n */\n _ping(id) {\n const confirmPongId = (event) => {\n try {\n this.logger.debug('socket: pong', event.data.id);\n if (event.data && event.data.id !== id) {\n this.logger.info('socket: received pong for wrong ping id, closing socket');\n this.logger.debug('socket: expected', id, 'received', event.data.id);\n this.close({\n code: 1000,\n reason: 'Pong mismatch',\n });\n }\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error('socket: error occurred in confirmPongId', error);\n }\n };\n\n const onPongNotReceived = () => {\n try {\n this.logger.info('socket: pong not receive in expected period, closing socket');\n this.close({\n code: 1000,\n reason: 'Pong not received',\n }).catch((reason) => {\n this.logger.warn('socket: failed to close socket after missed pong', reason);\n });\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error('socket: error occurred in onPongNotReceived', error);\n }\n };\n\n const scheduleNextPingAndCancelPongTimer = () => {\n try {\n clearTimeout(this.pongTimer);\n this.pingTimer = safeSetTimeout(() => this._ping(), this.pingInterval);\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error('socket: error occurred in scheduleNextPingAndCancelPongTimer', error);\n }\n };\n\n id = id || uuid.v4();\n this.pongTimer = safeSetTimeout(onPongNotReceived, this.pongTimeout);\n this.once('pong', scheduleNextPingAndCancelPongTimer);\n this.once('pong', confirmPongId);\n\n this.logger.debug(`socket: ping ${id}`);\n\n return this.send({\n id,\n type: 'ping',\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["sockets","Socket","_domain","onmessage","bind","onclose","get","binaryType","bufferedAmount","extensions","protocol","readyState","url","options","resolve","reject","socket","logger","info","code","Error","reason","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","close","URL","hostname","checkRequired","forEach","key","enumerable","value","WebSocket","getWebSocketConstructor","_fixCloseCode","UnknownResponse","BadRequest","NotAuthorized","Forbidden","ConnectionError","onopen","_authorize","then","catch","onerror","set","pongTimer","pingTimer","emit","removeAllListeners","data","JSON","parse","sequenceNumber","debug","expectedSequenceNumber","processedEvent","_acknowledge","type","send","messageId","id","uuid","v4","token","trackingId","logLevelToken","waitForBufferState","eventType","removeListener","_ping","once","toLowerCase","confirmPongId","onPongNotReceived","scheduleNextPingAndCancelPongTimer","pingInterval","calculateLatency","pingTimestamp","now","performance","latency","pongTimeout","EventEmitter"],"sources":["socket-base.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\nimport {checkRequired} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\nimport uuid from 'uuid';\n\nimport {\n BadRequest,\n ConnectionError,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n // NotFound\n} from '../errors';\n\nconst sockets = new WeakMap();\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n /**\n * constructor\n * @returns {Socket}\n */\n constructor() {\n super();\n this._domain = 'unknown-domain';\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get binaryType() {\n return sockets.get(this).binaryType;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n get bufferedAmount() {\n return sockets.get(this).bufferedAmount;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get extensions() {\n return sockets.get(this).extensions;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get protocol() {\n return sockets.get(this).protocol;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n get readyState() {\n return sockets.get(this).readyState;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get url() {\n return sockets.get(this).url;\n }\n\n /**\n * Provides the environmentally appropriate constructor (ws in NodeJS,\n * WebSocket in browsers)\n * @returns {WebSocket}\n */\n static getWebSocketConstructor() {\n throw new Error(\n 'Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way'\n );\n }\n\n /**\n * Closes the socket\n * @param {Object} options\n * @param {string} options.reason\n * @param {number} options.code\n * @returns {Promise}\n */\n close(options) {\n return new Promise((resolve, reject) => {\n const socket = sockets.get(this);\n\n if (!socket) {\n // Open has not been called yet so there is no socket to close\n resolve();\n\n return;\n }\n // logger is defined once open is called\n this.logger.info(`socket,${this._domain}: closing`);\n\n if (socket.readyState === 2 || socket.readyState === 3) {\n this.logger.info(`socket,${this._domain}: already closed`);\n resolve();\n\n return;\n }\n\n options = options || {};\n if (options.code && options.code !== 1000 && (options.code < 3000 || options.code > 4999)) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\n }\n\n options = defaults(options, {\n code: 1000,\n reason: 'Done',\n });\n\n const closeTimer = safeSetTimeout(() => {\n try {\n this.logger.info(`socket,${this._domain}: no close event received, forcing closure`);\n resolve(\n this.onclose({\n code: 1000,\n reason: 'Done (forced)',\n })\n );\n } catch (error) {\n this.logger.warn(`socket,${this._domain}: force-close failed`, error);\n }\n }, this.forceCloseDelay);\n\n socket.onclose = (event) => {\n this.logger.info(`socket,${this._domain}: close event fired`, event.code, event.reason);\n clearTimeout(closeTimer);\n this.onclose(event);\n resolve(event);\n };\n\n socket.close(options.code, options.reason);\n });\n }\n\n /**\n * Opens a WebSocket\n * @param {string} url\n * @param {options} options\n * @param {number} options.forceCloseDelay (required)\n * @param {number} options.pingInterval (required)\n * @param {number} options.pongTimeout (required)\n * @param {string} options.token (required)\n * @param {string} options.trackingId (required)\n * @param {Logger} options.logger (required)\n * @param {string} options.logLevelToken\n * @returns {Promise}\n */\n open(url, options) {\n try {\n this._domain = new URL(url).hostname;\n } catch {\n this._domain = url;\n }\n\n return new Promise((resolve, reject) => {\n /* eslint complexity: [0] */\n if (!url) {\n reject(new Error('`url` is required'));\n\n return;\n }\n\n if (sockets.get(this)) {\n reject(new Error('Socket#open() can only be called once per instance'));\n\n return;\n }\n\n options = options || {};\n\n checkRequired(\n ['forceCloseDelay', 'pingInterval', 'pongTimeout', 'token', 'trackingId', 'logger'],\n options\n );\n\n Object.keys(options).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: options[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor();\n\n this.logger.info(`socket,${this._domain}: creating WebSocket`);\n const socket = new WebSocket(url, [], options);\n\n socket.binaryType = 'arraybuffer';\n socket.onmessage = this.onmessage;\n\n socket.onclose = (event) => {\n event = this._fixCloseCode(event);\n this.logger.info(`socket,${this._domain}: closed before open`, event.code, event.reason);\n switch (event.code) {\n case 1005:\n // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume\n // it's a bad websocket url. That'll trigger a device refresh; if it\n // turns out we had a bad token, the device refresh should 401 and\n // trigger a token refresh.\n return reject(new UnknownResponse(event));\n case 4400:\n return reject(new BadRequest(event));\n case 4401:\n return reject(new NotAuthorized(event));\n case 4403:\n return reject(new Forbidden(event));\n // case 4404:\n // return reject(new NotFound(event));\n default:\n return reject(new ConnectionError(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info(`socket,${this._domain}: connected`);\n this._authorize()\n .then(() => {\n this.logger.info(`socket,${this._domain}: authorized`);\n socket.onclose = this.onclose;\n resolve();\n })\n .catch(reject);\n };\n\n socket.onerror = (event) => {\n this.logger.warn(`socket,${this._domain}: error event fired`, event);\n };\n\n sockets.set(this, socket);\n this.logger.info(`socket,${this._domain}: waiting for server`);\n });\n }\n\n /**\n * Handles incoming CloseEvents\n * @param {CloseEvent} event\n * @returns {undefined}\n */\n onclose(event) {\n this.logger.info(`socket,${this._domain}: closed`, event.code, event.reason);\n clearTimeout(this.pongTimer);\n clearTimeout(this.pingTimer);\n\n event = this._fixCloseCode(event);\n this.emit('close', event);\n\n // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure\n // we don't have a retain cycle.\n this.removeAllListeners();\n }\n\n /**\n * Handles incoming message events\n * @param {MessageEvent} event\n * @returns {undefined}\n */\n onmessage(event) {\n try {\n const data = JSON.parse(event.data);\n const sequenceNumber = parseInt(data.sequenceNumber, 10);\n\n this.logger.debug(`socket,${this._domain}: sequence number: `, sequenceNumber);\n if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {\n this.logger.debug(\n `socket,${this._domain}: sequence number mismatch indicates lost mercury message. expected: ${this.expectedSequenceNumber}, actual: ${sequenceNumber}`\n );\n this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);\n }\n this.expectedSequenceNumber = sequenceNumber + 1;\n\n // Yes, it's a little weird looking; we want to emit message events that\n // look like normal socket message events, but event.data cannot be\n // modified and we don't actually care about anything but the data property\n const processedEvent = {data};\n\n this._acknowledge(processedEvent);\n if (data.type === 'pong') {\n this.emit('pong', processedEvent);\n } else {\n this.emit('message', processedEvent);\n }\n } catch (error) {\n // The above code should only be able to throw if we receive an unparsable\n // message from Mercury. At this time, the only action we have is to\n // ignore it and move on.\n /* istanbul ignore next */\n this.logger.warn(`socket,${this._domain}: error while receiving WebSocket message`, error);\n }\n }\n\n /**\n * Sends a message up the socket\n * @param {mixed} data\n * @returns {Promise}\n */\n send(data) {\n return new Promise((resolve, reject) => {\n if (this.readyState !== 1) {\n return reject(new Error('INVALID_STATE_ERROR'));\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n socket.send(data);\n\n return resolve();\n });\n }\n\n /**\n * Sends an acknowledgment for a specific event\n * @param {MessageEvent} event\n * @returns {Promise}\n */\n _acknowledge(event) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.id')) {\n return Promise.reject(new Error('`event.data.id` is required'));\n }\n\n return this.send({\n messageId: event.data.id,\n type: 'ack',\n });\n }\n\n /**\n * Sends an auth message up the socket\n * @private\n * @returns {Promise}\n */\n _authorize() {\n return new Promise((resolve) => {\n this.logger.info(`socket,${this._domain}: authorizing`);\n this.send({\n id: uuid.v4(),\n type: 'authorization',\n data: {\n token: this.token,\n },\n trackingId: this.trackingId,\n logLevelToken: this.logLevelToken,\n });\n\n const waitForBufferState = (event) => {\n if (\n !event.data.type &&\n (event.data.data.eventType === 'mercury.buffer_state' ||\n event.data.data.eventType === 'mercury.registration_status')\n ) {\n this.removeListener('message', waitForBufferState);\n this._ping();\n resolve();\n }\n };\n\n this.once('message', waitForBufferState);\n });\n }\n\n /**\n * Deals with the fact that some browsers drop some close codes (but not\n * close reasons).\n * @param {CloseEvent} event\n * @private\n * @returns {CloseEvent}\n */\n _fixCloseCode(event) {\n if (event.code === 1005 && event.reason) {\n switch (event.reason.toLowerCase()) {\n case 'replaced':\n this.logger.info(\n `socket,${this._domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 4000;\n break;\n case 'authentication failed':\n case 'authentication did not happen within the timeout window of 30000 seconds.':\n this.logger.info(\n `socket,${this._domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 1008;\n break;\n default:\n // do nothing\n }\n }\n\n return event;\n }\n\n /**\n * Sends a ping up the socket and confirms we get it back\n * @param {[type]} id\n * @private\n * @returns {[type]}\n */\n _ping(id) {\n const confirmPongId = (event) => {\n try {\n this.logger.debug(`socket,${this._domain}: pong`, event.data.id);\n if (event.data && event.data.id !== id) {\n this.logger.info(\n `socket,${this._domain}: received pong for wrong ping id, closing socket`\n );\n this.logger.debug(`socket,${this._domain}: expected`, id, 'received', event.data.id);\n this.close({\n code: 1000,\n reason: 'Pong mismatch',\n });\n }\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error(`socket,${this._domain}: error occurred in confirmPongId`, error);\n }\n };\n\n const onPongNotReceived = () => {\n try {\n this.logger.info(\n `socket,${this._domain}: pong not receive in expected period, closing socket`\n );\n this.close({\n code: 1000,\n reason: 'Pong not received',\n }).catch((reason) => {\n this.logger.warn(\n `socket,${this._domain}: failed to close socket after missed pong`,\n reason\n );\n });\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error(`socket,${this._domain}: error occurred in onPongNotReceived`, error);\n }\n };\n\n const scheduleNextPingAndCancelPongTimer = () => {\n try {\n clearTimeout(this.pongTimer);\n this.pingTimer = safeSetTimeout(() => this._ping(), this.pingInterval);\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error(\n `socket,${this._domain}: error occurred in scheduleNextPingAndCancelPongTimer`,\n error\n );\n }\n };\n\n const calculateLatency = (pingTimestamp) => {\n const now = performance.now();\n const latency = now - pingTimestamp;\n\n this.logger.debug(`socket,${this._domain}: latency: `, latency);\n this.emit('ping-pong-latency', latency);\n };\n\n id = id || uuid.v4();\n const pingTimestamp = performance.now();\n\n this.pongTimer = safeSetTimeout(onPongNotReceived, this.pongTimeout);\n this.once('pong', scheduleNextPingAndCancelPongTimer);\n this.once('pong', confirmPongId);\n this.once('pong', () => calculateLatency(pingTimestamp));\n this.logger.debug(`socket,${this._domain}: ping ${id}`);\n\n return this.send({\n id,\n type: 'ping',\n });\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/internal-plugin-mercury",
3
- "version": "3.0.0-beta.42",
3
+ "version": "3.0.0-beta.421",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -28,19 +28,19 @@
28
28
  "sinon": "^9.2.4"
29
29
  },
30
30
  "dependencies": {
31
- "@webex/common": "3.0.0-beta.42",
32
- "@webex/common-timers": "3.0.0-beta.42",
33
- "@webex/internal-plugin-device": "3.0.0-beta.42",
34
- "@webex/internal-plugin-feature": "3.0.0-beta.42",
35
- "@webex/internal-plugin-mercury": "3.0.0-beta.42",
36
- "@webex/internal-plugin-metrics": "3.0.0-beta.42",
37
- "@webex/test-helper-chai": "3.0.0-beta.42",
38
- "@webex/test-helper-mocha": "3.0.0-beta.42",
39
- "@webex/test-helper-mock-web-socket": "3.0.0-beta.42",
40
- "@webex/test-helper-mock-webex": "3.0.0-beta.42",
41
- "@webex/test-helper-refresh-callback": "3.0.0-beta.42",
42
- "@webex/test-helper-test-users": "3.0.0-beta.42",
43
- "@webex/webex-core": "3.0.0-beta.42",
31
+ "@webex/common": "3.0.0-beta.421",
32
+ "@webex/common-timers": "3.0.0-beta.421",
33
+ "@webex/internal-plugin-device": "3.0.0-beta.421",
34
+ "@webex/internal-plugin-feature": "3.0.0-beta.421",
35
+ "@webex/internal-plugin-mercury": "3.0.0-beta.421",
36
+ "@webex/internal-plugin-metrics": "3.0.0-beta.421",
37
+ "@webex/test-helper-chai": "3.0.0-beta.421",
38
+ "@webex/test-helper-mocha": "3.0.0-beta.421",
39
+ "@webex/test-helper-mock-web-socket": "3.0.0-beta.421",
40
+ "@webex/test-helper-mock-webex": "3.0.0-beta.421",
41
+ "@webex/test-helper-refresh-callback": "3.0.0-beta.421",
42
+ "@webex/test-helper-test-users": "3.0.0-beta.421",
43
+ "@webex/webex-core": "3.0.0-beta.421",
44
44
  "backoff": "^2.5.0",
45
45
  "lodash": "^4.17.21",
46
46
  "uuid": "^3.3.2",