@webex/calling 3.12.0-mobius-socket.18 → 3.12.0-mobius-socket.20

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/mobius-socket/config.js +7 -44
  7. package/dist/mobius-socket/config.js.map +1 -1
  8. package/dist/mobius-socket/errors.js +71 -26
  9. package/dist/mobius-socket/errors.js.map +1 -1
  10. package/dist/mobius-socket/index.js +4 -54
  11. package/dist/mobius-socket/index.js.map +1 -1
  12. package/dist/mobius-socket/mobius-socket-events.test.js +20 -48
  13. package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -1
  14. package/dist/mobius-socket/mobius-socket.js +359 -748
  15. package/dist/mobius-socket/mobius-socket.js.map +1 -1
  16. package/dist/mobius-socket/mobius-socket.test.js +452 -728
  17. package/dist/mobius-socket/mobius-socket.test.js.map +1 -1
  18. package/dist/mobius-socket/socket/constants.js +14 -0
  19. package/dist/mobius-socket/socket/constants.js.map +1 -1
  20. package/dist/mobius-socket/socket/socket-base.js +152 -205
  21. package/dist/mobius-socket/socket/socket-base.js.map +1 -1
  22. package/dist/mobius-socket/socket/types.js.map +1 -1
  23. package/dist/mobius-socket/socket.test.js +38 -63
  24. package/dist/mobius-socket/socket.test.js.map +1 -1
  25. package/dist/mobius-socket/types.js.map +1 -1
  26. package/dist/module/CallingClient/utils/request.js +3 -2
  27. package/dist/module/mobius-socket/config.js +7 -10
  28. package/dist/module/mobius-socket/errors.js +34 -0
  29. package/dist/module/mobius-socket/index.js +0 -3
  30. package/dist/module/mobius-socket/mobius-socket.js +237 -426
  31. package/dist/module/mobius-socket/socket/socket-base.js +79 -116
  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/mobius-socket/config.d.ts +7 -8
  36. package/dist/types/mobius-socket/config.d.ts.map +1 -1
  37. package/dist/types/mobius-socket/errors.d.ts +11 -1
  38. package/dist/types/mobius-socket/errors.d.ts.map +1 -1
  39. package/dist/types/mobius-socket/index.d.ts +1 -5
  40. package/dist/types/mobius-socket/index.d.ts.map +1 -1
  41. package/dist/types/mobius-socket/mobius-socket.d.ts +33 -35
  42. package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -1
  43. package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -1
  44. package/dist/types/mobius-socket/socket/socket-base.d.ts +9 -10
  45. package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -1
  46. package/dist/types/mobius-socket/socket/types.d.ts +0 -8
  47. package/dist/types/mobius-socket/socket/types.d.ts.map +1 -1
  48. package/dist/types/mobius-socket/types.d.ts.map +1 -1
  49. package/package.json +1 -1
@@ -7,6 +7,10 @@ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/o
7
7
  var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
8
8
  var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
9
9
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
10
+ var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
11
+ var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
12
+ var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
13
+ var _Array$isArray = require("@babel/runtime-corejs2/core-js/array/is-array");
10
14
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
11
15
  _Object$defineProperty(exports, "__esModule", {
12
16
  value: true
@@ -18,7 +22,6 @@ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/pr
18
22
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
19
23
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/define-property"));
20
24
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
21
- var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from"));
22
25
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
23
26
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
24
27
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
@@ -33,124 +36,128 @@ var _common = require("@webex/common");
33
36
  var _commonTimers = require("@webex/common-timers");
34
37
  var _errors = require("../errors");
35
38
  var _constants = require("./constants");
39
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
40
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
41
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
36
42
  function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
37
43
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty3.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
38
44
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
39
45
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /*!
40
46
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
41
- */ // @ts-expect-error `@webex/common` is still JS-only and does not ship declarations.
42
- // @ts-expect-error `@webex/common-timers` is still JS-only and does not ship declarations.
47
+ */ // @ts-ignore - type not available
48
+ // @ts-ignore - type not available
43
49
  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;
50
+ function createTrackingId() {
51
+ return "webex-js-sdk_".concat(crypto.randomUUID());
52
+ }
49
53
 
50
54
  /**
51
55
  * Generalized socket abstraction
52
56
  */
53
57
  var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
54
58
  /**
55
- * constructor
56
- * @returns {Socket}
59
+ * Creates a new Socket instance.
57
60
  */
58
61
  function Socket() {
59
62
  var _this;
60
63
  (0, _classCallCheck2.default)(this, Socket);
61
64
  _this = _callSuper(this, Socket);
62
- (0, _defineProperty3.default)(_this, "_domain", void 0);
63
- (0, _defineProperty3.default)(_this, "_pendingResponses", void 0);
65
+ (0, _defineProperty3.default)(_this, "domain", void 0);
66
+ (0, _defineProperty3.default)(_this, "pendingResponses", void 0);
64
67
  (0, _defineProperty3.default)(_this, "forceCloseDelay", void 0);
65
68
  (0, _defineProperty3.default)(_this, "logger", void 0);
66
69
  (0, _defineProperty3.default)(_this, "refreshToken", void 0);
67
70
  (0, _defineProperty3.default)(_this, "token", void 0);
68
71
  (0, _defineProperty3.default)(_this, "trackingId", void 0);
69
72
  (0, _defineProperty3.default)(_this, "wssResponseTimeout", void 0);
70
- _this._domain = 'unknown-domain';
71
- _this._pendingResponses = new _map.default();
73
+ _this.domain = 'unknown-domain';
74
+ _this.pendingResponses = new _map.default();
72
75
  _this.onmessage = _this.onmessage.bind(_this);
73
76
  _this.onclose = _this.onclose.bind(_this);
74
- // Increase max listeners to avoid memory leak warning in tests
75
77
  _this.setMaxListeners(10);
76
78
  return _this;
77
79
  }
78
80
 
81
+ // TODO: Circle back and check if we are using binaryType and related getters. If not, we can remove these.
79
82
  /**
83
+ * Gets the binary type of the WebSocket connection.
80
84
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
81
- * @returns {string}
82
85
  */
83
86
  (0, _inherits2.default)(Socket, _EventEmitter);
84
87
  return (0, _createClass2.default)(Socket, [{
85
88
  key: "binaryType",
86
89
  get: function get() {
87
- return sockets.get(this).binaryType;
90
+ var _sockets$get;
91
+ return ((_sockets$get = sockets.get(this)) === null || _sockets$get === void 0 ? void 0 : _sockets$get.binaryType) || '';
88
92
  }
89
93
 
90
94
  /**
95
+ * Gets the number of bytes of data that have been queued but not yet transmitted.
91
96
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
92
- * @returns {number}
93
97
  */
94
98
  }, {
95
99
  key: "bufferedAmount",
96
100
  get: function get() {
97
- return sockets.get(this).bufferedAmount;
101
+ var _sockets$get2;
102
+ return ((_sockets$get2 = sockets.get(this)) === null || _sockets$get2 === void 0 ? void 0 : _sockets$get2.bufferedAmount) || 0;
98
103
  }
99
104
 
100
105
  /**
106
+ * Gets the extensions selected by the server.
101
107
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
102
- * @returns {string}
103
108
  */
104
109
  }, {
105
110
  key: "extensions",
106
111
  get: function get() {
107
- return sockets.get(this).extensions;
112
+ var _sockets$get3;
113
+ return ((_sockets$get3 = sockets.get(this)) === null || _sockets$get3 === void 0 ? void 0 : _sockets$get3.extensions) || '';
108
114
  }
109
115
 
110
116
  /**
117
+ * Gets the sub-protocol selected by the server.
111
118
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
112
- * @returns {string}
113
119
  */
114
120
  }, {
115
121
  key: "protocol",
116
122
  get: function get() {
117
- return sockets.get(this).protocol;
123
+ var _sockets$get4;
124
+ return ((_sockets$get4 = sockets.get(this)) === null || _sockets$get4 === void 0 ? void 0 : _sockets$get4.protocol) || '';
118
125
  }
119
126
 
120
127
  /**
128
+ * Gets the current state of the WebSocket connection.
121
129
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
122
- * @returns {number}
123
130
  */
124
131
  }, {
125
132
  key: "readyState",
126
133
  get: function get() {
127
- return sockets.get(this).readyState;
134
+ var _sockets$get5;
135
+ return ((_sockets$get5 = sockets.get(this)) === null || _sockets$get5 === void 0 ? void 0 : _sockets$get5.readyState) || 0;
128
136
  }
129
137
 
130
138
  /**
139
+ * Gets the URL of the WebSocket connection.
131
140
  * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
132
- * @returns {string}
133
141
  */
134
142
  }, {
135
143
  key: "url",
136
144
  get: function get() {
137
- return sockets.get(this).url;
145
+ var _sockets$get6;
146
+ return ((_sockets$get6 = sockets.get(this)) === null || _sockets$get6 === void 0 ? void 0 : _sockets$get6.url) || '';
138
147
  }
139
148
 
140
149
  /**
141
- * Provides the environmentally appropriate constructor (ws in NodeJS,
142
- * WebSocket in browsers)
143
- * @returns {WebSocket}
150
+ * Provides the environmentally appropriate WebSocket constructor.
151
+ *
152
+ * @returns The WebSocket constructor (ws in NodeJS, WebSocket in browsers)
144
153
  */
145
154
  }, {
146
155
  key: "close",
147
156
  value:
148
157
  /**
149
- * Closes the socket
150
- * @param {Object} options
151
- * @param {string} options.reason
152
- * @param {number} options.code
153
- * @returns {Promise}
158
+ * Closes the socket.
159
+ * @param options - Close options containing code and reason
160
+ * @returns Promise that resolves when the socket is closed
154
161
  */
155
162
  function close(options) {
156
163
  var _this2 = this;
@@ -162,9 +169,9 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
162
169
  return;
163
170
  }
164
171
  // logger is defined once open is called
165
- _this2.logger.info("socket,".concat(_this2._domain, ": closing"));
172
+ _this2.logger.info("socket,".concat(_this2.domain, ": closing"));
166
173
  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"));
174
+ _this2.logger.info("socket,".concat(_this2.domain, ": already closed"));
168
175
  resolve();
169
176
  return;
170
177
  }
@@ -180,7 +187,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
180
187
  }
181
188
  var closeTimer = (0, _commonTimers.safeSetTimeout)(function () {
182
189
  try {
183
- _this2.logger.info("socket,".concat(_this2._domain, ": no close event received, forcing closure"));
190
+ _this2.logger.info("socket,".concat(_this2.domain, ": no close event received, forcing closure"));
184
191
  resolve(_this2.onclose(originalCode ? {
185
192
  code: originalCode,
186
193
  reason: originalReason || 'Done (unknown)'
@@ -189,11 +196,11 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
189
196
  reason: 'Done (forced)'
190
197
  }));
191
198
  } catch (error) {
192
- _this2.logger.warn("socket,".concat(_this2._domain, ": force-close failed"), error);
199
+ _this2.logger.warn("socket,".concat(_this2.domain, ": force-close failed"), error);
193
200
  }
194
201
  }, _this2.forceCloseDelay);
195
202
  socket.onclose = function (event) {
196
- _this2.logger.info("socket,".concat(_this2._domain, ": close event fired"), event.code, event.reason);
203
+ _this2.logger.info("socket,".concat(_this2.domain, ": close event fired"), event.code, event.reason);
197
204
  clearTimeout(closeTimer);
198
205
  _this2.onclose(event);
199
206
  resolve(event);
@@ -202,7 +209,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
202
209
  // If socket is still connecting, manually trigger close handler with desired code
203
210
  // because calling close() on a CONNECTING socket may not preserve custom codes
204
211
  if (socket.readyState === _constants.SOCKET_READY_STATE.CONNECTING) {
205
- _this2.logger.info("socket,".concat(_this2._domain, ": socket still connecting, triggering close manually"));
212
+ _this2.logger.info("socket,".concat(_this2.domain, ": socket still connecting, triggering close manually"));
206
213
  clearTimeout(closeTimer);
207
214
  var closeEvent = {
208
215
  code: resolvedOptions.code,
@@ -213,7 +220,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
213
220
  try {
214
221
  socket.close(resolvedOptions.code, resolvedOptions.reason);
215
222
  } 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);
223
+ _this2.logger.info("socket,".concat(_this2.domain, ": error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes"), error);
217
224
  }
218
225
  } else {
219
226
  socket.close(resolvedOptions.code, resolvedOptions.reason);
@@ -222,23 +229,20 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
222
229
  }
223
230
 
224
231
  /**
225
- * Opens a WebSocket
226
- * @param {string} url
227
- * @param {options} options
228
- * @param {number} options.forceCloseDelay (required)
229
- * @param {string} options.token (required)
230
- * @param {string} options.trackingId (required)
231
- * @param {Logger} options.logger (required)
232
- * @returns {Promise}
232
+ * Opens a WebSocket connection and performs authentication.
233
+ *
234
+ * @param url - WebSocket URL to connect to
235
+ * @param options - Socket connection options including token, logger, and timeout settings
236
+ * @returns Promise that resolves when socket is opened and authenticated
233
237
  */
234
238
  }, {
235
239
  key: "open",
236
240
  value: function open(url, options) {
237
241
  var _this3 = this;
238
242
  try {
239
- this._domain = new URL(url).hostname;
243
+ this.domain = new URL(url).hostname;
240
244
  } catch (_unused) {
241
- this._domain = url;
245
+ this.domain = url;
242
246
  }
243
247
  return new _promise.default(function (resolve, reject) {
244
248
  /* eslint complexity: [0] */
@@ -259,59 +263,56 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
259
263
  });
260
264
  });
261
265
  var WebSocket = Socket.getWebSocketConstructor();
262
- _this3.logger.info("socket,".concat(_this3._domain, ": creating WebSocket"));
266
+ _this3.logger.info("socket,".concat(_this3.domain, ": creating WebSocket"));
263
267
  var socket = new WebSocket(url, [], resolvedOptions);
264
268
  socket.binaryType = 'arraybuffer';
265
269
  socket.onmessage = _this3.onmessage;
266
270
  socket.onclose = function (event) {
267
- event = _this3._fixCloseCode(event);
268
- _this3.logger.info("socket,".concat(_this3._domain, ": closed before open"), event.code, event.reason);
271
+ event = _this3.fixCloseCode(event);
272
+ _this3.logger.info("socket,".concat(_this3.domain, ": closed before open"), event.code, event.reason);
269
273
  switch (event.code) {
270
274
  case 1005:
271
275
  // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume
272
276
  // it's a bad websocket url. That'll trigger a device refresh; if it
273
277
  // turns out we had a bad token, the device refresh should 401 and
274
278
  // trigger a token refresh.
275
- return reject(new UnknownResponseCtor(event));
279
+ return reject(new _errors.UnknownResponse(event));
276
280
  case 4400:
277
- return reject(new BadRequestCtor(event));
281
+ return reject(new _errors.BadRequest(event));
278
282
  case 4401:
279
- return reject(new NotAuthorizedCtor(event));
283
+ return reject(new _errors.NotAuthorized(event));
280
284
  case 4403:
281
- return reject(new ForbiddenCtor(event));
282
- // case 4404:
283
- // return reject(new NotFound(event));
285
+ return reject(new _errors.Forbidden(event));
284
286
  default:
285
- return reject(new ConnectionErrorCtor(event));
287
+ return reject(new _errors.ConnectionError(event));
286
288
  }
287
289
  };
288
290
  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"));
291
+ _this3.logger.info("socket,".concat(_this3.domain, ": connected"));
292
+ _this3.authorize(_this3.token).then(function () {
293
+ _this3.logger.info("socket,".concat(_this3.domain, ": authorized"));
292
294
  socket.onclose = _this3.onclose;
293
295
  resolve();
294
296
  }).catch(reject);
295
297
  };
296
298
  socket.onerror = function (event) {
297
- _this3.logger.warn("socket,".concat(_this3._domain, ": error event fired"), event);
299
+ _this3.logger.warn("socket,".concat(_this3.domain, ": error event fired"), event);
298
300
  };
299
301
  sockets.set(_this3, socket);
300
- _this3.logger.info("socket,".concat(_this3._domain, ": waiting for server"));
302
+ _this3.logger.info("socket,".concat(_this3.domain, ": waiting for server"));
301
303
  });
302
304
  }
303
305
 
304
306
  /**
305
- * Handles incoming CloseEvents
306
- * @param {CloseEvent} event
307
- * @returns {undefined}
307
+ * Handles incoming CloseEvents.
308
+ * @param event - The close event containing code and reason
308
309
  */
309
310
  }, {
310
311
  key: "onclose",
311
312
  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));
313
+ this.logger.info("socket,".concat(this.domain, ": closed"), event.code, event.reason);
314
+ event = this.fixCloseCode(event);
315
+ this.rejectPendingResponses(new _errors.ConnectionError(event));
315
316
  this.emit('close', event);
316
317
 
317
318
  // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure
@@ -320,9 +321,8 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
320
321
  }
321
322
 
322
323
  /**
323
- * Handles incoming message events
324
- * @param {MessageEvent} event
325
- * @returns {undefined}
324
+ * Handles incoming message events from the WebSocket.
325
+ * @param event - The message event containing the data
326
326
  */
327
327
  }, {
328
328
  key: "onmessage",
@@ -334,25 +334,25 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
334
334
  data: data
335
335
  };
336
336
  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);
337
+ this.acknowledge(processedEvent).catch(function (error) {
338
+ _this4.logger.warn("socket,".concat(_this4.domain, ": failed to acknowledge async event"), error);
339
339
  });
340
340
  }
341
341
 
342
342
  // Match pending request/response promises before emitting the public message event.
343
343
  // The message is still emitted afterward for any external listeners that care about it.
344
- this._handlePendingResponse(data);
344
+ this.handlePendingResponse(data);
345
345
  this.emit('message', processedEvent);
346
346
  } catch (error) {
347
347
  /* istanbul ignore next */
348
- this.logger.warn("socket,".concat(this._domain, ": error while receiving WebSocket message"), error);
348
+ this.logger.warn("socket,".concat(this.domain, ": error while receiving WebSocket message"), error);
349
349
  }
350
350
  }
351
351
 
352
352
  /**
353
- * Sends a message up the socket
354
- * @param {mixed} data
355
- * @returns {Promise}
353
+ * Sends a message up the socket.
354
+ * @param data - Data to send (string or object that will be JSON stringified)
355
+ * @returns Promise that resolves when the message is sent
356
356
  */
357
357
  }, {
358
358
  key: "send",
@@ -378,15 +378,10 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
378
378
 
379
379
  /**
380
380
  * Sends a request and resolves when the matching response arrives.
381
- * @param {Object} data
382
- * @param {Object} [options={}]
383
- * @param {Function} [options.matchesResponse]
384
- * @param {Function} [options.createError]
385
- * @param {Function} [options.createTimeoutError]
386
- * @param {Function} [options.getStatusCode]
387
- * @param {Function} [options.getStatusMessage]
388
- * @param {number} [options.timeout]
389
- * @returns {Promise<Object>}
381
+ *
382
+ * @param data - Request data to send over the socket
383
+ * @param options - Request options including timeout and error handlers
384
+ * @returns Promise that resolves with the response data
390
385
  */
391
386
  }, {
392
387
  key: "sendRequest",
@@ -397,68 +392,45 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
397
392
  return _promise.default.reject(new Error('`data` is required'));
398
393
  }
399
394
  var request = _objectSpread({}, data);
400
- var trackingId = request.trackingId || this._createTrackingId();
395
+ var trackingId = request.trackingId || createTrackingId();
401
396
  var timeout = options.timeout || this.wssResponseTimeout || 10000;
402
- var matchesResponse = options.matchesResponse || function (response) {
403
- return (response === null || response === void 0 ? void 0 : response.trackingId) === trackingId && (response === null || response === void 0 ? void 0 : response.type) === 'response_event';
404
- };
405
- var getStatusCode = options.getStatusCode || function (response) {
406
- return response === null || response === void 0 ? void 0 : response.statusCode;
407
- };
408
- var getStatusMessage = options.getStatusMessage || function (response) {
409
- return response === null || response === void 0 ? void 0 : response.statusMessage;
410
- };
411
- var createError = options.createError || function (response, statusCode, statusMessage) {
412
- return new ConnectionErrorCtor({
413
- code: statusCode,
414
- reason: statusMessage || (response === null || response === void 0 ? void 0 : response.reason) || 'Socket request failed'
415
- });
416
- };
417
- var createTimeoutError = options.createTimeoutError || function () {
418
- return new ConnectionErrorCtor({
419
- reason: 'Socket response not received before timeout'
420
- });
421
- };
422
- if (this._pendingResponses.has(trackingId)) {
423
- return _promise.default.reject(new Error("socket request already pending for trackingId ".concat(trackingId)));
397
+ if (this.pendingResponses.has(trackingId)) {
398
+ return _promise.default.reject(new Error("socket request already sent for trackingId ".concat(trackingId)));
424
399
  }
425
400
  request.trackingId = trackingId;
426
401
  return new _promise.default(function (_resolve, _reject) {
427
402
  var timeoutId = (0, _commonTimers.safeSetTimeout)(function () {
428
- _this6._clearPendingResponse(trackingId);
429
- _reject(createTimeoutError(request));
403
+ _this6.clearPendingResponse(trackingId);
404
+ _reject((0, _errors.createTimeoutError)(request));
430
405
  }, timeout);
431
- _this6._pendingResponses.set(trackingId, {
406
+ var pendingResponse = {
432
407
  request: request,
433
- matchesResponse: matchesResponse,
434
- getStatusCode: getStatusCode,
435
- getStatusMessage: getStatusMessage,
436
- createError: createError,
437
408
  resolve: function resolve(response) {
438
- _this6._clearPendingResponse(trackingId);
409
+ _this6.clearPendingResponse(trackingId);
439
410
  _resolve(response);
440
411
  },
441
412
  reject: function reject(error) {
442
- _this6._clearPendingResponse(trackingId);
413
+ _this6.clearPendingResponse(trackingId);
443
414
  _reject(error);
444
415
  },
445
416
  timeoutId: timeoutId
446
- });
417
+ };
418
+ _this6.pendingResponses.set(trackingId, pendingResponse);
447
419
  _this6.send(request).catch(function (error) {
448
- _this6._clearPendingResponse(trackingId);
420
+ _this6.clearPendingResponse(trackingId);
449
421
  _reject(error);
450
422
  });
451
423
  });
452
424
  }
453
425
 
454
426
  /**
455
- * Sends an acknowledgment for a specific event
456
- * @param {MessageEvent} event
457
- * @returns {Promise}
427
+ * Sends an acknowledgment for a specific async event.
428
+ * @param event - Message event containing the async event to acknowledge
429
+ * @returns Promise that resolves when acknowledgment is sent
458
430
  */
459
431
  }, {
460
- key: "_acknowledge",
461
- value: function _acknowledge(event) {
432
+ key: "acknowledge",
433
+ value: function acknowledge(event) {
462
434
  if (!event) {
463
435
  return _promise.default.reject(new Error('`event` is required'));
464
436
  }
@@ -472,7 +444,7 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
472
444
  }
473
445
  return this.send({
474
446
  type: _constants.MESSAGE_TYPES.EVENT_ACK,
475
- trackingId: event.data.trackingId || this._createTrackingId(),
447
+ trackingId: event.data.trackingId || createTrackingId(),
476
448
  eventId: event.data.eventId
477
449
  }).catch(function (error) {
478
450
  if (error.message === 'INVALID_STATE_ERROR') {
@@ -495,150 +467,125 @@ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
495
467
  } else {
496
468
  refreshedToken = String(token);
497
469
  }
498
- return this._authorize(refreshedToken);
470
+ return this.authorize(refreshedToken);
499
471
  }
500
472
 
501
473
  /**
502
474
  * Sends an auth message up the socket with a refreshed token.
503
- * @param {string} token
504
- * @returns {Promise}
475
+ * @param token - Authentication token to send
476
+ * @returns Promise that resolves when authentication succeeds
505
477
  */
506
478
  }, {
507
- key: "_authorize",
508
- value: function _authorize(token) {
509
- this.logger.info("socket,".concat(this._domain, ": authorizing"));
479
+ key: "authorize",
480
+ value: function authorize(token) {
481
+ this.logger.info("socket,".concat(this.domain, ": authorizing"));
510
482
  return this.sendRequest({
511
483
  type: _constants.MESSAGE_TYPES.AUTH,
512
484
  data: {
513
485
  token: token
514
486
  }
515
- }, {
516
- matchesResponse: function matchesResponse(response, request) {
517
- return (response === null || response === void 0 ? void 0 : response.type) === 'response_event' && (response === null || response === void 0 ? void 0 : response.subtype) === _constants.MESSAGE_TYPES.AUTH && (response === null || response === void 0 ? void 0 : response.trackingId) === request.trackingId;
518
- },
519
- getStatusCode: function getStatusCode(response) {
520
- return response === null || response === void 0 ? void 0 : response.statusCode;
521
- },
522
- getStatusMessage: function getStatusMessage(response) {
523
- return response === null || response === void 0 ? void 0 : response.statusMessage;
524
- },
525
- createError: function createError(response, statusCode, statusMessage) {
526
- return new NotAuthorizedCtor({
527
- code: statusCode,
528
- reason: statusMessage || 'Mobius auth failed'
529
- });
530
- },
531
- createTimeoutError: function createTimeoutError() {
532
- return new NotAuthorizedCtor({
533
- reason: 'Mobius auth response not received before timeout'
534
- });
535
- }
536
487
  });
537
488
  }
538
489
 
539
- /**
540
- * Creates a unique tracking ID
541
- * @private
542
- * @returns {string}
543
- */
544
- }, {
545
- key: "_createTrackingId",
546
- value: function _createTrackingId() {
547
- return "".concat(this.trackingId, "_").concat(crypto.randomUUID());
548
- }
549
-
550
490
  /**
551
491
  * Clears a pending response entry.
552
- * @param {string} trackingId
553
- * @returns {void}
492
+ * @param trackingId - Tracking ID of the response to clear
554
493
  */
555
494
  }, {
556
- key: "_clearPendingResponse",
557
- value: function _clearPendingResponse(trackingId) {
558
- var pendingResponse = this._pendingResponses.get(trackingId);
495
+ key: "clearPendingResponse",
496
+ value: function clearPendingResponse(trackingId) {
497
+ var pendingResponse = this.pendingResponses.get(trackingId);
559
498
  if (pendingResponse !== null && pendingResponse !== void 0 && pendingResponse.timeoutId) {
560
499
  clearTimeout(pendingResponse.timeoutId);
561
500
  }
562
- this._pendingResponses.delete(trackingId);
501
+ this.pendingResponses.delete(trackingId);
563
502
  }
564
503
 
565
504
  /**
566
505
  * Rejects all pending responses with the provided error.
567
- * @param {Error} error
568
- * @returns {void}
506
+ * @param error - Error to reject pending responses with
569
507
  */
570
508
  }, {
571
- key: "_rejectPendingResponses",
572
- value: function _rejectPendingResponses(error) {
573
- if (!this._pendingResponses.size) {
509
+ key: "rejectPendingResponses",
510
+ value: function rejectPendingResponses(error) {
511
+ if (!this.pendingResponses.size) {
574
512
  return;
575
513
  }
576
- (0, _from.default)(this._pendingResponses.values()).forEach(function (pendingResponse) {
577
- pendingResponse.reject(error);
578
- });
514
+ var _iterator = _createForOfIteratorHelper(this.pendingResponses.values()),
515
+ _step;
516
+ try {
517
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
518
+ var pendingResponse = _step.value;
519
+ pendingResponse.reject(error);
520
+ }
521
+ } catch (err) {
522
+ _iterator.e(err);
523
+ } finally {
524
+ _iterator.f();
525
+ }
579
526
  }
580
527
 
581
528
  /**
582
529
  * Handles incoming responses for pending requests.
583
- * @param {Object} response
584
- * @returns {boolean}
530
+ * @param response - Response data to match against pending requests
531
+ * @returns True if a matching pending request was found and handled
585
532
  */
586
533
  }, {
587
- key: "_handlePendingResponse",
588
- value: function _handlePendingResponse(response) {
534
+ key: "handlePendingResponse",
535
+ value: function handlePendingResponse(response) {
589
536
  var _this7 = this;
590
537
  if (!response) {
591
538
  return false;
592
539
  }
593
540
 
594
541
  // Pending request correlation currently requires trackingId on the response.
595
- var pendingResponse = response.trackingId ? this._pendingResponses.get(response.trackingId) : undefined;
542
+ var pendingResponse = this.pendingResponses.get(response.trackingId || '');
596
543
  if (!pendingResponse) {
597
544
  return false;
598
545
  }
599
- if (!pendingResponse.matchesResponse(response, pendingResponse.request)) {
546
+ if (response.subtype !== pendingResponse.request.type) {
600
547
  return false;
601
548
  }
602
- var statusCode = pendingResponse.getStatusCode(response);
603
- var statusMessage = pendingResponse.getStatusMessage(response);
549
+ var statusCode = response === null || response === void 0 ? void 0 : response.statusCode;
550
+ var statusMessage = response === null || response === void 0 ? void 0 : response.statusMessage;
604
551
  if (statusCode === 440 && (response === null || response === void 0 ? void 0 : response.subtype) !== _constants.MESSAGE_TYPES.AUTH) {
605
552
  if (typeof this.refreshToken === 'function') {
606
553
  _promise.default.resolve(this.refreshToken(response)).catch(function (error) {
607
- _this7.logger.warn("socket,".concat(_this7._domain, ": failed token-expiry re-auth"), error);
554
+ _this7.logger.warn("socket,".concat(_this7.domain, ": failed token-expiry re-auth"), error);
608
555
  });
609
556
  } else {
610
- this.logger.warn("socket,".concat(this._domain, ": refreshToken callback is unavailable for statusCode 440"));
557
+ this.logger.warn("socket,".concat(this.domain, ": refreshToken callback is unavailable for statusCode 440"));
611
558
  }
612
559
  }
613
560
  if (statusCode === undefined) {
614
- pendingResponse.reject(pendingResponse.createError(response, statusCode, statusMessage || 'Socket response missing status code'));
561
+ var error = (0, _errors.createWssResponseError)(response, statusCode, statusMessage || 'Socket response missing status code');
562
+ pendingResponse.reject(error);
615
563
  } else if (statusCode >= 200 && statusCode < 300) {
616
564
  pendingResponse.resolve(response);
617
565
  } else {
618
- pendingResponse.reject(pendingResponse.createError(response, statusCode, statusMessage));
566
+ pendingResponse.reject((0, _errors.createWssResponseError)(response, statusCode, statusMessage));
619
567
  }
620
568
  return true;
621
569
  }
622
570
 
623
571
  /**
624
- * Deals with the fact that some browsers drop some close codes (but not
625
- * close reasons).
626
- * @param {CloseEvent} event
627
- * @private
628
- * @returns {CloseEvent}
572
+ * Deals with the fact that some browsers drop some close codes (but not close reasons).
573
+ *
574
+ * @param event - Close event to fix
575
+ * @returns Fixed close event with corrected code if necessary
629
576
  */
630
577
  }, {
631
- key: "_fixCloseCode",
632
- value: function _fixCloseCode(event) {
578
+ key: "fixCloseCode",
579
+ value: function fixCloseCode(event) {
633
580
  if (event.code === 1005 && event.reason) {
634
581
  switch (event.reason.toLowerCase()) {
635
582
  case 'replaced':
636
- this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
583
+ this.logger.info("socket,".concat(this.domain, ": fixing CloseEvent code for reason: "), event.reason);
637
584
  event.code = 4000;
638
585
  break;
639
586
  case 'authentication failed':
640
587
  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);
588
+ this.logger.info("socket,".concat(this.domain, ": fixing CloseEvent code for reason: "), event.reason);
642
589
  event.code = 1008;
643
590
  break;
644
591
  default: