@webex/calling 3.12.0-mobius-socket.17 → 3.12.0-mobius-socket.19

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.
Files changed (49) hide show
  1. package/dist/CallingClient/utils/request.js +6 -3
  2. package/dist/CallingClient/utils/request.js.map +1 -1
  3. package/dist/CallingClient/utils/request.test.js +2 -2
  4. package/dist/CallingClient/utils/request.test.js.map +1 -1
  5. package/dist/CallingClient/utils/types.js.map +1 -1
  6. package/dist/SDKConnector/types.js.map +1 -1
  7. package/dist/mobius-socket/config.js +7 -44
  8. package/dist/mobius-socket/config.js.map +1 -1
  9. package/dist/mobius-socket/errors.js +25 -21
  10. package/dist/mobius-socket/errors.js.map +1 -1
  11. package/dist/mobius-socket/index.js +0 -44
  12. package/dist/mobius-socket/index.js.map +1 -1
  13. package/dist/mobius-socket/mobius-socket-events.test.js +20 -48
  14. package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -1
  15. package/dist/mobius-socket/mobius-socket.js +302 -701
  16. package/dist/mobius-socket/mobius-socket.js.map +1 -1
  17. package/dist/mobius-socket/mobius-socket.test.js +435 -718
  18. package/dist/mobius-socket/mobius-socket.test.js.map +1 -1
  19. package/dist/mobius-socket/socket/socket-base.js +70 -78
  20. package/dist/mobius-socket/socket/socket-base.js.map +1 -1
  21. package/dist/mobius-socket/socket.test.js +36 -61
  22. package/dist/mobius-socket/socket.test.js.map +1 -1
  23. package/dist/mobius-socket/types.js +7 -0
  24. package/dist/mobius-socket/types.js.map +1 -0
  25. package/dist/module/CallingClient/utils/request.js +3 -2
  26. package/dist/module/mobius-socket/config.js +7 -10
  27. package/dist/module/mobius-socket/errors.js +17 -0
  28. package/dist/module/mobius-socket/index.js +0 -3
  29. package/dist/module/mobius-socket/mobius-socket.js +211 -401
  30. package/dist/module/mobius-socket/socket/socket-base.js +64 -69
  31. package/dist/module/mobius-socket/types.js +1 -0
  32. package/dist/types/CallingClient/utils/request.d.ts.map +1 -1
  33. package/dist/types/CallingClient/utils/types.d.ts +1 -1
  34. package/dist/types/CallingClient/utils/types.d.ts.map +1 -1
  35. package/dist/types/SDKConnector/types.d.ts +15 -0
  36. package/dist/types/SDKConnector/types.d.ts.map +1 -1
  37. package/dist/types/mobius-socket/config.d.ts +7 -8
  38. package/dist/types/mobius-socket/config.d.ts.map +1 -1
  39. package/dist/types/mobius-socket/errors.d.ts +7 -0
  40. package/dist/types/mobius-socket/errors.d.ts.map +1 -1
  41. package/dist/types/mobius-socket/index.d.ts +3 -5
  42. package/dist/types/mobius-socket/index.d.ts.map +1 -1
  43. package/dist/types/mobius-socket/mobius-socket.d.ts +26 -37
  44. package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -1
  45. package/dist/types/mobius-socket/socket/socket-base.d.ts +10 -10
  46. package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -1
  47. package/dist/types/mobius-socket/types.d.ts +21 -0
  48. package/dist/types/mobius-socket/types.d.ts.map +1 -0
  49. package/package.json +1 -1
@@ -41,11 +41,6 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
41
41
  */ // @ts-expect-error `@webex/common` is still JS-only and does not ship declarations.
42
42
  // @ts-expect-error `@webex/common-timers` is still JS-only and does not ship declarations.
43
43
  var sockets = new _weakMap.default();
44
- var UnknownResponseCtor = _errors.UnknownResponse;
45
- var BadRequestCtor = _errors.BadRequest;
46
- var NotAuthorizedCtor = _errors.NotAuthorized;
47
- var ForbiddenCtor = _errors.Forbidden;
48
- var ConnectionErrorCtor = _errors.ConnectionError;
49
44
 
50
45
  /**
51
46
  * Generalized socket abstraction
@@ -59,19 +54,18 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
59
54
  var _this;
60
55
  (0, _classCallCheck2.default)(this, Socket);
61
56
  _this = _callSuper(this, Socket);
62
- (0, _defineProperty3.default)(_this, "_domain", void 0);
63
- (0, _defineProperty3.default)(_this, "_pendingResponses", void 0);
57
+ (0, _defineProperty3.default)(_this, "domain", void 0);
58
+ (0, _defineProperty3.default)(_this, "pendingResponses", void 0);
64
59
  (0, _defineProperty3.default)(_this, "forceCloseDelay", void 0);
65
60
  (0, _defineProperty3.default)(_this, "logger", void 0);
66
61
  (0, _defineProperty3.default)(_this, "refreshToken", void 0);
67
62
  (0, _defineProperty3.default)(_this, "token", void 0);
68
63
  (0, _defineProperty3.default)(_this, "trackingId", void 0);
69
64
  (0, _defineProperty3.default)(_this, "wssResponseTimeout", void 0);
70
- _this._domain = 'unknown-domain';
71
- _this._pendingResponses = new _map.default();
65
+ _this.domain = 'unknown-domain';
66
+ _this.pendingResponses = new _map.default();
72
67
  _this.onmessage = _this.onmessage.bind(_this);
73
68
  _this.onclose = _this.onclose.bind(_this);
74
- // Increase max listeners to avoid memory leak warning in tests
75
69
  _this.setMaxListeners(10);
76
70
  return _this;
77
71
  }
@@ -162,9 +156,9 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
162
156
  return;
163
157
  }
164
158
  // logger is defined once open is called
165
- _this2.logger.info("socket,".concat(_this2._domain, ": closing"));
159
+ _this2.logger.info("socket,".concat(_this2.domain, ": closing"));
166
160
  if (socket.readyState === _constants.SOCKET_READY_STATE.CLOSING || socket.readyState === _constants.SOCKET_READY_STATE.CLOSED) {
167
- _this2.logger.info("socket,".concat(_this2._domain, ": already closed"));
161
+ _this2.logger.info("socket,".concat(_this2.domain, ": already closed"));
168
162
  resolve();
169
163
  return;
170
164
  }
@@ -180,7 +174,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
180
174
  }
181
175
  var closeTimer = (0, _commonTimers.safeSetTimeout)(function () {
182
176
  try {
183
- _this2.logger.info("socket,".concat(_this2._domain, ": no close event received, forcing closure"));
177
+ _this2.logger.info("socket,".concat(_this2.domain, ": no close event received, forcing closure"));
184
178
  resolve(_this2.onclose(originalCode ? {
185
179
  code: originalCode,
186
180
  reason: originalReason || 'Done (unknown)'
@@ -189,11 +183,11 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
189
183
  reason: 'Done (forced)'
190
184
  }));
191
185
  } catch (error) {
192
- _this2.logger.warn("socket,".concat(_this2._domain, ": force-close failed"), error);
186
+ _this2.logger.warn("socket,".concat(_this2.domain, ": force-close failed"), error);
193
187
  }
194
188
  }, _this2.forceCloseDelay);
195
189
  socket.onclose = function (event) {
196
- _this2.logger.info("socket,".concat(_this2._domain, ": close event fired"), event.code, event.reason);
190
+ _this2.logger.info("socket,".concat(_this2.domain, ": close event fired"), event.code, event.reason);
197
191
  clearTimeout(closeTimer);
198
192
  _this2.onclose(event);
199
193
  resolve(event);
@@ -202,7 +196,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
202
196
  // If socket is still connecting, manually trigger close handler with desired code
203
197
  // because calling close() on a CONNECTING socket may not preserve custom codes
204
198
  if (socket.readyState === _constants.SOCKET_READY_STATE.CONNECTING) {
205
- _this2.logger.info("socket,".concat(_this2._domain, ": socket still connecting, triggering close manually"));
199
+ _this2.logger.info("socket,".concat(_this2.domain, ": socket still connecting, triggering close manually"));
206
200
  clearTimeout(closeTimer);
207
201
  var closeEvent = {
208
202
  code: resolvedOptions.code,
@@ -213,7 +207,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
213
207
  try {
214
208
  socket.close(resolvedOptions.code, resolvedOptions.reason);
215
209
  } catch (error) {
216
- _this2.logger.info("socket,".concat(_this2._domain, ": error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes"), error);
210
+ _this2.logger.info("socket,".concat(_this2.domain, ": error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes"), error);
217
211
  }
218
212
  } else {
219
213
  socket.close(resolvedOptions.code, resolvedOptions.reason);
@@ -236,9 +230,9 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
236
230
  value: function open(url, options) {
237
231
  var _this3 = this;
238
232
  try {
239
- this._domain = new URL(url).hostname;
233
+ this.domain = new URL(url).hostname;
240
234
  } catch (_unused) {
241
- this._domain = url;
235
+ this.domain = url;
242
236
  }
243
237
  return new _promise.default(function (resolve, reject) {
244
238
  /* eslint complexity: [0] */
@@ -259,45 +253,43 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
259
253
  });
260
254
  });
261
255
  var WebSocket = Socket.getWebSocketConstructor();
262
- _this3.logger.info("socket,".concat(_this3._domain, ": creating WebSocket"));
256
+ _this3.logger.info("socket,".concat(_this3.domain, ": creating WebSocket"));
263
257
  var socket = new WebSocket(url, [], resolvedOptions);
264
258
  socket.binaryType = 'arraybuffer';
265
259
  socket.onmessage = _this3.onmessage;
266
260
  socket.onclose = function (event) {
267
- event = _this3._fixCloseCode(event);
268
- _this3.logger.info("socket,".concat(_this3._domain, ": closed before open"), event.code, event.reason);
261
+ event = _this3.fixCloseCode(event);
262
+ _this3.logger.info("socket,".concat(_this3.domain, ": closed before open"), event.code, event.reason);
269
263
  switch (event.code) {
270
264
  case 1005:
271
265
  // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume
272
266
  // it's a bad websocket url. That'll trigger a device refresh; if it
273
267
  // turns out we had a bad token, the device refresh should 401 and
274
268
  // trigger a token refresh.
275
- return reject(new UnknownResponseCtor(event));
269
+ return reject(new _errors.UnknownResponse(event));
276
270
  case 4400:
277
- return reject(new BadRequestCtor(event));
271
+ return reject(new _errors.BadRequest(event));
278
272
  case 4401:
279
- return reject(new NotAuthorizedCtor(event));
273
+ return reject(new _errors.NotAuthorized(event));
280
274
  case 4403:
281
- return reject(new ForbiddenCtor(event));
282
- // case 4404:
283
- // return reject(new NotFound(event));
275
+ return reject(new _errors.Forbidden(event));
284
276
  default:
285
- return reject(new ConnectionErrorCtor(event));
277
+ return reject(new _errors.ConnectionError(event));
286
278
  }
287
279
  };
288
280
  socket.onopen = function () {
289
- _this3.logger.info("socket,".concat(_this3._domain, ": connected"));
290
- _this3._authorize(_this3.token).then(function () {
291
- _this3.logger.info("socket,".concat(_this3._domain, ": authorized"));
281
+ _this3.logger.info("socket,".concat(_this3.domain, ": connected"));
282
+ _this3.authorize(_this3.token).then(function () {
283
+ _this3.logger.info("socket,".concat(_this3.domain, ": authorized"));
292
284
  socket.onclose = _this3.onclose;
293
285
  resolve();
294
286
  }).catch(reject);
295
287
  };
296
288
  socket.onerror = function (event) {
297
- _this3.logger.warn("socket,".concat(_this3._domain, ": error event fired"), event);
289
+ _this3.logger.warn("socket,".concat(_this3.domain, ": error event fired"), event);
298
290
  };
299
291
  sockets.set(_this3, socket);
300
- _this3.logger.info("socket,".concat(_this3._domain, ": waiting for server"));
292
+ _this3.logger.info("socket,".concat(_this3.domain, ": waiting for server"));
301
293
  });
302
294
  }
303
295
 
@@ -309,9 +301,9 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
309
301
  }, {
310
302
  key: "onclose",
311
303
  value: function onclose(event) {
312
- this.logger.info("socket,".concat(this._domain, ": closed"), event.code, event.reason);
313
- event = this._fixCloseCode(event);
314
- this._rejectPendingResponses(new ConnectionErrorCtor(event));
304
+ this.logger.info("socket,".concat(this.domain, ": closed"), event.code, event.reason);
305
+ event = this.fixCloseCode(event);
306
+ this.rejectPendingResponses(new _errors.ConnectionError(event));
315
307
  this.emit('close', event);
316
308
 
317
309
  // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure
@@ -334,18 +326,18 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
334
326
  data: data
335
327
  };
336
328
  if (data.type === 'async_event') {
337
- this._acknowledge(processedEvent).catch(function (error) {
338
- _this4.logger.warn("socket,".concat(_this4._domain, ": failed to acknowledge async event"), error);
329
+ this.acknowledge(processedEvent).catch(function (error) {
330
+ _this4.logger.warn("socket,".concat(_this4.domain, ": failed to acknowledge async event"), error);
339
331
  });
340
332
  }
341
333
 
342
334
  // Match pending request/response promises before emitting the public message event.
343
335
  // The message is still emitted afterward for any external listeners that care about it.
344
- this._handlePendingResponse(data);
336
+ this.handlePendingResponse(data);
345
337
  this.emit('message', processedEvent);
346
338
  } catch (error) {
347
339
  /* istanbul ignore next */
348
- this.logger.warn("socket,".concat(this._domain, ": error while receiving WebSocket message"), error);
340
+ this.logger.warn("socket,".concat(this.domain, ": error while receiving WebSocket message"), error);
349
341
  }
350
342
  }
351
343
 
@@ -397,7 +389,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
397
389
  return _promise.default.reject(new Error('`data` is required'));
398
390
  }
399
391
  var request = _objectSpread({}, data);
400
- var trackingId = request.trackingId || this._createTrackingId();
392
+ var trackingId = request.trackingId || this.createTrackingId();
401
393
  var timeout = options.timeout || this.wssResponseTimeout || 10000;
402
394
  var matchesResponse = options.matchesResponse || function (response) {
403
395
  return (response === null || response === void 0 ? void 0 : response.trackingId) === trackingId && (response === null || response === void 0 ? void 0 : response.type) === 'response_event';
@@ -409,43 +401,43 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
409
401
  return response === null || response === void 0 ? void 0 : response.statusMessage;
410
402
  };
411
403
  var createError = options.createError || function (response, statusCode, statusMessage) {
412
- return new ConnectionErrorCtor({
404
+ return new _errors.ConnectionError({
413
405
  code: statusCode,
414
406
  reason: statusMessage || (response === null || response === void 0 ? void 0 : response.reason) || 'Socket request failed'
415
407
  });
416
408
  };
417
409
  var createTimeoutError = options.createTimeoutError || function () {
418
- return new ConnectionErrorCtor({
410
+ return new _errors.ConnectionError({
419
411
  reason: 'Socket response not received before timeout'
420
412
  });
421
413
  };
422
- if (this._pendingResponses.has(trackingId)) {
414
+ if (this.pendingResponses.has(trackingId)) {
423
415
  return _promise.default.reject(new Error("socket request already pending for trackingId ".concat(trackingId)));
424
416
  }
425
417
  request.trackingId = trackingId;
426
418
  return new _promise.default(function (_resolve, _reject) {
427
419
  var timeoutId = (0, _commonTimers.safeSetTimeout)(function () {
428
- _this6._clearPendingResponse(trackingId);
420
+ _this6.clearPendingResponse(trackingId);
429
421
  _reject(createTimeoutError(request));
430
422
  }, timeout);
431
- _this6._pendingResponses.set(trackingId, {
423
+ _this6.pendingResponses.set(trackingId, {
432
424
  request: request,
433
425
  matchesResponse: matchesResponse,
434
426
  getStatusCode: getStatusCode,
435
427
  getStatusMessage: getStatusMessage,
436
428
  createError: createError,
437
429
  resolve: function resolve(response) {
438
- _this6._clearPendingResponse(trackingId);
430
+ _this6.clearPendingResponse(trackingId);
439
431
  _resolve(response);
440
432
  },
441
433
  reject: function reject(error) {
442
- _this6._clearPendingResponse(trackingId);
434
+ _this6.clearPendingResponse(trackingId);
443
435
  _reject(error);
444
436
  },
445
437
  timeoutId: timeoutId
446
438
  });
447
439
  _this6.send(request).catch(function (error) {
448
- _this6._clearPendingResponse(trackingId);
440
+ _this6.clearPendingResponse(trackingId);
449
441
  _reject(error);
450
442
  });
451
443
  });
@@ -457,8 +449,8 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
457
449
  * @returns {Promise}
458
450
  */
459
451
  }, {
460
- key: "_acknowledge",
461
- value: function _acknowledge(event) {
452
+ key: "acknowledge",
453
+ value: function acknowledge(event) {
462
454
  if (!event) {
463
455
  return _promise.default.reject(new Error('`event` is required'));
464
456
  }
@@ -472,7 +464,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
472
464
  }
473
465
  return this.send({
474
466
  type: _constants.MESSAGE_TYPES.EVENT_ACK,
475
- trackingId: event.data.trackingId || this._createTrackingId(),
467
+ trackingId: event.data.trackingId || this.createTrackingId(),
476
468
  eventId: event.data.eventId
477
469
  }).catch(function (error) {
478
470
  if (error.message === 'INVALID_STATE_ERROR') {
@@ -495,7 +487,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
495
487
  } else {
496
488
  refreshedToken = String(token);
497
489
  }
498
- return this._authorize(refreshedToken);
490
+ return this.authorize(refreshedToken);
499
491
  }
500
492
 
501
493
  /**
@@ -504,9 +496,9 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
504
496
  * @returns {Promise}
505
497
  */
506
498
  }, {
507
- key: "_authorize",
508
- value: function _authorize(token) {
509
- this.logger.info("socket,".concat(this._domain, ": authorizing"));
499
+ key: "authorize",
500
+ value: function authorize(token) {
501
+ this.logger.info("socket,".concat(this.domain, ": authorizing"));
510
502
  return this.sendRequest({
511
503
  type: _constants.MESSAGE_TYPES.AUTH,
512
504
  data: {
@@ -523,13 +515,13 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
523
515
  return response === null || response === void 0 ? void 0 : response.statusMessage;
524
516
  },
525
517
  createError: function createError(response, statusCode, statusMessage) {
526
- return new NotAuthorizedCtor({
518
+ return new _errors.NotAuthorized({
527
519
  code: statusCode,
528
520
  reason: statusMessage || 'Mobius auth failed'
529
521
  });
530
522
  },
531
523
  createTimeoutError: function createTimeoutError() {
532
- return new NotAuthorizedCtor({
524
+ return new _errors.NotAuthorized({
533
525
  reason: 'Mobius auth response not received before timeout'
534
526
  });
535
527
  }
@@ -542,8 +534,8 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
542
534
  * @returns {string}
543
535
  */
544
536
  }, {
545
- key: "_createTrackingId",
546
- value: function _createTrackingId() {
537
+ key: "createTrackingId",
538
+ value: function createTrackingId() {
547
539
  return "".concat(this.trackingId, "_").concat(crypto.randomUUID());
548
540
  }
549
541
 
@@ -553,13 +545,13 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
553
545
  * @returns {void}
554
546
  */
555
547
  }, {
556
- key: "_clearPendingResponse",
557
- value: function _clearPendingResponse(trackingId) {
558
- var pendingResponse = this._pendingResponses.get(trackingId);
548
+ key: "clearPendingResponse",
549
+ value: function clearPendingResponse(trackingId) {
550
+ var pendingResponse = this.pendingResponses.get(trackingId);
559
551
  if (pendingResponse !== null && pendingResponse !== void 0 && pendingResponse.timeoutId) {
560
552
  clearTimeout(pendingResponse.timeoutId);
561
553
  }
562
- this._pendingResponses.delete(trackingId);
554
+ this.pendingResponses.delete(trackingId);
563
555
  }
564
556
 
565
557
  /**
@@ -568,12 +560,12 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
568
560
  * @returns {void}
569
561
  */
570
562
  }, {
571
- key: "_rejectPendingResponses",
572
- value: function _rejectPendingResponses(error) {
573
- if (!this._pendingResponses.size) {
563
+ key: "rejectPendingResponses",
564
+ value: function rejectPendingResponses(error) {
565
+ if (!this.pendingResponses.size) {
574
566
  return;
575
567
  }
576
- (0, _from.default)(this._pendingResponses.values()).forEach(function (pendingResponse) {
568
+ (0, _from.default)(this.pendingResponses.values()).forEach(function (pendingResponse) {
577
569
  pendingResponse.reject(error);
578
570
  });
579
571
  }
@@ -584,15 +576,15 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
584
576
  * @returns {boolean}
585
577
  */
586
578
  }, {
587
- key: "_handlePendingResponse",
588
- value: function _handlePendingResponse(response) {
579
+ key: "handlePendingResponse",
580
+ value: function handlePendingResponse(response) {
589
581
  var _this7 = this;
590
582
  if (!response) {
591
583
  return false;
592
584
  }
593
585
 
594
586
  // Pending request correlation currently requires trackingId on the response.
595
- var pendingResponse = response.trackingId ? this._pendingResponses.get(response.trackingId) : undefined;
587
+ var pendingResponse = response.trackingId ? this.pendingResponses.get(response.trackingId) : undefined;
596
588
  if (!pendingResponse) {
597
589
  return false;
598
590
  }
@@ -604,10 +596,10 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
604
596
  if (statusCode === 440 && (response === null || response === void 0 ? void 0 : response.subtype) !== _constants.MESSAGE_TYPES.AUTH) {
605
597
  if (typeof this.refreshToken === 'function') {
606
598
  _promise.default.resolve(this.refreshToken(response)).catch(function (error) {
607
- _this7.logger.warn("socket,".concat(_this7._domain, ": failed token-expiry re-auth"), error);
599
+ _this7.logger.warn("socket,".concat(_this7.domain, ": failed token-expiry re-auth"), error);
608
600
  });
609
601
  } else {
610
- this.logger.warn("socket,".concat(this._domain, ": refreshToken callback is unavailable for statusCode 440"));
602
+ this.logger.warn("socket,".concat(this.domain, ": refreshToken callback is unavailable for statusCode 440"));
611
603
  }
612
604
  }
613
605
  if (statusCode === undefined) {
@@ -628,17 +620,17 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
628
620
  * @returns {CloseEvent}
629
621
  */
630
622
  }, {
631
- key: "_fixCloseCode",
632
- value: function _fixCloseCode(event) {
623
+ key: "fixCloseCode",
624
+ value: function fixCloseCode(event) {
633
625
  if (event.code === 1005 && event.reason) {
634
626
  switch (event.reason.toLowerCase()) {
635
627
  case 'replaced':
636
- this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
628
+ this.logger.info("socket,".concat(this.domain, ": fixing CloseEvent code for reason: "), event.reason);
637
629
  event.code = 4000;
638
630
  break;
639
631
  case 'authentication failed':
640
632
  case 'authentication did not happen within the timeout window of 30000 seconds.':
641
- this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
633
+ this.logger.info("socket,".concat(this.domain, ": fixing CloseEvent code for reason: "), event.reason);
642
634
  event.code = 1008;
643
635
  break;
644
636
  default:
@@ -1 +1 @@
1
- {"version":3,"names":["_events","require","_common","_commonTimers","_errors","_constants","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","sockets","_weakMap","UnknownResponseCtor","UnknownResponse","BadRequestCtor","BadRequest","NotAuthorizedCtor","NotAuthorized","ForbiddenCtor","Forbidden","ConnectionErrorCtor","ConnectionError","Socket","exports","_EventEmitter","_this","_classCallCheck2","_domain","_pendingResponses","_map","onmessage","bind","onclose","setMaxListeners","_inherits2","_createClass2","key","get","binaryType","bufferedAmount","extensions","protocol","readyState","url","value","close","options","_this2","_promise","resolve","reject","socket","logger","info","concat","SOCKET_READY_STATE","CLOSING","CLOSED","originalCode","code","originalReason","reason","resolvedOptions","_defaults2","Error","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","CONNECTING","closeEvent","open","_this3","URL","hostname","_unused","checkRequired","_keys","_defineProperty2","WebSocket","getWebSocketConstructor","_fixCloseCode","onopen","_authorize","token","then","catch","onerror","set","_rejectPendingResponses","emit","removeAllListeners","_this4","data","JSON","parse","processedEvent","type","_acknowledge","_handlePendingResponse","send","_this5","OPEN","_isObject2","_stringify","sendRequest","_this6","undefined","request","trackingId","_createTrackingId","timeout","wssResponseTimeout","matchesResponse","response","getStatusCode","statusCode","getStatusMessage","statusMessage","createError","createTimeoutError","has","timeoutId","_clearPendingResponse","_has2","MESSAGE_TYPES","EVENT_ACK","eventId","message","refresh","refreshedToken","toString","String","AUTH","subtype","crypto","randomUUID","pendingResponse","delete","size","_from","values","_this7","refreshToken","toLowerCase","EventEmitter"],"sources":["socket-base.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\n// @ts-expect-error `@webex/common` is still JS-only and does not ship declarations.\nimport {checkRequired} from '@webex/common';\n// @ts-expect-error `@webex/common-timers` is still JS-only and does not ship declarations.\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\n\nimport {\n BadRequest,\n ConnectionError,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n // NotFound\n} from '../errors';\nimport {MESSAGE_TYPES, SOCKET_READY_STATE} from './constants';\nimport type {\n SocketCloseEvent,\n SocketLogger,\n SocketMessageEvent,\n PendingResponseEntry,\n SendRequestOptions,\n SocketOpenOptions,\n SocketResponse,\n SocketTransport,\n SocketTransportConstructor,\n} from './types';\n\nconst sockets = new WeakMap<Socket, SocketTransport>();\nconst UnknownResponseCtor = UnknownResponse as unknown as new (\n event?: SocketCloseEvent\n) => UnknownResponse;\nconst BadRequestCtor = BadRequest as unknown as new (event?: SocketCloseEvent) => BadRequest;\nconst NotAuthorizedCtor = NotAuthorized as unknown as new (\n event?: SocketCloseEvent\n) => NotAuthorized;\nconst ForbiddenCtor = Forbidden as unknown as new (event?: SocketCloseEvent) => Forbidden;\nconst ConnectionErrorCtor = ConnectionError as unknown as new (\n event?: SocketCloseEvent\n) => ConnectionError;\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n _domain: string;\n\n _pendingResponses: Map<string, PendingResponseEntry>;\n\n forceCloseDelay!: number;\n\n logger!: SocketLogger;\n\n refreshToken?: (response: SocketResponse) => unknown;\n\n token!: string;\n\n trackingId!: string;\n\n wssResponseTimeout?: number;\n\n /**\n * constructor\n * @returns {Socket}\n */\n constructor() {\n super();\n this._domain = 'unknown-domain';\n this._pendingResponses = new Map();\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n // Increase max listeners to avoid memory leak warning in tests\n this.setMaxListeners(10);\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(): unknown {\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?: {reason?: string; code?: number}) {\n return new Promise<SocketCloseEvent | void>((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 (\n socket.readyState === SOCKET_READY_STATE.CLOSING ||\n socket.readyState === SOCKET_READY_STATE.CLOSED\n ) {\n this.logger.info(`socket,${this._domain}: already closed`);\n resolve();\n\n return;\n }\n\n const originalCode = options?.code;\n const originalReason = options?.reason;\n\n const resolvedOptions = defaults(options || {}, {\n code: 1000,\n reason: 'Done',\n }) as {code: number; reason: string};\n\n if (\n resolvedOptions.code &&\n resolvedOptions.code !== 1000 &&\n (resolvedOptions.code < 3000 || resolvedOptions.code > 4999)\n ) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\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 originalCode\n ? {code: originalCode, reason: originalReason || 'Done (unknown)'}\n : {\n code: 1000,\n reason: 'Done (forced)',\n }\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 // If socket is still connecting, manually trigger close handler with desired code\n // because calling close() on a CONNECTING socket may not preserve custom codes\n if (socket.readyState === SOCKET_READY_STATE.CONNECTING) {\n this.logger.info(\n `socket,${this._domain}: socket still connecting, triggering close manually`\n );\n clearTimeout(closeTimer);\n const closeEvent: SocketCloseEvent = {\n code: resolvedOptions.code,\n reason: resolvedOptions.reason,\n };\n this.onclose(closeEvent);\n resolve(closeEvent);\n try {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n } catch (error) {\n this.logger.info(\n `socket,${this._domain}: error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes`,\n error\n );\n }\n } else {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n }\n });\n }\n\n /**\n * Opens a WebSocket\n * @param {string} url\n * @param {options} options\n * @param {number} options.forceCloseDelay (required)\n * @param {string} options.token (required)\n * @param {string} options.trackingId (required)\n * @param {Logger} options.logger (required)\n * @returns {Promise}\n */\n open(url: string, options?: SocketOpenOptions) {\n try {\n this._domain = new URL(url).hostname;\n } catch {\n this._domain = url;\n }\n\n return new Promise<void>((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 const resolvedOptions = (options || {}) as SocketOpenOptions;\n\n checkRequired(['forceCloseDelay', 'token', 'trackingId', 'logger'], resolvedOptions);\n\n Object.keys(resolvedOptions).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: resolvedOptions[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor() as SocketTransportConstructor;\n\n this.logger.info(`socket,${this._domain}: creating WebSocket`);\n const socket = new WebSocket(url, [], resolvedOptions);\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 UnknownResponseCtor(event));\n case 4400:\n return reject(new BadRequestCtor(event));\n case 4401:\n return reject(new NotAuthorizedCtor(event));\n case 4403:\n return reject(new ForbiddenCtor(event));\n // case 4404:\n // return reject(new NotFound(event));\n default:\n return reject(new ConnectionErrorCtor(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info(`socket,${this._domain}: connected`);\n this._authorize(this.token)\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: SocketCloseEvent) {\n this.logger.info(`socket,${this._domain}: closed`, event.code, event.reason);\n\n event = this._fixCloseCode(event);\n this._rejectPendingResponses(new ConnectionErrorCtor(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: SocketMessageEvent<string>) {\n try {\n const data = JSON.parse(event.data) as SocketResponse;\n const processedEvent = {data};\n\n if (data.type === 'async_event') {\n this._acknowledge(processedEvent).catch((error) => {\n this.logger.warn(`socket,${this._domain}: failed to acknowledge async event`, error);\n });\n }\n\n // Match pending request/response promises before emitting the public message event.\n // The message is still emitted afterward for any external listeners that care about it.\n this._handlePendingResponse(data);\n this.emit('message', processedEvent);\n } catch (error) {\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: string | Record<string, unknown>) {\n return new Promise<void>((resolve, reject) => {\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n if (!socket) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n socket.send(data);\n\n resolve();\n });\n }\n\n /**\n * Sends a request and resolves when the matching response arrives.\n * @param {Object} data\n * @param {Object} [options={}]\n * @param {Function} [options.matchesResponse]\n * @param {Function} [options.createError]\n * @param {Function} [options.createTimeoutError]\n * @param {Function} [options.getStatusCode]\n * @param {Function} [options.getStatusMessage]\n * @param {number} [options.timeout]\n * @returns {Promise<Object>}\n */\n sendRequest(data: SocketResponse, options: SendRequestOptions = {}) {\n if (!isObject(data)) {\n return Promise.reject(new Error('`data` is required'));\n }\n\n const request = {...data};\n const trackingId = request.trackingId || this._createTrackingId();\n const timeout = options.timeout || this.wssResponseTimeout || 10000;\n const matchesResponse =\n options.matchesResponse ||\n ((response) => response?.trackingId === trackingId && response?.type === 'response_event');\n const getStatusCode = options.getStatusCode || ((response) => response?.statusCode);\n const getStatusMessage = options.getStatusMessage || ((response) => response?.statusMessage);\n const createError =\n options.createError ||\n ((response, statusCode, statusMessage) =>\n new ConnectionErrorCtor({\n code: statusCode,\n reason: statusMessage || response?.reason || 'Socket request failed',\n }));\n const createTimeoutError =\n options.createTimeoutError ||\n (() =>\n new ConnectionErrorCtor({\n reason: 'Socket response not received before timeout',\n }));\n\n if (this._pendingResponses.has(trackingId)) {\n return Promise.reject(\n new Error(`socket request already pending for trackingId ${trackingId}`)\n );\n }\n\n request.trackingId = trackingId;\n\n return new Promise<SocketResponse>((resolve, reject) => {\n const timeoutId = safeSetTimeout(() => {\n this._clearPendingResponse(trackingId);\n reject(createTimeoutError(request));\n }, timeout);\n\n this._pendingResponses.set(trackingId, {\n request,\n matchesResponse,\n getStatusCode,\n getStatusMessage,\n createError,\n resolve: (response) => {\n this._clearPendingResponse(trackingId);\n resolve(response);\n },\n reject: (error) => {\n this._clearPendingResponse(trackingId);\n reject(error);\n },\n timeoutId,\n });\n\n this.send(request).catch((error) => {\n this._clearPendingResponse(trackingId);\n reject(error);\n });\n });\n }\n\n /**\n * Sends an acknowledgment for a specific event\n * @param {MessageEvent} event\n * @returns {Promise}\n */\n _acknowledge(event: SocketMessageEvent<SocketResponse>) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.eventId')) {\n return Promise.reject(new Error('`event.data.eventId` is required'));\n }\n\n // Don't try to acknowledge if socket is not in open state\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n return Promise.resolve();\n }\n\n return this.send({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: event.data.trackingId || this._createTrackingId(),\n eventId: event.data.eventId,\n }).catch((error) => {\n if (error.message === 'INVALID_STATE_ERROR') {\n return Promise.resolve();\n }\n throw error;\n });\n }\n\n refresh(token: string | {toString(): string}) {\n if (!token) {\n return Promise.reject(new Error('`token` is required for Socket#refresh()'));\n }\n\n let refreshedToken;\n\n if (typeof token === 'string') {\n refreshedToken = token;\n } else if (token && typeof token.toString === 'function') {\n refreshedToken = token.toString();\n } else {\n refreshedToken = String(token);\n }\n\n return this._authorize(refreshedToken);\n }\n\n /**\n * Sends an auth message up the socket with a refreshed token.\n * @param {string} token\n * @returns {Promise}\n */\n _authorize(token: string) {\n this.logger.info(`socket,${this._domain}: authorizing`);\n\n return this.sendRequest(\n {\n type: MESSAGE_TYPES.AUTH,\n data: {\n token,\n },\n },\n {\n matchesResponse: (response, request) =>\n response?.type === 'response_event' &&\n response?.subtype === MESSAGE_TYPES.AUTH &&\n response?.trackingId === request.trackingId,\n getStatusCode: (response) => response?.statusCode,\n getStatusMessage: (response) => response?.statusMessage,\n createError: (response, statusCode, statusMessage) =>\n new NotAuthorizedCtor({\n code: statusCode,\n reason: statusMessage || 'Mobius auth failed',\n }),\n createTimeoutError: () =>\n new NotAuthorizedCtor({\n reason: 'Mobius auth response not received before timeout',\n }),\n }\n );\n }\n\n /**\n * Creates a unique tracking ID\n * @private\n * @returns {string}\n */\n _createTrackingId() {\n return `${this.trackingId}_${crypto.randomUUID()}`;\n }\n\n /**\n * Clears a pending response entry.\n * @param {string} trackingId\n * @returns {void}\n */\n _clearPendingResponse(trackingId: string) {\n const pendingResponse = this._pendingResponses.get(trackingId);\n\n if (pendingResponse?.timeoutId) {\n clearTimeout(pendingResponse.timeoutId);\n }\n\n this._pendingResponses.delete(trackingId);\n }\n\n /**\n * Rejects all pending responses with the provided error.\n * @param {Error} error\n * @returns {void}\n */\n _rejectPendingResponses(error: unknown) {\n if (!this._pendingResponses.size) {\n return;\n }\n\n Array.from(this._pendingResponses.values()).forEach((pendingResponse) => {\n pendingResponse.reject(error);\n });\n }\n\n /**\n * Handles incoming responses for pending requests.\n * @param {Object} response\n * @returns {boolean}\n */\n _handlePendingResponse(response: SocketResponse) {\n if (!response) {\n return false;\n }\n\n // Pending request correlation currently requires trackingId on the response.\n const pendingResponse = response.trackingId\n ? this._pendingResponses.get(response.trackingId)\n : undefined;\n\n if (!pendingResponse) {\n return false;\n }\n\n if (!pendingResponse.matchesResponse(response, pendingResponse.request)) {\n return false;\n }\n\n const statusCode = pendingResponse.getStatusCode(response);\n const statusMessage = pendingResponse.getStatusMessage(response);\n\n if (statusCode === 440 && response?.subtype !== MESSAGE_TYPES.AUTH) {\n if (typeof this.refreshToken === 'function') {\n Promise.resolve(this.refreshToken(response)).catch((error) => {\n this.logger.warn(`socket,${this._domain}: failed token-expiry re-auth`, error);\n });\n } else {\n this.logger.warn(\n `socket,${this._domain}: refreshToken callback is unavailable for statusCode 440`\n );\n }\n }\n\n if (statusCode === undefined) {\n pendingResponse.reject(\n pendingResponse.createError(\n response,\n statusCode,\n statusMessage || 'Socket response missing status code'\n )\n );\n } else if (statusCode >= 200 && statusCode < 300) {\n pendingResponse.resolve(response);\n } else {\n pendingResponse.reject(pendingResponse.createError(response, statusCode, statusMessage));\n }\n\n return true;\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: SocketCloseEvent) {\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"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_events","require","_common","_commonTimers","_errors","_constants","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","sockets","_weakMap","Socket","exports","_EventEmitter","_this","_classCallCheck2","domain","pendingResponses","_map","onmessage","bind","onclose","setMaxListeners","_inherits2","_createClass2","key","get","binaryType","bufferedAmount","extensions","protocol","readyState","url","value","close","options","_this2","_promise","resolve","reject","socket","logger","info","concat","SOCKET_READY_STATE","CLOSING","CLOSED","originalCode","code","originalReason","reason","resolvedOptions","_defaults2","Error","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","CONNECTING","closeEvent","open","_this3","URL","hostname","_unused","checkRequired","_keys","_defineProperty2","WebSocket","getWebSocketConstructor","fixCloseCode","UnknownResponse","BadRequest","NotAuthorized","Forbidden","ConnectionError","onopen","authorize","token","then","catch","onerror","set","rejectPendingResponses","emit","removeAllListeners","_this4","data","JSON","parse","processedEvent","type","acknowledge","handlePendingResponse","send","_this5","OPEN","_isObject2","_stringify","sendRequest","_this6","undefined","request","trackingId","createTrackingId","timeout","wssResponseTimeout","matchesResponse","response","getStatusCode","statusCode","getStatusMessage","statusMessage","createError","createTimeoutError","has","timeoutId","clearPendingResponse","_has2","MESSAGE_TYPES","EVENT_ACK","eventId","message","refresh","refreshedToken","toString","String","AUTH","subtype","crypto","randomUUID","pendingResponse","delete","size","_from","values","_this7","refreshToken","toLowerCase","EventEmitter"],"sources":["socket-base.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\n// @ts-expect-error `@webex/common` is still JS-only and does not ship declarations.\nimport {checkRequired} from '@webex/common';\n// @ts-expect-error `@webex/common-timers` is still JS-only and does not ship declarations.\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\n\nimport {BadRequest, ConnectionError, Forbidden, NotAuthorized, UnknownResponse} from '../errors';\nimport {MESSAGE_TYPES, SOCKET_READY_STATE} from './constants';\nimport type {\n SocketCloseEvent,\n SocketLogger,\n SocketMessageEvent,\n PendingResponseEntry,\n SendRequestOptions,\n SocketOpenOptions,\n SocketResponse,\n SocketTransport,\n SocketTransportConstructor,\n} from './types';\n\nconst sockets = new WeakMap<Socket, SocketTransport>();\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n private domain: string;\n\n private pendingResponses: Map<string, PendingResponseEntry>;\n\n forceCloseDelay!: number;\n\n logger!: SocketLogger;\n\n refreshToken?: (response: SocketResponse) => unknown;\n\n token!: string;\n\n trackingId!: string;\n\n wssResponseTimeout?: number;\n\n /**\n * constructor\n * @returns {Socket}\n */\n public constructor() {\n super();\n this.domain = 'unknown-domain';\n this.pendingResponses = new Map();\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n this.setMaxListeners(10);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n public 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 public 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 public 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 public 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 public 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 public 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 public static getWebSocketConstructor(): unknown {\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 public close(options?: {reason?: string; code?: number}) {\n return new Promise<SocketCloseEvent | void>((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 (\n socket.readyState === SOCKET_READY_STATE.CLOSING ||\n socket.readyState === SOCKET_READY_STATE.CLOSED\n ) {\n this.logger.info(`socket,${this.domain}: already closed`);\n resolve();\n\n return;\n }\n\n const originalCode = options?.code;\n const originalReason = options?.reason;\n\n const resolvedOptions = defaults(options || {}, {\n code: 1000,\n reason: 'Done',\n }) as {code: number; reason: string};\n\n if (\n resolvedOptions.code &&\n resolvedOptions.code !== 1000 &&\n (resolvedOptions.code < 3000 || resolvedOptions.code > 4999)\n ) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\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 originalCode\n ? {code: originalCode, reason: originalReason || 'Done (unknown)'}\n : {\n code: 1000,\n reason: 'Done (forced)',\n }\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 // If socket is still connecting, manually trigger close handler with desired code\n // because calling close() on a CONNECTING socket may not preserve custom codes\n if (socket.readyState === SOCKET_READY_STATE.CONNECTING) {\n this.logger.info(\n `socket,${this.domain}: socket still connecting, triggering close manually`\n );\n clearTimeout(closeTimer);\n const closeEvent: SocketCloseEvent = {\n code: resolvedOptions.code,\n reason: resolvedOptions.reason,\n };\n this.onclose(closeEvent);\n resolve(closeEvent);\n try {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n } catch (error) {\n this.logger.info(\n `socket,${this.domain}: error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes`,\n error\n );\n }\n } else {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n }\n });\n }\n\n /**\n * Opens a WebSocket\n * @param {string} url\n * @param {options} options\n * @param {number} options.forceCloseDelay (required)\n * @param {string} options.token (required)\n * @param {string} options.trackingId (required)\n * @param {Logger} options.logger (required)\n * @returns {Promise}\n */\n public open(url: string, options?: SocketOpenOptions) {\n try {\n this.domain = new URL(url).hostname;\n } catch {\n this.domain = url;\n }\n\n return new Promise<void>((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 const resolvedOptions = (options || {}) as SocketOpenOptions;\n\n checkRequired(['forceCloseDelay', 'token', 'trackingId', 'logger'], resolvedOptions);\n\n Object.keys(resolvedOptions).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: resolvedOptions[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor() as SocketTransportConstructor;\n\n this.logger.info(`socket,${this.domain}: creating WebSocket`);\n const socket = new WebSocket(url, [], resolvedOptions);\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 default:\n return reject(new ConnectionError(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info(`socket,${this.domain}: connected`);\n this.authorize(this.token)\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 public onclose(event: SocketCloseEvent) {\n this.logger.info(`socket,${this.domain}: closed`, event.code, event.reason);\n\n event = this.fixCloseCode(event);\n this.rejectPendingResponses(new ConnectionError(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 public onmessage(event: SocketMessageEvent<string>) {\n try {\n const data = JSON.parse(event.data) as SocketResponse;\n const processedEvent = {data};\n\n if (data.type === 'async_event') {\n this.acknowledge(processedEvent).catch((error) => {\n this.logger.warn(`socket,${this.domain}: failed to acknowledge async event`, error);\n });\n }\n\n // Match pending request/response promises before emitting the public message event.\n // The message is still emitted afterward for any external listeners that care about it.\n this.handlePendingResponse(data);\n this.emit('message', processedEvent);\n } catch (error) {\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 public send(data: string | Record<string, unknown>) {\n return new Promise<void>((resolve, reject) => {\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n if (!socket) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n socket.send(data);\n\n resolve();\n });\n }\n\n /**\n * Sends a request and resolves when the matching response arrives.\n * @param {Object} data\n * @param {Object} [options={}]\n * @param {Function} [options.matchesResponse]\n * @param {Function} [options.createError]\n * @param {Function} [options.createTimeoutError]\n * @param {Function} [options.getStatusCode]\n * @param {Function} [options.getStatusMessage]\n * @param {number} [options.timeout]\n * @returns {Promise<Object>}\n */\n public sendRequest(data: SocketResponse, options: SendRequestOptions = {}) {\n if (!isObject(data)) {\n return Promise.reject(new Error('`data` is required'));\n }\n\n const request = {...data};\n const trackingId = request.trackingId || this.createTrackingId();\n const timeout = options.timeout || this.wssResponseTimeout || 10000;\n const matchesResponse =\n options.matchesResponse ||\n ((response) => response?.trackingId === trackingId && response?.type === 'response_event');\n const getStatusCode = options.getStatusCode || ((response) => response?.statusCode);\n const getStatusMessage = options.getStatusMessage || ((response) => response?.statusMessage);\n const createError =\n options.createError ||\n ((response, statusCode, statusMessage) =>\n new ConnectionError({\n code: statusCode,\n reason: statusMessage || response?.reason || 'Socket request failed',\n }));\n const createTimeoutError =\n options.createTimeoutError ||\n (() =>\n new ConnectionError({\n reason: 'Socket response not received before timeout',\n }));\n\n if (this.pendingResponses.has(trackingId)) {\n return Promise.reject(\n new Error(`socket request already pending for trackingId ${trackingId}`)\n );\n }\n\n request.trackingId = trackingId;\n\n return new Promise<SocketResponse>((resolve, reject) => {\n const timeoutId = safeSetTimeout(() => {\n this.clearPendingResponse(trackingId);\n reject(createTimeoutError(request));\n }, timeout);\n\n this.pendingResponses.set(trackingId, {\n request,\n matchesResponse,\n getStatusCode,\n getStatusMessage,\n createError,\n resolve: (response) => {\n this.clearPendingResponse(trackingId);\n resolve(response);\n },\n reject: (error) => {\n this.clearPendingResponse(trackingId);\n reject(error);\n },\n timeoutId,\n });\n\n this.send(request).catch((error) => {\n this.clearPendingResponse(trackingId);\n reject(error);\n });\n });\n }\n\n /**\n * Sends an acknowledgment for a specific event\n * @param {MessageEvent} event\n * @returns {Promise}\n */\n private acknowledge(event: SocketMessageEvent<SocketResponse>) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.eventId')) {\n return Promise.reject(new Error('`event.data.eventId` is required'));\n }\n\n // Don't try to acknowledge if socket is not in open state\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n return Promise.resolve();\n }\n\n return this.send({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: event.data.trackingId || this.createTrackingId(),\n eventId: event.data.eventId,\n }).catch((error) => {\n if (error.message === 'INVALID_STATE_ERROR') {\n return Promise.resolve();\n }\n throw error;\n });\n }\n\n public refresh(token: string | {toString(): string}) {\n if (!token) {\n return Promise.reject(new Error('`token` is required for Socket#refresh()'));\n }\n\n let refreshedToken;\n\n if (typeof token === 'string') {\n refreshedToken = token;\n } else if (token && typeof token.toString === 'function') {\n refreshedToken = token.toString();\n } else {\n refreshedToken = String(token);\n }\n\n return this.authorize(refreshedToken);\n }\n\n /**\n * Sends an auth message up the socket with a refreshed token.\n * @param {string} token\n * @returns {Promise}\n */\n private authorize(token: string) {\n this.logger.info(`socket,${this.domain}: authorizing`);\n\n return this.sendRequest(\n {\n type: MESSAGE_TYPES.AUTH,\n data: {\n token,\n },\n },\n {\n matchesResponse: (response, request) =>\n response?.type === 'response_event' &&\n response?.subtype === MESSAGE_TYPES.AUTH &&\n response?.trackingId === request.trackingId,\n getStatusCode: (response) => response?.statusCode,\n getStatusMessage: (response) => response?.statusMessage,\n createError: (response, statusCode, statusMessage) =>\n new NotAuthorized({\n code: statusCode,\n reason: statusMessage || 'Mobius auth failed',\n }),\n createTimeoutError: () =>\n new NotAuthorized({\n reason: 'Mobius auth response not received before timeout',\n }),\n }\n );\n }\n\n /**\n * Creates a unique tracking ID\n * @private\n * @returns {string}\n */\n private createTrackingId() {\n return `${this.trackingId}_${crypto.randomUUID()}`;\n }\n\n /**\n * Clears a pending response entry.\n * @param {string} trackingId\n * @returns {void}\n */\n private clearPendingResponse(trackingId: string) {\n const pendingResponse = this.pendingResponses.get(trackingId);\n\n if (pendingResponse?.timeoutId) {\n clearTimeout(pendingResponse.timeoutId);\n }\n\n this.pendingResponses.delete(trackingId);\n }\n\n /**\n * Rejects all pending responses with the provided error.\n * @param {Error} error\n * @returns {void}\n */\n private rejectPendingResponses(error: unknown) {\n if (!this.pendingResponses.size) {\n return;\n }\n\n Array.from(this.pendingResponses.values()).forEach((pendingResponse) => {\n pendingResponse.reject(error);\n });\n }\n\n /**\n * Handles incoming responses for pending requests.\n * @param {Object} response\n * @returns {boolean}\n */\n private handlePendingResponse(response: SocketResponse) {\n if (!response) {\n return false;\n }\n\n // Pending request correlation currently requires trackingId on the response.\n const pendingResponse = response.trackingId\n ? this.pendingResponses.get(response.trackingId)\n : undefined;\n\n if (!pendingResponse) {\n return false;\n }\n\n if (!pendingResponse.matchesResponse(response, pendingResponse.request)) {\n return false;\n }\n\n const statusCode = pendingResponse.getStatusCode(response);\n const statusMessage = pendingResponse.getStatusMessage(response);\n\n if (statusCode === 440 && response?.subtype !== MESSAGE_TYPES.AUTH) {\n if (typeof this.refreshToken === 'function') {\n Promise.resolve(this.refreshToken(response)).catch((error) => {\n this.logger.warn(`socket,${this.domain}: failed token-expiry re-auth`, error);\n });\n } else {\n this.logger.warn(\n `socket,${this.domain}: refreshToken callback is unavailable for statusCode 440`\n );\n }\n }\n\n if (statusCode === undefined) {\n pendingResponse.reject(\n pendingResponse.createError(\n response,\n statusCode,\n statusMessage || 'Socket response missing status code'\n )\n );\n } else if (statusCode >= 200 && statusCode < 300) {\n pendingResponse.resolve(response);\n } else {\n pendingResponse.reject(pendingResponse.createError(response, statusCode, statusMessage));\n }\n\n return true;\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 private fixCloseCode(event: SocketCloseEvent) {\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"],"mappings":"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","ignoreList":[]}