@webex/internal-plugin-mercury 3.3.1-next.1 → 3.3.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.
- package/dist/mercury.js +81 -95
- package/dist/mercury.js.map +1 -1
- package/package.json +17 -17
- package/src/mercury.js +0 -14
- package/test/unit/spec/mercury.js +0 -23
package/dist/mercury.js
CHANGED
|
@@ -62,20 +62,6 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
|
-
initialize: function initialize() {
|
|
66
|
-
var _this = this;
|
|
67
|
-
/*
|
|
68
|
-
When one of these legacy feature gets updated, this event would be triggered
|
|
69
|
-
* group-message-notifications
|
|
70
|
-
* mention-notifications
|
|
71
|
-
* thread-notifications
|
|
72
|
-
*/
|
|
73
|
-
this.on('event:featureToggle_update', function (envelope) {
|
|
74
|
-
if (envelope && envelope.data) {
|
|
75
|
-
_this.webex.internal.feature.updateFeature(envelope.data.featureToggle);
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
},
|
|
79
65
|
/**
|
|
80
66
|
* Get the last error.
|
|
81
67
|
* @returns {any} The last error.
|
|
@@ -84,28 +70,28 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
84
70
|
return this.lastError;
|
|
85
71
|
},
|
|
86
72
|
connect: function connect(webSocketUrl) {
|
|
87
|
-
var
|
|
73
|
+
var _this = this;
|
|
88
74
|
if (this.connected) {
|
|
89
75
|
this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
|
|
90
76
|
return _promise.default.resolve();
|
|
91
77
|
}
|
|
92
78
|
this.connecting = true;
|
|
93
79
|
return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
|
|
94
|
-
|
|
95
|
-
return
|
|
80
|
+
_this.logger.info("".concat(_this.namespace, ": connecting"));
|
|
81
|
+
return _this._connectWithBackoff(webSocketUrl);
|
|
96
82
|
});
|
|
97
83
|
},
|
|
98
84
|
disconnect: function disconnect() {
|
|
99
|
-
var
|
|
85
|
+
var _this2 = this;
|
|
100
86
|
return new _promise.default(function (resolve) {
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
|
|
87
|
+
if (_this2.backoffCall) {
|
|
88
|
+
_this2.logger.info("".concat(_this2.namespace, ": aborting connection"));
|
|
89
|
+
_this2.backoffCall.abort();
|
|
104
90
|
}
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
resolve(
|
|
91
|
+
if (_this2.socket) {
|
|
92
|
+
_this2.socket.removeAllListeners('message');
|
|
93
|
+
_this2.once('offline', resolve);
|
|
94
|
+
resolve(_this2.socket.close());
|
|
109
95
|
}
|
|
110
96
|
resolve();
|
|
111
97
|
});
|
|
@@ -131,19 +117,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
131
117
|
});
|
|
132
118
|
},
|
|
133
119
|
_prepareUrl: function _prepareUrl(webSocketUrl) {
|
|
134
|
-
var
|
|
120
|
+
var _this3 = this;
|
|
135
121
|
if (!webSocketUrl) {
|
|
136
122
|
webSocketUrl = this.webex.internal.device.webSocketUrl;
|
|
137
123
|
}
|
|
138
124
|
return this.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
139
125
|
if (haMessagingEnabled) {
|
|
140
|
-
return
|
|
126
|
+
return _this3.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
|
|
141
127
|
}
|
|
142
128
|
return webSocketUrl;
|
|
143
129
|
}).then(function (wsUrl) {
|
|
144
130
|
webSocketUrl = wsUrl;
|
|
145
131
|
}).then(function () {
|
|
146
|
-
return
|
|
132
|
+
return _this3.webex.internal.feature.getFeature('developer', 'web-shared-mercury');
|
|
147
133
|
}).then(function (webSharedMercury) {
|
|
148
134
|
webSocketUrl = _url.default.parse(webSocketUrl, true);
|
|
149
135
|
(0, _assign.default)(webSocketUrl.query, {
|
|
@@ -158,98 +144,98 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
158
144
|
});
|
|
159
145
|
(0, _deleteProperty.default)(webSocketUrl.query, 'bufferStates');
|
|
160
146
|
}
|
|
161
|
-
if ((0, _lodash.get)(
|
|
147
|
+
if ((0, _lodash.get)(_this3, 'webex.config.device.ephemeral', false)) {
|
|
162
148
|
webSocketUrl.query.multipleConnections = true;
|
|
163
149
|
}
|
|
164
150
|
return _url.default.format(webSocketUrl);
|
|
165
151
|
});
|
|
166
152
|
},
|
|
167
153
|
_attemptConnection: function _attemptConnection(socketUrl, callback) {
|
|
168
|
-
var
|
|
154
|
+
var _this4 = this;
|
|
169
155
|
var socket = new _socket.default();
|
|
170
156
|
var attemptWSUrl;
|
|
171
157
|
socket.on('close', function () {
|
|
172
|
-
return
|
|
158
|
+
return _this4._onclose.apply(_this4, arguments);
|
|
173
159
|
});
|
|
174
160
|
socket.on('message', function () {
|
|
175
|
-
return
|
|
161
|
+
return _this4._onmessage.apply(_this4, arguments);
|
|
176
162
|
});
|
|
177
163
|
socket.on('sequence-mismatch', function () {
|
|
178
164
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
179
165
|
args[_key] = arguments[_key];
|
|
180
166
|
}
|
|
181
|
-
return
|
|
167
|
+
return _this4._emit.apply(_this4, ['sequence-mismatch'].concat(args));
|
|
182
168
|
});
|
|
183
169
|
socket.on('ping-pong-latency', function () {
|
|
184
170
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
185
171
|
args[_key2] = arguments[_key2];
|
|
186
172
|
}
|
|
187
|
-
return
|
|
173
|
+
return _this4._emit.apply(_this4, ['ping-pong-latency'].concat(args));
|
|
188
174
|
});
|
|
189
175
|
_promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
|
|
190
176
|
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
|
|
191
177
|
webSocketUrl = _ref2[0],
|
|
192
178
|
token = _ref2[1];
|
|
193
|
-
if (!
|
|
194
|
-
var msg = "".concat(
|
|
195
|
-
|
|
179
|
+
if (!_this4.backoffCall) {
|
|
180
|
+
var msg = "".concat(_this4.namespace, ": prevent socket open when backoffCall no longer defined");
|
|
181
|
+
_this4.logger.info(msg);
|
|
196
182
|
return _promise.default.reject(new Error(msg));
|
|
197
183
|
}
|
|
198
184
|
attemptWSUrl = webSocketUrl;
|
|
199
185
|
var options = {
|
|
200
|
-
forceCloseDelay:
|
|
201
|
-
pingInterval:
|
|
202
|
-
pongTimeout:
|
|
186
|
+
forceCloseDelay: _this4.config.forceCloseDelay,
|
|
187
|
+
pingInterval: _this4.config.pingInterval,
|
|
188
|
+
pongTimeout: _this4.config.pongTimeout,
|
|
203
189
|
token: token.toString(),
|
|
204
|
-
trackingId: "".concat(
|
|
205
|
-
logger:
|
|
190
|
+
trackingId: "".concat(_this4.webex.sessionId, "_").concat((0, _now.default)()),
|
|
191
|
+
logger: _this4.logger
|
|
206
192
|
};
|
|
207
193
|
|
|
208
194
|
// if the consumer has supplied request options use them
|
|
209
|
-
if (
|
|
210
|
-
|
|
211
|
-
options = _objectSpread(_objectSpread({}, options),
|
|
195
|
+
if (_this4.webex.config.defaultMercuryOptions) {
|
|
196
|
+
_this4.logger.info("".concat(_this4.namespace, ": setting custom options"));
|
|
197
|
+
options = _objectSpread(_objectSpread({}, options), _this4.webex.config.defaultMercuryOptions);
|
|
212
198
|
}
|
|
213
199
|
|
|
214
200
|
// Set the socket before opening it. This allows a disconnect() to close
|
|
215
201
|
// the socket if it is in the process of being opened.
|
|
216
|
-
|
|
217
|
-
|
|
202
|
+
_this4.socket = socket;
|
|
203
|
+
_this4.logger.info("".concat(_this4.namespace, " connection url: ").concat(webSocketUrl));
|
|
218
204
|
return socket.open(webSocketUrl, options);
|
|
219
205
|
}).then(function () {
|
|
220
|
-
|
|
206
|
+
_this4.logger.info("".concat(_this4.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
|
|
221
207
|
callback();
|
|
222
|
-
return
|
|
208
|
+
return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
223
209
|
if (haMessagingEnabled) {
|
|
224
|
-
return
|
|
210
|
+
return _this4.webex.internal.device.refresh();
|
|
225
211
|
}
|
|
226
212
|
return _promise.default.resolve();
|
|
227
213
|
});
|
|
228
214
|
}).catch(function (reason) {
|
|
229
|
-
|
|
215
|
+
_this4.lastError = reason; // remember the last error
|
|
230
216
|
|
|
231
217
|
// Suppress connection errors that appear to be network related. This
|
|
232
218
|
// may end up suppressing metrics during outages, but we might not care
|
|
233
219
|
// (especially since many of our outages happen in a way that client
|
|
234
220
|
// metrics can't be trusted).
|
|
235
|
-
if (reason.code !== 1006 &&
|
|
236
|
-
|
|
237
|
-
retries:
|
|
221
|
+
if (reason.code !== 1006 && _this4.backoffCall && _this4.backoffCall.getNumRetries() > 0) {
|
|
222
|
+
_this4._emit('connection_failed', reason, {
|
|
223
|
+
retries: _this4.backoffCall.getNumRetries()
|
|
238
224
|
});
|
|
239
225
|
}
|
|
240
|
-
|
|
226
|
+
_this4.logger.info("".concat(_this4.namespace, ": connection attempt failed"), reason);
|
|
241
227
|
// UnknownResponse is produced by IE for any 4XXX; treated it like a bad
|
|
242
228
|
// web socket url and let WDM handle the token checking
|
|
243
229
|
if (reason instanceof _errors.UnknownResponse) {
|
|
244
|
-
|
|
245
|
-
return
|
|
230
|
+
_this4.logger.info("".concat(_this4.namespace, ": received unknown response code, refreshing device registration"));
|
|
231
|
+
return _this4.webex.internal.device.refresh().then(function () {
|
|
246
232
|
return callback(reason);
|
|
247
233
|
});
|
|
248
234
|
}
|
|
249
235
|
// NotAuthorized implies expired token
|
|
250
236
|
if (reason instanceof _errors.NotAuthorized) {
|
|
251
|
-
|
|
252
|
-
return
|
|
237
|
+
_this4.logger.info("".concat(_this4.namespace, ": received authorization error, reauthorizing"));
|
|
238
|
+
return _this4.webex.credentials.refresh({
|
|
253
239
|
force: true
|
|
254
240
|
}).then(function () {
|
|
255
241
|
return callback(reason);
|
|
@@ -264,15 +250,15 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
264
250
|
// BadRequest implies current credentials are for a Service Account
|
|
265
251
|
// Forbidden implies current user is not entitle for Webex
|
|
266
252
|
if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
|
|
267
|
-
|
|
268
|
-
|
|
253
|
+
_this4.logger.warn("".concat(_this4.namespace, ": received unrecoverable response from mercury"));
|
|
254
|
+
_this4.backoffCall.abort();
|
|
269
255
|
return callback(reason);
|
|
270
256
|
}
|
|
271
257
|
if (reason instanceof _errors.ConnectionError) {
|
|
272
|
-
return
|
|
258
|
+
return _this4.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
273
259
|
if (haMessagingEnabled) {
|
|
274
|
-
|
|
275
|
-
return
|
|
260
|
+
_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));
|
|
261
|
+
return _this4.webex.internal.services.markFailedUrl(attemptWSUrl);
|
|
276
262
|
}
|
|
277
263
|
return null;
|
|
278
264
|
}).then(function () {
|
|
@@ -281,62 +267,62 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
281
267
|
}
|
|
282
268
|
return callback(reason);
|
|
283
269
|
}).catch(function (reason) {
|
|
284
|
-
|
|
270
|
+
_this4.logger.error("".concat(_this4.namespace, ": failed to handle connection failure"), reason);
|
|
285
271
|
callback(reason);
|
|
286
272
|
});
|
|
287
273
|
},
|
|
288
274
|
_connectWithBackoff: function _connectWithBackoff(webSocketUrl) {
|
|
289
|
-
var
|
|
275
|
+
var _this5 = this;
|
|
290
276
|
return new _promise.default(function (resolve, reject) {
|
|
291
277
|
// eslint gets confused about whether or not call is actually used
|
|
292
278
|
// eslint-disable-next-line prefer-const
|
|
293
279
|
var call;
|
|
294
280
|
var onComplete = function onComplete(err) {
|
|
295
|
-
|
|
296
|
-
|
|
281
|
+
_this5.connecting = false;
|
|
282
|
+
_this5.backoffCall = undefined;
|
|
297
283
|
if (err) {
|
|
298
|
-
|
|
284
|
+
_this5.logger.info("".concat(_this5.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
|
|
299
285
|
return reject(err);
|
|
300
286
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
287
|
+
_this5.connected = true;
|
|
288
|
+
_this5.hasEverConnected = true;
|
|
289
|
+
_this5._emit('online');
|
|
304
290
|
return resolve();
|
|
305
291
|
};
|
|
306
292
|
|
|
307
293
|
// eslint-disable-next-line prefer-reflect
|
|
308
294
|
call = _backoff.default.call(function (callback) {
|
|
309
|
-
|
|
310
|
-
|
|
295
|
+
_this5.logger.info("".concat(_this5.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
|
|
296
|
+
_this5._attemptConnection(webSocketUrl, callback);
|
|
311
297
|
}, onComplete);
|
|
312
298
|
call.setStrategy(new _backoff.default.ExponentialStrategy({
|
|
313
|
-
initialDelay:
|
|
314
|
-
maxDelay:
|
|
299
|
+
initialDelay: _this5.config.backoffTimeReset,
|
|
300
|
+
maxDelay: _this5.config.backoffTimeMax
|
|
315
301
|
}));
|
|
316
|
-
if (
|
|
317
|
-
call.failAfter(
|
|
318
|
-
} else if (
|
|
319
|
-
call.failAfter(
|
|
302
|
+
if (_this5.config.initialConnectionMaxRetries && !_this5.hasEverConnected) {
|
|
303
|
+
call.failAfter(_this5.config.initialConnectionMaxRetries);
|
|
304
|
+
} else if (_this5.config.maxRetries) {
|
|
305
|
+
call.failAfter(_this5.config.maxRetries);
|
|
320
306
|
}
|
|
321
307
|
call.on('abort', function () {
|
|
322
|
-
|
|
308
|
+
_this5.logger.info("".concat(_this5.namespace, ": connection aborted"));
|
|
323
309
|
reject(new Error('Mercury Connection Aborted'));
|
|
324
310
|
});
|
|
325
311
|
call.on('callback', function (err) {
|
|
326
312
|
if (err) {
|
|
327
313
|
var number = call.getNumRetries();
|
|
328
|
-
var delay = Math.min(call.strategy_.nextBackoffDelay_,
|
|
329
|
-
|
|
314
|
+
var delay = Math.min(call.strategy_.nextBackoffDelay_, _this5.config.backoffTimeMax);
|
|
315
|
+
_this5.logger.info("".concat(_this5.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
|
|
330
316
|
/* istanbul ignore if */
|
|
331
317
|
if (process.env.NODE_ENV === 'development') {
|
|
332
|
-
|
|
318
|
+
_this5.logger.debug("".concat(_this5.namespace, ": "), err, err.stack);
|
|
333
319
|
}
|
|
334
320
|
return;
|
|
335
321
|
}
|
|
336
|
-
|
|
322
|
+
_this5.logger.info("".concat(_this5.namespace, ": connected"));
|
|
337
323
|
});
|
|
338
324
|
call.start();
|
|
339
|
-
|
|
325
|
+
_this5.backoffCall = call;
|
|
340
326
|
});
|
|
341
327
|
},
|
|
342
328
|
_emit: function _emit() {
|
|
@@ -424,7 +410,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
424
410
|
}
|
|
425
411
|
},
|
|
426
412
|
_onmessage: function _onmessage(event) {
|
|
427
|
-
var
|
|
413
|
+
var _this6 = this;
|
|
428
414
|
var envelope = event.data;
|
|
429
415
|
if (process.env.ENABLE_MERCURY_LOGGING) {
|
|
430
416
|
this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
|
|
@@ -436,31 +422,31 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
436
422
|
var namespace = handler.namespace,
|
|
437
423
|
name = handler.name;
|
|
438
424
|
return new _promise.default(function (resolve) {
|
|
439
|
-
return resolve((
|
|
425
|
+
return resolve((_this6.webex[namespace] || _this6.webex.internal[namespace])[name](data));
|
|
440
426
|
}).catch(function (reason) {
|
|
441
|
-
return
|
|
427
|
+
return _this6.logger.error("".concat(_this6.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
|
|
442
428
|
});
|
|
443
429
|
});
|
|
444
430
|
}, _promise.default.resolve()).then(function () {
|
|
445
|
-
|
|
431
|
+
_this6._emit('event', event.data);
|
|
446
432
|
var _data$eventType$split = data.eventType.split('.'),
|
|
447
433
|
_data$eventType$split2 = (0, _slicedToArray2.default)(_data$eventType$split, 1),
|
|
448
434
|
namespace = _data$eventType$split2[0];
|
|
449
435
|
if (namespace === data.eventType) {
|
|
450
|
-
|
|
436
|
+
_this6._emit("event:".concat(namespace), envelope);
|
|
451
437
|
} else {
|
|
452
|
-
|
|
453
|
-
|
|
438
|
+
_this6._emit("event:".concat(namespace), envelope);
|
|
439
|
+
_this6._emit("event:".concat(data.eventType), envelope);
|
|
454
440
|
}
|
|
455
441
|
}).catch(function (reason) {
|
|
456
|
-
|
|
442
|
+
_this6.logger.error("".concat(_this6.namespace, ": error occurred processing socket message"), reason);
|
|
457
443
|
});
|
|
458
444
|
},
|
|
459
445
|
_reconnect: function _reconnect(webSocketUrl) {
|
|
460
446
|
this.logger.info("".concat(this.namespace, ": reconnecting"));
|
|
461
447
|
return this.connect(webSocketUrl);
|
|
462
448
|
},
|
|
463
|
-
version: "3.3.1
|
|
449
|
+
version: "3.3.1"
|
|
464
450
|
}, ((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)));
|
|
465
451
|
var _default = exports.default = Mercury;
|
|
466
452
|
//# sourceMappingURL=mercury.js.map
|
package/dist/mercury.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","type","connecting","hasEverConnected","socket","localClusterServiceUrls","derived","listening","deps","fn","initialize","_this","on","envelope","data","webex","internal","feature","updateFeature","featureToggle","getLastError","connect","webSocketUrl","_this2","logger","info","concat","_promise","resolve","device","registered","register","then","_connectWithBackoff","disconnect","_this3","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","_keys","keyPath","set","_prepareUrl","_this4","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","get","multipleConnections","format","_attemptConnection","socketUrl","callback","_this5","Socket","attemptWSUrl","_onclose","_onmessage","_len","args","Array","_key","_emit","_len2","_key2","all","credentials","getUserToken","_ref","_ref2","_slicedToArray2","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","_now","defaultMercuryOptions","open","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","markFailedUrl","error","_this6","call","onComplete","err","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","initialConnectionMaxRetries","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","_len3","_key3","trigger","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","name","handlers","handlerName","camelCase","toLowerCase","unset","_reconnect","includes","_this7","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","version","_applyDecoratedDescriptor2","oneFlight","_getOwnPropertyDescriptor","_default","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\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 lastError: undefined,\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n hasEverConnected: {\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 initialize() {\n /*\n When one of these legacy feature gets updated, this event would be triggered\n * group-message-notifications\n * mention-notifications\n * thread-notifications\n */\n this.on('event:featureToggle_update', (envelope) => {\n if (envelope && envelope.data) {\n this.webex.internal.feature.updateFeature(envelope.data.featureToggle);\n }\n });\n },\n\n /**\n * Get the last error.\n * @returns {any} The last error.\n */\n getLastError() {\n return this.lastError;\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 this.lastError = reason; // remember the last error\n\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.hasEverConnected = 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.initialConnectionMaxRetries && !this.hasEverConnected) {\n call.failAfter(this.config.initialConnectionMaxRetries);\n } else 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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"}
|
|
1
|
+
{"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","type","connecting","hasEverConnected","socket","localClusterServiceUrls","derived","listening","deps","fn","getLastError","connect","webSocketUrl","_this","logger","info","concat","_promise","resolve","webex","internal","device","registered","register","then","_connectWithBackoff","disconnect","_this2","backoffCall","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","event","headers","headerKeys","_keys","keyPath","set","_prepareUrl","_this3","feature","getFeature","haMessagingEnabled","services","convertUrlToPriorityHostUrl","wsUrl","webSharedMercury","url","parse","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","get","multipleConnections","format","_attemptConnection","socketUrl","callback","_this4","Socket","attemptWSUrl","on","_onclose","_onmessage","_len","args","Array","_key","_emit","_len2","_key2","all","credentials","getUserToken","_ref","_ref2","_slicedToArray2","token","msg","reject","Error","options","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","_now","defaultMercuryOptions","open","refresh","catch","reason","code","getNumRetries","retries","UnknownResponse","NotAuthorized","force","BadRequest","Forbidden","warn","ConnectionError","markFailedUrl","error","_this5","call","onComplete","err","backoff","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","initialConnectionMaxRetries","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","stack","start","_len3","_key3","trigger","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","name","handlers","handlerName","camelCase","toLowerCase","unset","_reconnect","includes","_this6","envelope","data","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","version","_applyDecoratedDescriptor2","oneFlight","_getOwnPropertyDescriptor","_default","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\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 lastError: undefined,\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n hasEverConnected: {\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 /**\n * Get the last error.\n * @returns {any} The last error.\n */\n getLastError() {\n return this.lastError;\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 this.lastError = reason; // remember the last error\n\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.hasEverConnected = 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.initialConnectionMaxRetries && !this.hasEverConnected) {\n call.failAfter(this.config.initialConnectionMaxRetries);\n } else 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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"}
|
package/package.json
CHANGED
|
@@ -29,27 +29,27 @@
|
|
|
29
29
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
30
30
|
"@webex/jest-config-legacy": "0.0.0",
|
|
31
31
|
"@webex/legacy-tools": "0.0.0",
|
|
32
|
-
"@webex/test-helper-chai": "3.1
|
|
33
|
-
"@webex/test-helper-mocha": "3.1
|
|
34
|
-
"@webex/test-helper-mock-webex": "3.1
|
|
35
|
-
"@webex/test-helper-test-users": "3.1
|
|
32
|
+
"@webex/test-helper-chai": "3.3.1",
|
|
33
|
+
"@webex/test-helper-mocha": "3.3.1",
|
|
34
|
+
"@webex/test-helper-mock-webex": "3.3.1",
|
|
35
|
+
"@webex/test-helper-test-users": "3.3.1",
|
|
36
36
|
"eslint": "^8.24.0",
|
|
37
37
|
"prettier": "^2.7.1",
|
|
38
38
|
"sinon": "^9.2.4"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@webex/common": "3.1
|
|
42
|
-
"@webex/common-timers": "3.1
|
|
43
|
-
"@webex/internal-plugin-device": "3.1
|
|
44
|
-
"@webex/internal-plugin-feature": "3.3.1
|
|
45
|
-
"@webex/internal-plugin-metrics": "3.1
|
|
46
|
-
"@webex/test-helper-chai": "3.1
|
|
47
|
-
"@webex/test-helper-mocha": "3.1
|
|
48
|
-
"@webex/test-helper-mock-web-socket": "3.1
|
|
49
|
-
"@webex/test-helper-mock-webex": "3.1
|
|
50
|
-
"@webex/test-helper-refresh-callback": "3.1
|
|
51
|
-
"@webex/test-helper-test-users": "3.1
|
|
52
|
-
"@webex/webex-core": "3.1
|
|
41
|
+
"@webex/common": "3.3.1",
|
|
42
|
+
"@webex/common-timers": "3.3.1",
|
|
43
|
+
"@webex/internal-plugin-device": "3.3.1",
|
|
44
|
+
"@webex/internal-plugin-feature": "3.3.1",
|
|
45
|
+
"@webex/internal-plugin-metrics": "3.3.1",
|
|
46
|
+
"@webex/test-helper-chai": "3.3.1",
|
|
47
|
+
"@webex/test-helper-mocha": "3.3.1",
|
|
48
|
+
"@webex/test-helper-mock-web-socket": "3.3.1",
|
|
49
|
+
"@webex/test-helper-mock-webex": "3.3.1",
|
|
50
|
+
"@webex/test-helper-refresh-callback": "3.3.1",
|
|
51
|
+
"@webex/test-helper-test-users": "3.3.1",
|
|
52
|
+
"@webex/webex-core": "3.3.1",
|
|
53
53
|
"backoff": "^2.5.0",
|
|
54
54
|
"lodash": "^4.17.21",
|
|
55
55
|
"uuid": "^3.3.2",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"test:style": "eslint ./src/**/*.*",
|
|
65
65
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
66
66
|
},
|
|
67
|
-
"version": "3.3.1
|
|
67
|
+
"version": "3.3.1"
|
|
68
68
|
}
|
package/src/mercury.js
CHANGED
|
@@ -52,20 +52,6 @@ const Mercury = WebexPlugin.extend({
|
|
|
52
52
|
},
|
|
53
53
|
},
|
|
54
54
|
|
|
55
|
-
initialize() {
|
|
56
|
-
/*
|
|
57
|
-
When one of these legacy feature gets updated, this event would be triggered
|
|
58
|
-
* group-message-notifications
|
|
59
|
-
* mention-notifications
|
|
60
|
-
* thread-notifications
|
|
61
|
-
*/
|
|
62
|
-
this.on('event:featureToggle_update', (envelope) => {
|
|
63
|
-
if (envelope && envelope.data) {
|
|
64
|
-
this.webex.internal.feature.updateFeature(envelope.data.featureToggle);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
},
|
|
68
|
-
|
|
69
55
|
/**
|
|
70
56
|
* Get the last error.
|
|
71
57
|
* @returns {any} The last error.
|
|
@@ -138,15 +138,7 @@ describe('plugin-mercury', () => {
|
|
|
138
138
|
});
|
|
139
139
|
|
|
140
140
|
it('connects to Mercury using default url', () => {
|
|
141
|
-
webex.internal.feature.updateFeature = sinon.stub();
|
|
142
141
|
const promise = mercury.connect();
|
|
143
|
-
const envelope = {
|
|
144
|
-
data: {
|
|
145
|
-
featureToggle: {
|
|
146
|
-
'feature-name': true
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
142
|
|
|
151
143
|
assert.isFalse(mercury.connected, 'Mercury is not connected');
|
|
152
144
|
assert.isTrue(mercury.connecting, 'Mercury is connecting');
|
|
@@ -156,21 +148,6 @@ describe('plugin-mercury', () => {
|
|
|
156
148
|
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
157
149
|
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
158
150
|
assert.calledWith(socketOpenStub, sinon.match(/ws:\/\/example.com/), sinon.match.any);
|
|
159
|
-
mercury._emit('event:featureToggle_update', envelope);
|
|
160
|
-
assert.calledOnceWithExactly(webex.internal.feature.updateFeature, envelope.data.featureToggle);
|
|
161
|
-
sinon.restore();
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('connects to Mercury but does not call updateFeature', () => {
|
|
166
|
-
webex.internal.feature.updateFeature = sinon.stub();
|
|
167
|
-
const promise = mercury.connect();
|
|
168
|
-
const envelope = {};
|
|
169
|
-
|
|
170
|
-
return promise.then(() => {
|
|
171
|
-
mercury._emit('event:featureToggle_update', envelope);
|
|
172
|
-
assert.notCalled(webex.internal.feature.updateFeature);
|
|
173
|
-
sinon.restore();
|
|
174
151
|
});
|
|
175
152
|
});
|
|
176
153
|
|