@webex/internal-plugin-mercury 3.0.0-beta.39 → 3.0.0-beta.391
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/mercury.js +46 -52
- package/dist/mercury.js.map +1 -1
- package/dist/socket/socket-base.js +43 -27
- package/dist/socket/socket-base.js.map +1 -1
- package/package.json +14 -14
- package/src/mercury.js +43 -51
- package/src/socket/socket-base.js +61 -28
- package/test/integration/spec/webex.js +3 -2
- package/test/unit/spec/mercury.js +26 -4
- package/test/unit/spec/socket.js +17 -0
package/dist/mercury.js
CHANGED
|
@@ -58,12 +58,12 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
58
58
|
connect: function connect(webSocketUrl) {
|
|
59
59
|
var _this = this;
|
|
60
60
|
if (this.connected) {
|
|
61
|
-
this.logger.info(
|
|
61
|
+
this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
|
|
62
62
|
return _promise.default.resolve();
|
|
63
63
|
}
|
|
64
64
|
this.connecting = true;
|
|
65
65
|
return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
|
|
66
|
-
_this.logger.info(
|
|
66
|
+
_this.logger.info("".concat(_this.namespace, ": connecting"));
|
|
67
67
|
return _this._connectWithBackoff(webSocketUrl);
|
|
68
68
|
});
|
|
69
69
|
},
|
|
@@ -71,14 +71,13 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
71
71
|
var _this2 = this;
|
|
72
72
|
return new _promise.default(function (resolve) {
|
|
73
73
|
if (_this2.backoffCall) {
|
|
74
|
-
_this2.logger.info(
|
|
74
|
+
_this2.logger.info("".concat(_this2.namespace, ": aborting connection"));
|
|
75
75
|
_this2.backoffCall.abort();
|
|
76
76
|
}
|
|
77
77
|
if (_this2.socket) {
|
|
78
78
|
_this2.socket.removeAllListeners('message');
|
|
79
79
|
_this2.once('offline', resolve);
|
|
80
|
-
_this2.socket.close();
|
|
81
|
-
return;
|
|
80
|
+
resolve(_this2.socket.close());
|
|
82
81
|
}
|
|
83
82
|
resolve();
|
|
84
83
|
});
|
|
@@ -153,12 +152,18 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
153
152
|
}
|
|
154
153
|
return _this4._emit.apply(_this4, ['sequence-mismatch'].concat(args));
|
|
155
154
|
});
|
|
155
|
+
socket.on('ping-pong-latency', function () {
|
|
156
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
157
|
+
args[_key2] = arguments[_key2];
|
|
158
|
+
}
|
|
159
|
+
return _this4._emit.apply(_this4, ['ping-pong-latency'].concat(args));
|
|
160
|
+
});
|
|
156
161
|
_promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
|
|
157
162
|
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
|
|
158
163
|
webSocketUrl = _ref2[0],
|
|
159
164
|
token = _ref2[1];
|
|
160
165
|
if (!_this4.backoffCall) {
|
|
161
|
-
var msg =
|
|
166
|
+
var msg = "".concat(_this4.namespace, ": prevent socket open when backoffCall no longer defined");
|
|
162
167
|
_this4.logger.info(msg);
|
|
163
168
|
return _promise.default.reject(new Error(msg));
|
|
164
169
|
}
|
|
@@ -174,24 +179,17 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
174
179
|
|
|
175
180
|
// if the consumer has supplied request options use them
|
|
176
181
|
if (_this4.webex.config.defaultMercuryOptions) {
|
|
177
|
-
_this4.logger.info(
|
|
182
|
+
_this4.logger.info("".concat(_this4.namespace, ": setting custom options"));
|
|
178
183
|
options = _objectSpread(_objectSpread({}, options), _this4.webex.config.defaultMercuryOptions);
|
|
179
184
|
}
|
|
180
185
|
|
|
181
186
|
// Set the socket before opening it. This allows a disconnect() to close
|
|
182
187
|
// the socket if it is in the process of being opened.
|
|
183
188
|
_this4.socket = socket;
|
|
189
|
+
_this4.logger.info("".concat(_this4.namespace, " connection url: ").concat(webSocketUrl));
|
|
184
190
|
return socket.open(webSocketUrl, options);
|
|
185
191
|
}).then(function () {
|
|
186
|
-
_this4.
|
|
187
|
-
fields: {
|
|
188
|
-
success: true
|
|
189
|
-
},
|
|
190
|
-
tags: {
|
|
191
|
-
action: 'connected',
|
|
192
|
-
url: attemptWSUrl
|
|
193
|
-
}
|
|
194
|
-
});
|
|
192
|
+
_this4.logger.info("".concat(_this4.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
|
|
195
193
|
callback();
|
|
196
194
|
return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
197
195
|
if (haMessagingEnabled) {
|
|
@@ -209,18 +207,18 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
209
207
|
retries: _this4.backoffCall.getNumRetries()
|
|
210
208
|
});
|
|
211
209
|
}
|
|
212
|
-
_this4.logger.info(
|
|
210
|
+
_this4.logger.info("".concat(_this4.namespace, ": connection attempt failed"), reason);
|
|
213
211
|
// UnknownResponse is produced by IE for any 4XXX; treated it like a bad
|
|
214
212
|
// web socket url and let WDM handle the token checking
|
|
215
213
|
if (reason instanceof _errors.UnknownResponse) {
|
|
216
|
-
_this4.logger.info(
|
|
214
|
+
_this4.logger.info("".concat(_this4.namespace, ": received unknown response code, refreshing device registration"));
|
|
217
215
|
return _this4.webex.internal.device.refresh().then(function () {
|
|
218
216
|
return callback(reason);
|
|
219
217
|
});
|
|
220
218
|
}
|
|
221
219
|
// NotAuthorized implies expired token
|
|
222
220
|
if (reason instanceof _errors.NotAuthorized) {
|
|
223
|
-
_this4.logger.info(
|
|
221
|
+
_this4.logger.info("".concat(_this4.namespace, ": received authorization error, reauthorizing"));
|
|
224
222
|
return _this4.webex.credentials.refresh({
|
|
225
223
|
force: true
|
|
226
224
|
}).then(function () {
|
|
@@ -236,24 +234,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
236
234
|
// BadRequest implies current credentials are for a Service Account
|
|
237
235
|
// Forbidden implies current user is not entitle for Webex
|
|
238
236
|
if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
|
|
239
|
-
_this4.logger.warn(
|
|
237
|
+
_this4.logger.warn("".concat(_this4.namespace, ": received unrecoverable response from mercury"));
|
|
240
238
|
_this4.backoffCall.abort();
|
|
241
239
|
return callback(reason);
|
|
242
240
|
}
|
|
243
241
|
if (reason instanceof _errors.ConnectionError) {
|
|
244
242
|
return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
245
243
|
if (haMessagingEnabled) {
|
|
246
|
-
_this4.logger.info(
|
|
247
|
-
_this4.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {
|
|
248
|
-
fields: {
|
|
249
|
-
success: false
|
|
250
|
-
},
|
|
251
|
-
tags: {
|
|
252
|
-
action: 'failed',
|
|
253
|
-
error: reason.message,
|
|
254
|
-
url: attemptWSUrl
|
|
255
|
-
}
|
|
256
|
-
});
|
|
244
|
+
_this4.logger.info("".concat(_this4.namespace, ": received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ").concat(attemptWSUrl, " error: ").concat(reason.message));
|
|
257
245
|
return _this4.webex.internal.services.markFailedUrl(attemptWSUrl);
|
|
258
246
|
}
|
|
259
247
|
return null;
|
|
@@ -263,7 +251,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
263
251
|
}
|
|
264
252
|
return callback(reason);
|
|
265
253
|
}).catch(function (reason) {
|
|
266
|
-
_this4.logger.error(
|
|
254
|
+
_this4.logger.error("".concat(_this4.namespace, ": failed to handle connection failure"), reason);
|
|
267
255
|
callback(reason);
|
|
268
256
|
});
|
|
269
257
|
},
|
|
@@ -277,7 +265,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
277
265
|
_this5.connecting = false;
|
|
278
266
|
_this5.backoffCall = undefined;
|
|
279
267
|
if (err) {
|
|
280
|
-
_this5.logger.info("
|
|
268
|
+
_this5.logger.info("".concat(_this5.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
|
|
281
269
|
return reject(err);
|
|
282
270
|
}
|
|
283
271
|
_this5.connected = true;
|
|
@@ -287,7 +275,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
287
275
|
|
|
288
276
|
// eslint-disable-next-line prefer-reflect
|
|
289
277
|
call = _backoff.default.call(function (callback) {
|
|
290
|
-
_this5.logger.info("
|
|
278
|
+
_this5.logger.info("".concat(_this5.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
|
|
291
279
|
_this5._attemptConnection(webSocketUrl, callback);
|
|
292
280
|
}, onComplete);
|
|
293
281
|
call.setStrategy(new _backoff.default.ExponentialStrategy({
|
|
@@ -298,31 +286,37 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
298
286
|
call.failAfter(_this5.config.maxRetries);
|
|
299
287
|
}
|
|
300
288
|
call.on('abort', function () {
|
|
301
|
-
_this5.logger.info(
|
|
289
|
+
_this5.logger.info("".concat(_this5.namespace, ": connection aborted"));
|
|
302
290
|
reject(new Error('Mercury Connection Aborted'));
|
|
303
291
|
});
|
|
304
292
|
call.on('callback', function (err) {
|
|
305
293
|
if (err) {
|
|
306
294
|
var number = call.getNumRetries();
|
|
307
295
|
var delay = Math.min(call.strategy_.nextBackoffDelay_, _this5.config.backoffTimeMax);
|
|
308
|
-
_this5.logger.info("
|
|
296
|
+
_this5.logger.info("".concat(_this5.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
|
|
309
297
|
/* istanbul ignore if */
|
|
310
298
|
if (process.env.NODE_ENV === 'development') {
|
|
311
|
-
_this5.logger.debug(
|
|
299
|
+
_this5.logger.debug("".concat(_this5.namespace, ": "), err, err.stack);
|
|
312
300
|
}
|
|
313
301
|
return;
|
|
314
302
|
}
|
|
315
|
-
_this5.logger.info(
|
|
303
|
+
_this5.logger.info("".concat(_this5.namespace, ": connected"));
|
|
316
304
|
});
|
|
317
305
|
call.start();
|
|
318
306
|
_this5.backoffCall = call;
|
|
319
307
|
});
|
|
320
308
|
},
|
|
321
309
|
_emit: function _emit() {
|
|
310
|
+
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
311
|
+
args[_key3] = arguments[_key3];
|
|
312
|
+
}
|
|
322
313
|
try {
|
|
323
|
-
this.trigger.apply(this,
|
|
314
|
+
this.trigger.apply(this, args);
|
|
324
315
|
} catch (error) {
|
|
325
|
-
this.logger.error(
|
|
316
|
+
this.logger.error("".concat(this.namespace, ": error occurred in event handler"), {
|
|
317
|
+
error: error,
|
|
318
|
+
arguments: args
|
|
319
|
+
});
|
|
326
320
|
}
|
|
327
321
|
},
|
|
328
322
|
_getEventHandlers: function _getEventHandlers(eventType) {
|
|
@@ -357,19 +351,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
357
351
|
switch (event.code) {
|
|
358
352
|
case 1003:
|
|
359
353
|
// metric: disconnect
|
|
360
|
-
this.logger.info("
|
|
354
|
+
this.logger.info("".concat(this.namespace, ": Mercury service rejected last message; will not reconnect: ").concat(event.reason));
|
|
361
355
|
this._emit('offline.permanent', event);
|
|
362
356
|
break;
|
|
363
357
|
case 4000:
|
|
364
358
|
// metric: disconnect
|
|
365
|
-
this.logger.info(
|
|
359
|
+
this.logger.info("".concat(this.namespace, ": socket replaced; will not reconnect"));
|
|
366
360
|
this._emit('offline.replaced', event);
|
|
367
361
|
break;
|
|
368
362
|
case 1001:
|
|
369
363
|
case 1005:
|
|
370
364
|
case 1006:
|
|
371
365
|
case 1011:
|
|
372
|
-
this.logger.info(
|
|
366
|
+
this.logger.info("".concat(this.namespace, ": socket disconnected; reconnecting"));
|
|
373
367
|
this._emit('offline.transient', event);
|
|
374
368
|
this._reconnect(socketUrl);
|
|
375
369
|
// metric: disconnect
|
|
@@ -377,30 +371,30 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
377
371
|
break;
|
|
378
372
|
case 1000:
|
|
379
373
|
if (normalReconnectReasons.includes(reason)) {
|
|
380
|
-
this.logger.info(
|
|
374
|
+
this.logger.info("".concat(this.namespace, ": socket disconnected; reconnecting"));
|
|
381
375
|
this._emit('offline.transient', event);
|
|
382
376
|
this._reconnect(socketUrl);
|
|
383
377
|
// metric: disconnect
|
|
384
378
|
// if (reason === done forced) metric: force closure
|
|
385
379
|
} else {
|
|
386
|
-
this.logger.info(
|
|
380
|
+
this.logger.info("".concat(this.namespace, ": socket disconnected; will not reconnect"));
|
|
387
381
|
this._emit('offline.permanent', event);
|
|
388
382
|
}
|
|
389
383
|
break;
|
|
390
384
|
default:
|
|
391
|
-
this.logger.info(
|
|
385
|
+
this.logger.info("".concat(this.namespace, ": socket disconnected unexpectedly; will not reconnect"));
|
|
392
386
|
// unexpected disconnect
|
|
393
387
|
this._emit('offline.permanent', event);
|
|
394
388
|
}
|
|
395
389
|
} catch (error) {
|
|
396
|
-
this.logger.error(
|
|
390
|
+
this.logger.error("".concat(this.namespace, ": error occurred in close handler"), error);
|
|
397
391
|
}
|
|
398
392
|
},
|
|
399
393
|
_onmessage: function _onmessage(event) {
|
|
400
394
|
var _this6 = this;
|
|
401
395
|
var envelope = event.data;
|
|
402
396
|
if (process.env.ENABLE_MERCURY_LOGGING) {
|
|
403
|
-
this.logger.debug(
|
|
397
|
+
this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
|
|
404
398
|
}
|
|
405
399
|
var data = envelope.data;
|
|
406
400
|
this._applyOverrides(data);
|
|
@@ -411,7 +405,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
411
405
|
return new _promise.default(function (resolve) {
|
|
412
406
|
return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
|
|
413
407
|
}).catch(function (reason) {
|
|
414
|
-
return _this6.logger.error("
|
|
408
|
+
return _this6.logger.error("".concat(_this6.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
|
|
415
409
|
});
|
|
416
410
|
});
|
|
417
411
|
}, _promise.default.resolve()).then(function () {
|
|
@@ -426,14 +420,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
426
420
|
_this6._emit("event:".concat(data.eventType), envelope);
|
|
427
421
|
}
|
|
428
422
|
}).catch(function (reason) {
|
|
429
|
-
_this6.logger.error(
|
|
423
|
+
_this6.logger.error("".concat(_this6.namespace, ": error occurred processing socket message"), reason);
|
|
430
424
|
});
|
|
431
425
|
},
|
|
432
426
|
_reconnect: function _reconnect(webSocketUrl) {
|
|
433
|
-
this.logger.info(
|
|
427
|
+
this.logger.info("".concat(this.namespace, ": reconnecting"));
|
|
434
428
|
return this.connect(webSocketUrl);
|
|
435
429
|
},
|
|
436
|
-
version: "3.0.0-beta.
|
|
430
|
+
version: "3.0.0-beta.391"
|
|
437
431
|
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "connect", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "connect"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "disconnect", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "disconnect"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "listen", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "listen"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "stopListening", [_dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "stopListening"), _obj)), _obj)));
|
|
438
432
|
var _default = Mercury;
|
|
439
433
|
exports.default = _default;
|
package/dist/mercury.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","session","connected","default","type","connecting","socket","localClusterServiceUrls","derived","listening","deps","fn","connect","webSocketUrl","logger","info","resolve","webex","internal","device","registered","register","then","_connectWithBackoff","disconnect","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","forEach","keyPath","_prepareUrl","feature","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","multipleConnections","format","_attemptConnection","socketUrl","callback","Socket","attemptWSUrl","on","_onclose","_onmessage","args","_emit","all","credentials","getUserToken","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","open","metrics","submitClientMetrics","fields","success","tags","action","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","error","markFailedUrl","call","onComplete","err","undefined","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","maxRetries","failAfter","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","trigger","_getEventHandlers","eventType","split","name","handlers","handlerName","push","toLowerCase","unset","_reconnect","includes","envelope","data","ENABLE_MERCURY_LOGGING","reduce","promise","handler","oneFlight"],"sources":["mercury.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated, oneFlight} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n socket: 'object',\n localClusterServiceUrls: 'object',\n },\n\n derived: {\n listening: {\n deps: ['connected'],\n fn() {\n return this.connected;\n },\n },\n },\n\n @oneFlight\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info('mercury: already connected, will not connect again');\n\n return Promise.resolve();\n }\n\n this.connecting = true;\n\n return Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n ).then(() => {\n this.logger.info('mercury: connecting');\n\n return this._connectWithBackoff(webSocketUrl);\n });\n },\n\n @oneFlight\n disconnect() {\n return new Promise((resolve) => {\n if (this.backoffCall) {\n this.logger.info('mercury: aborting connection');\n this.backoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n this.socket.close();\n\n return;\n }\n\n resolve();\n });\n },\n\n @deprecated('Mercury#listen(): Use Mercury#connect() instead')\n listen() {\n /* eslint no-invalid-this: [0] */\n return this.connect();\n },\n\n @deprecated('Mercury#stopListening(): Use Mercury#disconnect() instead')\n stopListening() {\n /* eslint no-invalid-this: [0] */\n return this.disconnect();\n },\n\n processRegistrationStatusEvent(message) {\n this.localClusterServiceUrls = message.localClusterServiceUrls;\n },\n\n _applyOverrides(event) {\n if (!event || !event.headers) {\n return;\n }\n const headerKeys = Object.keys(event.headers);\n\n headerKeys.forEach((keyPath) => {\n set(event, keyPath, event.headers[keyPath]);\n });\n },\n\n _prepareUrl(webSocketUrl) {\n if (!webSocketUrl) {\n webSocketUrl = this.webex.internal.device.webSocketUrl;\n }\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);\n }\n\n return webSocketUrl;\n })\n .then((wsUrl) => {\n webSocketUrl = wsUrl;\n })\n .then(() => this.webex.internal.feature.getFeature('developer', 'web-shared-mercury'))\n .then((webSharedMercury) => {\n webSocketUrl = url.parse(webSocketUrl, true);\n Object.assign(webSocketUrl.query, {\n outboundWireFormat: 'text',\n bufferStates: true,\n aliasHttpStatus: true,\n });\n\n if (webSharedMercury) {\n Object.assign(webSocketUrl.query, {\n mercuryRegistrationStatus: true,\n isRegistrationRefreshEnabled: true,\n });\n Reflect.deleteProperty(webSocketUrl.query, 'bufferStates');\n }\n\n if (get(this, 'webex.config.device.ephemeral', false)) {\n webSocketUrl.query.multipleConnections = true;\n }\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, callback) {\n const socket = new Socket();\n let attemptWSUrl;\n\n socket.on('close', (...args) => this._onclose(...args));\n socket.on('message', (...args) => this._onmessage(...args));\n socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));\n\n Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()])\n .then(([webSocketUrl, token]) => {\n if (!this.backoffCall) {\n const msg = 'mercury: prevent socket open when backoffCall no longer defined';\n\n this.logger.info(msg);\n\n return Promise.reject(new Error(msg));\n }\n\n attemptWSUrl = webSocketUrl;\n\n let options = {\n forceCloseDelay: this.config.forceCloseDelay,\n pingInterval: this.config.pingInterval,\n pongTimeout: this.config.pongTimeout,\n token: token.toString(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n // if the consumer has supplied request options use them\n if (this.webex.config.defaultMercuryOptions) {\n this.logger.info('mercury: setting custom options');\n options = {...options, ...this.webex.config.defaultMercuryOptions};\n }\n\n // Set the socket before opening it. This allows a disconnect() to close\n // the socket if it is in the process of being opened.\n this.socket = socket;\n\n return socket.open(webSocketUrl, options);\n })\n .then(() => {\n this.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {\n fields: {\n success: true,\n },\n tags: {\n action: 'connected',\n url: attemptWSUrl,\n },\n });\n callback();\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.device.refresh();\n }\n\n return Promise.resolve();\n });\n })\n .catch((reason) => {\n // Suppress connection errors that appear to be network related. This\n // may end up suppressing metrics during outages, but we might not care\n // (especially since many of our outages happen in a way that client\n // metrics can't be trusted).\n if (reason.code !== 1006 && this.backoffCall && this.backoffCall.getNumRetries() > 0) {\n this._emit('connection_failed', reason, {retries: this.backoffCall.getNumRetries()});\n }\n this.logger.info('mercury: connection attempt failed', reason);\n // UnknownResponse is produced by IE for any 4XXX; treated it like a bad\n // web socket url and let WDM handle the token checking\n if (reason instanceof UnknownResponse) {\n this.logger.info(\n 'mercury: received unknown response code, refreshing device registration'\n );\n\n return this.webex.internal.device.refresh().then(() => callback(reason));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info('mercury: received authorization error, reauthorizing');\n\n return this.webex.credentials.refresh({force: true}).then(() => callback(reason));\n }\n // // NotFound implies expired web socket url\n // else if (reason instanceof NotFound) {\n // this.logger.info(`mercury: received not found error, refreshing device registration`);\n // return this.webex.internal.device.refresh()\n // .then(() => callback(reason));\n // }\n // BadRequest implies current credentials are for a Service Account\n // Forbidden implies current user is not entitle for Webex\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn('mercury: received unrecoverable response from mercury');\n this.backoffCall.abort();\n\n return callback(reason);\n }\n if (reason instanceof ConnectionError) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n this.logger.info(\n 'mercury: received a generic connection error, will try to connect to another datacenter'\n );\n this.webex.internal.metrics.submitClientMetrics('web-ha-mercury', {\n fields: {\n success: false,\n },\n tags: {\n action: 'failed',\n error: reason.message,\n url: attemptWSUrl,\n },\n });\n\n return this.webex.internal.services.markFailedUrl(attemptWSUrl);\n }\n\n return null;\n })\n .then(() => callback(reason));\n }\n\n return callback(reason);\n })\n .catch((reason) => {\n this.logger.error('mercury: failed to handle connection failure', reason);\n callback(reason);\n });\n },\n\n _connectWithBackoff(webSocketUrl) {\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether or not call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err) => {\n this.connecting = false;\n\n this.backoffCall = undefined;\n if (err) {\n this.logger.info(\n `mercury: failed to connect after ${call.getNumRetries()} retries; log statement about next retry was inaccurate; ${err}`\n );\n\n return reject(err);\n }\n this.connected = true;\n this._emit('online');\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n this.logger.info(`mercury: executing connection attempt ${call.getNumRetries()}`);\n this._attemptConnection(webSocketUrl, callback);\n }, onComplete);\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n call.on('abort', () => {\n this.logger.info('mercury: connection aborted');\n reject(new Error('Mercury Connection Aborted'));\n });\n\n call.on('callback', (err) => {\n if (err) {\n const number = call.getNumRetries();\n const delay = Math.min(call.strategy_.nextBackoffDelay_, this.config.backoffTimeMax);\n\n this.logger.info(\n `mercury: failed to connect; attempting retry ${number + 1} in ${delay} ms`\n );\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'development') {\n this.logger.debug('mercury: ', err, err.stack);\n }\n\n return;\n }\n this.logger.info('mercury: connected');\n });\n\n call.start();\n\n this.backoffCall = call;\n });\n },\n\n _emit(...args) {\n try {\n this.trigger(...args);\n } catch (error) {\n this.logger.error('mercury: error occurred in event handler', error);\n }\n },\n\n _getEventHandlers(eventType) {\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _onclose(event) {\n // I don't see any way to avoid the complexity or statement count in here.\n /* eslint complexity: [0] */\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n const socketUrl = this.socket.url;\n\n this.socket.removeAllListeners();\n this.unset('socket');\n this.connected = false;\n this._emit('offline', event);\n\n switch (event.code) {\n case 1003:\n // metric: disconnect\n this.logger.info(\n `mercury: Mercury service rejected last message; will not reconnect: ${event.reason}`\n );\n this._emit('offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n this.logger.info('mercury: socket replaced; will not reconnect');\n this._emit('offline.replaced', event);\n break;\n case 1001:\n case 1005:\n case 1006:\n case 1011:\n this.logger.info('mercury: socket disconnected; reconnecting');\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (code == 1011 && reason !== ping error) metric: unexpected disconnect\n break;\n case 1000:\n if (normalReconnectReasons.includes(reason)) {\n this.logger.info('mercury: socket disconnected; reconnecting');\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info('mercury: socket disconnected; will not reconnect');\n this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info('mercury: socket disconnected unexpectedly; will not reconnect');\n // unexpected disconnect\n this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error('mercury: error occurred in close handler', error);\n }\n },\n\n _onmessage(event) {\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug('mercury: message envelope: ', envelope);\n }\n\n const {data} = envelope;\n\n this._applyOverrides(data);\n\n return this._getEventHandlers(data.eventType)\n .reduce(\n (promise, handler) =>\n promise.then(() => {\n const {namespace, name} = handler;\n\n return new Promise((resolve) =>\n resolve((this.webex[namespace] || this.webex.internal[namespace])[name](data))\n ).catch((reason) =>\n this.logger.error(\n `mercury: error occurred in autowired event handler for ${data.eventType}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit('event', event.data);\n const [namespace] = data.eventType.split('.');\n\n if (namespace === data.eventType) {\n this._emit(`event:${namespace}`, envelope);\n } else {\n this._emit(`event:${namespace}`, envelope);\n this._emit(`event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error('mercury: error occurred processing socket message', reason);\n });\n },\n\n _reconnect(webSocketUrl) {\n this.logger.info('mercury: reconnecting');\n\n return this.connect(webSocketUrl);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","session","connected","default","type","connecting","socket","localClusterServiceUrls","derived","listening","deps","fn","connect","webSocketUrl","logger","info","resolve","webex","internal","device","registered","register","then","_connectWithBackoff","disconnect","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","forEach","keyPath","_prepareUrl","feature","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","multipleConnections","format","_attemptConnection","socketUrl","callback","Socket","attemptWSUrl","on","_onclose","_onmessage","args","_emit","all","credentials","getUserToken","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","open","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","markFailedUrl","error","call","onComplete","err","undefined","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","maxRetries","failAfter","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","trigger","arguments","_getEventHandlers","eventType","split","name","handlers","handlerName","push","toLowerCase","unset","_reconnect","includes","envelope","data","ENABLE_MERCURY_LOGGING","reduce","promise","handler","oneFlight"],"sources":["mercury.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated, oneFlight} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n socket: 'object',\n localClusterServiceUrls: 'object',\n },\n\n derived: {\n listening: {\n deps: ['connected'],\n fn() {\n return this.connected;\n },\n },\n },\n\n @oneFlight\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info(`${this.namespace}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n this.connecting = true;\n\n return Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n ).then(() => {\n this.logger.info(`${this.namespace}: connecting`);\n\n return this._connectWithBackoff(webSocketUrl);\n });\n },\n\n @oneFlight\n disconnect() {\n return new Promise((resolve) => {\n if (this.backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection`);\n this.backoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n resolve(this.socket.close());\n }\n\n resolve();\n });\n },\n\n @deprecated('Mercury#listen(): Use Mercury#connect() instead')\n listen() {\n /* eslint no-invalid-this: [0] */\n return this.connect();\n },\n\n @deprecated('Mercury#stopListening(): Use Mercury#disconnect() instead')\n stopListening() {\n /* eslint no-invalid-this: [0] */\n return this.disconnect();\n },\n\n processRegistrationStatusEvent(message) {\n this.localClusterServiceUrls = message.localClusterServiceUrls;\n },\n\n _applyOverrides(event) {\n if (!event || !event.headers) {\n return;\n }\n const headerKeys = Object.keys(event.headers);\n\n headerKeys.forEach((keyPath) => {\n set(event, keyPath, event.headers[keyPath]);\n });\n },\n\n _prepareUrl(webSocketUrl) {\n if (!webSocketUrl) {\n webSocketUrl = this.webex.internal.device.webSocketUrl;\n }\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);\n }\n\n return webSocketUrl;\n })\n .then((wsUrl) => {\n webSocketUrl = wsUrl;\n })\n .then(() => this.webex.internal.feature.getFeature('developer', 'web-shared-mercury'))\n .then((webSharedMercury) => {\n webSocketUrl = url.parse(webSocketUrl, true);\n Object.assign(webSocketUrl.query, {\n outboundWireFormat: 'text',\n bufferStates: true,\n aliasHttpStatus: true,\n });\n\n if (webSharedMercury) {\n Object.assign(webSocketUrl.query, {\n mercuryRegistrationStatus: true,\n isRegistrationRefreshEnabled: true,\n });\n Reflect.deleteProperty(webSocketUrl.query, 'bufferStates');\n }\n\n if (get(this, 'webex.config.device.ephemeral', false)) {\n webSocketUrl.query.multipleConnections = true;\n }\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, callback) {\n const socket = new Socket();\n let attemptWSUrl;\n\n socket.on('close', (...args) => this._onclose(...args));\n socket.on('message', (...args) => this._onmessage(...args));\n socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));\n socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args));\n\n Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()])\n .then(([webSocketUrl, token]) => {\n if (!this.backoffCall) {\n const msg = `${this.namespace}: prevent socket open when backoffCall no longer defined`;\n\n this.logger.info(msg);\n\n return Promise.reject(new Error(msg));\n }\n\n attemptWSUrl = webSocketUrl;\n\n let options = {\n forceCloseDelay: this.config.forceCloseDelay,\n pingInterval: this.config.pingInterval,\n pongTimeout: this.config.pongTimeout,\n token: token.toString(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n // if the consumer has supplied request options use them\n if (this.webex.config.defaultMercuryOptions) {\n this.logger.info(`${this.namespace}: setting custom options`);\n options = {...options, ...this.webex.config.defaultMercuryOptions};\n }\n\n // Set the socket before opening it. This allows a disconnect() to close\n // the socket if it is in the process of being opened.\n this.socket = socket;\n\n this.logger.info(`${this.namespace} connection url: ${webSocketUrl}`);\n\n return socket.open(webSocketUrl, options);\n })\n .then(() => {\n this.logger.info(\n `${this.namespace}: connected to mercury, success, action: connected, url: ${attemptWSUrl}`\n );\n callback();\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.device.refresh();\n }\n\n return Promise.resolve();\n });\n })\n .catch((reason) => {\n // Suppress connection errors that appear to be network related. This\n // may end up suppressing metrics during outages, but we might not care\n // (especially since many of our outages happen in a way that client\n // metrics can't be trusted).\n if (reason.code !== 1006 && this.backoffCall && this.backoffCall.getNumRetries() > 0) {\n this._emit('connection_failed', reason, {retries: this.backoffCall.getNumRetries()});\n }\n this.logger.info(`${this.namespace}: connection attempt failed`, reason);\n // UnknownResponse is produced by IE for any 4XXX; treated it like a bad\n // web socket url and let WDM handle the token checking\n if (reason instanceof UnknownResponse) {\n this.logger.info(\n `${this.namespace}: received unknown response code, refreshing device registration`\n );\n\n return this.webex.internal.device.refresh().then(() => callback(reason));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(`${this.namespace}: received authorization error, reauthorizing`);\n\n return this.webex.credentials.refresh({force: true}).then(() => callback(reason));\n }\n // // NotFound implies expired web socket url\n // else if (reason instanceof NotFound) {\n // this.logger.info(`mercury: received not found error, refreshing device registration`);\n // return this.webex.internal.device.refresh()\n // .then(() => callback(reason));\n // }\n // BadRequest implies current credentials are for a Service Account\n // Forbidden implies current user is not entitle for Webex\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(`${this.namespace}: received unrecoverable response from mercury`);\n this.backoffCall.abort();\n\n return callback(reason);\n }\n if (reason instanceof ConnectionError) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n this.logger.info(\n `${this.namespace}: received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ${attemptWSUrl} error: ${reason.message}`\n );\n\n return this.webex.internal.services.markFailedUrl(attemptWSUrl);\n }\n\n return null;\n })\n .then(() => callback(reason));\n }\n\n return callback(reason);\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: failed to handle connection failure`, reason);\n callback(reason);\n });\n },\n\n _connectWithBackoff(webSocketUrl) {\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether or not call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err) => {\n this.connecting = false;\n\n this.backoffCall = undefined;\n if (err) {\n this.logger.info(\n `${\n this.namespace\n }: failed to connect after ${call.getNumRetries()} retries; log statement about next retry was inaccurate; ${err}`\n );\n\n return reject(err);\n }\n this.connected = true;\n this._emit('online');\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n this.logger.info(`${this.namespace}: executing connection attempt ${call.getNumRetries()}`);\n this._attemptConnection(webSocketUrl, callback);\n }, onComplete);\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n call.on('abort', () => {\n this.logger.info(`${this.namespace}: connection aborted`);\n reject(new Error('Mercury Connection Aborted'));\n });\n\n call.on('callback', (err) => {\n if (err) {\n const number = call.getNumRetries();\n const delay = Math.min(call.strategy_.nextBackoffDelay_, this.config.backoffTimeMax);\n\n this.logger.info(\n `${this.namespace}: failed to connect; attempting retry ${number + 1} in ${delay} ms`\n );\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'development') {\n this.logger.debug(`${this.namespace}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${this.namespace}: connected`);\n });\n\n call.start();\n\n this.backoffCall = call;\n });\n },\n\n _emit(...args) {\n try {\n this.trigger(...args);\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in event handler`, {\n error,\n arguments: args,\n });\n }\n },\n\n _getEventHandlers(eventType) {\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _onclose(event) {\n // I don't see any way to avoid the complexity or statement count in here.\n /* eslint complexity: [0] */\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n const socketUrl = this.socket.url;\n\n this.socket.removeAllListeners();\n this.unset('socket');\n this.connected = false;\n this._emit('offline', event);\n\n switch (event.code) {\n case 1003:\n // metric: disconnect\n this.logger.info(\n `${this.namespace}: Mercury service rejected last message; will not reconnect: ${event.reason}`\n );\n this._emit('offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n this.logger.info(`${this.namespace}: socket replaced; will not reconnect`);\n this._emit('offline.replaced', event);\n break;\n case 1001:\n case 1005:\n case 1006:\n case 1011:\n this.logger.info(`${this.namespace}: socket disconnected; reconnecting`);\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (code == 1011 && reason !== ping error) metric: unexpected disconnect\n break;\n case 1000:\n if (normalReconnectReasons.includes(reason)) {\n this.logger.info(`${this.namespace}: socket disconnected; reconnecting`);\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(`${this.namespace}: socket disconnected; will not reconnect`);\n this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in close handler`, error);\n }\n },\n\n _onmessage(event) {\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope: `, envelope);\n }\n\n const {data} = envelope;\n\n this._applyOverrides(data);\n\n return this._getEventHandlers(data.eventType)\n .reduce(\n (promise, handler) =>\n promise.then(() => {\n const {namespace, name} = handler;\n\n return new Promise((resolve) =>\n resolve((this.webex[namespace] || this.webex.internal[namespace])[name](data))\n ).catch((reason) =>\n this.logger.error(\n `${this.namespace}: error occurred in autowired event handler for ${data.eventType}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit('event', event.data);\n const [namespace] = data.eventType.split('.');\n\n if (namespace === data.eventType) {\n this._emit(`event:${namespace}`, envelope);\n } else {\n this._emit(`event:${namespace}`, envelope);\n this._emit(`event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: error occurred processing socket message`, reason);\n });\n },\n\n _reconnect(webSocketUrl) {\n this.logger.info(`${this.namespace}: reconnecting`);\n\n return this.connect(webSocketUrl);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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"}
|