@webex/internal-plugin-mobius-socket 0.0.0-next.1

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.
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+
3
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
12
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
13
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
15
+ var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
16
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
17
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
18
+ var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/define-property"));
19
+ var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
20
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
21
+ var _events = require("events");
22
+ var _common = require("@webex/common");
23
+ var _commonTimers = require("@webex/common-timers");
24
+ var _lodash = require("lodash");
25
+ var _uuid = _interopRequireDefault(require("uuid"));
26
+ var _errors = require("../errors");
27
+ var _constants = require("./constants");
28
+ 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)); }
29
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /*!
30
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
31
+ */
32
+ var sockets = new _weakMap.default();
33
+
34
+ /**
35
+ * Generalized socket abstraction
36
+ */
37
+ var Socket = exports.default = /*#__PURE__*/function (_EventEmitter) {
38
+ /**
39
+ * constructor
40
+ * @returns {Socket}
41
+ */
42
+ function Socket() {
43
+ var _this;
44
+ (0, _classCallCheck2.default)(this, Socket);
45
+ _this = _callSuper(this, Socket);
46
+ _this._domain = 'unknown-domain';
47
+ _this.onmessage = _this.onmessage.bind(_this);
48
+ _this.onclose = _this.onclose.bind(_this);
49
+ // Increase max listeners to avoid memory leak warning in tests
50
+ _this.setMaxListeners(10);
51
+ return _this;
52
+ }
53
+
54
+ /**
55
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
56
+ * @returns {string}
57
+ */
58
+ (0, _inherits2.default)(Socket, _EventEmitter);
59
+ return (0, _createClass2.default)(Socket, [{
60
+ key: "binaryType",
61
+ get: function get() {
62
+ return sockets.get(this).binaryType;
63
+ }
64
+
65
+ /**
66
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
67
+ * @returns {number}
68
+ */
69
+ }, {
70
+ key: "bufferedAmount",
71
+ get: function get() {
72
+ return sockets.get(this).bufferedAmount;
73
+ }
74
+
75
+ /**
76
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
77
+ * @returns {string}
78
+ */
79
+ }, {
80
+ key: "extensions",
81
+ get: function get() {
82
+ return sockets.get(this).extensions;
83
+ }
84
+
85
+ /**
86
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
87
+ * @returns {string}
88
+ */
89
+ }, {
90
+ key: "protocol",
91
+ get: function get() {
92
+ return sockets.get(this).protocol;
93
+ }
94
+
95
+ /**
96
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
97
+ * @returns {number}
98
+ */
99
+ }, {
100
+ key: "readyState",
101
+ get: function get() {
102
+ return sockets.get(this).readyState;
103
+ }
104
+
105
+ /**
106
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
107
+ * @returns {string}
108
+ */
109
+ }, {
110
+ key: "url",
111
+ get: function get() {
112
+ return sockets.get(this).url;
113
+ }
114
+
115
+ /**
116
+ * Provides the environmentally appropriate constructor (ws in NodeJS,
117
+ * WebSocket in browsers)
118
+ * @returns {WebSocket}
119
+ */
120
+ }, {
121
+ key: "close",
122
+ value:
123
+ /**
124
+ * Closes the socket
125
+ * @param {Object} options
126
+ * @param {string} options.reason
127
+ * @param {number} options.code
128
+ * @returns {Promise}
129
+ */
130
+ function close(options) {
131
+ var _this2 = this;
132
+ return new _promise.default(function (resolve, reject) {
133
+ var socket = sockets.get(_this2);
134
+ if (!socket) {
135
+ // Open has not been called yet so there is no socket to close
136
+ resolve();
137
+ return;
138
+ }
139
+ // logger is defined once open is called
140
+ _this2.logger.info("socket,".concat(_this2._domain, ": closing"));
141
+ if (socket.readyState === _constants.SOCKET_READY_STATE.CLOSING || socket.readyState === _constants.SOCKET_READY_STATE.CLOSED) {
142
+ _this2.logger.info("socket,".concat(_this2._domain, ": already closed"));
143
+ resolve();
144
+ return;
145
+ }
146
+ options = options || {};
147
+ if (options.code && options.code !== 1000 && (options.code < 3000 || options.code > 4999)) {
148
+ reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));
149
+ return;
150
+ }
151
+ var originalCode = options.code;
152
+ var originalReason = options.reason;
153
+ options = (0, _lodash.defaults)(options, {
154
+ code: 1000,
155
+ reason: 'Done'
156
+ });
157
+ var closeTimer = (0, _commonTimers.safeSetTimeout)(function () {
158
+ try {
159
+ _this2.logger.info("socket,".concat(_this2._domain, ": no close event received, forcing closure"));
160
+ resolve(_this2.onclose(originalCode ? {
161
+ code: originalCode,
162
+ reason: originalReason || 'Done (unknown)'
163
+ } : {
164
+ code: 1000,
165
+ reason: 'Done (forced)'
166
+ }));
167
+ } catch (error) {
168
+ _this2.logger.warn("socket,".concat(_this2._domain, ": force-close failed"), error);
169
+ }
170
+ }, _this2.forceCloseDelay);
171
+ socket.onclose = function (event) {
172
+ _this2.logger.info("socket,".concat(_this2._domain, ": close event fired"), event.code, event.reason);
173
+ clearTimeout(closeTimer);
174
+ _this2.onclose(event);
175
+ resolve(event);
176
+ };
177
+
178
+ // If socket is still connecting, manually trigger close handler with desired code
179
+ // because calling close() on a CONNECTING socket may not preserve custom codes
180
+ if (socket.readyState === _constants.SOCKET_READY_STATE.CONNECTING) {
181
+ _this2.logger.info("socket,".concat(_this2._domain, ": socket still connecting, triggering close manually"));
182
+ clearTimeout(closeTimer);
183
+ var closeEvent = {
184
+ code: options.code,
185
+ reason: options.reason
186
+ };
187
+ _this2.onclose(closeEvent);
188
+ resolve(closeEvent);
189
+ try {
190
+ socket.close(options.code, options.reason);
191
+ } catch (error) {
192
+ _this2.logger.info("socket,".concat(_this2._domain, ": error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes"), error);
193
+ }
194
+ } else {
195
+ socket.close(options.code, options.reason);
196
+ }
197
+ });
198
+ }
199
+
200
+ /**
201
+ * Opens a WebSocket
202
+ * @param {string} url
203
+ * @param {options} options
204
+ * @param {number} options.forceCloseDelay (required)
205
+ * @param {number} options.pingInterval (required)
206
+ * @param {number} options.pongTimeout (required)
207
+ * @param {string} options.token (required)
208
+ * @param {string} options.trackingId (required)
209
+ * @param {Logger} options.logger (required)
210
+ * @param {string} options.logLevelToken
211
+ * @returns {Promise}
212
+ */
213
+ }, {
214
+ key: "open",
215
+ value: function open(url, options) {
216
+ var _this3 = this;
217
+ try {
218
+ this._domain = new URL(url).hostname;
219
+ } catch (_unused) {
220
+ this._domain = url;
221
+ }
222
+ return new _promise.default(function (resolve, reject) {
223
+ /* eslint complexity: [0] */
224
+ if (!url) {
225
+ reject(new Error('`url` is required'));
226
+ return;
227
+ }
228
+ if (sockets.get(_this3)) {
229
+ reject(new Error('Socket#open() can only be called once per instance'));
230
+ return;
231
+ }
232
+ options = options || {};
233
+ (0, _common.checkRequired)(['forceCloseDelay', 'pingInterval', 'pongTimeout', 'token', 'trackingId', 'logger'], options);
234
+ (0, _keys.default)(options).forEach(function (key) {
235
+ (0, _defineProperty.default)(_this3, key, {
236
+ enumerable: false,
237
+ value: options[key]
238
+ });
239
+ });
240
+ var WebSocket = Socket.getWebSocketConstructor();
241
+ _this3.logger.info("socket,".concat(_this3._domain, ": creating WebSocket"));
242
+ var socket = new WebSocket(url, [], options);
243
+ socket.binaryType = 'arraybuffer';
244
+ socket.onmessage = _this3.onmessage;
245
+ socket.onclose = function (event) {
246
+ event = _this3._fixCloseCode(event);
247
+ _this3.logger.info("socket,".concat(_this3._domain, ": closed before open"), event.code, event.reason);
248
+ switch (event.code) {
249
+ case 1005:
250
+ // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume
251
+ // it's a bad websocket url. That'll trigger a device refresh; if it
252
+ // turns out we had a bad token, the device refresh should 401 and
253
+ // trigger a token refresh.
254
+ return reject(new _errors.UnknownResponse(event));
255
+ case 4400:
256
+ return reject(new _errors.BadRequest(event));
257
+ case 4401:
258
+ return reject(new _errors.NotAuthorized(event));
259
+ case 4403:
260
+ return reject(new _errors.Forbidden(event));
261
+ // case 4404:
262
+ // return reject(new NotFound(event));
263
+ default:
264
+ return reject(new _errors.ConnectionError(event));
265
+ }
266
+ };
267
+ socket.onopen = function () {
268
+ _this3.logger.info("socket,".concat(_this3._domain, ": connected"));
269
+ _this3._authorize().then(function () {
270
+ _this3.logger.info("socket,".concat(_this3._domain, ": authorized"));
271
+ socket.onclose = _this3.onclose;
272
+ resolve();
273
+ }).catch(reject);
274
+ };
275
+ socket.onerror = function (event) {
276
+ _this3.logger.warn("socket,".concat(_this3._domain, ": error event fired"), event);
277
+ };
278
+ sockets.set(_this3, socket);
279
+ _this3.logger.info("socket,".concat(_this3._domain, ": waiting for server"));
280
+ });
281
+ }
282
+
283
+ /**
284
+ * Handles incoming CloseEvents
285
+ * @param {CloseEvent} event
286
+ * @returns {undefined}
287
+ */
288
+ }, {
289
+ key: "onclose",
290
+ value: function onclose(event) {
291
+ this.logger.info("socket,".concat(this._domain, ": closed"), event.code, event.reason);
292
+ clearTimeout(this.pongTimer);
293
+ clearTimeout(this.pingTimer);
294
+ event = this._fixCloseCode(event);
295
+ this.emit('close', event);
296
+
297
+ // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure
298
+ // we don't have a retain cycle.
299
+ this.removeAllListeners();
300
+ }
301
+
302
+ /**
303
+ * Handles incoming message events
304
+ * @param {MessageEvent} event
305
+ * @returns {undefined}
306
+ */
307
+ }, {
308
+ key: "onmessage",
309
+ value: function onmessage(event) {
310
+ try {
311
+ var data = JSON.parse(event.data);
312
+ var sequenceNumber = (0, _parseInt2.default)(data.sequenceNumber, 10);
313
+ this.logger.debug("socket,".concat(this._domain, ": sequence number: "), sequenceNumber);
314
+ if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {
315
+ this.logger.debug("socket,".concat(this._domain, ": sequence number mismatch indicates lost mercury message. expected: ").concat(this.expectedSequenceNumber, ", actual: ").concat(sequenceNumber));
316
+ this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);
317
+ }
318
+ this.expectedSequenceNumber = sequenceNumber + 1;
319
+
320
+ // Yes, it's a little weird looking; we want to emit message events that
321
+ // look like normal socket message events, but event.data cannot be
322
+ // modified and we don't actually care about anything but the data property
323
+ var processedEvent = {
324
+ data: data
325
+ };
326
+ this._acknowledge(processedEvent);
327
+ if (data.type === 'pong') {
328
+ this.emit('pong', processedEvent);
329
+ } else {
330
+ this.emit('message', processedEvent);
331
+ }
332
+ } catch (error) {
333
+ // The above code should only be able to throw if we receive an unparsable
334
+ // message from Mercury. At this time, the only action we have is to
335
+ // ignore it and move on.
336
+ /* istanbul ignore next */
337
+ this.logger.warn("socket,".concat(this._domain, ": error while receiving WebSocket message"), error);
338
+ }
339
+ }
340
+
341
+ /**
342
+ * Sends a message up the socket
343
+ * @param {mixed} data
344
+ * @returns {Promise}
345
+ */
346
+ }, {
347
+ key: "send",
348
+ value: function send(data) {
349
+ var _this4 = this;
350
+ return new _promise.default(function (resolve, reject) {
351
+ if (_this4.readyState !== _constants.SOCKET_READY_STATE.OPEN) {
352
+ return reject(new Error('INVALID_STATE_ERROR'));
353
+ }
354
+ if ((0, _lodash.isObject)(data)) {
355
+ data = (0, _stringify.default)(data);
356
+ }
357
+ var socket = sockets.get(_this4);
358
+ socket.send(data);
359
+ return resolve();
360
+ });
361
+ }
362
+
363
+ /**
364
+ * Sends an acknowledgment for a specific event
365
+ * @param {MessageEvent} event
366
+ * @returns {Promise}
367
+ */
368
+ }, {
369
+ key: "_acknowledge",
370
+ value: function _acknowledge(event) {
371
+ if (!event) {
372
+ return _promise.default.reject(new Error('`event` is required'));
373
+ }
374
+ if (!(0, _lodash.has)(event, 'data.id')) {
375
+ return _promise.default.reject(new Error('`event.data.id` is required'));
376
+ }
377
+
378
+ // Don't try to acknowledge if socket is not in open state
379
+ if (this.readyState !== _constants.SOCKET_READY_STATE.OPEN) {
380
+ return _promise.default.resolve(); // Silently ignore acknowledgment for closed sockets
381
+ }
382
+ return this.send({
383
+ messageId: event.data.id,
384
+ type: 'ack'
385
+ }).catch(function (error) {
386
+ // Gracefully handle send errors (like INVALID_STATE_ERROR) to prevent test issues
387
+ if (error.message === 'INVALID_STATE_ERROR') {
388
+ return _promise.default.resolve(); // Socket was closed, ignore the acknowledgment
389
+ }
390
+ throw error; // Re-throw other errors
391
+ });
392
+ }
393
+
394
+ /**
395
+ * Sends an auth message up the socket
396
+ * @private
397
+ * @returns {Promise}
398
+ */
399
+ }, {
400
+ key: "_authorize",
401
+ value: function _authorize() {
402
+ var _this5 = this;
403
+ return new _promise.default(function (resolve) {
404
+ _this5.logger.info("socket,".concat(_this5._domain, ": authorizing"));
405
+ _this5.send({
406
+ id: _uuid.default.v4(),
407
+ type: 'authorization',
408
+ data: {
409
+ token: _this5.token
410
+ },
411
+ trackingId: _this5.trackingId,
412
+ logLevelToken: _this5.logLevelToken
413
+ });
414
+ var _waitForBufferState = function waitForBufferState(event) {
415
+ if (!event.data.type && (event.data.data.eventType === 'mercury.buffer_state' || event.data.data.eventType === 'mercury.registration_status')) {
416
+ _this5.removeListener('message', _waitForBufferState);
417
+ _this5._ping();
418
+ resolve();
419
+ }
420
+ };
421
+ _this5.once('message', _waitForBufferState);
422
+ });
423
+ }
424
+
425
+ /**
426
+ * Deals with the fact that some browsers drop some close codes (but not
427
+ * close reasons).
428
+ * @param {CloseEvent} event
429
+ * @private
430
+ * @returns {CloseEvent}
431
+ */
432
+ }, {
433
+ key: "_fixCloseCode",
434
+ value: function _fixCloseCode(event) {
435
+ if (event.code === 1005 && event.reason) {
436
+ switch (event.reason.toLowerCase()) {
437
+ case 'replaced':
438
+ this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
439
+ event.code = 4000;
440
+ break;
441
+ case 'authentication failed':
442
+ case 'authentication did not happen within the timeout window of 30000 seconds.':
443
+ this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
444
+ event.code = 1008;
445
+ break;
446
+ default:
447
+ // do nothing
448
+ }
449
+ }
450
+ return event;
451
+ }
452
+
453
+ /**
454
+ * Sends a ping up the socket and confirms we get it back
455
+ * @param {[type]} id
456
+ * @private
457
+ * @returns {[type]}
458
+ */
459
+ }, {
460
+ key: "_ping",
461
+ value: function _ping(id) {
462
+ var _this6 = this;
463
+ var confirmPongId = function confirmPongId(event) {
464
+ try {
465
+ _this6.logger.debug("socket,".concat(_this6._domain, ": pong"), event.data.id);
466
+ if (event.data && event.data.id !== id) {
467
+ _this6.logger.info("socket,".concat(_this6._domain, ": received pong for wrong ping id, closing socket"));
468
+ _this6.logger.debug("socket,".concat(_this6._domain, ": expected"), id, 'received', event.data.id);
469
+ _this6.close({
470
+ code: 1000,
471
+ reason: 'Pong mismatch'
472
+ });
473
+ }
474
+ } catch (error) {
475
+ // This try/catch block was added as a debugging step; to the best of my
476
+ // knowledge, the above can never throw.
477
+ /* istanbul ignore next */
478
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in confirmPongId"), error);
479
+ }
480
+ };
481
+ var onPongNotReceived = function onPongNotReceived() {
482
+ try {
483
+ _this6.logger.info("socket,".concat(_this6._domain, ": pong not receive in expected period, closing socket"));
484
+ _this6.close({
485
+ code: 1000,
486
+ reason: 'Pong not received'
487
+ }).catch(function (reason) {
488
+ _this6.logger.warn("socket,".concat(_this6._domain, ": failed to close socket after missed pong"), reason);
489
+ });
490
+ } catch (error) {
491
+ // This try/catch block was added as a debugging step; to the best of my
492
+ // knowledge, the above can never throw.
493
+ /* istanbul ignore next */
494
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in onPongNotReceived"), error);
495
+ }
496
+ };
497
+ var scheduleNextPingAndCancelPongTimer = function scheduleNextPingAndCancelPongTimer() {
498
+ try {
499
+ clearTimeout(_this6.pongTimer);
500
+ _this6.pingTimer = (0, _commonTimers.safeSetTimeout)(function () {
501
+ return _this6._ping();
502
+ }, _this6.pingInterval);
503
+ } catch (error) {
504
+ // This try/catch block was added as a debugging step; to the best of my
505
+ // knowledge, the above can never throw.
506
+ /* istanbul ignore next */
507
+ _this6.logger.error("socket,".concat(_this6._domain, ": error occurred in scheduleNextPingAndCancelPongTimer"), error);
508
+ }
509
+ };
510
+ var calculateLatency = function calculateLatency(pingTimestamp) {
511
+ var now = performance.now();
512
+ var latency = now - pingTimestamp;
513
+ _this6.logger.debug("socket,".concat(_this6._domain, ": latency: "), latency);
514
+ _this6.emit('ping-pong-latency', latency);
515
+ };
516
+ id = id || _uuid.default.v4();
517
+ var pingTimestamp = performance.now();
518
+ this.pongTimer = (0, _commonTimers.safeSetTimeout)(onPongNotReceived, this.pongTimeout);
519
+ this.once('pong', scheduleNextPingAndCancelPongTimer);
520
+ this.once('pong', confirmPongId);
521
+ this.once('pong', function () {
522
+ return calculateLatency(pingTimestamp);
523
+ });
524
+ this.logger.debug("socket,".concat(this._domain, ": ping ").concat(id));
525
+ return this.send({
526
+ id: id,
527
+ type: 'ping'
528
+ });
529
+ }
530
+ }], [{
531
+ key: "getWebSocketConstructor",
532
+ value: function getWebSocketConstructor() {
533
+ throw new Error('Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way');
534
+ }
535
+ }]);
536
+ }(_events.EventEmitter);
537
+ //# sourceMappingURL=socket-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_events","require","_common","_commonTimers","_lodash","_uuid","_interopRequireDefault","_errors","_constants","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","sockets","_weakMap","Socket","exports","_EventEmitter","_this","_classCallCheck2","_domain","onmessage","bind","onclose","setMaxListeners","_inherits2","_createClass2","key","get","binaryType","bufferedAmount","extensions","protocol","readyState","url","value","close","options","_this2","_promise","resolve","reject","socket","logger","info","concat","SOCKET_READY_STATE","CLOSING","CLOSED","code","Error","originalCode","originalReason","reason","defaults","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","CONNECTING","closeEvent","open","_this3","URL","hostname","_unused","checkRequired","_keys","forEach","_defineProperty","enumerable","WebSocket","getWebSocketConstructor","_fixCloseCode","UnknownResponse","BadRequest","NotAuthorized","Forbidden","ConnectionError","onopen","_authorize","then","catch","onerror","set","pongTimer","pingTimer","emit","removeAllListeners","data","JSON","parse","sequenceNumber","_parseInt2","debug","expectedSequenceNumber","processedEvent","_acknowledge","type","send","_this4","OPEN","isObject","_stringify","has","messageId","id","message","_this5","uuid","v4","token","trackingId","logLevelToken","waitForBufferState","eventType","removeListener","_ping","once","toLowerCase","_this6","confirmPongId","onPongNotReceived","scheduleNextPingAndCancelPongTimer","pingInterval","calculateLatency","pingTimestamp","now","performance","latency","pongTimeout","EventEmitter"],"sources":["socket-base.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\nimport {checkRequired} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\nimport uuid from 'uuid';\n\nimport {\n BadRequest,\n ConnectionError,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n // NotFound\n} from '../errors';\nimport {SOCKET_READY_STATE} from './constants';\n\nconst sockets = new WeakMap();\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n /**\n * constructor\n * @returns {Socket}\n */\n constructor() {\n super();\n this._domain = 'unknown-domain';\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n // Increase max listeners to avoid memory leak warning in tests\n this.setMaxListeners(10);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get binaryType() {\n return sockets.get(this).binaryType;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n get bufferedAmount() {\n return sockets.get(this).bufferedAmount;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get extensions() {\n return sockets.get(this).extensions;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get protocol() {\n return sockets.get(this).protocol;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n get readyState() {\n return sockets.get(this).readyState;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n get url() {\n return sockets.get(this).url;\n }\n\n /**\n * Provides the environmentally appropriate constructor (ws in NodeJS,\n * WebSocket in browsers)\n * @returns {WebSocket}\n */\n static getWebSocketConstructor() {\n throw new Error(\n 'Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way'\n );\n }\n\n /**\n * Closes the socket\n * @param {Object} options\n * @param {string} options.reason\n * @param {number} options.code\n * @returns {Promise}\n */\n close(options) {\n return new Promise((resolve, reject) => {\n const socket = sockets.get(this);\n\n if (!socket) {\n // Open has not been called yet so there is no socket to close\n resolve();\n\n return;\n }\n // logger is defined once open is called\n this.logger.info(`socket,${this._domain}: closing`);\n\n if (\n socket.readyState === SOCKET_READY_STATE.CLOSING ||\n socket.readyState === SOCKET_READY_STATE.CLOSED\n ) {\n this.logger.info(`socket,${this._domain}: already closed`);\n resolve();\n\n return;\n }\n\n options = options || {};\n if (options.code && options.code !== 1000 && (options.code < 3000 || options.code > 4999)) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\n }\n\n const originalCode = options.code;\n const originalReason = options.reason;\n\n options = defaults(options, {\n code: 1000,\n reason: 'Done',\n });\n\n const closeTimer = safeSetTimeout(() => {\n try {\n this.logger.info(`socket,${this._domain}: no close event received, forcing closure`);\n resolve(\n this.onclose(\n originalCode\n ? {code: originalCode, reason: originalReason || 'Done (unknown)'}\n : {\n code: 1000,\n reason: 'Done (forced)',\n }\n )\n );\n } catch (error) {\n this.logger.warn(`socket,${this._domain}: force-close failed`, error);\n }\n }, this.forceCloseDelay);\n\n socket.onclose = (event) => {\n this.logger.info(`socket,${this._domain}: close event fired`, event.code, event.reason);\n clearTimeout(closeTimer);\n this.onclose(event);\n resolve(event);\n };\n\n // If socket is still connecting, manually trigger close handler with desired code\n // because calling close() on a CONNECTING socket may not preserve custom codes\n if (socket.readyState === SOCKET_READY_STATE.CONNECTING) {\n this.logger.info(\n `socket,${this._domain}: socket still connecting, triggering close manually`\n );\n clearTimeout(closeTimer);\n const closeEvent = {code: options.code, reason: options.reason};\n this.onclose(closeEvent);\n resolve(closeEvent);\n try {\n socket.close(options.code, options.reason);\n } catch (error) {\n this.logger.info(\n `socket,${this._domain}: error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes`,\n error\n );\n }\n } else {\n socket.close(options.code, options.reason);\n }\n });\n }\n\n /**\n * Opens a WebSocket\n * @param {string} url\n * @param {options} options\n * @param {number} options.forceCloseDelay (required)\n * @param {number} options.pingInterval (required)\n * @param {number} options.pongTimeout (required)\n * @param {string} options.token (required)\n * @param {string} options.trackingId (required)\n * @param {Logger} options.logger (required)\n * @param {string} options.logLevelToken\n * @returns {Promise}\n */\n open(url, options) {\n try {\n this._domain = new URL(url).hostname;\n } catch {\n this._domain = url;\n }\n\n return new Promise((resolve, reject) => {\n /* eslint complexity: [0] */\n if (!url) {\n reject(new Error('`url` is required'));\n\n return;\n }\n\n if (sockets.get(this)) {\n reject(new Error('Socket#open() can only be called once per instance'));\n\n return;\n }\n\n options = options || {};\n\n checkRequired(\n ['forceCloseDelay', 'pingInterval', 'pongTimeout', 'token', 'trackingId', 'logger'],\n options\n );\n\n Object.keys(options).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: options[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor();\n\n this.logger.info(`socket,${this._domain}: creating WebSocket`);\n const socket = new WebSocket(url, [], options);\n\n socket.binaryType = 'arraybuffer';\n socket.onmessage = this.onmessage;\n\n socket.onclose = (event) => {\n event = this._fixCloseCode(event);\n this.logger.info(`socket,${this._domain}: closed before open`, event.code, event.reason);\n switch (event.code) {\n case 1005:\n // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume\n // it's a bad websocket url. That'll trigger a device refresh; if it\n // turns out we had a bad token, the device refresh should 401 and\n // trigger a token refresh.\n return reject(new UnknownResponse(event));\n case 4400:\n return reject(new BadRequest(event));\n case 4401:\n return reject(new NotAuthorized(event));\n case 4403:\n return reject(new Forbidden(event));\n // case 4404:\n // return reject(new NotFound(event));\n default:\n return reject(new ConnectionError(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info(`socket,${this._domain}: connected`);\n this._authorize()\n .then(() => {\n this.logger.info(`socket,${this._domain}: authorized`);\n socket.onclose = this.onclose;\n resolve();\n })\n .catch(reject);\n };\n\n socket.onerror = (event) => {\n this.logger.warn(`socket,${this._domain}: error event fired`, event);\n };\n\n sockets.set(this, socket);\n this.logger.info(`socket,${this._domain}: waiting for server`);\n });\n }\n\n /**\n * Handles incoming CloseEvents\n * @param {CloseEvent} event\n * @returns {undefined}\n */\n onclose(event) {\n this.logger.info(`socket,${this._domain}: closed`, event.code, event.reason);\n clearTimeout(this.pongTimer);\n clearTimeout(this.pingTimer);\n\n event = this._fixCloseCode(event);\n this.emit('close', event);\n\n // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure\n // we don't have a retain cycle.\n this.removeAllListeners();\n }\n\n /**\n * Handles incoming message events\n * @param {MessageEvent} event\n * @returns {undefined}\n */\n onmessage(event) {\n try {\n const data = JSON.parse(event.data);\n const sequenceNumber = parseInt(data.sequenceNumber, 10);\n\n this.logger.debug(`socket,${this._domain}: sequence number: `, sequenceNumber);\n if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {\n this.logger.debug(\n `socket,${this._domain}: sequence number mismatch indicates lost mercury message. expected: ${this.expectedSequenceNumber}, actual: ${sequenceNumber}`\n );\n this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);\n }\n this.expectedSequenceNumber = sequenceNumber + 1;\n\n // Yes, it's a little weird looking; we want to emit message events that\n // look like normal socket message events, but event.data cannot be\n // modified and we don't actually care about anything but the data property\n const processedEvent = {data};\n\n this._acknowledge(processedEvent);\n if (data.type === 'pong') {\n this.emit('pong', processedEvent);\n } else {\n this.emit('message', processedEvent);\n }\n } catch (error) {\n // The above code should only be able to throw if we receive an unparsable\n // message from Mercury. At this time, the only action we have is to\n // ignore it and move on.\n /* istanbul ignore next */\n this.logger.warn(`socket,${this._domain}: error while receiving WebSocket message`, error);\n }\n }\n\n /**\n * Sends a message up the socket\n * @param {mixed} data\n * @returns {Promise}\n */\n send(data) {\n return new Promise((resolve, reject) => {\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n return reject(new Error('INVALID_STATE_ERROR'));\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n socket.send(data);\n\n return resolve();\n });\n }\n\n /**\n * Sends an acknowledgment for a specific event\n * @param {MessageEvent} event\n * @returns {Promise}\n */\n _acknowledge(event) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.id')) {\n return Promise.reject(new Error('`event.data.id` is required'));\n }\n\n // Don't try to acknowledge if socket is not in open state\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n return Promise.resolve(); // Silently ignore acknowledgment for closed sockets\n }\n\n return this.send({\n messageId: event.data.id,\n type: 'ack',\n }).catch((error) => {\n // Gracefully handle send errors (like INVALID_STATE_ERROR) to prevent test issues\n if (error.message === 'INVALID_STATE_ERROR') {\n return Promise.resolve(); // Socket was closed, ignore the acknowledgment\n }\n throw error; // Re-throw other errors\n });\n }\n\n /**\n * Sends an auth message up the socket\n * @private\n * @returns {Promise}\n */\n _authorize() {\n return new Promise((resolve) => {\n this.logger.info(`socket,${this._domain}: authorizing`);\n this.send({\n id: uuid.v4(),\n type: 'authorization',\n data: {\n token: this.token,\n },\n trackingId: this.trackingId,\n logLevelToken: this.logLevelToken,\n });\n\n const waitForBufferState = (event) => {\n if (\n !event.data.type &&\n (event.data.data.eventType === 'mercury.buffer_state' ||\n event.data.data.eventType === 'mercury.registration_status')\n ) {\n this.removeListener('message', waitForBufferState);\n this._ping();\n resolve();\n }\n };\n\n this.once('message', waitForBufferState);\n });\n }\n\n /**\n * Deals with the fact that some browsers drop some close codes (but not\n * close reasons).\n * @param {CloseEvent} event\n * @private\n * @returns {CloseEvent}\n */\n _fixCloseCode(event) {\n if (event.code === 1005 && event.reason) {\n switch (event.reason.toLowerCase()) {\n case 'replaced':\n this.logger.info(\n `socket,${this._domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 4000;\n break;\n case 'authentication failed':\n case 'authentication did not happen within the timeout window of 30000 seconds.':\n this.logger.info(\n `socket,${this._domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 1008;\n break;\n default:\n // do nothing\n }\n }\n\n return event;\n }\n\n /**\n * Sends a ping up the socket and confirms we get it back\n * @param {[type]} id\n * @private\n * @returns {[type]}\n */\n _ping(id) {\n const confirmPongId = (event) => {\n try {\n this.logger.debug(`socket,${this._domain}: pong`, event.data.id);\n if (event.data && event.data.id !== id) {\n this.logger.info(\n `socket,${this._domain}: received pong for wrong ping id, closing socket`\n );\n this.logger.debug(`socket,${this._domain}: expected`, id, 'received', event.data.id);\n this.close({\n code: 1000,\n reason: 'Pong mismatch',\n });\n }\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error(`socket,${this._domain}: error occurred in confirmPongId`, error);\n }\n };\n\n const onPongNotReceived = () => {\n try {\n this.logger.info(\n `socket,${this._domain}: pong not receive in expected period, closing socket`\n );\n this.close({\n code: 1000,\n reason: 'Pong not received',\n }).catch((reason) => {\n this.logger.warn(\n `socket,${this._domain}: failed to close socket after missed pong`,\n reason\n );\n });\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error(`socket,${this._domain}: error occurred in onPongNotReceived`, error);\n }\n };\n\n const scheduleNextPingAndCancelPongTimer = () => {\n try {\n clearTimeout(this.pongTimer);\n this.pingTimer = safeSetTimeout(() => this._ping(), this.pingInterval);\n } catch (error) {\n // This try/catch block was added as a debugging step; to the best of my\n // knowledge, the above can never throw.\n /* istanbul ignore next */\n this.logger.error(\n `socket,${this._domain}: error occurred in scheduleNextPingAndCancelPongTimer`,\n error\n );\n }\n };\n\n const calculateLatency = (pingTimestamp) => {\n const now = performance.now();\n const latency = now - pingTimestamp;\n\n this.logger.debug(`socket,${this._domain}: latency: `, latency);\n this.emit('ping-pong-latency', latency);\n };\n\n id = id || uuid.v4();\n const pingTimestamp = performance.now();\n\n this.pongTimer = safeSetTimeout(onPongNotReceived, this.pongTimeout);\n this.once('pong', scheduleNextPingAndCancelPongTimer);\n this.once('pong', confirmPongId);\n this.once('pong', () => calculateLatency(pingTimestamp));\n this.logger.debug(`socket,${this._domain}: ping ${id}`);\n\n return this.send({\n id,\n type: 'ping',\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAC,sBAAA,CAAAL,OAAA;AAEA,IAAAM,OAAA,GAAAN,OAAA;AAQA,IAAAO,UAAA,GAAAP,OAAA;AAA+C,SAAAQ,WAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,WAAAD,CAAA,OAAAE,gBAAA,CAAAC,OAAA,EAAAH,CAAA,OAAAI,2BAAA,CAAAD,OAAA,EAAAJ,CAAA,EAAAM,yBAAA,KAAAC,kBAAA,CAAAN,CAAA,EAAAC,CAAA,YAAAC,gBAAA,CAAAC,OAAA,EAAAJ,CAAA,EAAAQ,WAAA,IAAAP,CAAA,CAAAQ,KAAA,CAAAT,CAAA,EAAAE,CAAA;AAAA,SAAAI,0BAAA,cAAAN,CAAA,IAAAU,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAN,kBAAA,CAAAG,OAAA,iCAAAV,CAAA,aAAAM,yBAAA,YAAAA,0BAAA,aAAAN,CAAA,UAnB/C;AACA;AACA;AAmBA,IAAMc,OAAO,GAAG,IAAAC,QAAA,CAAAX,OAAA,CAAY,CAAC;;AAE7B;AACA;AACA;AAFA,IAGqBY,MAAM,GAAAC,OAAA,CAAAb,OAAA,0BAAAc,aAAA;EACzB;AACF;AACA;AACA;EACE,SAAAF,OAAA,EAAc;IAAA,IAAAG,KAAA;IAAA,IAAAC,gBAAA,CAAAhB,OAAA,QAAAY,MAAA;IACZG,KAAA,GAAApB,UAAA,OAAAiB,MAAA;IACAG,KAAA,CAAKE,OAAO,GAAG,gBAAgB;IAC/BF,KAAA,CAAKG,SAAS,GAAGH,KAAA,CAAKG,SAAS,CAACC,IAAI,CAAAJ,KAAK,CAAC;IAC1CA,KAAA,CAAKK,OAAO,GAAGL,KAAA,CAAKK,OAAO,CAACD,IAAI,CAAAJ,KAAK,CAAC;IACtC;IACAA,KAAA,CAAKM,eAAe,CAAC,EAAE,CAAC;IAAC,OAAAN,KAAA;EAC3B;;EAEA;AACF;AACA;AACA;EAHE,IAAAO,UAAA,CAAAtB,OAAA,EAAAY,MAAA,EAAAE,aAAA;EAAA,WAAAS,aAAA,CAAAvB,OAAA,EAAAY,MAAA;IAAAY,GAAA;IAAAC,GAAA,EAIA,SAAAA,IAAA,EAAiB;MACf,OAAOf,OAAO,CAACe,GAAG,CAAC,IAAI,CAAC,CAACC,UAAU;IACrC;;IAEA;AACF;AACA;AACA;EAHE;IAAAF,GAAA;IAAAC,GAAA,EAIA,SAAAA,IAAA,EAAqB;MACnB,OAAOf,OAAO,CAACe,GAAG,CAAC,IAAI,CAAC,CAACE,cAAc;IACzC;;IAEA;AACF;AACA;AACA;EAHE;IAAAH,GAAA;IAAAC,GAAA,EAIA,SAAAA,IAAA,EAAiB;MACf,OAAOf,OAAO,CAACe,GAAG,CAAC,IAAI,CAAC,CAACG,UAAU;IACrC;;IAEA;AACF;AACA;AACA;EAHE;IAAAJ,GAAA;IAAAC,GAAA,EAIA,SAAAA,IAAA,EAAe;MACb,OAAOf,OAAO,CAACe,GAAG,CAAC,IAAI,CAAC,CAACI,QAAQ;IACnC;;IAEA;AACF;AACA;AACA;EAHE;IAAAL,GAAA;IAAAC,GAAA,EAIA,SAAAA,IAAA,EAAiB;MACf,OAAOf,OAAO,CAACe,GAAG,CAAC,IAAI,CAAC,CAACK,UAAU;IACrC;;IAEA;AACF;AACA;AACA;EAHE;IAAAN,GAAA;IAAAC,GAAA,EAIA,SAAAA,IAAA,EAAU;MACR,OAAOf,OAAO,CAACe,GAAG,CAAC,IAAI,CAAC,CAACM,GAAG;IAC9B;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAP,GAAA;IAAAQ,KAAA;IAWA;AACF;AACA;AACA;AACA;AACA;AACA;IACE,SAAAC,KAAKA,CAACC,OAAO,EAAE;MAAA,IAAAC,MAAA;MACb,OAAO,IAAAC,QAAA,CAAApC,OAAA,CAAY,UAACqC,OAAO,EAAEC,MAAM,EAAK;QACtC,IAAMC,MAAM,GAAG7B,OAAO,CAACe,GAAG,CAACU,MAAI,CAAC;QAEhC,IAAI,CAACI,MAAM,EAAE;UACX;UACAF,OAAO,CAAC,CAAC;UAET;QACF;QACA;QACAF,MAAI,CAACK,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWP,MAAI,CAAClB,OAAO,cAAW,CAAC;QAEnD,IACEsB,MAAM,CAACT,UAAU,KAAKa,6BAAkB,CAACC,OAAO,IAChDL,MAAM,CAACT,UAAU,KAAKa,6BAAkB,CAACE,MAAM,EAC/C;UACAV,MAAI,CAACK,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWP,MAAI,CAAClB,OAAO,qBAAkB,CAAC;UAC1DoB,OAAO,CAAC,CAAC;UAET;QACF;QAEAH,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;QACvB,IAAIA,OAAO,CAACY,IAAI,IAAIZ,OAAO,CAACY,IAAI,KAAK,IAAI,KAAKZ,OAAO,CAACY,IAAI,GAAG,IAAI,IAAIZ,OAAO,CAACY,IAAI,GAAG,IAAI,CAAC,EAAE;UACzFR,MAAM,CAAC,IAAIS,KAAK,CAAC,kEAAkE,CAAC,CAAC;UAErF;QACF;QAEA,IAAMC,YAAY,GAAGd,OAAO,CAACY,IAAI;QACjC,IAAMG,cAAc,GAAGf,OAAO,CAACgB,MAAM;QAErChB,OAAO,GAAG,IAAAiB,gBAAQ,EAACjB,OAAO,EAAE;UAC1BY,IAAI,EAAE,IAAI;UACVI,MAAM,EAAE;QACV,CAAC,CAAC;QAEF,IAAME,UAAU,GAAG,IAAAC,4BAAc,EAAC,YAAM;UACtC,IAAI;YACFlB,MAAI,CAACK,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWP,MAAI,CAAClB,OAAO,+CAA4C,CAAC;YACpFoB,OAAO,CACLF,MAAI,CAACf,OAAO,CACV4B,YAAY,GACR;cAACF,IAAI,EAAEE,YAAY;cAAEE,MAAM,EAAED,cAAc,IAAI;YAAgB,CAAC,GAChE;cACEH,IAAI,EAAE,IAAI;cACVI,MAAM,EAAE;YACV,CACN,CACF,CAAC;UACH,CAAC,CAAC,OAAOI,KAAK,EAAE;YACdnB,MAAI,CAACK,MAAM,CAACe,IAAI,WAAAb,MAAA,CAAWP,MAAI,CAAClB,OAAO,2BAAwBqC,KAAK,CAAC;UACvE;QACF,CAAC,EAAEnB,MAAI,CAACqB,eAAe,CAAC;QAExBjB,MAAM,CAACnB,OAAO,GAAG,UAACqC,KAAK,EAAK;UAC1BtB,MAAI,CAACK,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWP,MAAI,CAAClB,OAAO,0BAAuBwC,KAAK,CAACX,IAAI,EAAEW,KAAK,CAACP,MAAM,CAAC;UACvFQ,YAAY,CAACN,UAAU,CAAC;UACxBjB,MAAI,CAACf,OAAO,CAACqC,KAAK,CAAC;UACnBpB,OAAO,CAACoB,KAAK,CAAC;QAChB,CAAC;;QAED;QACA;QACA,IAAIlB,MAAM,CAACT,UAAU,KAAKa,6BAAkB,CAACgB,UAAU,EAAE;UACvDxB,MAAI,CAACK,MAAM,CAACC,IAAI,WAAAC,MAAA,CACJP,MAAI,CAAClB,OAAO,yDACxB,CAAC;UACDyC,YAAY,CAACN,UAAU,CAAC;UACxB,IAAMQ,UAAU,GAAG;YAACd,IAAI,EAAEZ,OAAO,CAACY,IAAI;YAAEI,MAAM,EAAEhB,OAAO,CAACgB;UAAM,CAAC;UAC/Df,MAAI,CAACf,OAAO,CAACwC,UAAU,CAAC;UACxBvB,OAAO,CAACuB,UAAU,CAAC;UACnB,IAAI;YACFrB,MAAM,CAACN,KAAK,CAACC,OAAO,CAACY,IAAI,EAAEZ,OAAO,CAACgB,MAAM,CAAC;UAC5C,CAAC,CAAC,OAAOI,KAAK,EAAE;YACdnB,MAAI,CAACK,MAAM,CAACC,IAAI,WAAAC,MAAA,CACJP,MAAI,CAAClB,OAAO,6GACtBqC,KACF,CAAC;UACH;QACF,CAAC,MAAM;UACLf,MAAM,CAACN,KAAK,CAACC,OAAO,CAACY,IAAI,EAAEZ,OAAO,CAACgB,MAAM,CAAC;QAC5C;MACF,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAZE;IAAA1B,GAAA;IAAAQ,KAAA,EAaA,SAAA6B,IAAIA,CAAC9B,GAAG,EAAEG,OAAO,EAAE;MAAA,IAAA4B,MAAA;MACjB,IAAI;QACF,IAAI,CAAC7C,OAAO,GAAG,IAAI8C,GAAG,CAAChC,GAAG,CAAC,CAACiC,QAAQ;MACtC,CAAC,CAAC,OAAAC,OAAA,EAAM;QACN,IAAI,CAAChD,OAAO,GAAGc,GAAG;MACpB;MAEA,OAAO,IAAAK,QAAA,CAAApC,OAAA,CAAY,UAACqC,OAAO,EAAEC,MAAM,EAAK;QACtC;QACA,IAAI,CAACP,GAAG,EAAE;UACRO,MAAM,CAAC,IAAIS,KAAK,CAAC,mBAAmB,CAAC,CAAC;UAEtC;QACF;QAEA,IAAIrC,OAAO,CAACe,GAAG,CAACqC,MAAI,CAAC,EAAE;UACrBxB,MAAM,CAAC,IAAIS,KAAK,CAAC,oDAAoD,CAAC,CAAC;UAEvE;QACF;QAEAb,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;QAEvB,IAAAgC,qBAAa,EACX,CAAC,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EACnFhC,OACF,CAAC;QAED,IAAAiC,KAAA,CAAAnE,OAAA,EAAYkC,OAAO,CAAC,CAACkC,OAAO,CAAC,UAAC5C,GAAG,EAAK;UACpC,IAAA6C,eAAA,CAAArE,OAAA,EAAuB8D,MAAI,EAAEtC,GAAG,EAAE;YAChC8C,UAAU,EAAE,KAAK;YACjBtC,KAAK,EAAEE,OAAO,CAACV,GAAG;UACpB,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,IAAM+C,SAAS,GAAG3D,MAAM,CAAC4D,uBAAuB,CAAC,CAAC;QAElDV,MAAI,CAACtB,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWoB,MAAI,CAAC7C,OAAO,yBAAsB,CAAC;QAC9D,IAAMsB,MAAM,GAAG,IAAIgC,SAAS,CAACxC,GAAG,EAAE,EAAE,EAAEG,OAAO,CAAC;QAE9CK,MAAM,CAACb,UAAU,GAAG,aAAa;QACjCa,MAAM,CAACrB,SAAS,GAAG4C,MAAI,CAAC5C,SAAS;QAEjCqB,MAAM,CAACnB,OAAO,GAAG,UAACqC,KAAK,EAAK;UAC1BA,KAAK,GAAGK,MAAI,CAACW,aAAa,CAAChB,KAAK,CAAC;UACjCK,MAAI,CAACtB,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWoB,MAAI,CAAC7C,OAAO,2BAAwBwC,KAAK,CAACX,IAAI,EAAEW,KAAK,CAACP,MAAM,CAAC;UACxF,QAAQO,KAAK,CAACX,IAAI;YAChB,KAAK,IAAI;cACP;cACA;cACA;cACA;cACA,OAAOR,MAAM,CAAC,IAAIoC,uBAAe,CAACjB,KAAK,CAAC,CAAC;YAC3C,KAAK,IAAI;cACP,OAAOnB,MAAM,CAAC,IAAIqC,kBAAU,CAAClB,KAAK,CAAC,CAAC;YACtC,KAAK,IAAI;cACP,OAAOnB,MAAM,CAAC,IAAIsC,qBAAa,CAACnB,KAAK,CAAC,CAAC;YACzC,KAAK,IAAI;cACP,OAAOnB,MAAM,CAAC,IAAIuC,iBAAS,CAACpB,KAAK,CAAC,CAAC;YACrC;YACA;YACA;cACE,OAAOnB,MAAM,CAAC,IAAIwC,uBAAe,CAACrB,KAAK,CAAC,CAAC;UAC7C;QACF,CAAC;QAEDlB,MAAM,CAACwC,MAAM,GAAG,YAAM;UACpBjB,MAAI,CAACtB,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWoB,MAAI,CAAC7C,OAAO,gBAAa,CAAC;UACrD6C,MAAI,CAACkB,UAAU,CAAC,CAAC,CACdC,IAAI,CAAC,YAAM;YACVnB,MAAI,CAACtB,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWoB,MAAI,CAAC7C,OAAO,iBAAc,CAAC;YACtDsB,MAAM,CAACnB,OAAO,GAAG0C,MAAI,CAAC1C,OAAO;YAC7BiB,OAAO,CAAC,CAAC;UACX,CAAC,CAAC,CACD6C,KAAK,CAAC5C,MAAM,CAAC;QAClB,CAAC;QAEDC,MAAM,CAAC4C,OAAO,GAAG,UAAC1B,KAAK,EAAK;UAC1BK,MAAI,CAACtB,MAAM,CAACe,IAAI,WAAAb,MAAA,CAAWoB,MAAI,CAAC7C,OAAO,0BAAuBwC,KAAK,CAAC;QACtE,CAAC;QAED/C,OAAO,CAAC0E,GAAG,CAACtB,MAAI,EAAEvB,MAAM,CAAC;QACzBuB,MAAI,CAACtB,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWoB,MAAI,CAAC7C,OAAO,yBAAsB,CAAC;MAChE,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAO,GAAA;IAAAQ,KAAA,EAKA,SAAAZ,OAAOA,CAACqC,KAAK,EAAE;MACb,IAAI,CAACjB,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAW,IAAI,CAACzB,OAAO,eAAYwC,KAAK,CAACX,IAAI,EAAEW,KAAK,CAACP,MAAM,CAAC;MAC5EQ,YAAY,CAAC,IAAI,CAAC2B,SAAS,CAAC;MAC5B3B,YAAY,CAAC,IAAI,CAAC4B,SAAS,CAAC;MAE5B7B,KAAK,GAAG,IAAI,CAACgB,aAAa,CAAChB,KAAK,CAAC;MACjC,IAAI,CAAC8B,IAAI,CAAC,OAAO,EAAE9B,KAAK,CAAC;;MAEzB;MACA;MACA,IAAI,CAAC+B,kBAAkB,CAAC,CAAC;IAC3B;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAhE,GAAA;IAAAQ,KAAA,EAKA,SAAAd,SAASA,CAACuC,KAAK,EAAE;MACf,IAAI;QACF,IAAMgC,IAAI,GAAGC,IAAI,CAACC,KAAK,CAAClC,KAAK,CAACgC,IAAI,CAAC;QACnC,IAAMG,cAAc,GAAG,IAAAC,UAAA,CAAA7F,OAAA,EAASyF,IAAI,CAACG,cAAc,EAAE,EAAE,CAAC;QAExD,IAAI,CAACpD,MAAM,CAACsD,KAAK,WAAApD,MAAA,CAAW,IAAI,CAACzB,OAAO,0BAAuB2E,cAAc,CAAC;QAC9E,IAAI,IAAI,CAACG,sBAAsB,IAAIH,cAAc,KAAK,IAAI,CAACG,sBAAsB,EAAE;UACjF,IAAI,CAACvD,MAAM,CAACsD,KAAK,WAAApD,MAAA,CACL,IAAI,CAACzB,OAAO,2EAAAyB,MAAA,CAAwE,IAAI,CAACqD,sBAAsB,gBAAArD,MAAA,CAAakD,cAAc,CACtJ,CAAC;UACD,IAAI,CAACL,IAAI,CAAC,mBAAmB,EAAEK,cAAc,EAAE,IAAI,CAACG,sBAAsB,CAAC;QAC7E;QACA,IAAI,CAACA,sBAAsB,GAAGH,cAAc,GAAG,CAAC;;QAEhD;QACA;QACA;QACA,IAAMI,cAAc,GAAG;UAACP,IAAI,EAAJA;QAAI,CAAC;QAE7B,IAAI,CAACQ,YAAY,CAACD,cAAc,CAAC;QACjC,IAAIP,IAAI,CAACS,IAAI,KAAK,MAAM,EAAE;UACxB,IAAI,CAACX,IAAI,CAAC,MAAM,EAAES,cAAc,CAAC;QACnC,CAAC,MAAM;UACL,IAAI,CAACT,IAAI,CAAC,SAAS,EAAES,cAAc,CAAC;QACtC;MACF,CAAC,CAAC,OAAO1C,KAAK,EAAE;QACd;QACA;QACA;QACA;QACA,IAAI,CAACd,MAAM,CAACe,IAAI,WAAAb,MAAA,CAAW,IAAI,CAACzB,OAAO,gDAA6CqC,KAAK,CAAC;MAC5F;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA9B,GAAA;IAAAQ,KAAA,EAKA,SAAAmE,IAAIA,CAACV,IAAI,EAAE;MAAA,IAAAW,MAAA;MACT,OAAO,IAAAhE,QAAA,CAAApC,OAAA,CAAY,UAACqC,OAAO,EAAEC,MAAM,EAAK;QACtC,IAAI8D,MAAI,CAACtE,UAAU,KAAKa,6BAAkB,CAAC0D,IAAI,EAAE;UAC/C,OAAO/D,MAAM,CAAC,IAAIS,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACjD;QAEA,IAAI,IAAAuD,gBAAQ,EAACb,IAAI,CAAC,EAAE;UAClBA,IAAI,GAAG,IAAAc,UAAA,CAAAvG,OAAA,EAAeyF,IAAI,CAAC;QAC7B;QAEA,IAAMlD,MAAM,GAAG7B,OAAO,CAACe,GAAG,CAAC2E,MAAI,CAAC;QAEhC7D,MAAM,CAAC4D,IAAI,CAACV,IAAI,CAAC;QAEjB,OAAOpD,OAAO,CAAC,CAAC;MAClB,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAb,GAAA;IAAAQ,KAAA,EAKA,SAAAiE,YAAYA,CAACxC,KAAK,EAAE;MAClB,IAAI,CAACA,KAAK,EAAE;QACV,OAAOrB,QAAA,CAAApC,OAAA,CAAQsC,MAAM,CAAC,IAAIS,KAAK,CAAC,qBAAqB,CAAC,CAAC;MACzD;MAEA,IAAI,CAAC,IAAAyD,WAAG,EAAC/C,KAAK,EAAE,SAAS,CAAC,EAAE;QAC1B,OAAOrB,QAAA,CAAApC,OAAA,CAAQsC,MAAM,CAAC,IAAIS,KAAK,CAAC,6BAA6B,CAAC,CAAC;MACjE;;MAEA;MACA,IAAI,IAAI,CAACjB,UAAU,KAAKa,6BAAkB,CAAC0D,IAAI,EAAE;QAC/C,OAAOjE,QAAA,CAAApC,OAAA,CAAQqC,OAAO,CAAC,CAAC,CAAC,CAAC;MAC5B;MAEA,OAAO,IAAI,CAAC8D,IAAI,CAAC;QACfM,SAAS,EAAEhD,KAAK,CAACgC,IAAI,CAACiB,EAAE;QACxBR,IAAI,EAAE;MACR,CAAC,CAAC,CAAChB,KAAK,CAAC,UAAC5B,KAAK,EAAK;QAClB;QACA,IAAIA,KAAK,CAACqD,OAAO,KAAK,qBAAqB,EAAE;UAC3C,OAAOvE,QAAA,CAAApC,OAAA,CAAQqC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B;QACA,MAAMiB,KAAK,CAAC,CAAC;MACf,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA9B,GAAA;IAAAQ,KAAA,EAKA,SAAAgD,UAAUA,CAAA,EAAG;MAAA,IAAA4B,MAAA;MACX,OAAO,IAAAxE,QAAA,CAAApC,OAAA,CAAY,UAACqC,OAAO,EAAK;QAC9BuE,MAAI,CAACpE,MAAM,CAACC,IAAI,WAAAC,MAAA,CAAWkE,MAAI,CAAC3F,OAAO,kBAAe,CAAC;QACvD2F,MAAI,CAACT,IAAI,CAAC;UACRO,EAAE,EAAEG,aAAI,CAACC,EAAE,CAAC,CAAC;UACbZ,IAAI,EAAE,eAAe;UACrBT,IAAI,EAAE;YACJsB,KAAK,EAAEH,MAAI,CAACG;UACd,CAAC;UACDC,UAAU,EAAEJ,MAAI,CAACI,UAAU;UAC3BC,aAAa,EAAEL,MAAI,CAACK;QACtB,CAAC,CAAC;QAEF,IAAMC,mBAAkB,GAAG,SAArBA,kBAAkBA,CAAIzD,KAAK,EAAK;UACpC,IACE,CAACA,KAAK,CAACgC,IAAI,CAACS,IAAI,KACfzC,KAAK,CAACgC,IAAI,CAACA,IAAI,CAAC0B,SAAS,KAAK,sBAAsB,IACnD1D,KAAK,CAACgC,IAAI,CAACA,IAAI,CAAC0B,SAAS,KAAK,6BAA6B,CAAC,EAC9D;YACAP,MAAI,CAACQ,cAAc,CAAC,SAAS,EAAEF,mBAAkB,CAAC;YAClDN,MAAI,CAACS,KAAK,CAAC,CAAC;YACZhF,OAAO,CAAC,CAAC;UACX;QACF,CAAC;QAEDuE,MAAI,CAACU,IAAI,CAAC,SAAS,EAAEJ,mBAAkB,CAAC;MAC1C,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA1F,GAAA;IAAAQ,KAAA,EAOA,SAAAyC,aAAaA,CAAChB,KAAK,EAAE;MACnB,IAAIA,KAAK,CAACX,IAAI,KAAK,IAAI,IAAIW,KAAK,CAACP,MAAM,EAAE;QACvC,QAAQO,KAAK,CAACP,MAAM,CAACqE,WAAW,CAAC,CAAC;UAChC,KAAK,UAAU;YACb,IAAI,CAAC/E,MAAM,CAACC,IAAI,WAAAC,MAAA,CACJ,IAAI,CAACzB,OAAO,4CACtBwC,KAAK,CAACP,MACR,CAAC;YACDO,KAAK,CAACX,IAAI,GAAG,IAAI;YACjB;UACF,KAAK,uBAAuB;UAC5B,KAAK,2EAA2E;YAC9E,IAAI,CAACN,MAAM,CAACC,IAAI,WAAAC,MAAA,CACJ,IAAI,CAACzB,OAAO,4CACtBwC,KAAK,CAACP,MACR,CAAC;YACDO,KAAK,CAACX,IAAI,GAAG,IAAI;YACjB;UACF;UACA;QACF;MACF;MAEA,OAAOW,KAAK;IACd;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAjC,GAAA;IAAAQ,KAAA,EAMA,SAAAqF,KAAKA,CAACX,EAAE,EAAE;MAAA,IAAAc,MAAA;MACR,IAAMC,aAAa,GAAG,SAAhBA,aAAaA,CAAIhE,KAAK,EAAK;QAC/B,IAAI;UACF+D,MAAI,CAAChF,MAAM,CAACsD,KAAK,WAAApD,MAAA,CAAW8E,MAAI,CAACvG,OAAO,aAAUwC,KAAK,CAACgC,IAAI,CAACiB,EAAE,CAAC;UAChE,IAAIjD,KAAK,CAACgC,IAAI,IAAIhC,KAAK,CAACgC,IAAI,CAACiB,EAAE,KAAKA,EAAE,EAAE;YACtCc,MAAI,CAAChF,MAAM,CAACC,IAAI,WAAAC,MAAA,CACJ8E,MAAI,CAACvG,OAAO,sDACxB,CAAC;YACDuG,MAAI,CAAChF,MAAM,CAACsD,KAAK,WAAApD,MAAA,CAAW8E,MAAI,CAACvG,OAAO,iBAAcyF,EAAE,EAAE,UAAU,EAAEjD,KAAK,CAACgC,IAAI,CAACiB,EAAE,CAAC;YACpFc,MAAI,CAACvF,KAAK,CAAC;cACTa,IAAI,EAAE,IAAI;cACVI,MAAM,EAAE;YACV,CAAC,CAAC;UACJ;QACF,CAAC,CAAC,OAAOI,KAAK,EAAE;UACd;UACA;UACA;UACAkE,MAAI,CAAChF,MAAM,CAACc,KAAK,WAAAZ,MAAA,CAAW8E,MAAI,CAACvG,OAAO,wCAAqCqC,KAAK,CAAC;QACrF;MACF,CAAC;MAED,IAAMoE,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAA,EAAS;QAC9B,IAAI;UACFF,MAAI,CAAChF,MAAM,CAACC,IAAI,WAAAC,MAAA,CACJ8E,MAAI,CAACvG,OAAO,0DACxB,CAAC;UACDuG,MAAI,CAACvF,KAAK,CAAC;YACTa,IAAI,EAAE,IAAI;YACVI,MAAM,EAAE;UACV,CAAC,CAAC,CAACgC,KAAK,CAAC,UAAChC,MAAM,EAAK;YACnBsE,MAAI,CAAChF,MAAM,CAACe,IAAI,WAAAb,MAAA,CACJ8E,MAAI,CAACvG,OAAO,iDACtBiC,MACF,CAAC;UACH,CAAC,CAAC;QACJ,CAAC,CAAC,OAAOI,KAAK,EAAE;UACd;UACA;UACA;UACAkE,MAAI,CAAChF,MAAM,CAACc,KAAK,WAAAZ,MAAA,CAAW8E,MAAI,CAACvG,OAAO,4CAAyCqC,KAAK,CAAC;QACzF;MACF,CAAC;MAED,IAAMqE,kCAAkC,GAAG,SAArCA,kCAAkCA,CAAA,EAAS;QAC/C,IAAI;UACFjE,YAAY,CAAC8D,MAAI,CAACnC,SAAS,CAAC;UAC5BmC,MAAI,CAAClC,SAAS,GAAG,IAAAjC,4BAAc,EAAC;YAAA,OAAMmE,MAAI,CAACH,KAAK,CAAC,CAAC;UAAA,GAAEG,MAAI,CAACI,YAAY,CAAC;QACxE,CAAC,CAAC,OAAOtE,KAAK,EAAE;UACd;UACA;UACA;UACAkE,MAAI,CAAChF,MAAM,CAACc,KAAK,WAAAZ,MAAA,CACL8E,MAAI,CAACvG,OAAO,6DACtBqC,KACF,CAAC;QACH;MACF,CAAC;MAED,IAAMuE,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIC,aAAa,EAAK;QAC1C,IAAMC,GAAG,GAAGC,WAAW,CAACD,GAAG,CAAC,CAAC;QAC7B,IAAME,OAAO,GAAGF,GAAG,GAAGD,aAAa;QAEnCN,MAAI,CAAChF,MAAM,CAACsD,KAAK,WAAApD,MAAA,CAAW8E,MAAI,CAACvG,OAAO,kBAAegH,OAAO,CAAC;QAC/DT,MAAI,CAACjC,IAAI,CAAC,mBAAmB,EAAE0C,OAAO,CAAC;MACzC,CAAC;MAEDvB,EAAE,GAAGA,EAAE,IAAIG,aAAI,CAACC,EAAE,CAAC,CAAC;MACpB,IAAMgB,aAAa,GAAGE,WAAW,CAACD,GAAG,CAAC,CAAC;MAEvC,IAAI,CAAC1C,SAAS,GAAG,IAAAhC,4BAAc,EAACqE,iBAAiB,EAAE,IAAI,CAACQ,WAAW,CAAC;MACpE,IAAI,CAACZ,IAAI,CAAC,MAAM,EAAEK,kCAAkC,CAAC;MACrD,IAAI,CAACL,IAAI,CAAC,MAAM,EAAEG,aAAa,CAAC;MAChC,IAAI,CAACH,IAAI,CAAC,MAAM,EAAE;QAAA,OAAMO,gBAAgB,CAACC,aAAa,CAAC;MAAA,EAAC;MACxD,IAAI,CAACtF,MAAM,CAACsD,KAAK,WAAApD,MAAA,CAAW,IAAI,CAACzB,OAAO,aAAAyB,MAAA,CAAUgE,EAAE,CAAE,CAAC;MAEvD,OAAO,IAAI,CAACP,IAAI,CAAC;QACfO,EAAE,EAAFA,EAAE;QACFR,IAAI,EAAE;MACR,CAAC,CAAC;IACJ;EAAC;IAAA1E,GAAA;IAAAQ,KAAA,EA/cD,SAAOwC,uBAAuBA,CAAA,EAAG;MAC/B,MAAM,IAAIzB,KAAK,CACb,4FACF,CAAC;IACH;EAAC;AAAA,EAvEiCoF,oBAAY","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _ws = _interopRequireDefault(require("ws"));
10
+ var _socketBase = _interopRequireDefault(require("./socket-base"));
11
+ /*!
12
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
13
+ */
14
+
15
+ _socketBase.default.getWebSocketConstructor = function getWebSocketConstructor() {
16
+ return _ws.default;
17
+ };
18
+ var _default = exports.default = _socketBase.default;
19
+ //# sourceMappingURL=socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_ws","_interopRequireDefault","require","_socketBase","Socket","getWebSocketConstructor","WS","_default","exports","default"],"sources":["socket.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport WS from 'ws';\n\nimport Socket from './socket-base';\n\nSocket.getWebSocketConstructor = function getWebSocketConstructor() {\n return WS;\n};\n\nexport default Socket;\n"],"mappings":";;;;;;;;AAIA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAF,sBAAA,CAAAC,OAAA;AANA;AACA;AACA;;AAMAE,mBAAM,CAACC,uBAAuB,GAAG,SAASA,uBAAuBA,CAAA,EAAG;EAClE,OAAOC,WAAE;AACX,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEaL,mBAAM","ignoreList":[]}