@webex/internal-plugin-mercury 3.0.0-beta.4 → 3.0.0-beta.400

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.
@@ -1,151 +1,121 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
-
5
4
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
5
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
-
9
6
  _Object$defineProperty(exports, "__esModule", {
10
7
  value: true
11
8
  });
12
-
13
9
  exports.default = void 0;
14
-
15
10
  var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
16
-
17
11
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
18
-
19
12
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
20
-
21
13
  var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/define-property"));
22
-
23
14
  var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
24
-
25
15
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
26
-
27
16
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
28
-
29
17
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
30
-
31
18
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
32
-
33
19
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
34
-
35
20
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
36
-
37
21
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
38
-
39
22
  var _isObject2 = _interopRequireDefault(require("lodash/isObject"));
40
-
41
23
  var _has2 = _interopRequireDefault(require("lodash/has"));
42
-
43
24
  var _defaults2 = _interopRequireDefault(require("lodash/defaults"));
44
-
45
25
  var _events = require("events");
46
-
47
26
  var _common = require("@webex/common");
48
-
49
27
  var _commonTimers = require("@webex/common-timers");
50
-
51
28
  var _uuid = _interopRequireDefault(require("uuid"));
52
-
53
29
  var _errors = require("../errors");
54
-
55
30
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
56
-
57
31
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
58
-
59
32
  var sockets = new _weakMap.default();
33
+
60
34
  /**
61
35
  * Generalized socket abstraction
62
36
  */
63
-
64
37
  var Socket = /*#__PURE__*/function (_EventEmitter) {
65
38
  (0, _inherits2.default)(Socket, _EventEmitter);
66
-
67
39
  var _super = _createSuper(Socket);
68
-
69
40
  /**
70
41
  * constructor
71
42
  * @returns {Socket}
72
43
  */
73
44
  function Socket() {
74
45
  var _this;
75
-
76
46
  (0, _classCallCheck2.default)(this, Socket);
77
47
  _this = _super.call(this);
48
+ _this._domain = 'unknown-domain';
78
49
  _this.onmessage = _this.onmessage.bind((0, _assertThisInitialized2.default)(_this));
79
50
  _this.onclose = _this.onclose.bind((0, _assertThisInitialized2.default)(_this));
80
51
  return _this;
81
52
  }
53
+
82
54
  /**
83
55
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
84
56
  * @returns {string}
85
57
  */
86
-
87
-
88
58
  (0, _createClass2.default)(Socket, [{
89
59
  key: "binaryType",
90
60
  get: function get() {
91
61
  return sockets.get(this).binaryType;
92
62
  }
63
+
93
64
  /**
94
65
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
95
66
  * @returns {number}
96
67
  */
97
-
98
68
  }, {
99
69
  key: "bufferedAmount",
100
70
  get: function get() {
101
71
  return sockets.get(this).bufferedAmount;
102
72
  }
73
+
103
74
  /**
104
75
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
105
76
  * @returns {string}
106
77
  */
107
-
108
78
  }, {
109
79
  key: "extensions",
110
80
  get: function get() {
111
81
  return sockets.get(this).extensions;
112
82
  }
83
+
113
84
  /**
114
85
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
115
86
  * @returns {string}
116
87
  */
117
-
118
88
  }, {
119
89
  key: "protocol",
120
90
  get: function get() {
121
91
  return sockets.get(this).protocol;
122
92
  }
93
+
123
94
  /**
124
95
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
125
96
  * @returns {number}
126
97
  */
127
-
128
98
  }, {
129
99
  key: "readyState",
130
100
  get: function get() {
131
101
  return sockets.get(this).readyState;
132
102
  }
103
+
133
104
  /**
134
105
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
135
106
  * @returns {string}
136
107
  */
137
-
138
108
  }, {
139
109
  key: "url",
140
110
  get: function get() {
141
111
  return sockets.get(this).url;
142
112
  }
113
+
143
114
  /**
144
115
  * Provides the environmentally appropriate constructor (ws in NodeJS,
145
116
  * WebSocket in browsers)
146
117
  * @returns {WebSocket}
147
118
  */
148
-
149
119
  }, {
150
120
  key: "close",
151
121
  value:
@@ -158,63 +128,50 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
158
128
  */
159
129
  function close(options) {
160
130
  var _this2 = this;
161
-
162
131
  return new _promise.default(function (resolve, reject) {
163
132
  var socket = sockets.get(_this2);
164
-
165
133
  if (!socket) {
166
134
  // Open has not been called yet so there is no socket to close
167
135
  resolve();
168
136
  return;
169
- } // logger is defined once open is called
170
-
171
-
172
- _this2.logger.info('socket: closing');
173
-
137
+ }
138
+ // logger is defined once open is called
139
+ _this2.logger.info("socket,".concat(_this2._domain, ": closing"));
174
140
  if (socket.readyState === 2 || socket.readyState === 3) {
175
- _this2.logger.info('socket: already closed');
176
-
141
+ _this2.logger.info("socket,".concat(_this2._domain, ": already closed"));
177
142
  resolve();
178
143
  return;
179
144
  }
180
-
181
145
  options = options || {};
182
-
183
146
  if (options.code && options.code !== 1000 && (options.code < 3000 || options.code > 4999)) {
184
147
  reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));
185
148
  return;
186
149
  }
187
-
188
150
  options = (0, _defaults2.default)(options, {
189
151
  code: 1000,
190
152
  reason: 'Done'
191
153
  });
192
154
  var closeTimer = (0, _commonTimers.safeSetTimeout)(function () {
193
155
  try {
194
- _this2.logger.info('socket: no close event received, forcing closure');
195
-
156
+ _this2.logger.info("socket,".concat(_this2._domain, ": no close event received, forcing closure"));
196
157
  resolve(_this2.onclose({
197
158
  code: 1000,
198
159
  reason: 'Done (forced)'
199
160
  }));
200
161
  } catch (error) {
201
- _this2.logger.warn('socket: force-close failed', error);
162
+ _this2.logger.warn("socket,".concat(_this2._domain, ": force-close failed"), error);
202
163
  }
203
164
  }, _this2.forceCloseDelay);
204
-
205
165
  socket.onclose = function (event) {
206
- _this2.logger.info('socket: close event fired', event.code, event.reason);
207
-
166
+ _this2.logger.info("socket,".concat(_this2._domain, ": close event fired"), event.code, event.reason);
208
167
  clearTimeout(closeTimer);
209
-
210
168
  _this2.onclose(event);
211
-
212
169
  resolve(event);
213
170
  };
214
-
215
171
  socket.close(options.code, options.reason);
216
172
  });
217
173
  }
174
+
218
175
  /**
219
176
  * Opens a WebSocket
220
177
  * @param {string} url
@@ -228,24 +185,25 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
228
185
  * @param {string} options.logLevelToken
229
186
  * @returns {Promise}
230
187
  */
231
-
232
188
  }, {
233
189
  key: "open",
234
190
  value: function open(url, options) {
235
191
  var _this3 = this;
236
-
192
+ try {
193
+ this._domain = new URL(url).hostname;
194
+ } catch (_unused) {
195
+ this._domain = url;
196
+ }
237
197
  return new _promise.default(function (resolve, reject) {
238
198
  /* eslint complexity: [0] */
239
199
  if (!url) {
240
200
  reject(new Error('`url` is required'));
241
201
  return;
242
202
  }
243
-
244
203
  if (sockets.get(_this3)) {
245
204
  reject(new Error('Socket#open() can only be called once per instance'));
246
205
  return;
247
206
  }
248
-
249
207
  options = options || {};
250
208
  (0, _common.checkRequired)(['forceCloseDelay', 'pingInterval', 'pongTimeout', 'token', 'trackingId', 'logger'], options);
251
209
  (0, _keys.default)(options).forEach(function (key) {
@@ -255,18 +213,13 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
255
213
  });
256
214
  });
257
215
  var WebSocket = Socket.getWebSocketConstructor();
258
-
259
- _this3.logger.info('socket: creating WebSocket');
260
-
216
+ _this3.logger.info("socket,".concat(_this3._domain, ": creating WebSocket"));
261
217
  var socket = new WebSocket(url, [], options);
262
218
  socket.binaryType = 'arraybuffer';
263
219
  socket.onmessage = _this3.onmessage;
264
-
265
220
  socket.onclose = function (event) {
266
221
  event = _this3._fixCloseCode(event);
267
-
268
- _this3.logger.info('socket: closed before open', event.code, event.reason);
269
-
222
+ _this3.logger.info("socket,".concat(_this3._domain, ": closed before open"), event.code, event.reason);
270
223
  switch (event.code) {
271
224
  case 1005:
272
225
  // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume
@@ -274,90 +227,78 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
274
227
  // turns out we had a bad token, the device refresh should 401 and
275
228
  // trigger a token refresh.
276
229
  return reject(new _errors.UnknownResponse(event));
277
-
278
230
  case 4400:
279
231
  return reject(new _errors.BadRequest(event));
280
-
281
232
  case 4401:
282
233
  return reject(new _errors.NotAuthorized(event));
283
-
284
234
  case 4403:
285
235
  return reject(new _errors.Forbidden(event));
286
236
  // case 4404:
287
237
  // return reject(new NotFound(event));
288
-
289
238
  default:
290
239
  return reject(new _errors.ConnectionError(event));
291
240
  }
292
241
  };
293
-
294
242
  socket.onopen = function () {
295
- _this3.logger.info('socket: connected');
296
-
243
+ _this3.logger.info("socket,".concat(_this3._domain, ": connected"));
297
244
  _this3._authorize().then(function () {
298
- _this3.logger.info('socket: authorized');
299
-
245
+ _this3.logger.info("socket,".concat(_this3._domain, ": authorized"));
300
246
  socket.onclose = _this3.onclose;
301
247
  resolve();
302
248
  }).catch(reject);
303
249
  };
304
-
305
250
  socket.onerror = function (event) {
306
- _this3.logger.warn('socket: error event fired', event);
251
+ _this3.logger.warn("socket,".concat(_this3._domain, ": error event fired"), event);
307
252
  };
308
-
309
253
  sockets.set(_this3, socket);
310
-
311
- _this3.logger.info('socket: waiting for server');
254
+ _this3.logger.info("socket,".concat(_this3._domain, ": waiting for server"));
312
255
  });
313
256
  }
257
+
314
258
  /**
315
259
  * Handles incoming CloseEvents
316
260
  * @param {CloseEvent} event
317
261
  * @returns {undefined}
318
262
  */
319
-
320
263
  }, {
321
264
  key: "onclose",
322
265
  value: function onclose(event) {
323
- this.logger.info('socket: closed', event.code, event.reason);
266
+ this.logger.info("socket,".concat(this._domain, ": closed"), event.code, event.reason);
324
267
  clearTimeout(this.pongTimer);
325
268
  clearTimeout(this.pingTimer);
326
269
  event = this._fixCloseCode(event);
327
- this.emit('close', event); // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure
328
- // we don't have a retain cycle.
270
+ this.emit('close', event);
329
271
 
272
+ // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure
273
+ // we don't have a retain cycle.
330
274
  this.removeAllListeners();
331
275
  }
276
+
332
277
  /**
333
278
  * Handles incoming message events
334
279
  * @param {MessageEvent} event
335
280
  * @returns {undefined}
336
281
  */
337
-
338
282
  }, {
339
283
  key: "onmessage",
340
284
  value: function onmessage(event) {
341
285
  try {
342
286
  var data = JSON.parse(event.data);
343
287
  var sequenceNumber = (0, _parseInt2.default)(data.sequenceNumber, 10);
344
- this.logger.debug('socket: sequence number: ', sequenceNumber);
345
-
288
+ this.logger.debug("socket,".concat(this._domain, ": sequence number: "), sequenceNumber);
346
289
  if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {
347
- 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));
348
291
  this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);
349
292
  }
293
+ this.expectedSequenceNumber = sequenceNumber + 1;
350
294
 
351
- this.expectedSequenceNumber = sequenceNumber + 1; // Yes, it's a little weird looking; we want to emit message events that
295
+ // Yes, it's a little weird looking; we want to emit message events that
352
296
  // look like normal socket message events, but event.data cannot be
353
297
  // modified and we don't actually care about anything but the data property
354
-
355
298
  var processedEvent = {
356
299
  data: data
357
300
  };
358
-
359
301
  this._acknowledge(processedEvent);
360
-
361
302
  if (data.type === 'pong') {
362
303
  this.emit('pong', processedEvent);
363
304
  } else {
@@ -367,72 +308,64 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
367
308
  // The above code should only be able to throw if we receive an unparsable
368
309
  // message from Mercury. At this time, the only action we have is to
369
310
  // ignore it and move on.
370
-
371
311
  /* istanbul ignore next */
372
- this.logger.warn('socket: error while receiving WebSocket message', error);
312
+ this.logger.warn("socket,".concat(this._domain, ": error while receiving WebSocket message"), error);
373
313
  }
374
314
  }
315
+
375
316
  /**
376
317
  * Sends a message up the socket
377
318
  * @param {mixed} data
378
319
  * @returns {Promise}
379
320
  */
380
-
381
321
  }, {
382
322
  key: "send",
383
323
  value: function send(data) {
384
324
  var _this4 = this;
385
-
386
325
  return new _promise.default(function (resolve, reject) {
387
326
  if (_this4.readyState !== 1) {
388
327
  return reject(new Error('INVALID_STATE_ERROR'));
389
328
  }
390
-
391
329
  if ((0, _isObject2.default)(data)) {
392
330
  data = (0, _stringify.default)(data);
393
331
  }
394
-
395
332
  var socket = sockets.get(_this4);
396
333
  socket.send(data);
397
334
  return resolve();
398
335
  });
399
336
  }
337
+
400
338
  /**
401
339
  * Sends an acknowledgment for a specific event
402
340
  * @param {MessageEvent} event
403
341
  * @returns {Promise}
404
342
  */
405
-
406
343
  }, {
407
344
  key: "_acknowledge",
408
345
  value: function _acknowledge(event) {
409
346
  if (!event) {
410
347
  return _promise.default.reject(new Error('`event` is required'));
411
348
  }
412
-
413
349
  if (!(0, _has2.default)(event, 'data.id')) {
414
350
  return _promise.default.reject(new Error('`event.data.id` is required'));
415
351
  }
416
-
417
352
  return this.send({
418
353
  messageId: event.data.id,
419
354
  type: 'ack'
420
355
  });
421
356
  }
357
+
422
358
  /**
423
359
  * Sends an auth message up the socket
424
360
  * @private
425
361
  * @returns {Promise}
426
362
  */
427
-
428
363
  }, {
429
364
  key: "_authorize",
430
365
  value: function _authorize() {
431
366
  var _this5 = this;
432
-
433
367
  return new _promise.default(function (resolve) {
434
- _this5.logger.info('socket: authorizing');
435
-
368
+ _this5.logger.info("socket,".concat(_this5._domain, ": authorizing"));
436
369
  _this5.send({
437
370
  id: _uuid.default.v4(),
438
371
  type: 'authorization',
@@ -442,20 +375,17 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
442
375
  trackingId: _this5.trackingId,
443
376
  logLevelToken: _this5.logLevelToken
444
377
  });
445
-
446
378
  var waitForBufferState = function waitForBufferState(event) {
447
379
  if (!event.data.type && (event.data.data.eventType === 'mercury.buffer_state' || event.data.data.eventType === 'mercury.registration_status')) {
448
380
  _this5.removeListener('message', waitForBufferState);
449
-
450
381
  _this5._ping();
451
-
452
382
  resolve();
453
383
  }
454
384
  };
455
-
456
385
  _this5.once('message', waitForBufferState);
457
386
  });
458
387
  }
388
+
459
389
  /**
460
390
  * Deals with the fact that some browsers drop some close codes (but not
461
391
  * close reasons).
@@ -463,51 +393,44 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
463
393
  * @private
464
394
  * @returns {CloseEvent}
465
395
  */
466
-
467
396
  }, {
468
397
  key: "_fixCloseCode",
469
398
  value: function _fixCloseCode(event) {
470
399
  if (event.code === 1005 && event.reason) {
471
400
  switch (event.reason.toLowerCase()) {
472
401
  case 'replaced':
473
- 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);
474
403
  event.code = 4000;
475
404
  break;
476
-
477
405
  case 'authentication failed':
478
406
  case 'authentication did not happen within the timeout window of 30000 seconds.':
479
- 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);
480
408
  event.code = 1008;
481
409
  break;
482
-
483
- default: // do nothing
484
-
410
+ default:
411
+ // do nothing
485
412
  }
486
413
  }
487
414
 
488
415
  return event;
489
416
  }
417
+
490
418
  /**
491
419
  * Sends a ping up the socket and confirms we get it back
492
420
  * @param {[type]} id
493
421
  * @private
494
422
  * @returns {[type]}
495
423
  */
496
-
497
424
  }, {
498
425
  key: "_ping",
499
426
  value: function _ping(id) {
500
427
  var _this6 = this;
501
-
502
428
  var confirmPongId = function confirmPongId(event) {
503
429
  try {
504
- _this6.logger.debug('socket: pong', event.data.id);
505
-
430
+ _this6.logger.debug("socket,".concat(_this6._domain, ": pong"), event.data.id);
506
431
  if (event.data && event.data.id !== id) {
507
- _this6.logger.info('socket: received pong for wrong ping id, closing socket');
508
-
509
- _this6.logger.debug('socket: expected', id, 'received', event.data.id);
510
-
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);
511
434
  _this6.close({
512
435
  code: 1000,
513
436
  reason: 'Pong mismatch'
@@ -516,31 +439,26 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
516
439
  } catch (error) {
517
440
  // This try/catch block was added as a debugging step; to the best of my
518
441
  // knowledge, the above can never throw.
519
-
520
442
  /* istanbul ignore next */
521
- _this6.logger.error('socket: error occurred in confirmPongId', error);
443
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in confirmPongId"), error);
522
444
  }
523
445
  };
524
-
525
446
  var onPongNotReceived = function onPongNotReceived() {
526
447
  try {
527
- _this6.logger.info('socket: pong not receive in expected period, closing socket');
528
-
448
+ _this6.logger.info("socket,".concat(_this6._domain, ": pong not receive in expected period, closing socket"));
529
449
  _this6.close({
530
450
  code: 1000,
531
451
  reason: 'Pong not received'
532
452
  }).catch(function (reason) {
533
- _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);
534
454
  });
535
455
  } catch (error) {
536
456
  // This try/catch block was added as a debugging step; to the best of my
537
457
  // knowledge, the above can never throw.
538
-
539
458
  /* istanbul ignore next */
540
- _this6.logger.error('socket: error occurred in onPongNotReceived', error);
459
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in onPongNotReceived"), error);
541
460
  }
542
461
  };
543
-
544
462
  var scheduleNextPingAndCancelPongTimer = function scheduleNextPingAndCancelPongTimer() {
545
463
  try {
546
464
  clearTimeout(_this6.pongTimer);
@@ -550,17 +468,25 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
550
468
  } catch (error) {
551
469
  // This try/catch block was added as a debugging step; to the best of my
552
470
  // knowledge, the above can never throw.
553
-
554
471
  /* istanbul ignore next */
555
- _this6.logger.error('socket: error occurred in scheduleNextPingAndCancelPongTimer', error);
472
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in scheduleNextPingAndCancelPongTimer"), error);
556
473
  }
557
474
  };
558
-
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
+ };
559
481
  id = id || _uuid.default.v4();
482
+ var pingTimestamp = performance.now();
560
483
  this.pongTimer = (0, _commonTimers.safeSetTimeout)(onPongNotReceived, this.pongTimeout);
561
484
  this.once('pong', scheduleNextPingAndCancelPongTimer);
562
485
  this.once('pong', confirmPongId);
563
- 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));
564
490
  return this.send({
565
491
  id: id,
566
492
  type: 'ping'
@@ -574,6 +500,5 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
574
500
  }]);
575
501
  return Socket;
576
502
  }(_events.EventEmitter);
577
-
578
503
  exports.default = Socket;
579
504
  //# sourceMappingURL=socket-base.js.map