@webex/internal-plugin-mercury 3.0.0-beta.9 → 3.0.0-bnr.2

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