@webex/internal-plugin-mercury 3.3.0 → 3.3.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mercury.js +95 -81
- package/dist/mercury.js.map +1 -1
- package/package.json +17 -17
- package/src/mercury.js +14 -0
- package/test/unit/spec/mercury.js +23 -0
package/dist/mercury.js
CHANGED
|
@@ -62,6 +62,20 @@ 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
|
+
},
|
|
65
79
|
/**
|
|
66
80
|
* Get the last error.
|
|
67
81
|
* @returns {any} The last error.
|
|
@@ -70,28 +84,28 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
70
84
|
return this.lastError;
|
|
71
85
|
},
|
|
72
86
|
connect: function connect(webSocketUrl) {
|
|
73
|
-
var
|
|
87
|
+
var _this2 = this;
|
|
74
88
|
if (this.connected) {
|
|
75
89
|
this.logger.info("".concat(this.namespace, ": already connected, will not connect again"));
|
|
76
90
|
return _promise.default.resolve();
|
|
77
91
|
}
|
|
78
92
|
this.connecting = true;
|
|
79
93
|
return _promise.default.resolve(this.webex.internal.device.registered || this.webex.internal.device.register()).then(function () {
|
|
80
|
-
|
|
81
|
-
return
|
|
94
|
+
_this2.logger.info("".concat(_this2.namespace, ": connecting"));
|
|
95
|
+
return _this2._connectWithBackoff(webSocketUrl);
|
|
82
96
|
});
|
|
83
97
|
},
|
|
84
98
|
disconnect: function disconnect() {
|
|
85
|
-
var
|
|
99
|
+
var _this3 = this;
|
|
86
100
|
return new _promise.default(function (resolve) {
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
|
|
101
|
+
if (_this3.backoffCall) {
|
|
102
|
+
_this3.logger.info("".concat(_this3.namespace, ": aborting connection"));
|
|
103
|
+
_this3.backoffCall.abort();
|
|
90
104
|
}
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
resolve(
|
|
105
|
+
if (_this3.socket) {
|
|
106
|
+
_this3.socket.removeAllListeners('message');
|
|
107
|
+
_this3.once('offline', resolve);
|
|
108
|
+
resolve(_this3.socket.close());
|
|
95
109
|
}
|
|
96
110
|
resolve();
|
|
97
111
|
});
|
|
@@ -117,19 +131,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
117
131
|
});
|
|
118
132
|
},
|
|
119
133
|
_prepareUrl: function _prepareUrl(webSocketUrl) {
|
|
120
|
-
var
|
|
134
|
+
var _this4 = this;
|
|
121
135
|
if (!webSocketUrl) {
|
|
122
136
|
webSocketUrl = this.webex.internal.device.webSocketUrl;
|
|
123
137
|
}
|
|
124
138
|
return this.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
125
139
|
if (haMessagingEnabled) {
|
|
126
|
-
return
|
|
140
|
+
return _this4.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);
|
|
127
141
|
}
|
|
128
142
|
return webSocketUrl;
|
|
129
143
|
}).then(function (wsUrl) {
|
|
130
144
|
webSocketUrl = wsUrl;
|
|
131
145
|
}).then(function () {
|
|
132
|
-
return
|
|
146
|
+
return _this4.webex.internal.feature.getFeature('developer', 'web-shared-mercury');
|
|
133
147
|
}).then(function (webSharedMercury) {
|
|
134
148
|
webSocketUrl = _url.default.parse(webSocketUrl, true);
|
|
135
149
|
(0, _assign.default)(webSocketUrl.query, {
|
|
@@ -144,98 +158,98 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
144
158
|
});
|
|
145
159
|
(0, _deleteProperty.default)(webSocketUrl.query, 'bufferStates');
|
|
146
160
|
}
|
|
147
|
-
if ((0, _lodash.get)(
|
|
161
|
+
if ((0, _lodash.get)(_this4, 'webex.config.device.ephemeral', false)) {
|
|
148
162
|
webSocketUrl.query.multipleConnections = true;
|
|
149
163
|
}
|
|
150
164
|
return _url.default.format(webSocketUrl);
|
|
151
165
|
});
|
|
152
166
|
},
|
|
153
167
|
_attemptConnection: function _attemptConnection(socketUrl, callback) {
|
|
154
|
-
var
|
|
168
|
+
var _this5 = this;
|
|
155
169
|
var socket = new _socket.default();
|
|
156
170
|
var attemptWSUrl;
|
|
157
171
|
socket.on('close', function () {
|
|
158
|
-
return
|
|
172
|
+
return _this5._onclose.apply(_this5, arguments);
|
|
159
173
|
});
|
|
160
174
|
socket.on('message', function () {
|
|
161
|
-
return
|
|
175
|
+
return _this5._onmessage.apply(_this5, arguments);
|
|
162
176
|
});
|
|
163
177
|
socket.on('sequence-mismatch', function () {
|
|
164
178
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
165
179
|
args[_key] = arguments[_key];
|
|
166
180
|
}
|
|
167
|
-
return
|
|
181
|
+
return _this5._emit.apply(_this5, ['sequence-mismatch'].concat(args));
|
|
168
182
|
});
|
|
169
183
|
socket.on('ping-pong-latency', function () {
|
|
170
184
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
171
185
|
args[_key2] = arguments[_key2];
|
|
172
186
|
}
|
|
173
|
-
return
|
|
187
|
+
return _this5._emit.apply(_this5, ['ping-pong-latency'].concat(args));
|
|
174
188
|
});
|
|
175
189
|
_promise.default.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(function (_ref) {
|
|
176
190
|
var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
|
|
177
191
|
webSocketUrl = _ref2[0],
|
|
178
192
|
token = _ref2[1];
|
|
179
|
-
if (!
|
|
180
|
-
var msg = "".concat(
|
|
181
|
-
|
|
193
|
+
if (!_this5.backoffCall) {
|
|
194
|
+
var msg = "".concat(_this5.namespace, ": prevent socket open when backoffCall no longer defined");
|
|
195
|
+
_this5.logger.info(msg);
|
|
182
196
|
return _promise.default.reject(new Error(msg));
|
|
183
197
|
}
|
|
184
198
|
attemptWSUrl = webSocketUrl;
|
|
185
199
|
var options = {
|
|
186
|
-
forceCloseDelay:
|
|
187
|
-
pingInterval:
|
|
188
|
-
pongTimeout:
|
|
200
|
+
forceCloseDelay: _this5.config.forceCloseDelay,
|
|
201
|
+
pingInterval: _this5.config.pingInterval,
|
|
202
|
+
pongTimeout: _this5.config.pongTimeout,
|
|
189
203
|
token: token.toString(),
|
|
190
|
-
trackingId: "".concat(
|
|
191
|
-
logger:
|
|
204
|
+
trackingId: "".concat(_this5.webex.sessionId, "_").concat((0, _now.default)()),
|
|
205
|
+
logger: _this5.logger
|
|
192
206
|
};
|
|
193
207
|
|
|
194
208
|
// if the consumer has supplied request options use them
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
options = _objectSpread(_objectSpread({}, options),
|
|
209
|
+
if (_this5.webex.config.defaultMercuryOptions) {
|
|
210
|
+
_this5.logger.info("".concat(_this5.namespace, ": setting custom options"));
|
|
211
|
+
options = _objectSpread(_objectSpread({}, options), _this5.webex.config.defaultMercuryOptions);
|
|
198
212
|
}
|
|
199
213
|
|
|
200
214
|
// Set the socket before opening it. This allows a disconnect() to close
|
|
201
215
|
// the socket if it is in the process of being opened.
|
|
202
|
-
|
|
203
|
-
|
|
216
|
+
_this5.socket = socket;
|
|
217
|
+
_this5.logger.info("".concat(_this5.namespace, " connection url: ").concat(webSocketUrl));
|
|
204
218
|
return socket.open(webSocketUrl, options);
|
|
205
219
|
}).then(function () {
|
|
206
|
-
|
|
220
|
+
_this5.logger.info("".concat(_this5.namespace, ": connected to mercury, success, action: connected, url: ").concat(attemptWSUrl));
|
|
207
221
|
callback();
|
|
208
|
-
return
|
|
222
|
+
return _this5.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
209
223
|
if (haMessagingEnabled) {
|
|
210
|
-
return
|
|
224
|
+
return _this5.webex.internal.device.refresh();
|
|
211
225
|
}
|
|
212
226
|
return _promise.default.resolve();
|
|
213
227
|
});
|
|
214
228
|
}).catch(function (reason) {
|
|
215
|
-
|
|
229
|
+
_this5.lastError = reason; // remember the last error
|
|
216
230
|
|
|
217
231
|
// Suppress connection errors that appear to be network related. This
|
|
218
232
|
// may end up suppressing metrics during outages, but we might not care
|
|
219
233
|
// (especially since many of our outages happen in a way that client
|
|
220
234
|
// metrics can't be trusted).
|
|
221
|
-
if (reason.code !== 1006 &&
|
|
222
|
-
|
|
223
|
-
retries:
|
|
235
|
+
if (reason.code !== 1006 && _this5.backoffCall && _this5.backoffCall.getNumRetries() > 0) {
|
|
236
|
+
_this5._emit('connection_failed', reason, {
|
|
237
|
+
retries: _this5.backoffCall.getNumRetries()
|
|
224
238
|
});
|
|
225
239
|
}
|
|
226
|
-
|
|
240
|
+
_this5.logger.info("".concat(_this5.namespace, ": connection attempt failed"), reason);
|
|
227
241
|
// UnknownResponse is produced by IE for any 4XXX; treated it like a bad
|
|
228
242
|
// web socket url and let WDM handle the token checking
|
|
229
243
|
if (reason instanceof _errors.UnknownResponse) {
|
|
230
|
-
|
|
231
|
-
return
|
|
244
|
+
_this5.logger.info("".concat(_this5.namespace, ": received unknown response code, refreshing device registration"));
|
|
245
|
+
return _this5.webex.internal.device.refresh().then(function () {
|
|
232
246
|
return callback(reason);
|
|
233
247
|
});
|
|
234
248
|
}
|
|
235
249
|
// NotAuthorized implies expired token
|
|
236
250
|
if (reason instanceof _errors.NotAuthorized) {
|
|
237
|
-
|
|
238
|
-
return
|
|
251
|
+
_this5.logger.info("".concat(_this5.namespace, ": received authorization error, reauthorizing"));
|
|
252
|
+
return _this5.webex.credentials.refresh({
|
|
239
253
|
force: true
|
|
240
254
|
}).then(function () {
|
|
241
255
|
return callback(reason);
|
|
@@ -250,15 +264,15 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
250
264
|
// BadRequest implies current credentials are for a Service Account
|
|
251
265
|
// Forbidden implies current user is not entitle for Webex
|
|
252
266
|
if (reason instanceof _errors.BadRequest || reason instanceof _errors.Forbidden) {
|
|
253
|
-
|
|
254
|
-
|
|
267
|
+
_this5.logger.warn("".concat(_this5.namespace, ": received unrecoverable response from mercury"));
|
|
268
|
+
_this5.backoffCall.abort();
|
|
255
269
|
return callback(reason);
|
|
256
270
|
}
|
|
257
271
|
if (reason instanceof _errors.ConnectionError) {
|
|
258
|
-
return
|
|
272
|
+
return _this5.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
|
|
259
273
|
if (haMessagingEnabled) {
|
|
260
|
-
|
|
261
|
-
return
|
|
274
|
+
_this5.logger.info("".concat(_this5.namespace, ": received a generic connection error, will try to connect to another datacenter. failed, action: 'failed', url: ").concat(attemptWSUrl, " error: ").concat(reason.message));
|
|
275
|
+
return _this5.webex.internal.services.markFailedUrl(attemptWSUrl);
|
|
262
276
|
}
|
|
263
277
|
return null;
|
|
264
278
|
}).then(function () {
|
|
@@ -267,62 +281,62 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
267
281
|
}
|
|
268
282
|
return callback(reason);
|
|
269
283
|
}).catch(function (reason) {
|
|
270
|
-
|
|
284
|
+
_this5.logger.error("".concat(_this5.namespace, ": failed to handle connection failure"), reason);
|
|
271
285
|
callback(reason);
|
|
272
286
|
});
|
|
273
287
|
},
|
|
274
288
|
_connectWithBackoff: function _connectWithBackoff(webSocketUrl) {
|
|
275
|
-
var
|
|
289
|
+
var _this6 = this;
|
|
276
290
|
return new _promise.default(function (resolve, reject) {
|
|
277
291
|
// eslint gets confused about whether or not call is actually used
|
|
278
292
|
// eslint-disable-next-line prefer-const
|
|
279
293
|
var call;
|
|
280
294
|
var onComplete = function onComplete(err) {
|
|
281
|
-
|
|
282
|
-
|
|
295
|
+
_this6.connecting = false;
|
|
296
|
+
_this6.backoffCall = undefined;
|
|
283
297
|
if (err) {
|
|
284
|
-
|
|
298
|
+
_this6.logger.info("".concat(_this6.namespace, ": failed to connect after ").concat(call.getNumRetries(), " retries; log statement about next retry was inaccurate; ").concat(err));
|
|
285
299
|
return reject(err);
|
|
286
300
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
301
|
+
_this6.connected = true;
|
|
302
|
+
_this6.hasEverConnected = true;
|
|
303
|
+
_this6._emit('online');
|
|
290
304
|
return resolve();
|
|
291
305
|
};
|
|
292
306
|
|
|
293
307
|
// eslint-disable-next-line prefer-reflect
|
|
294
308
|
call = _backoff.default.call(function (callback) {
|
|
295
|
-
|
|
296
|
-
|
|
309
|
+
_this6.logger.info("".concat(_this6.namespace, ": executing connection attempt ").concat(call.getNumRetries()));
|
|
310
|
+
_this6._attemptConnection(webSocketUrl, callback);
|
|
297
311
|
}, onComplete);
|
|
298
312
|
call.setStrategy(new _backoff.default.ExponentialStrategy({
|
|
299
|
-
initialDelay:
|
|
300
|
-
maxDelay:
|
|
313
|
+
initialDelay: _this6.config.backoffTimeReset,
|
|
314
|
+
maxDelay: _this6.config.backoffTimeMax
|
|
301
315
|
}));
|
|
302
|
-
if (
|
|
303
|
-
call.failAfter(
|
|
304
|
-
} else if (
|
|
305
|
-
call.failAfter(
|
|
316
|
+
if (_this6.config.initialConnectionMaxRetries && !_this6.hasEverConnected) {
|
|
317
|
+
call.failAfter(_this6.config.initialConnectionMaxRetries);
|
|
318
|
+
} else if (_this6.config.maxRetries) {
|
|
319
|
+
call.failAfter(_this6.config.maxRetries);
|
|
306
320
|
}
|
|
307
321
|
call.on('abort', function () {
|
|
308
|
-
|
|
322
|
+
_this6.logger.info("".concat(_this6.namespace, ": connection aborted"));
|
|
309
323
|
reject(new Error('Mercury Connection Aborted'));
|
|
310
324
|
});
|
|
311
325
|
call.on('callback', function (err) {
|
|
312
326
|
if (err) {
|
|
313
327
|
var number = call.getNumRetries();
|
|
314
|
-
var delay = Math.min(call.strategy_.nextBackoffDelay_,
|
|
315
|
-
|
|
328
|
+
var delay = Math.min(call.strategy_.nextBackoffDelay_, _this6.config.backoffTimeMax);
|
|
329
|
+
_this6.logger.info("".concat(_this6.namespace, ": failed to connect; attempting retry ").concat(number + 1, " in ").concat(delay, " ms"));
|
|
316
330
|
/* istanbul ignore if */
|
|
317
331
|
if (process.env.NODE_ENV === 'development') {
|
|
318
|
-
|
|
332
|
+
_this6.logger.debug("".concat(_this6.namespace, ": "), err, err.stack);
|
|
319
333
|
}
|
|
320
334
|
return;
|
|
321
335
|
}
|
|
322
|
-
|
|
336
|
+
_this6.logger.info("".concat(_this6.namespace, ": connected"));
|
|
323
337
|
});
|
|
324
338
|
call.start();
|
|
325
|
-
|
|
339
|
+
_this6.backoffCall = call;
|
|
326
340
|
});
|
|
327
341
|
},
|
|
328
342
|
_emit: function _emit() {
|
|
@@ -410,7 +424,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
410
424
|
}
|
|
411
425
|
},
|
|
412
426
|
_onmessage: function _onmessage(event) {
|
|
413
|
-
var
|
|
427
|
+
var _this7 = this;
|
|
414
428
|
var envelope = event.data;
|
|
415
429
|
if (process.env.ENABLE_MERCURY_LOGGING) {
|
|
416
430
|
this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
|
|
@@ -422,31 +436,31 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
422
436
|
var namespace = handler.namespace,
|
|
423
437
|
name = handler.name;
|
|
424
438
|
return new _promise.default(function (resolve) {
|
|
425
|
-
return resolve((
|
|
439
|
+
return resolve((_this7.webex[namespace] || _this7.webex.internal[namespace])[name](data));
|
|
426
440
|
}).catch(function (reason) {
|
|
427
|
-
return
|
|
441
|
+
return _this7.logger.error("".concat(_this7.namespace, ": error occurred in autowired event handler for ").concat(data.eventType), reason);
|
|
428
442
|
});
|
|
429
443
|
});
|
|
430
444
|
}, _promise.default.resolve()).then(function () {
|
|
431
|
-
|
|
445
|
+
_this7._emit('event', event.data);
|
|
432
446
|
var _data$eventType$split = data.eventType.split('.'),
|
|
433
447
|
_data$eventType$split2 = (0, _slicedToArray2.default)(_data$eventType$split, 1),
|
|
434
448
|
namespace = _data$eventType$split2[0];
|
|
435
449
|
if (namespace === data.eventType) {
|
|
436
|
-
|
|
450
|
+
_this7._emit("event:".concat(namespace), envelope);
|
|
437
451
|
} else {
|
|
438
|
-
|
|
439
|
-
|
|
452
|
+
_this7._emit("event:".concat(namespace), envelope);
|
|
453
|
+
_this7._emit("event:".concat(data.eventType), envelope);
|
|
440
454
|
}
|
|
441
455
|
}).catch(function (reason) {
|
|
442
|
-
|
|
456
|
+
_this7.logger.error("".concat(_this7.namespace, ": error occurred processing socket message"), reason);
|
|
443
457
|
});
|
|
444
458
|
},
|
|
445
459
|
_reconnect: function _reconnect(webSocketUrl) {
|
|
446
460
|
this.logger.info("".concat(this.namespace, ": reconnecting"));
|
|
447
461
|
return this.connect(webSocketUrl);
|
|
448
462
|
},
|
|
449
|
-
version: "3.3.
|
|
463
|
+
version: "3.3.1-next.1"
|
|
450
464
|
}, ((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)));
|
|
451
465
|
var _default = exports.default = Mercury;
|
|
452
466
|
//# 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","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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"}
|
|
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":";;;;;;;;;;;;;;;;;;;;;;AAKA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEA,IAAAK,OAAA,GAAAN,sBAAA,CAAAC,OAAA;AACA,IAAAM,OAAA,GAAAN,OAAA;AAOkB,IAAAO,IAAA,EAAAC,KAAA,EAAAC,IAAA;AApBlB;AACA;AACA;AACA;AAFA,SAAAC,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,aAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,iCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,iCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAqBA,IAAMqB,sBAAsB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,CAAC;AAE9F,IAAMC,OAAO,GAAGC,sBAAW,CAACC,MAAM,EAAA5B,IAAA,GAyF/B,IAAA6B,kBAAU,EAAC,iDAAiD,CAAC,EAAA5B,KAAA,GAM7D,IAAA4B,kBAAU,EAAC,2DAA2D,CAAC,GAAA3B,IAAA,GA/FvC;EACjC4B,SAAS,EAAE,SAAS;EACpBC,SAAS,EAAEC,SAAS;EAEpBC,OAAO,EAAE;IACPC,SAAS,EAAE;MACTb,OAAO,EAAE,KAAK;MACdc,IAAI,EAAE;IACR,CAAC;IACDC,UAAU,EAAE;MACVf,OAAO,EAAE,KAAK;MACdc,IAAI,EAAE;IACR,CAAC;IACDE,gBAAgB,EAAE;MAChBhB,OAAO,EAAE,KAAK;MACdc,IAAI,EAAE;IACR,CAAC;IACDG,MAAM,EAAE,QAAQ;IAChBC,uBAAuB,EAAE;EAC3B,CAAC;EAEDC,OAAO,EAAE;IACPC,SAAS,EAAE;MACTC,IAAI,EAAE,CAAC,WAAW,CAAC;MACnBC,EAAE,WAAAA,GAAA,EAAG;QACH,OAAO,IAAI,CAACT,SAAS;MACvB;IACF;EACF,CAAC;EAEDU,UAAU,WAAAA,WAAA,EAAG;IAAA,IAAAC,KAAA;IACX;AACJ;AACA;AACA;AACA;AACA;IACI,IAAI,CAACC,EAAE,CAAC,4BAA4B,EAAE,UAACC,QAAQ,EAAK;MAClD,IAAIA,QAAQ,IAAIA,QAAQ,CAACC,IAAI,EAAE;QAC7BH,KAAI,CAACI,KAAK,CAACC,QAAQ,CAACC,OAAO,CAACC,aAAa,CAACL,QAAQ,CAACC,IAAI,CAACK,aAAa,CAAC;MACxE;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;EACEC,YAAY,WAAAA,aAAA,EAAG;IACb,OAAO,IAAI,CAACvB,SAAS;EACvB,CAAC;EAGDwB,OAAO,WAAAA,QAACC,YAAY,EAAE;IAAA,IAAAC,MAAA;IACpB,IAAI,IAAI,CAACvB,SAAS,EAAE;MAClB,IAAI,CAACwB,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAI,IAAI,CAAC9B,SAAS,gDAA6C,CAAC;MAEhF,OAAO+B,QAAA,CAAAxC,OAAA,CAAQyC,OAAO,CAAC,CAAC;IAC1B;IAEA,IAAI,CAAC1B,UAAU,GAAG,IAAI;IAEtB,OAAOyB,QAAA,CAAAxC,OAAA,CAAQyC,OAAO,CACpB,IAAI,CAACb,KAAK,CAACC,QAAQ,CAACa,MAAM,CAACC,UAAU,IAAI,IAAI,CAACf,KAAK,CAACC,QAAQ,CAACa,MAAM,CAACE,QAAQ,CAAC,CAC/E,CAAC,CAACC,IAAI,CAAC,YAAM;MACXT,MAAI,CAACC,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIH,MAAI,CAAC3B,SAAS,iBAAc,CAAC;MAEjD,OAAO2B,MAAI,CAACU,mBAAmB,CAACX,YAAY,CAAC;IAC/C,CAAC,CAAC;EACJ,CAAC;EAGDY,UAAU,WAAAA,WAAA,EAAG;IAAA,IAAAC,MAAA;IACX,OAAO,IAAAR,QAAA,CAAAxC,OAAA,CAAY,UAACyC,OAAO,EAAK;MAC9B,IAAIO,MAAI,CAACC,WAAW,EAAE;QACpBD,MAAI,CAACX,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIS,MAAI,CAACvC,SAAS,0BAAuB,CAAC;QAC1DuC,MAAI,CAACC,WAAW,CAACC,KAAK,CAAC,CAAC;MAC1B;MAEA,IAAIF,MAAI,CAAC/B,MAAM,EAAE;QACf+B,MAAI,CAAC/B,MAAM,CAACkC,kBAAkB,CAAC,SAAS,CAAC;QACzCH,MAAI,CAACI,IAAI,CAAC,SAAS,EAAEX,OAAO,CAAC;QAC7BA,OAAO,CAACO,MAAI,CAAC/B,MAAM,CAACoC,KAAK,CAAC,CAAC,CAAC;MAC9B;MAEAZ,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;EACJ,CAAC;EAGDa,MAAM,WAAAA,OAAA,EAAG;IACP;IACA,OAAO,IAAI,CAACpB,OAAO,CAAC,CAAC;EACvB,CAAC;EAGDqB,aAAa,WAAAA,cAAA,EAAG;IACd;IACA,OAAO,IAAI,CAACR,UAAU,CAAC,CAAC;EAC1B,CAAC;EAEDS,8BAA8B,WAAAA,+BAACC,OAAO,EAAE;IACtC,IAAI,CAACvC,uBAAuB,GAAGuC,OAAO,CAACvC,uBAAuB;EAChE,CAAC;EAEDwC,eAAe,WAAAA,gBAACC,KAAK,EAAE;IACrB,IAAI,CAACA,KAAK,IAAI,CAACA,KAAK,CAACC,OAAO,EAAE;MAC5B;IACF;IACA,IAAMC,UAAU,GAAG,IAAAC,KAAA,CAAA9D,OAAA,EAAY2D,KAAK,CAACC,OAAO,CAAC;IAE7CC,UAAU,CAAC/D,OAAO,CAAC,UAACiE,OAAO,EAAK;MAC9B,IAAAC,WAAG,EAACL,KAAK,EAAEI,OAAO,EAAEJ,KAAK,CAACC,OAAO,CAACG,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC;EACJ,CAAC;EAEDE,WAAW,WAAAA,YAAC9B,YAAY,EAAE;IAAA,IAAA+B,MAAA;IACxB,IAAI,CAAC/B,YAAY,EAAE;MACjBA,YAAY,GAAG,IAAI,CAACP,KAAK,CAACC,QAAQ,CAACa,MAAM,CAACP,YAAY;IACxD;IAEA,OAAO,IAAI,CAACP,KAAK,CAACC,QAAQ,CAACC,OAAO,CAC/BqC,UAAU,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAChDtB,IAAI,CAAC,UAACuB,kBAAkB,EAAK;MAC5B,IAAIA,kBAAkB,EAAE;QACtB,OAAOF,MAAI,CAACtC,KAAK,CAACC,QAAQ,CAACwC,QAAQ,CAACC,2BAA2B,CAACnC,YAAY,CAAC;MAC/E;MAEA,OAAOA,YAAY;IACrB,CAAC,CAAC,CACDU,IAAI,CAAC,UAAC0B,KAAK,EAAK;MACfpC,YAAY,GAAGoC,KAAK;IACtB,CAAC,CAAC,CACD1B,IAAI,CAAC;MAAA,OAAMqB,MAAI,CAACtC,KAAK,CAACC,QAAQ,CAACC,OAAO,CAACqC,UAAU,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAAA,EAAC,CACrFtB,IAAI,CAAC,UAAC2B,gBAAgB,EAAK;MAC1BrC,YAAY,GAAGsC,YAAG,CAACC,KAAK,CAACvC,YAAY,EAAE,IAAI,CAAC;MAC5C,IAAAwC,OAAA,CAAA3E,OAAA,EAAcmC,YAAY,CAACyC,KAAK,EAAE;QAChCC,kBAAkB,EAAE,MAAM;QAC1BC,YAAY,EAAE,IAAI;QAClBC,eAAe,EAAE;MACnB,CAAC,CAAC;MAEF,IAAIP,gBAAgB,EAAE;QACpB,IAAAG,OAAA,CAAA3E,OAAA,EAAcmC,YAAY,CAACyC,KAAK,EAAE;UAChCI,yBAAyB,EAAE,IAAI;UAC/BC,4BAA4B,EAAE;QAChC,CAAC,CAAC;QACF,IAAAC,eAAA,CAAAlF,OAAA,EAAuBmC,YAAY,CAACyC,KAAK,EAAE,cAAc,CAAC;MAC5D;MAEA,IAAI,IAAAO,WAAG,EAACjB,MAAI,EAAE,+BAA+B,EAAE,KAAK,CAAC,EAAE;QACrD/B,YAAY,CAACyC,KAAK,CAACQ,mBAAmB,GAAG,IAAI;MAC/C;MAEA,OAAOX,YAAG,CAACY,MAAM,CAAClD,YAAY,CAAC;IACjC,CAAC,CAAC;EACN,CAAC;EAEDmD,kBAAkB,WAAAA,mBAACC,SAAS,EAAEC,QAAQ,EAAE;IAAA,IAAAC,MAAA;IACtC,IAAMxE,MAAM,GAAG,IAAIyE,eAAM,CAAC,CAAC;IAC3B,IAAIC,YAAY;IAEhB1E,MAAM,CAACQ,EAAE,CAAC,OAAO,EAAE;MAAA,OAAagE,MAAI,CAACG,QAAQ,CAAAnG,KAAA,CAAbgG,MAAI,EAAA9F,SAAiB,CAAC;IAAA,EAAC;IACvDsB,MAAM,CAACQ,EAAE,CAAC,SAAS,EAAE;MAAA,OAAagE,MAAI,CAACI,UAAU,CAAApG,KAAA,CAAfgG,MAAI,EAAA9F,SAAmB,CAAC;IAAA,EAAC;IAC3DsB,MAAM,CAACQ,EAAE,CAAC,mBAAmB,EAAE;MAAA,SAAAqE,IAAA,GAAAnG,SAAA,CAAAC,MAAA,EAAImG,IAAI,OAAAC,KAAA,CAAAF,IAAA,GAAAG,IAAA,MAAAA,IAAA,GAAAH,IAAA,EAAAG,IAAA;QAAJF,IAAI,CAAAE,IAAA,IAAAtG,SAAA,CAAAsG,IAAA;MAAA;MAAA,OAAKR,MAAI,CAACS,KAAK,CAAAzG,KAAA,CAAVgG,MAAI,GAAO,mBAAmB,EAAAlD,MAAA,CAAKwD,IAAI,EAAC;IAAA,EAAC;IACrF9E,MAAM,CAACQ,EAAE,CAAC,mBAAmB,EAAE;MAAA,SAAA0E,KAAA,GAAAxG,SAAA,CAAAC,MAAA,EAAImG,IAAI,OAAAC,KAAA,CAAAG,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;QAAJL,IAAI,CAAAK,KAAA,IAAAzG,SAAA,CAAAyG,KAAA;MAAA;MAAA,OAAKX,MAAI,CAACS,KAAK,CAAAzG,KAAA,CAAVgG,MAAI,GAAO,mBAAmB,EAAAlD,MAAA,CAAKwD,IAAI,EAAC;IAAA,EAAC;IAErFvD,QAAA,CAAAxC,OAAA,CAAQqG,GAAG,CAAC,CAAC,IAAI,CAACpC,WAAW,CAACsB,SAAS,CAAC,EAAE,IAAI,CAAC3D,KAAK,CAAC0E,WAAW,CAACC,YAAY,CAAC,CAAC,CAAC,CAAC,CAC9E1D,IAAI,CAAC,UAAA2D,IAAA,EAA2B;MAAA,IAAAC,KAAA,OAAAC,eAAA,CAAA1G,OAAA,EAAAwG,IAAA;QAAzBrE,YAAY,GAAAsE,KAAA;QAAEE,KAAK,GAAAF,KAAA;MACzB,IAAI,CAAChB,MAAI,CAACxC,WAAW,EAAE;QACrB,IAAM2D,GAAG,MAAArE,MAAA,CAAMkD,MAAI,CAAChF,SAAS,6DAA0D;QAEvFgF,MAAI,CAACpD,MAAM,CAACC,IAAI,CAACsE,GAAG,CAAC;QAErB,OAAOpE,QAAA,CAAAxC,OAAA,CAAQ6G,MAAM,CAAC,IAAIC,KAAK,CAACF,GAAG,CAAC,CAAC;MACvC;MAEAjB,YAAY,GAAGxD,YAAY;MAE3B,IAAI4E,OAAO,GAAG;QACZC,eAAe,EAAEvB,MAAI,CAACwB,MAAM,CAACD,eAAe;QAC5CE,YAAY,EAAEzB,MAAI,CAACwB,MAAM,CAACC,YAAY;QACtCC,WAAW,EAAE1B,MAAI,CAACwB,MAAM,CAACE,WAAW;QACpCR,KAAK,EAAEA,KAAK,CAACS,QAAQ,CAAC,CAAC;QACvBC,UAAU,KAAA9E,MAAA,CAAKkD,MAAI,CAAC7D,KAAK,CAAC0F,SAAS,OAAA/E,MAAA,CAAI,IAAAgF,IAAA,CAAAvH,OAAA,EAAS,CAAC,CAAE;QACnDqC,MAAM,EAAEoD,MAAI,CAACpD;MACf,CAAC;;MAED;MACA,IAAIoD,MAAI,CAAC7D,KAAK,CAACqF,MAAM,CAACO,qBAAqB,EAAE;QAC3C/B,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkD,MAAI,CAAChF,SAAS,6BAA0B,CAAC;QAC7DsG,OAAO,GAAArH,aAAA,CAAAA,aAAA,KAAOqH,OAAO,GAAKtB,MAAI,CAAC7D,KAAK,CAACqF,MAAM,CAACO,qBAAqB,CAAC;MACpE;;MAEA;MACA;MACA/B,MAAI,CAACxE,MAAM,GAAGA,MAAM;MAEpBwE,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkD,MAAI,CAAChF,SAAS,uBAAA8B,MAAA,CAAoBJ,YAAY,CAAE,CAAC;MAErE,OAAOlB,MAAM,CAACwG,IAAI,CAACtF,YAAY,EAAE4E,OAAO,CAAC;IAC3C,CAAC,CAAC,CACDlE,IAAI,CAAC,YAAM;MACV4C,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CACXkD,MAAI,CAAChF,SAAS,+DAAA8B,MAAA,CAA4DoD,YAAY,CAC3F,CAAC;MACDH,QAAQ,CAAC,CAAC;MAEV,OAAOC,MAAI,CAAC7D,KAAK,CAACC,QAAQ,CAACC,OAAO,CAC/BqC,UAAU,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAChDtB,IAAI,CAAC,UAACuB,kBAAkB,EAAK;QAC5B,IAAIA,kBAAkB,EAAE;UACtB,OAAOqB,MAAI,CAAC7D,KAAK,CAACC,QAAQ,CAACa,MAAM,CAACgF,OAAO,CAAC,CAAC;QAC7C;QAEA,OAAOlF,QAAA,CAAAxC,OAAA,CAAQyC,OAAO,CAAC,CAAC;MAC1B,CAAC,CAAC;IACN,CAAC,CAAC,CACDkF,KAAK,CAAC,UAACC,MAAM,EAAK;MACjBnC,MAAI,CAAC/E,SAAS,GAAGkH,MAAM,CAAC,CAAC;;MAEzB;MACA;MACA;MACA;MACA,IAAIA,MAAM,CAACC,IAAI,KAAK,IAAI,IAAIpC,MAAI,CAACxC,WAAW,IAAIwC,MAAI,CAACxC,WAAW,CAAC6E,aAAa,CAAC,CAAC,GAAG,CAAC,EAAE;QACpFrC,MAAI,CAACS,KAAK,CAAC,mBAAmB,EAAE0B,MAAM,EAAE;UAACG,OAAO,EAAEtC,MAAI,CAACxC,WAAW,CAAC6E,aAAa,CAAC;QAAC,CAAC,CAAC;MACtF;MACArC,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkD,MAAI,CAAChF,SAAS,kCAA+BmH,MAAM,CAAC;MACxE;MACA;MACA,IAAIA,MAAM,YAAYI,uBAAe,EAAE;QACrCvC,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CACXkD,MAAI,CAAChF,SAAS,qEACnB,CAAC;QAED,OAAOgF,MAAI,CAAC7D,KAAK,CAACC,QAAQ,CAACa,MAAM,CAACgF,OAAO,CAAC,CAAC,CAAC7E,IAAI,CAAC;UAAA,OAAM2C,QAAQ,CAACoC,MAAM,CAAC;QAAA,EAAC;MAC1E;MACA;MACA,IAAIA,MAAM,YAAYK,qBAAa,EAAE;QACnCxC,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkD,MAAI,CAAChF,SAAS,kDAA+C,CAAC;QAElF,OAAOgF,MAAI,CAAC7D,KAAK,CAAC0E,WAAW,CAACoB,OAAO,CAAC;UAACQ,KAAK,EAAE;QAAI,CAAC,CAAC,CAACrF,IAAI,CAAC;UAAA,OAAM2C,QAAQ,CAACoC,MAAM,CAAC;QAAA,EAAC;MACnF;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,IAAIA,MAAM,YAAYO,kBAAU,IAAIP,MAAM,YAAYQ,iBAAS,EAAE;QAC/D3C,MAAI,CAACpD,MAAM,CAACgG,IAAI,IAAA9F,MAAA,CAAIkD,MAAI,CAAChF,SAAS,mDAAgD,CAAC;QACnFgF,MAAI,CAACxC,WAAW,CAACC,KAAK,CAAC,CAAC;QAExB,OAAOsC,QAAQ,CAACoC,MAAM,CAAC;MACzB;MACA,IAAIA,MAAM,YAAYU,uBAAe,EAAE;QACrC,OAAO7C,MAAI,CAAC7D,KAAK,CAACC,QAAQ,CAACC,OAAO,CAC/BqC,UAAU,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAChDtB,IAAI,CAAC,UAACuB,kBAAkB,EAAK;UAC5B,IAAIA,kBAAkB,EAAE;YACtBqB,MAAI,CAACpD,MAAM,CAACC,IAAI,IAAAC,MAAA,CACXkD,MAAI,CAAChF,SAAS,uHAAA8B,MAAA,CAAoHoD,YAAY,cAAApD,MAAA,CAAWqF,MAAM,CAACnE,OAAO,CAC5K,CAAC;YAED,OAAOgC,MAAI,CAAC7D,KAAK,CAACC,QAAQ,CAACwC,QAAQ,CAACkE,aAAa,CAAC5C,YAAY,CAAC;UACjE;UAEA,OAAO,IAAI;QACb,CAAC,CAAC,CACD9C,IAAI,CAAC;UAAA,OAAM2C,QAAQ,CAACoC,MAAM,CAAC;QAAA,EAAC;MACjC;MAEA,OAAOpC,QAAQ,CAACoC,MAAM,CAAC;IACzB,CAAC,CAAC,CACDD,KAAK,CAAC,UAACC,MAAM,EAAK;MACjBnC,MAAI,CAACpD,MAAM,CAACmG,KAAK,IAAAjG,MAAA,CAAIkD,MAAI,CAAChF,SAAS,4CAAyCmH,MAAM,CAAC;MACnFpC,QAAQ,CAACoC,MAAM,CAAC;IAClB,CAAC,CAAC;EACN,CAAC;EAED9E,mBAAmB,WAAAA,oBAACX,YAAY,EAAE;IAAA,IAAAsG,MAAA;IAChC,OAAO,IAAAjG,QAAA,CAAAxC,OAAA,CAAY,UAACyC,OAAO,EAAEoE,MAAM,EAAK;MACtC;MACA;MACA,IAAI6B,IAAI;MACR,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAIC,GAAG,EAAK;QAC1BH,MAAI,CAAC1H,UAAU,GAAG,KAAK;QAEvB0H,MAAI,CAACxF,WAAW,GAAGtC,SAAS;QAC5B,IAAIiI,GAAG,EAAE;UACPH,MAAI,CAACpG,MAAM,CAACC,IAAI,IAAAC,MAAA,CAEZkG,MAAI,CAAChI,SAAS,gCAAA8B,MAAA,CACamG,IAAI,CAACZ,aAAa,CAAC,CAAC,+DAAAvF,MAAA,CAA4DqG,GAAG,CAClH,CAAC;UAED,OAAO/B,MAAM,CAAC+B,GAAG,CAAC;QACpB;QACAH,MAAI,CAAC5H,SAAS,GAAG,IAAI;QACrB4H,MAAI,CAACzH,gBAAgB,GAAG,IAAI;QAC5ByH,MAAI,CAACvC,KAAK,CAAC,QAAQ,CAAC;QAEpB,OAAOzD,OAAO,CAAC,CAAC;MAClB,CAAC;;MAED;MACAiG,IAAI,GAAGG,gBAAO,CAACH,IAAI,CAAC,UAAClD,QAAQ,EAAK;QAChCiD,MAAI,CAACpG,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkG,MAAI,CAAChI,SAAS,qCAAA8B,MAAA,CAAkCmG,IAAI,CAACZ,aAAa,CAAC,CAAC,CAAE,CAAC;QAC3FW,MAAI,CAACnD,kBAAkB,CAACnD,YAAY,EAAEqD,QAAQ,CAAC;MACjD,CAAC,EAAEmD,UAAU,CAAC;MAEdD,IAAI,CAACI,WAAW,CACd,IAAID,gBAAO,CAACE,mBAAmB,CAAC;QAC9BC,YAAY,EAAEP,MAAI,CAACxB,MAAM,CAACgC,gBAAgB;QAC1CC,QAAQ,EAAET,MAAI,CAACxB,MAAM,CAACkC;MACxB,CAAC,CACH,CAAC;MAED,IAAIV,MAAI,CAACxB,MAAM,CAACmC,2BAA2B,IAAI,CAACX,MAAI,CAACzH,gBAAgB,EAAE;QACrE0H,IAAI,CAACW,SAAS,CAACZ,MAAI,CAACxB,MAAM,CAACmC,2BAA2B,CAAC;MACzD,CAAC,MAAM,IAAIX,MAAI,CAACxB,MAAM,CAACqC,UAAU,EAAE;QACjCZ,IAAI,CAACW,SAAS,CAACZ,MAAI,CAACxB,MAAM,CAACqC,UAAU,CAAC;MACxC;MAEAZ,IAAI,CAACjH,EAAE,CAAC,OAAO,EAAE,YAAM;QACrBgH,MAAI,CAACpG,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkG,MAAI,CAAChI,SAAS,yBAAsB,CAAC;QACzDoG,MAAM,CAAC,IAAIC,KAAK,CAAC,4BAA4B,CAAC,CAAC;MACjD,CAAC,CAAC;MAEF4B,IAAI,CAACjH,EAAE,CAAC,UAAU,EAAE,UAACmH,GAAG,EAAK;QAC3B,IAAIA,GAAG,EAAE;UACP,IAAMW,MAAM,GAAGb,IAAI,CAACZ,aAAa,CAAC,CAAC;UACnC,IAAM0B,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAChB,IAAI,CAACiB,SAAS,CAACC,iBAAiB,EAAEnB,MAAI,CAACxB,MAAM,CAACkC,cAAc,CAAC;UAEpFV,MAAI,CAACpG,MAAM,CAACC,IAAI,IAAAC,MAAA,CACXkG,MAAI,CAAChI,SAAS,4CAAA8B,MAAA,CAAyCgH,MAAM,GAAG,CAAC,UAAAhH,MAAA,CAAOiH,KAAK,QAClF,CAAC;UACD;UACA,IAAIK,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,aAAa,EAAE;YAC1CtB,MAAI,CAACpG,MAAM,CAAC2H,KAAK,IAAAzH,MAAA,CAAIkG,MAAI,CAAChI,SAAS,SAAMmI,GAAG,EAAEA,GAAG,CAACqB,KAAK,CAAC;UAC1D;UAEA;QACF;QACAxB,MAAI,CAACpG,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAIkG,MAAI,CAAChI,SAAS,gBAAa,CAAC;MAClD,CAAC,CAAC;MAEFiI,IAAI,CAACwB,KAAK,CAAC,CAAC;MAEZzB,MAAI,CAACxF,WAAW,GAAGyF,IAAI;IACzB,CAAC,CAAC;EACJ,CAAC;EAEDxC,KAAK,WAAAA,MAAA,EAAU;IAAA,SAAAiE,KAAA,GAAAxK,SAAA,CAAAC,MAAA,EAANmG,IAAI,OAAAC,KAAA,CAAAmE,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;MAAJrE,IAAI,CAAAqE,KAAA,IAAAzK,SAAA,CAAAyK,KAAA;IAAA;IACX,IAAI;MACF,IAAI,CAACC,OAAO,CAAA5K,KAAA,CAAZ,IAAI,EAAYsG,IAAI,CAAC;IACvB,CAAC,CAAC,OAAOyC,KAAK,EAAE;MACd,IAAI,CAACnG,MAAM,CAACmG,KAAK,IAAAjG,MAAA,CAAI,IAAI,CAAC9B,SAAS,wCAAqC;QACtE+H,KAAK,EAALA,KAAK;QACL7I,SAAS,EAAEoG;MACb,CAAC,CAAC;IACJ;EACF,CAAC;EAEDuE,iBAAiB,WAAAA,kBAACC,SAAS,EAAE;IAC3B,IAAAC,gBAAA,GAA0BD,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC;MAAAC,iBAAA,OAAAhE,eAAA,CAAA1G,OAAA,EAAAwK,gBAAA;MAAvC/J,SAAS,GAAAiK,iBAAA;MAAEC,IAAI,GAAAD,iBAAA;IACtB,IAAME,QAAQ,GAAG,EAAE;IAEnB,IAAI,CAAC,IAAI,CAAChJ,KAAK,CAACnB,SAAS,CAAC,IAAI,CAAC,IAAI,CAACmB,KAAK,CAACC,QAAQ,CAACpB,SAAS,CAAC,EAAE;MAC7D,OAAOmK,QAAQ;IACjB;IAEA,IAAMC,WAAW,GAAG,IAAAC,iBAAS,aAAAvI,MAAA,CAAYoI,IAAI,WAAQ,CAAC;IAEtD,IAAI,CAAC,IAAI,CAAC/I,KAAK,CAACnB,SAAS,CAAC,IAAI,IAAI,CAACmB,KAAK,CAACC,QAAQ,CAACpB,SAAS,CAAC,EAAEoK,WAAW,CAAC,EAAE;MAC1ED,QAAQ,CAACpL,IAAI,CAAC;QACZmL,IAAI,EAAEE,WAAW;QACjBpK,SAAS,EAATA;MACF,CAAC,CAAC;IACJ;IAEA,OAAOmK,QAAQ;EACjB,CAAC;EAEDhF,QAAQ,WAAAA,SAACjC,KAAK,EAAE;IACd;IACA;;IAEA,IAAI;MACF,IAAMiE,MAAM,GAAGjE,KAAK,CAACiE,MAAM,IAAIjE,KAAK,CAACiE,MAAM,CAACmD,WAAW,CAAC,CAAC;MACzD,IAAMxF,SAAS,GAAG,IAAI,CAACtE,MAAM,CAACwD,GAAG;MAEjC,IAAI,CAACxD,MAAM,CAACkC,kBAAkB,CAAC,CAAC;MAChC,IAAI,CAAC6H,KAAK,CAAC,QAAQ,CAAC;MACpB,IAAI,CAACnK,SAAS,GAAG,KAAK;MACtB,IAAI,CAACqF,KAAK,CAAC,SAAS,EAAEvC,KAAK,CAAC;MAE5B,QAAQA,KAAK,CAACkE,IAAI;QAChB,KAAK,IAAI;UACP;UACA,IAAI,CAACxF,MAAM,CAACC,IAAI,IAAAC,MAAA,CACX,IAAI,CAAC9B,SAAS,mEAAA8B,MAAA,CAAgEoB,KAAK,CAACiE,MAAM,CAC/F,CAAC;UACD,IAAI,CAAC1B,KAAK,CAAC,mBAAmB,EAAEvC,KAAK,CAAC;UACtC;QACF,KAAK,IAAI;UACP;UACA,IAAI,CAACtB,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAI,IAAI,CAAC9B,SAAS,0CAAuC,CAAC;UAC1E,IAAI,CAACyF,KAAK,CAAC,kBAAkB,EAAEvC,KAAK,CAAC;UACrC;QACF,KAAK,IAAI;QACT,KAAK,IAAI;QACT,KAAK,IAAI;QACT,KAAK,IAAI;UACP,IAAI,CAACtB,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAI,IAAI,CAAC9B,SAAS,wCAAqC,CAAC;UACxE,IAAI,CAACyF,KAAK,CAAC,mBAAmB,EAAEvC,KAAK,CAAC;UACtC,IAAI,CAACsH,UAAU,CAAC1F,SAAS,CAAC;UAC1B;UACA;UACA;QACF,KAAK,IAAI;UACP,IAAInF,sBAAsB,CAAC8K,QAAQ,CAACtD,MAAM,CAAC,EAAE;YAC3C,IAAI,CAACvF,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAI,IAAI,CAAC9B,SAAS,wCAAqC,CAAC;YACxE,IAAI,CAACyF,KAAK,CAAC,mBAAmB,EAAEvC,KAAK,CAAC;YACtC,IAAI,CAACsH,UAAU,CAAC1F,SAAS,CAAC;YAC1B;YACA;UACF,CAAC,MAAM;YACL,IAAI,CAAClD,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAI,IAAI,CAAC9B,SAAS,8CAA2C,CAAC;YAC9E,IAAI,CAACyF,KAAK,CAAC,mBAAmB,EAAEvC,KAAK,CAAC;UACxC;UACA;QACF;UACE,IAAI,CAACtB,MAAM,CAACC,IAAI,IAAAC,MAAA,CACX,IAAI,CAAC9B,SAAS,2DACnB,CAAC;UACD;UACA,IAAI,CAACyF,KAAK,CAAC,mBAAmB,EAAEvC,KAAK,CAAC;MAC1C;IACF,CAAC,CAAC,OAAO6E,KAAK,EAAE;MACd,IAAI,CAACnG,MAAM,CAACmG,KAAK,IAAAjG,MAAA,CAAI,IAAI,CAAC9B,SAAS,wCAAqC+H,KAAK,CAAC;IAChF;EACF,CAAC;EAED3C,UAAU,WAAAA,WAAClC,KAAK,EAAE;IAAA,IAAAwH,MAAA;IAChB,IAAMzJ,QAAQ,GAAGiC,KAAK,CAAChC,IAAI;IAE3B,IAAIkI,OAAO,CAACC,GAAG,CAACsB,sBAAsB,EAAE;MACtC,IAAI,CAAC/I,MAAM,CAAC2H,KAAK,IAAAzH,MAAA,CAAI,IAAI,CAAC9B,SAAS,2BAAwBiB,QAAQ,CAAC;IACtE;IAEA,IAAOC,IAAI,GAAID,QAAQ,CAAhBC,IAAI;IAEX,IAAI,CAAC+B,eAAe,CAAC/B,IAAI,CAAC;IAE1B,OAAO,IAAI,CAAC2I,iBAAiB,CAAC3I,IAAI,CAAC4I,SAAS,CAAC,CAC1Cc,MAAM,CACL,UAACC,OAAO,EAAEC,OAAO;MAAA,OACfD,OAAO,CAACzI,IAAI,CAAC,YAAM;QACjB,IAAOpC,SAAS,GAAU8K,OAAO,CAA1B9K,SAAS;UAAEkK,IAAI,GAAIY,OAAO,CAAfZ,IAAI;QAEtB,OAAO,IAAAnI,QAAA,CAAAxC,OAAA,CAAY,UAACyC,OAAO;UAAA,OACzBA,OAAO,CAAC,CAAC0I,MAAI,CAACvJ,KAAK,CAACnB,SAAS,CAAC,IAAI0K,MAAI,CAACvJ,KAAK,CAACC,QAAQ,CAACpB,SAAS,CAAC,EAAEkK,IAAI,CAAC,CAAChJ,IAAI,CAAC,CAAC;QAAA,CAChF,CAAC,CAACgG,KAAK,CAAC,UAACC,MAAM;UAAA,OACbuD,MAAI,CAAC9I,MAAM,CAACmG,KAAK,IAAAjG,MAAA,CACZ4I,MAAI,CAAC1K,SAAS,sDAAA8B,MAAA,CAAmDZ,IAAI,CAAC4I,SAAS,GAClF3C,MACF,CAAC;QAAA,CACH,CAAC;MACH,CAAC,CAAC;IAAA,GACJpF,QAAA,CAAAxC,OAAA,CAAQyC,OAAO,CAAC,CAClB,CAAC,CACAI,IAAI,CAAC,YAAM;MACVsI,MAAI,CAACjF,KAAK,CAAC,OAAO,EAAEvC,KAAK,CAAChC,IAAI,CAAC;MAC/B,IAAA6J,qBAAA,GAAoB7J,IAAI,CAAC4I,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC;QAAAgB,sBAAA,OAAA/E,eAAA,CAAA1G,OAAA,EAAAwL,qBAAA;QAAtC/K,SAAS,GAAAgL,sBAAA;MAEhB,IAAIhL,SAAS,KAAKkB,IAAI,CAAC4I,SAAS,EAAE;QAChCY,MAAI,CAACjF,KAAK,UAAA3D,MAAA,CAAU9B,SAAS,GAAIiB,QAAQ,CAAC;MAC5C,CAAC,MAAM;QACLyJ,MAAI,CAACjF,KAAK,UAAA3D,MAAA,CAAU9B,SAAS,GAAIiB,QAAQ,CAAC;QAC1CyJ,MAAI,CAACjF,KAAK,UAAA3D,MAAA,CAAUZ,IAAI,CAAC4I,SAAS,GAAI7I,QAAQ,CAAC;MACjD;IACF,CAAC,CAAC,CACDiG,KAAK,CAAC,UAACC,MAAM,EAAK;MACjBuD,MAAI,CAAC9I,MAAM,CAACmG,KAAK,IAAAjG,MAAA,CAAI4I,MAAI,CAAC1K,SAAS,iDAA8CmH,MAAM,CAAC;IAC1F,CAAC,CAAC;EACN,CAAC;EAEDqD,UAAU,WAAAA,WAAC9I,YAAY,EAAE;IACvB,IAAI,CAACE,MAAM,CAACC,IAAI,IAAAC,MAAA,CAAI,IAAI,CAAC9B,SAAS,mBAAgB,CAAC;IAEnD,OAAO,IAAI,CAACyB,OAAO,CAACC,YAAY,CAAC;EACnC,CAAC;EAAAuJ,OAAA;AACH,CAAC,OAAAC,0BAAA,CAAA3L,OAAA,EAAAnB,IAAA,cA5bE+M,iBAAS,OAAAC,yBAAA,CAAA7L,OAAA,EAAAnB,IAAA,cAAAA,IAAA,OAAA8M,0BAAA,CAAA3L,OAAA,EAAAnB,IAAA,iBAmBT+M,iBAAS,OAAAC,yBAAA,CAAA7L,OAAA,EAAAnB,IAAA,iBAAAA,IAAA,OAAA8M,0BAAA,CAAA3L,OAAA,EAAAnB,IAAA,aAAAF,IAAA,OAAAkN,yBAAA,CAAA7L,OAAA,EAAAnB,IAAA,aAAAA,IAAA,OAAA8M,0BAAA,CAAA3L,OAAA,EAAAnB,IAAA,oBAAAD,KAAA,OAAAiN,yBAAA,CAAA7L,OAAA,EAAAnB,IAAA,oBAAAA,IAAA,IAAAA,IAAA,EAyaX,CAAC;AAAC,IAAAiN,QAAA,GAAAC,OAAA,CAAA/L,OAAA,GAEYK,OAAO"}
|
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.
|
|
33
|
-
"@webex/test-helper-mocha": "3.
|
|
34
|
-
"@webex/test-helper-mock-webex": "3.
|
|
35
|
-
"@webex/test-helper-test-users": "3.
|
|
32
|
+
"@webex/test-helper-chai": "3.1.0-next.3",
|
|
33
|
+
"@webex/test-helper-mocha": "3.1.0-next.3",
|
|
34
|
+
"@webex/test-helper-mock-webex": "3.1.0-next.3",
|
|
35
|
+
"@webex/test-helper-test-users": "3.1.0-next.3",
|
|
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.
|
|
42
|
-
"@webex/common-timers": "3.
|
|
43
|
-
"@webex/internal-plugin-device": "3.
|
|
44
|
-
"@webex/internal-plugin-feature": "3.3.
|
|
45
|
-
"@webex/internal-plugin-metrics": "3.
|
|
46
|
-
"@webex/test-helper-chai": "3.
|
|
47
|
-
"@webex/test-helper-mocha": "3.
|
|
48
|
-
"@webex/test-helper-mock-web-socket": "3.
|
|
49
|
-
"@webex/test-helper-mock-webex": "3.
|
|
50
|
-
"@webex/test-helper-refresh-callback": "3.
|
|
51
|
-
"@webex/test-helper-test-users": "3.
|
|
52
|
-
"@webex/webex-core": "3.
|
|
41
|
+
"@webex/common": "3.1.0-next.3",
|
|
42
|
+
"@webex/common-timers": "3.1.0-next.3",
|
|
43
|
+
"@webex/internal-plugin-device": "3.1.0-next.3",
|
|
44
|
+
"@webex/internal-plugin-feature": "3.3.1-next.1",
|
|
45
|
+
"@webex/internal-plugin-metrics": "3.1.0-next.3",
|
|
46
|
+
"@webex/test-helper-chai": "3.1.0-next.3",
|
|
47
|
+
"@webex/test-helper-mocha": "3.1.0-next.3",
|
|
48
|
+
"@webex/test-helper-mock-web-socket": "3.1.0-next.3",
|
|
49
|
+
"@webex/test-helper-mock-webex": "3.1.0-next.3",
|
|
50
|
+
"@webex/test-helper-refresh-callback": "3.1.0-next.3",
|
|
51
|
+
"@webex/test-helper-test-users": "3.1.0-next.3",
|
|
52
|
+
"@webex/webex-core": "3.1.0-next.3",
|
|
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.
|
|
67
|
+
"version": "3.3.1-next.1"
|
|
68
68
|
}
|
package/src/mercury.js
CHANGED
|
@@ -52,6 +52,20 @@ 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
|
+
|
|
55
69
|
/**
|
|
56
70
|
* Get the last error.
|
|
57
71
|
* @returns {any} The last error.
|
|
@@ -138,7 +138,15 @@ describe('plugin-mercury', () => {
|
|
|
138
138
|
});
|
|
139
139
|
|
|
140
140
|
it('connects to Mercury using default url', () => {
|
|
141
|
+
webex.internal.feature.updateFeature = sinon.stub();
|
|
141
142
|
const promise = mercury.connect();
|
|
143
|
+
const envelope = {
|
|
144
|
+
data: {
|
|
145
|
+
featureToggle: {
|
|
146
|
+
'feature-name': true
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
};
|
|
142
150
|
|
|
143
151
|
assert.isFalse(mercury.connected, 'Mercury is not connected');
|
|
144
152
|
assert.isTrue(mercury.connecting, 'Mercury is connecting');
|
|
@@ -148,6 +156,21 @@ describe('plugin-mercury', () => {
|
|
|
148
156
|
assert.isTrue(mercury.connected, 'Mercury is connected');
|
|
149
157
|
assert.isFalse(mercury.connecting, 'Mercury is not connecting');
|
|
150
158
|
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();
|
|
151
174
|
});
|
|
152
175
|
});
|
|
153
176
|
|