@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.
- package/dist/CallingClient/utils/request.js +6 -3
- package/dist/CallingClient/utils/request.js.map +1 -1
- package/dist/CallingClient/utils/request.test.js +2 -2
- package/dist/CallingClient/utils/request.test.js.map +1 -1
- package/dist/CallingClient/utils/types.js.map +1 -1
- package/dist/mobius-socket/config.js +7 -44
- package/dist/mobius-socket/config.js.map +1 -1
- package/dist/mobius-socket/errors.js +71 -26
- package/dist/mobius-socket/errors.js.map +1 -1
- package/dist/mobius-socket/index.js +4 -54
- package/dist/mobius-socket/index.js.map +1 -1
- package/dist/mobius-socket/mobius-socket-events.test.js +20 -48
- package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -1
- package/dist/mobius-socket/mobius-socket.js +359 -748
- package/dist/mobius-socket/mobius-socket.js.map +1 -1
- package/dist/mobius-socket/mobius-socket.test.js +452 -728
- package/dist/mobius-socket/mobius-socket.test.js.map +1 -1
- package/dist/mobius-socket/socket/constants.js +14 -0
- package/dist/mobius-socket/socket/constants.js.map +1 -1
- package/dist/mobius-socket/socket/socket-base.js +152 -205
- package/dist/mobius-socket/socket/socket-base.js.map +1 -1
- package/dist/mobius-socket/socket/types.js.map +1 -1
- package/dist/mobius-socket/socket.test.js +38 -63
- package/dist/mobius-socket/socket.test.js.map +1 -1
- package/dist/mobius-socket/types.js.map +1 -1
- package/dist/module/CallingClient/utils/request.js +3 -2
- package/dist/module/mobius-socket/config.js +7 -10
- package/dist/module/mobius-socket/errors.js +34 -0
- package/dist/module/mobius-socket/index.js +0 -3
- package/dist/module/mobius-socket/mobius-socket.js +237 -426
- package/dist/module/mobius-socket/socket/socket-base.js +79 -116
- package/dist/types/CallingClient/utils/request.d.ts.map +1 -1
- package/dist/types/CallingClient/utils/types.d.ts +1 -1
- package/dist/types/CallingClient/utils/types.d.ts.map +1 -1
- package/dist/types/mobius-socket/config.d.ts +7 -8
- package/dist/types/mobius-socket/config.d.ts.map +1 -1
- package/dist/types/mobius-socket/errors.d.ts +11 -1
- package/dist/types/mobius-socket/errors.d.ts.map +1 -1
- package/dist/types/mobius-socket/index.d.ts +1 -5
- package/dist/types/mobius-socket/index.d.ts.map +1 -1
- package/dist/types/mobius-socket/mobius-socket.d.ts +33 -35
- package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/socket-base.d.ts +9 -10
- package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/types.d.ts +0 -8
- package/dist/types/mobius-socket/socket/types.d.ts.map +1 -1
- package/dist/types/mobius-socket/types.d.ts.map +1 -1
- 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-
|
|
42
|
-
// @ts-
|
|
47
|
+
*/ // @ts-ignore - type not available
|
|
48
|
+
// @ts-ignore - type not available
|
|
43
49
|
var sockets = new _weakMap.default();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
*
|
|
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, "
|
|
63
|
-
(0, _defineProperty3.default)(_this, "
|
|
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.
|
|
71
|
-
_this.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
142
|
-
*
|
|
143
|
-
* @returns
|
|
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
|
|
151
|
-
* @
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
*
|
|
227
|
-
* @param
|
|
228
|
-
* @param
|
|
229
|
-
* @
|
|
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.
|
|
243
|
+
this.domain = new URL(url).hostname;
|
|
240
244
|
} catch (_unused) {
|
|
241
|
-
this.
|
|
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.
|
|
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.
|
|
268
|
-
_this3.logger.info("socket,".concat(_this3.
|
|
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
|
|
279
|
+
return reject(new _errors.UnknownResponse(event));
|
|
276
280
|
case 4400:
|
|
277
|
-
return reject(new
|
|
281
|
+
return reject(new _errors.BadRequest(event));
|
|
278
282
|
case 4401:
|
|
279
|
-
return reject(new
|
|
283
|
+
return reject(new _errors.NotAuthorized(event));
|
|
280
284
|
case 4403:
|
|
281
|
-
return reject(new
|
|
282
|
-
// case 4404:
|
|
283
|
-
// return reject(new NotFound(event));
|
|
285
|
+
return reject(new _errors.Forbidden(event));
|
|
284
286
|
default:
|
|
285
|
-
return reject(new
|
|
287
|
+
return reject(new _errors.ConnectionError(event));
|
|
286
288
|
}
|
|
287
289
|
};
|
|
288
290
|
socket.onopen = function () {
|
|
289
|
-
_this3.logger.info("socket,".concat(_this3.
|
|
290
|
-
_this3.
|
|
291
|
-
_this3.logger.info("socket,".concat(_this3.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
313
|
-
event = this.
|
|
314
|
-
this.
|
|
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
|
|
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.
|
|
338
|
-
_this4.logger.warn("socket,".concat(_this4.
|
|
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.
|
|
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.
|
|
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
|
|
355
|
-
* @returns
|
|
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
|
-
*
|
|
382
|
-
* @param
|
|
383
|
-
* @param
|
|
384
|
-
* @
|
|
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 ||
|
|
395
|
+
var trackingId = request.trackingId || createTrackingId();
|
|
401
396
|
var timeout = options.timeout || this.wssResponseTimeout || 10000;
|
|
402
|
-
|
|
403
|
-
return (
|
|
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.
|
|
429
|
-
_reject(createTimeoutError(request));
|
|
403
|
+
_this6.clearPendingResponse(trackingId);
|
|
404
|
+
_reject((0, _errors.createTimeoutError)(request));
|
|
430
405
|
}, timeout);
|
|
431
|
-
|
|
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.
|
|
409
|
+
_this6.clearPendingResponse(trackingId);
|
|
439
410
|
_resolve(response);
|
|
440
411
|
},
|
|
441
412
|
reject: function reject(error) {
|
|
442
|
-
_this6.
|
|
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.
|
|
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
|
|
457
|
-
* @returns
|
|
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: "
|
|
461
|
-
value: function
|
|
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 ||
|
|
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.
|
|
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
|
|
504
|
-
* @returns
|
|
475
|
+
* @param token - Authentication token to send
|
|
476
|
+
* @returns Promise that resolves when authentication succeeds
|
|
505
477
|
*/
|
|
506
478
|
}, {
|
|
507
|
-
key: "
|
|
508
|
-
value: function
|
|
509
|
-
this.logger.info("socket,".concat(this.
|
|
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
|
|
553
|
-
* @returns {void}
|
|
492
|
+
* @param trackingId - Tracking ID of the response to clear
|
|
554
493
|
*/
|
|
555
494
|
}, {
|
|
556
|
-
key: "
|
|
557
|
-
value: function
|
|
558
|
-
var pendingResponse = this.
|
|
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.
|
|
501
|
+
this.pendingResponses.delete(trackingId);
|
|
563
502
|
}
|
|
564
503
|
|
|
565
504
|
/**
|
|
566
505
|
* Rejects all pending responses with the provided error.
|
|
567
|
-
* @param
|
|
568
|
-
* @returns {void}
|
|
506
|
+
* @param error - Error to reject pending responses with
|
|
569
507
|
*/
|
|
570
508
|
}, {
|
|
571
|
-
key: "
|
|
572
|
-
value: function
|
|
573
|
-
if (!this.
|
|
509
|
+
key: "rejectPendingResponses",
|
|
510
|
+
value: function rejectPendingResponses(error) {
|
|
511
|
+
if (!this.pendingResponses.size) {
|
|
574
512
|
return;
|
|
575
513
|
}
|
|
576
|
-
|
|
577
|
-
|
|
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
|
|
584
|
-
* @returns
|
|
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: "
|
|
588
|
-
value: function
|
|
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 =
|
|
542
|
+
var pendingResponse = this.pendingResponses.get(response.trackingId || '');
|
|
596
543
|
if (!pendingResponse) {
|
|
597
544
|
return false;
|
|
598
545
|
}
|
|
599
|
-
if (
|
|
546
|
+
if (response.subtype !== pendingResponse.request.type) {
|
|
600
547
|
return false;
|
|
601
548
|
}
|
|
602
|
-
var statusCode =
|
|
603
|
-
var statusMessage =
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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(
|
|
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
|
-
*
|
|
626
|
-
* @param
|
|
627
|
-
* @
|
|
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: "
|
|
632
|
-
value: function
|
|
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.
|
|
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.
|
|
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:
|