@webex/calling 3.12.0-mobius-socket.9 → 3.12.0-mobius-socket.11

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