@webex/calling 3.12.0-mobius-socket.10 → 3.12.0-mobius-socket.12
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/CallingClient.test.js +2 -2
- package/dist/CallingClient/CallingClient.test.js.map +1 -1
- package/dist/CallingClient/calling/call.test.js +1 -1
- package/dist/CallingClient/calling/call.test.js.map +1 -1
- package/dist/CallingClient/line/line.test.js +2 -2
- package/dist/CallingClient/line/line.test.js.map +1 -1
- package/dist/CallingClient/registration/register.js +76 -43
- package/dist/CallingClient/registration/register.js.map +1 -1
- package/dist/CallingClient/registration/register.test.js +1 -1
- package/dist/CallingClient/registration/register.test.js.map +1 -1
- package/dist/CallingClient/registration/types.js.map +1 -1
- package/dist/CallingClient/utils/request.js +2 -2
- package/dist/CallingClient/utils/request.js.map +1 -1
- package/dist/common/Utils.js +70 -30
- package/dist/common/Utils.js.map +1 -1
- package/dist/mobius-socket/config.js +61 -0
- package/dist/mobius-socket/config.js.map +1 -0
- package/dist/mobius-socket/errors.js +106 -0
- package/dist/mobius-socket/errors.js.map +1 -0
- package/dist/mobius-socket/index.js +101 -0
- package/dist/mobius-socket/index.js.map +1 -0
- package/dist/mobius-socket/mobius-socket-events.test.js +511 -0
- package/dist/mobius-socket/mobius-socket-events.test.js.map +1 -0
- package/dist/mobius-socket/mobius-socket.js +1191 -0
- package/dist/mobius-socket/mobius-socket.js.map +1 -0
- package/dist/mobius-socket/mobius-socket.test.js +2107 -0
- package/dist/mobius-socket/mobius-socket.test.js.map +1 -0
- package/dist/mobius-socket/socket/constants.js +20 -0
- package/dist/mobius-socket/socket/constants.js.map +1 -0
- package/dist/mobius-socket/socket/index.js +15 -0
- package/dist/mobius-socket/socket/index.js.map +1 -0
- package/dist/mobius-socket/socket/socket-base.js +632 -0
- package/dist/mobius-socket/socket/socket-base.js.map +1 -0
- package/dist/mobius-socket/socket/socket.js +19 -0
- package/dist/mobius-socket/socket/socket.js.map +1 -0
- package/dist/mobius-socket/socket/socket.shim.js +36 -0
- package/dist/mobius-socket/socket/socket.shim.js.map +1 -0
- package/dist/mobius-socket/socket.test.js +752 -0
- package/dist/mobius-socket/socket.test.js.map +1 -0
- package/dist/mobius-socket/test/mocha-helpers.js +23 -0
- package/dist/mobius-socket/test/mocha-helpers.js.map +1 -0
- package/dist/mobius-socket/test/promise-tick.js +29 -0
- package/dist/mobius-socket/test/promise-tick.js.map +1 -0
- package/dist/module/CallingClient/registration/register.js +30 -7
- package/dist/module/CallingClient/utils/request.js +1 -1
- package/dist/module/common/Utils.js +17 -4
- package/dist/module/mobius-socket/config.js +18 -0
- package/dist/module/mobius-socket/errors.js +30 -0
- package/dist/module/mobius-socket/index.js +24 -0
- package/dist/module/mobius-socket/mobius-socket.js +761 -0
- package/dist/module/mobius-socket/socket/constants.js +10 -0
- package/dist/module/mobius-socket/socket/index.js +4 -0
- package/dist/module/mobius-socket/socket/socket-base.js +374 -0
- package/dist/module/mobius-socket/socket/socket.js +9 -0
- package/dist/module/mobius-socket/socket/socket.shim.js +24 -0
- package/dist/types/CallingClient/registration/register.d.ts.map +1 -1
- package/dist/types/CallingClient/registration/types.d.ts +1 -1
- package/dist/types/CallingClient/registration/types.d.ts.map +1 -1
- package/dist/types/common/Utils.d.ts +4 -1
- package/dist/types/common/Utils.d.ts.map +1 -1
- package/dist/types/mobius-socket/config.d.ts +15 -0
- package/dist/types/mobius-socket/config.d.ts.map +1 -0
- package/dist/types/mobius-socket/errors.d.ts +13 -0
- package/dist/types/mobius-socket/errors.d.ts.map +1 -0
- package/dist/types/mobius-socket/index.d.ts +9 -0
- package/dist/types/mobius-socket/index.d.ts.map +1 -0
- package/dist/types/mobius-socket/mobius-socket.d.ts +62 -0
- package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/constants.d.ts +11 -0
- package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/index.d.ts +2 -0
- package/dist/types/mobius-socket/socket/index.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket-base.d.ts +38 -0
- package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket.d.ts +3 -0
- package/dist/types/mobius-socket/socket/socket.d.ts.map +1 -0
- package/dist/types/mobius-socket/socket/socket.shim.d.ts +3 -0
- package/dist/types/mobius-socket/socket/socket.shim.d.ts.map +1 -0
- package/package.json +16 -3
- package/src/mobius-socket/socket/socket.js +13 -0
- 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
|