@webex/internal-plugin-mercury 3.0.0-beta.4 → 3.0.0-beta.400
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/README.md +15 -4
- package/dist/config.js +0 -7
- package/dist/config.js.map +1 -1
- package/dist/errors.js +0 -44
- package/dist/errors.js.map +1 -1
- package/dist/index.js +1 -20
- package/dist/index.js.map +1 -1
- package/dist/mercury.js +80 -198
- package/dist/mercury.js.map +1 -1
- package/dist/socket/index.js +0 -4
- package/dist/socket/index.js.map +1 -1
- package/dist/socket/socket-base.js +68 -143
- package/dist/socket/socket-base.js.map +1 -1
- package/dist/socket/socket.js +1 -7
- package/dist/socket/socket.js.map +1 -1
- package/dist/socket/socket.shim.js +2 -7
- package/dist/socket/socket.shim.js.map +1 -1
- package/package.json +14 -14
- package/src/config.js +2 -2
- package/src/errors.js +7 -5
- package/src/index.js +2 -2
- package/src/mercury.js +112 -98
- package/src/socket/socket-base.js +104 -72
- package/src/socket/socket.shim.js +6 -8
- package/test/integration/spec/mercury.js +49 -39
- package/test/integration/spec/sharable-mercury.js +19 -15
- package/test/integration/spec/webex.js +10 -8
- package/test/unit/spec/mercury-events.js +51 -60
- package/test/unit/spec/mercury.js +237 -157
- package/test/unit/spec/socket.js +263 -202
|
@@ -1,151 +1,121 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
|
|
4
|
-
|
|
5
4
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
6
|
-
|
|
7
5
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
8
|
-
|
|
9
6
|
_Object$defineProperty(exports, "__esModule", {
|
|
10
7
|
value: true
|
|
11
8
|
});
|
|
12
|
-
|
|
13
9
|
exports.default = void 0;
|
|
14
|
-
|
|
15
10
|
var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
|
|
16
|
-
|
|
17
11
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
18
|
-
|
|
19
12
|
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
20
|
-
|
|
21
13
|
var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/define-property"));
|
|
22
|
-
|
|
23
14
|
var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
|
|
24
|
-
|
|
25
15
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
26
|
-
|
|
27
16
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
28
|
-
|
|
29
17
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
30
|
-
|
|
31
18
|
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
|
|
32
|
-
|
|
33
19
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
34
|
-
|
|
35
20
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
36
|
-
|
|
37
21
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
38
|
-
|
|
39
22
|
var _isObject2 = _interopRequireDefault(require("lodash/isObject"));
|
|
40
|
-
|
|
41
23
|
var _has2 = _interopRequireDefault(require("lodash/has"));
|
|
42
|
-
|
|
43
24
|
var _defaults2 = _interopRequireDefault(require("lodash/defaults"));
|
|
44
|
-
|
|
45
25
|
var _events = require("events");
|
|
46
|
-
|
|
47
26
|
var _common = require("@webex/common");
|
|
48
|
-
|
|
49
27
|
var _commonTimers = require("@webex/common-timers");
|
|
50
|
-
|
|
51
28
|
var _uuid = _interopRequireDefault(require("uuid"));
|
|
52
|
-
|
|
53
29
|
var _errors = require("../errors");
|
|
54
|
-
|
|
55
30
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
56
|
-
|
|
57
31
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
58
|
-
|
|
59
32
|
var sockets = new _weakMap.default();
|
|
33
|
+
|
|
60
34
|
/**
|
|
61
35
|
* Generalized socket abstraction
|
|
62
36
|
*/
|
|
63
|
-
|
|
64
37
|
var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
65
38
|
(0, _inherits2.default)(Socket, _EventEmitter);
|
|
66
|
-
|
|
67
39
|
var _super = _createSuper(Socket);
|
|
68
|
-
|
|
69
40
|
/**
|
|
70
41
|
* constructor
|
|
71
42
|
* @returns {Socket}
|
|
72
43
|
*/
|
|
73
44
|
function Socket() {
|
|
74
45
|
var _this;
|
|
75
|
-
|
|
76
46
|
(0, _classCallCheck2.default)(this, Socket);
|
|
77
47
|
_this = _super.call(this);
|
|
48
|
+
_this._domain = 'unknown-domain';
|
|
78
49
|
_this.onmessage = _this.onmessage.bind((0, _assertThisInitialized2.default)(_this));
|
|
79
50
|
_this.onclose = _this.onclose.bind((0, _assertThisInitialized2.default)(_this));
|
|
80
51
|
return _this;
|
|
81
52
|
}
|
|
53
|
+
|
|
82
54
|
/**
|
|
83
55
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
|
|
84
56
|
* @returns {string}
|
|
85
57
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
58
|
(0, _createClass2.default)(Socket, [{
|
|
89
59
|
key: "binaryType",
|
|
90
60
|
get: function get() {
|
|
91
61
|
return sockets.get(this).binaryType;
|
|
92
62
|
}
|
|
63
|
+
|
|
93
64
|
/**
|
|
94
65
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
|
|
95
66
|
* @returns {number}
|
|
96
67
|
*/
|
|
97
|
-
|
|
98
68
|
}, {
|
|
99
69
|
key: "bufferedAmount",
|
|
100
70
|
get: function get() {
|
|
101
71
|
return sockets.get(this).bufferedAmount;
|
|
102
72
|
}
|
|
73
|
+
|
|
103
74
|
/**
|
|
104
75
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
|
|
105
76
|
* @returns {string}
|
|
106
77
|
*/
|
|
107
|
-
|
|
108
78
|
}, {
|
|
109
79
|
key: "extensions",
|
|
110
80
|
get: function get() {
|
|
111
81
|
return sockets.get(this).extensions;
|
|
112
82
|
}
|
|
83
|
+
|
|
113
84
|
/**
|
|
114
85
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
|
|
115
86
|
* @returns {string}
|
|
116
87
|
*/
|
|
117
|
-
|
|
118
88
|
}, {
|
|
119
89
|
key: "protocol",
|
|
120
90
|
get: function get() {
|
|
121
91
|
return sockets.get(this).protocol;
|
|
122
92
|
}
|
|
93
|
+
|
|
123
94
|
/**
|
|
124
95
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
|
|
125
96
|
* @returns {number}
|
|
126
97
|
*/
|
|
127
|
-
|
|
128
98
|
}, {
|
|
129
99
|
key: "readyState",
|
|
130
100
|
get: function get() {
|
|
131
101
|
return sockets.get(this).readyState;
|
|
132
102
|
}
|
|
103
|
+
|
|
133
104
|
/**
|
|
134
105
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
|
|
135
106
|
* @returns {string}
|
|
136
107
|
*/
|
|
137
|
-
|
|
138
108
|
}, {
|
|
139
109
|
key: "url",
|
|
140
110
|
get: function get() {
|
|
141
111
|
return sockets.get(this).url;
|
|
142
112
|
}
|
|
113
|
+
|
|
143
114
|
/**
|
|
144
115
|
* Provides the environmentally appropriate constructor (ws in NodeJS,
|
|
145
116
|
* WebSocket in browsers)
|
|
146
117
|
* @returns {WebSocket}
|
|
147
118
|
*/
|
|
148
|
-
|
|
149
119
|
}, {
|
|
150
120
|
key: "close",
|
|
151
121
|
value:
|
|
@@ -158,63 +128,50 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
158
128
|
*/
|
|
159
129
|
function close(options) {
|
|
160
130
|
var _this2 = this;
|
|
161
|
-
|
|
162
131
|
return new _promise.default(function (resolve, reject) {
|
|
163
132
|
var socket = sockets.get(_this2);
|
|
164
|
-
|
|
165
133
|
if (!socket) {
|
|
166
134
|
// Open has not been called yet so there is no socket to close
|
|
167
135
|
resolve();
|
|
168
136
|
return;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
_this2.logger.info('socket: closing');
|
|
173
|
-
|
|
137
|
+
}
|
|
138
|
+
// logger is defined once open is called
|
|
139
|
+
_this2.logger.info("socket,".concat(_this2._domain, ": closing"));
|
|
174
140
|
if (socket.readyState === 2 || socket.readyState === 3) {
|
|
175
|
-
_this2.logger.info(
|
|
176
|
-
|
|
141
|
+
_this2.logger.info("socket,".concat(_this2._domain, ": already closed"));
|
|
177
142
|
resolve();
|
|
178
143
|
return;
|
|
179
144
|
}
|
|
180
|
-
|
|
181
145
|
options = options || {};
|
|
182
|
-
|
|
183
146
|
if (options.code && options.code !== 1000 && (options.code < 3000 || options.code > 4999)) {
|
|
184
147
|
reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));
|
|
185
148
|
return;
|
|
186
149
|
}
|
|
187
|
-
|
|
188
150
|
options = (0, _defaults2.default)(options, {
|
|
189
151
|
code: 1000,
|
|
190
152
|
reason: 'Done'
|
|
191
153
|
});
|
|
192
154
|
var closeTimer = (0, _commonTimers.safeSetTimeout)(function () {
|
|
193
155
|
try {
|
|
194
|
-
_this2.logger.info(
|
|
195
|
-
|
|
156
|
+
_this2.logger.info("socket,".concat(_this2._domain, ": no close event received, forcing closure"));
|
|
196
157
|
resolve(_this2.onclose({
|
|
197
158
|
code: 1000,
|
|
198
159
|
reason: 'Done (forced)'
|
|
199
160
|
}));
|
|
200
161
|
} catch (error) {
|
|
201
|
-
_this2.logger.warn(
|
|
162
|
+
_this2.logger.warn("socket,".concat(_this2._domain, ": force-close failed"), error);
|
|
202
163
|
}
|
|
203
164
|
}, _this2.forceCloseDelay);
|
|
204
|
-
|
|
205
165
|
socket.onclose = function (event) {
|
|
206
|
-
_this2.logger.info(
|
|
207
|
-
|
|
166
|
+
_this2.logger.info("socket,".concat(_this2._domain, ": close event fired"), event.code, event.reason);
|
|
208
167
|
clearTimeout(closeTimer);
|
|
209
|
-
|
|
210
168
|
_this2.onclose(event);
|
|
211
|
-
|
|
212
169
|
resolve(event);
|
|
213
170
|
};
|
|
214
|
-
|
|
215
171
|
socket.close(options.code, options.reason);
|
|
216
172
|
});
|
|
217
173
|
}
|
|
174
|
+
|
|
218
175
|
/**
|
|
219
176
|
* Opens a WebSocket
|
|
220
177
|
* @param {string} url
|
|
@@ -228,24 +185,25 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
228
185
|
* @param {string} options.logLevelToken
|
|
229
186
|
* @returns {Promise}
|
|
230
187
|
*/
|
|
231
|
-
|
|
232
188
|
}, {
|
|
233
189
|
key: "open",
|
|
234
190
|
value: function open(url, options) {
|
|
235
191
|
var _this3 = this;
|
|
236
|
-
|
|
192
|
+
try {
|
|
193
|
+
this._domain = new URL(url).hostname;
|
|
194
|
+
} catch (_unused) {
|
|
195
|
+
this._domain = url;
|
|
196
|
+
}
|
|
237
197
|
return new _promise.default(function (resolve, reject) {
|
|
238
198
|
/* eslint complexity: [0] */
|
|
239
199
|
if (!url) {
|
|
240
200
|
reject(new Error('`url` is required'));
|
|
241
201
|
return;
|
|
242
202
|
}
|
|
243
|
-
|
|
244
203
|
if (sockets.get(_this3)) {
|
|
245
204
|
reject(new Error('Socket#open() can only be called once per instance'));
|
|
246
205
|
return;
|
|
247
206
|
}
|
|
248
|
-
|
|
249
207
|
options = options || {};
|
|
250
208
|
(0, _common.checkRequired)(['forceCloseDelay', 'pingInterval', 'pongTimeout', 'token', 'trackingId', 'logger'], options);
|
|
251
209
|
(0, _keys.default)(options).forEach(function (key) {
|
|
@@ -255,18 +213,13 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
255
213
|
});
|
|
256
214
|
});
|
|
257
215
|
var WebSocket = Socket.getWebSocketConstructor();
|
|
258
|
-
|
|
259
|
-
_this3.logger.info('socket: creating WebSocket');
|
|
260
|
-
|
|
216
|
+
_this3.logger.info("socket,".concat(_this3._domain, ": creating WebSocket"));
|
|
261
217
|
var socket = new WebSocket(url, [], options);
|
|
262
218
|
socket.binaryType = 'arraybuffer';
|
|
263
219
|
socket.onmessage = _this3.onmessage;
|
|
264
|
-
|
|
265
220
|
socket.onclose = function (event) {
|
|
266
221
|
event = _this3._fixCloseCode(event);
|
|
267
|
-
|
|
268
|
-
_this3.logger.info('socket: closed before open', event.code, event.reason);
|
|
269
|
-
|
|
222
|
+
_this3.logger.info("socket,".concat(_this3._domain, ": closed before open"), event.code, event.reason);
|
|
270
223
|
switch (event.code) {
|
|
271
224
|
case 1005:
|
|
272
225
|
// IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume
|
|
@@ -274,90 +227,78 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
274
227
|
// turns out we had a bad token, the device refresh should 401 and
|
|
275
228
|
// trigger a token refresh.
|
|
276
229
|
return reject(new _errors.UnknownResponse(event));
|
|
277
|
-
|
|
278
230
|
case 4400:
|
|
279
231
|
return reject(new _errors.BadRequest(event));
|
|
280
|
-
|
|
281
232
|
case 4401:
|
|
282
233
|
return reject(new _errors.NotAuthorized(event));
|
|
283
|
-
|
|
284
234
|
case 4403:
|
|
285
235
|
return reject(new _errors.Forbidden(event));
|
|
286
236
|
// case 4404:
|
|
287
237
|
// return reject(new NotFound(event));
|
|
288
|
-
|
|
289
238
|
default:
|
|
290
239
|
return reject(new _errors.ConnectionError(event));
|
|
291
240
|
}
|
|
292
241
|
};
|
|
293
|
-
|
|
294
242
|
socket.onopen = function () {
|
|
295
|
-
_this3.logger.info(
|
|
296
|
-
|
|
243
|
+
_this3.logger.info("socket,".concat(_this3._domain, ": connected"));
|
|
297
244
|
_this3._authorize().then(function () {
|
|
298
|
-
_this3.logger.info(
|
|
299
|
-
|
|
245
|
+
_this3.logger.info("socket,".concat(_this3._domain, ": authorized"));
|
|
300
246
|
socket.onclose = _this3.onclose;
|
|
301
247
|
resolve();
|
|
302
248
|
}).catch(reject);
|
|
303
249
|
};
|
|
304
|
-
|
|
305
250
|
socket.onerror = function (event) {
|
|
306
|
-
_this3.logger.warn(
|
|
251
|
+
_this3.logger.warn("socket,".concat(_this3._domain, ": error event fired"), event);
|
|
307
252
|
};
|
|
308
|
-
|
|
309
253
|
sockets.set(_this3, socket);
|
|
310
|
-
|
|
311
|
-
_this3.logger.info('socket: waiting for server');
|
|
254
|
+
_this3.logger.info("socket,".concat(_this3._domain, ": waiting for server"));
|
|
312
255
|
});
|
|
313
256
|
}
|
|
257
|
+
|
|
314
258
|
/**
|
|
315
259
|
* Handles incoming CloseEvents
|
|
316
260
|
* @param {CloseEvent} event
|
|
317
261
|
* @returns {undefined}
|
|
318
262
|
*/
|
|
319
|
-
|
|
320
263
|
}, {
|
|
321
264
|
key: "onclose",
|
|
322
265
|
value: function onclose(event) {
|
|
323
|
-
this.logger.info(
|
|
266
|
+
this.logger.info("socket,".concat(this._domain, ": closed"), event.code, event.reason);
|
|
324
267
|
clearTimeout(this.pongTimer);
|
|
325
268
|
clearTimeout(this.pingTimer);
|
|
326
269
|
event = this._fixCloseCode(event);
|
|
327
|
-
this.emit('close', event);
|
|
328
|
-
// we don't have a retain cycle.
|
|
270
|
+
this.emit('close', event);
|
|
329
271
|
|
|
272
|
+
// Remove all listeners to (a) avoid reacting to late pongs and (b) ensure
|
|
273
|
+
// we don't have a retain cycle.
|
|
330
274
|
this.removeAllListeners();
|
|
331
275
|
}
|
|
276
|
+
|
|
332
277
|
/**
|
|
333
278
|
* Handles incoming message events
|
|
334
279
|
* @param {MessageEvent} event
|
|
335
280
|
* @returns {undefined}
|
|
336
281
|
*/
|
|
337
|
-
|
|
338
282
|
}, {
|
|
339
283
|
key: "onmessage",
|
|
340
284
|
value: function onmessage(event) {
|
|
341
285
|
try {
|
|
342
286
|
var data = JSON.parse(event.data);
|
|
343
287
|
var sequenceNumber = (0, _parseInt2.default)(data.sequenceNumber, 10);
|
|
344
|
-
this.logger.debug(
|
|
345
|
-
|
|
288
|
+
this.logger.debug("socket,".concat(this._domain, ": sequence number: "), sequenceNumber);
|
|
346
289
|
if (this.expectedSequenceNumber && sequenceNumber !== this.expectedSequenceNumber) {
|
|
347
|
-
this.logger.debug("socket: sequence number mismatch indicates lost mercury message. expected: ".concat(this.expectedSequenceNumber, ", actual: ").concat(sequenceNumber));
|
|
290
|
+
this.logger.debug("socket,".concat(this._domain, ": sequence number mismatch indicates lost mercury message. expected: ").concat(this.expectedSequenceNumber, ", actual: ").concat(sequenceNumber));
|
|
348
291
|
this.emit('sequence-mismatch', sequenceNumber, this.expectedSequenceNumber);
|
|
349
292
|
}
|
|
293
|
+
this.expectedSequenceNumber = sequenceNumber + 1;
|
|
350
294
|
|
|
351
|
-
|
|
295
|
+
// Yes, it's a little weird looking; we want to emit message events that
|
|
352
296
|
// look like normal socket message events, but event.data cannot be
|
|
353
297
|
// modified and we don't actually care about anything but the data property
|
|
354
|
-
|
|
355
298
|
var processedEvent = {
|
|
356
299
|
data: data
|
|
357
300
|
};
|
|
358
|
-
|
|
359
301
|
this._acknowledge(processedEvent);
|
|
360
|
-
|
|
361
302
|
if (data.type === 'pong') {
|
|
362
303
|
this.emit('pong', processedEvent);
|
|
363
304
|
} else {
|
|
@@ -367,72 +308,64 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
367
308
|
// The above code should only be able to throw if we receive an unparsable
|
|
368
309
|
// message from Mercury. At this time, the only action we have is to
|
|
369
310
|
// ignore it and move on.
|
|
370
|
-
|
|
371
311
|
/* istanbul ignore next */
|
|
372
|
-
this.logger.warn(
|
|
312
|
+
this.logger.warn("socket,".concat(this._domain, ": error while receiving WebSocket message"), error);
|
|
373
313
|
}
|
|
374
314
|
}
|
|
315
|
+
|
|
375
316
|
/**
|
|
376
317
|
* Sends a message up the socket
|
|
377
318
|
* @param {mixed} data
|
|
378
319
|
* @returns {Promise}
|
|
379
320
|
*/
|
|
380
|
-
|
|
381
321
|
}, {
|
|
382
322
|
key: "send",
|
|
383
323
|
value: function send(data) {
|
|
384
324
|
var _this4 = this;
|
|
385
|
-
|
|
386
325
|
return new _promise.default(function (resolve, reject) {
|
|
387
326
|
if (_this4.readyState !== 1) {
|
|
388
327
|
return reject(new Error('INVALID_STATE_ERROR'));
|
|
389
328
|
}
|
|
390
|
-
|
|
391
329
|
if ((0, _isObject2.default)(data)) {
|
|
392
330
|
data = (0, _stringify.default)(data);
|
|
393
331
|
}
|
|
394
|
-
|
|
395
332
|
var socket = sockets.get(_this4);
|
|
396
333
|
socket.send(data);
|
|
397
334
|
return resolve();
|
|
398
335
|
});
|
|
399
336
|
}
|
|
337
|
+
|
|
400
338
|
/**
|
|
401
339
|
* Sends an acknowledgment for a specific event
|
|
402
340
|
* @param {MessageEvent} event
|
|
403
341
|
* @returns {Promise}
|
|
404
342
|
*/
|
|
405
|
-
|
|
406
343
|
}, {
|
|
407
344
|
key: "_acknowledge",
|
|
408
345
|
value: function _acknowledge(event) {
|
|
409
346
|
if (!event) {
|
|
410
347
|
return _promise.default.reject(new Error('`event` is required'));
|
|
411
348
|
}
|
|
412
|
-
|
|
413
349
|
if (!(0, _has2.default)(event, 'data.id')) {
|
|
414
350
|
return _promise.default.reject(new Error('`event.data.id` is required'));
|
|
415
351
|
}
|
|
416
|
-
|
|
417
352
|
return this.send({
|
|
418
353
|
messageId: event.data.id,
|
|
419
354
|
type: 'ack'
|
|
420
355
|
});
|
|
421
356
|
}
|
|
357
|
+
|
|
422
358
|
/**
|
|
423
359
|
* Sends an auth message up the socket
|
|
424
360
|
* @private
|
|
425
361
|
* @returns {Promise}
|
|
426
362
|
*/
|
|
427
|
-
|
|
428
363
|
}, {
|
|
429
364
|
key: "_authorize",
|
|
430
365
|
value: function _authorize() {
|
|
431
366
|
var _this5 = this;
|
|
432
|
-
|
|
433
367
|
return new _promise.default(function (resolve) {
|
|
434
|
-
_this5.logger.info(
|
|
435
|
-
|
|
368
|
+
_this5.logger.info("socket,".concat(_this5._domain, ": authorizing"));
|
|
436
369
|
_this5.send({
|
|
437
370
|
id: _uuid.default.v4(),
|
|
438
371
|
type: 'authorization',
|
|
@@ -442,20 +375,17 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
442
375
|
trackingId: _this5.trackingId,
|
|
443
376
|
logLevelToken: _this5.logLevelToken
|
|
444
377
|
});
|
|
445
|
-
|
|
446
378
|
var waitForBufferState = function waitForBufferState(event) {
|
|
447
379
|
if (!event.data.type && (event.data.data.eventType === 'mercury.buffer_state' || event.data.data.eventType === 'mercury.registration_status')) {
|
|
448
380
|
_this5.removeListener('message', waitForBufferState);
|
|
449
|
-
|
|
450
381
|
_this5._ping();
|
|
451
|
-
|
|
452
382
|
resolve();
|
|
453
383
|
}
|
|
454
384
|
};
|
|
455
|
-
|
|
456
385
|
_this5.once('message', waitForBufferState);
|
|
457
386
|
});
|
|
458
387
|
}
|
|
388
|
+
|
|
459
389
|
/**
|
|
460
390
|
* Deals with the fact that some browsers drop some close codes (but not
|
|
461
391
|
* close reasons).
|
|
@@ -463,51 +393,44 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
463
393
|
* @private
|
|
464
394
|
* @returns {CloseEvent}
|
|
465
395
|
*/
|
|
466
|
-
|
|
467
396
|
}, {
|
|
468
397
|
key: "_fixCloseCode",
|
|
469
398
|
value: function _fixCloseCode(event) {
|
|
470
399
|
if (event.code === 1005 && event.reason) {
|
|
471
400
|
switch (event.reason.toLowerCase()) {
|
|
472
401
|
case 'replaced':
|
|
473
|
-
this.logger.info(
|
|
402
|
+
this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
|
|
474
403
|
event.code = 4000;
|
|
475
404
|
break;
|
|
476
|
-
|
|
477
405
|
case 'authentication failed':
|
|
478
406
|
case 'authentication did not happen within the timeout window of 30000 seconds.':
|
|
479
|
-
this.logger.info(
|
|
407
|
+
this.logger.info("socket,".concat(this._domain, ": fixing CloseEvent code for reason: "), event.reason);
|
|
480
408
|
event.code = 1008;
|
|
481
409
|
break;
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
410
|
+
default:
|
|
411
|
+
// do nothing
|
|
485
412
|
}
|
|
486
413
|
}
|
|
487
414
|
|
|
488
415
|
return event;
|
|
489
416
|
}
|
|
417
|
+
|
|
490
418
|
/**
|
|
491
419
|
* Sends a ping up the socket and confirms we get it back
|
|
492
420
|
* @param {[type]} id
|
|
493
421
|
* @private
|
|
494
422
|
* @returns {[type]}
|
|
495
423
|
*/
|
|
496
|
-
|
|
497
424
|
}, {
|
|
498
425
|
key: "_ping",
|
|
499
426
|
value: function _ping(id) {
|
|
500
427
|
var _this6 = this;
|
|
501
|
-
|
|
502
428
|
var confirmPongId = function confirmPongId(event) {
|
|
503
429
|
try {
|
|
504
|
-
_this6.logger.debug(
|
|
505
|
-
|
|
430
|
+
_this6.logger.debug("socket,".concat(_this6._domain, ": pong"), event.data.id);
|
|
506
431
|
if (event.data && event.data.id !== id) {
|
|
507
|
-
_this6.logger.info(
|
|
508
|
-
|
|
509
|
-
_this6.logger.debug('socket: expected', id, 'received', event.data.id);
|
|
510
|
-
|
|
432
|
+
_this6.logger.info("socket,".concat(_this6._domain, ": received pong for wrong ping id, closing socket"));
|
|
433
|
+
_this6.logger.debug("socket,".concat(_this6._domain, ": expected"), id, 'received', event.data.id);
|
|
511
434
|
_this6.close({
|
|
512
435
|
code: 1000,
|
|
513
436
|
reason: 'Pong mismatch'
|
|
@@ -516,31 +439,26 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
516
439
|
} catch (error) {
|
|
517
440
|
// This try/catch block was added as a debugging step; to the best of my
|
|
518
441
|
// knowledge, the above can never throw.
|
|
519
|
-
|
|
520
442
|
/* istanbul ignore next */
|
|
521
|
-
_this6.logger.error(
|
|
443
|
+
_this6.logger.error("socket,".concat(_this6._domain, ": error occurred in confirmPongId"), error);
|
|
522
444
|
}
|
|
523
445
|
};
|
|
524
|
-
|
|
525
446
|
var onPongNotReceived = function onPongNotReceived() {
|
|
526
447
|
try {
|
|
527
|
-
_this6.logger.info(
|
|
528
|
-
|
|
448
|
+
_this6.logger.info("socket,".concat(_this6._domain, ": pong not receive in expected period, closing socket"));
|
|
529
449
|
_this6.close({
|
|
530
450
|
code: 1000,
|
|
531
451
|
reason: 'Pong not received'
|
|
532
452
|
}).catch(function (reason) {
|
|
533
|
-
_this6.logger.warn(
|
|
453
|
+
_this6.logger.warn("socket,".concat(_this6._domain, ": failed to close socket after missed pong"), reason);
|
|
534
454
|
});
|
|
535
455
|
} catch (error) {
|
|
536
456
|
// This try/catch block was added as a debugging step; to the best of my
|
|
537
457
|
// knowledge, the above can never throw.
|
|
538
|
-
|
|
539
458
|
/* istanbul ignore next */
|
|
540
|
-
_this6.logger.error(
|
|
459
|
+
_this6.logger.error("socket,".concat(_this6._domain, ": error occurred in onPongNotReceived"), error);
|
|
541
460
|
}
|
|
542
461
|
};
|
|
543
|
-
|
|
544
462
|
var scheduleNextPingAndCancelPongTimer = function scheduleNextPingAndCancelPongTimer() {
|
|
545
463
|
try {
|
|
546
464
|
clearTimeout(_this6.pongTimer);
|
|
@@ -550,17 +468,25 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
550
468
|
} catch (error) {
|
|
551
469
|
// This try/catch block was added as a debugging step; to the best of my
|
|
552
470
|
// knowledge, the above can never throw.
|
|
553
|
-
|
|
554
471
|
/* istanbul ignore next */
|
|
555
|
-
_this6.logger.error(
|
|
472
|
+
_this6.logger.error("socket,".concat(_this6._domain, ": error occurred in scheduleNextPingAndCancelPongTimer"), error);
|
|
556
473
|
}
|
|
557
474
|
};
|
|
558
|
-
|
|
475
|
+
var calculateLatency = function calculateLatency(pingTimestamp) {
|
|
476
|
+
var now = performance.now();
|
|
477
|
+
var latency = now - pingTimestamp;
|
|
478
|
+
_this6.logger.debug("socket,".concat(_this6._domain, ": latency: "), latency);
|
|
479
|
+
_this6.emit('ping-pong-latency', latency);
|
|
480
|
+
};
|
|
559
481
|
id = id || _uuid.default.v4();
|
|
482
|
+
var pingTimestamp = performance.now();
|
|
560
483
|
this.pongTimer = (0, _commonTimers.safeSetTimeout)(onPongNotReceived, this.pongTimeout);
|
|
561
484
|
this.once('pong', scheduleNextPingAndCancelPongTimer);
|
|
562
485
|
this.once('pong', confirmPongId);
|
|
563
|
-
this.
|
|
486
|
+
this.once('pong', function () {
|
|
487
|
+
return calculateLatency(pingTimestamp);
|
|
488
|
+
});
|
|
489
|
+
this.logger.debug("socket,".concat(this._domain, ": ping ").concat(id));
|
|
564
490
|
return this.send({
|
|
565
491
|
id: id,
|
|
566
492
|
type: 'ping'
|
|
@@ -574,6 +500,5 @@ var Socket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
574
500
|
}]);
|
|
575
501
|
return Socket;
|
|
576
502
|
}(_events.EventEmitter);
|
|
577
|
-
|
|
578
503
|
exports.default = Socket;
|
|
579
504
|
//# sourceMappingURL=socket-base.js.map
|