@webex/internal-plugin-mercury 3.7.0-next.1 → 3.7.0-next.10

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 CHANGED
@@ -52,7 +52,11 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
52
52
  type: 'boolean'
53
53
  },
54
54
  socket: 'object',
55
- localClusterServiceUrls: 'object'
55
+ localClusterServiceUrls: 'object',
56
+ mercuryTimeOffset: {
57
+ default: undefined,
58
+ type: 'number'
59
+ }
56
60
  },
57
61
  derived: {
58
62
  listening: {
@@ -181,6 +185,9 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
181
185
  socket.on('message', function () {
182
186
  return _this5._onmessage.apply(_this5, arguments);
183
187
  });
188
+ socket.on('pong', function () {
189
+ return _this5._setTimeOffset.apply(_this5, arguments);
190
+ });
184
191
  socket.on('sequence-mismatch', function () {
185
192
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
186
193
  args[_key] = arguments[_key];
@@ -431,6 +438,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
431
438
  },
432
439
  _onmessage: function _onmessage(event) {
433
440
  var _this7 = this;
441
+ this._setTimeOffset(event);
434
442
  var envelope = event.data;
435
443
  if (process.env.ENABLE_MERCURY_LOGGING) {
436
444
  this.logger.debug("".concat(this.namespace, ": message envelope: "), envelope);
@@ -462,11 +470,17 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
462
470
  _this7.logger.error("".concat(_this7.namespace, ": error occurred processing socket message"), reason);
463
471
  });
464
472
  },
473
+ _setTimeOffset: function _setTimeOffset(event) {
474
+ var wsWriteTimestamp = event.data.wsWriteTimestamp;
475
+ if (typeof wsWriteTimestamp === 'number' && wsWriteTimestamp > 0) {
476
+ this.mercuryTimeOffset = (0, _now.default)() - wsWriteTimestamp;
477
+ }
478
+ },
465
479
  _reconnect: function _reconnect(webSocketUrl) {
466
480
  this.logger.info("".concat(this.namespace, ": reconnecting"));
467
481
  return this.connect(webSocketUrl);
468
482
  },
469
- version: "3.7.0-next.1"
483
+ version: "3.7.0-next.10"
470
484
  }, ((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)));
471
485
  var _default = exports.default = Mercury;
472
486
  //# sourceMappingURL=mercury.js.map
@@ -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","logout","disconnect","config","beforeLogoutOptionsCloseReason","includes","code","reason","options","_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","clientTimestamp","_now","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","forceCloseDelay","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","open","refresh","catch","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","_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 logout() {\n return this.disconnect(\n this.config.beforeLogoutOptionsCloseReason &&\n !normalReconnectReasons.includes(this.config.beforeLogoutOptionsCloseReason)\n ? {code: 1050, reason: this.config.beforeLogoutOptionsCloseReason}\n : undefined\n );\n },\n\n @oneFlight\n disconnect(options) {\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(options || undefined));\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 webSocketUrl.query.clientTimestamp = Date.now();\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(\n `${this.namespace}: error occurred in event handler:`,\n error,\n ' with args: ',\n 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 case 1050: // 1050 indicates logout form of closure, default to old behavior, use config reason defined by consumer to proceed with the permanent block\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(\n `${this.namespace}: socket disconnected; will not reconnect: ${event.reason}`\n );\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","mercuryTimeOffset","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","logout","disconnect","config","beforeLogoutOptionsCloseReason","includes","code","reason","options","_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","clientTimestamp","_now","format","_attemptConnection","socketUrl","callback","_this5","Socket","attemptWSUrl","_onclose","_onmessage","_setTimeOffset","_len","args","Array","_key","_emit","_len2","_key2","all","credentials","getUserToken","_ref","_ref2","_slicedToArray2","token","msg","reject","Error","forceCloseDelay","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","open","refresh","catch","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","_this7","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","wsWriteTimestamp","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 mercuryTimeOffset: {\n default: undefined,\n type: 'number',\n },\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 logout() {\n return this.disconnect(\n this.config.beforeLogoutOptionsCloseReason &&\n !normalReconnectReasons.includes(this.config.beforeLogoutOptionsCloseReason)\n ? {code: 1050, reason: this.config.beforeLogoutOptionsCloseReason}\n : undefined\n );\n },\n\n @oneFlight\n disconnect(options) {\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(options || undefined));\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 webSocketUrl.query.clientTimestamp = Date.now();\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('pong', (...args) => this._setTimeOffset(...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(\n `${this.namespace}: error occurred in event handler:`,\n error,\n ' with args: ',\n 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 case 1050: // 1050 indicates logout form of closure, default to old behavior, use config reason defined by consumer to proceed with the permanent block\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(\n `${this.namespace}: socket disconnected; will not reconnect: ${event.reason}`\n );\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 this._setTimeOffset(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 _setTimeOffset(event) {\n const {wsWriteTimestamp} = event.data;\n if (typeof wsWriteTimestamp === 'number' && wsWriteTimestamp > 0) {\n this.mercuryTimeOffset = Date.now() - wsWriteTimestamp;\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.7.0-next.1",
33
- "@webex/test-helper-mocha": "3.7.0-next.1",
34
- "@webex/test-helper-mock-webex": "3.7.0-next.1",
35
- "@webex/test-helper-test-users": "3.7.0-next.1",
32
+ "@webex/test-helper-chai": "3.7.0-next.9",
33
+ "@webex/test-helper-mocha": "3.7.0-next.9",
34
+ "@webex/test-helper-mock-webex": "3.7.0-next.9",
35
+ "@webex/test-helper-test-users": "3.7.0-next.9",
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.7.0-next.1",
42
- "@webex/common-timers": "3.7.0-next.1",
43
- "@webex/internal-plugin-device": "3.7.0-next.1",
44
- "@webex/internal-plugin-feature": "3.7.0-next.1",
45
- "@webex/internal-plugin-metrics": "3.7.0-next.1",
46
- "@webex/test-helper-chai": "3.7.0-next.1",
47
- "@webex/test-helper-mocha": "3.7.0-next.1",
48
- "@webex/test-helper-mock-web-socket": "3.7.0-next.1",
49
- "@webex/test-helper-mock-webex": "3.7.0-next.1",
50
- "@webex/test-helper-refresh-callback": "3.7.0-next.1",
51
- "@webex/test-helper-test-users": "3.7.0-next.1",
52
- "@webex/webex-core": "3.7.0-next.1",
41
+ "@webex/common": "3.7.0-next.9",
42
+ "@webex/common-timers": "3.7.0-next.9",
43
+ "@webex/internal-plugin-device": "3.7.0-next.9",
44
+ "@webex/internal-plugin-feature": "3.7.0-next.9",
45
+ "@webex/internal-plugin-metrics": "3.7.0-next.9",
46
+ "@webex/test-helper-chai": "3.7.0-next.9",
47
+ "@webex/test-helper-mocha": "3.7.0-next.9",
48
+ "@webex/test-helper-mock-web-socket": "3.7.0-next.9",
49
+ "@webex/test-helper-mock-webex": "3.7.0-next.9",
50
+ "@webex/test-helper-refresh-callback": "3.7.0-next.9",
51
+ "@webex/test-helper-test-users": "3.7.0-next.9",
52
+ "@webex/webex-core": "3.7.0-next.9",
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.7.0-next.1"
67
+ "version": "3.7.0-next.10"
68
68
  }
package/src/mercury.js CHANGED
@@ -41,6 +41,10 @@ const Mercury = WebexPlugin.extend({
41
41
  },
42
42
  socket: 'object',
43
43
  localClusterServiceUrls: 'object',
44
+ mercuryTimeOffset: {
45
+ default: undefined,
46
+ type: 'number',
47
+ },
44
48
  },
45
49
 
46
50
  derived: {
@@ -197,6 +201,7 @@ const Mercury = WebexPlugin.extend({
197
201
 
198
202
  socket.on('close', (...args) => this._onclose(...args));
199
203
  socket.on('message', (...args) => this._onmessage(...args));
204
+ socket.on('pong', (...args) => this._setTimeOffset(...args));
200
205
  socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));
201
206
  socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args));
202
207
 
@@ -486,6 +491,7 @@ const Mercury = WebexPlugin.extend({
486
491
  },
487
492
 
488
493
  _onmessage(event) {
494
+ this._setTimeOffset(event);
489
495
  const envelope = event.data;
490
496
 
491
497
  if (process.env.ENABLE_MERCURY_LOGGING) {
@@ -529,6 +535,13 @@ const Mercury = WebexPlugin.extend({
529
535
  });
530
536
  },
531
537
 
538
+ _setTimeOffset(event) {
539
+ const {wsWriteTimestamp} = event.data;
540
+ if (typeof wsWriteTimestamp === 'number' && wsWriteTimestamp > 0) {
541
+ this.mercuryTimeOffset = Date.now() - wsWriteTimestamp;
542
+ }
543
+ },
544
+
532
545
  _reconnect(webSocketUrl) {
533
546
  this.logger.info(`${this.namespace}: reconnecting`);
534
547
 
@@ -773,6 +773,41 @@ describe('plugin-mercury', () => {
773
773
  });
774
774
  });
775
775
 
776
+ describe('#_setTimeOffset', () => {
777
+ it('sets mercuryTimeOffset based on the difference between wsWriteTimestamp and now', () => {
778
+ const event = {
779
+ data: {
780
+ wsWriteTimestamp: Date.now() - 60000,
781
+ }
782
+ };
783
+ assert.isUndefined(mercury.mercuryTimeOffset);
784
+ mercury._setTimeOffset(event);
785
+ assert.isDefined(mercury.mercuryTimeOffset);
786
+ assert.isTrue(mercury.mercuryTimeOffset > 0);
787
+ });
788
+ it('handles negative offsets', () => {
789
+ const event = {
790
+ data: {
791
+ wsWriteTimestamp: Date.now() + 60000,
792
+ }
793
+ };
794
+ mercury._setTimeOffset(event);
795
+ assert.isTrue(mercury.mercuryTimeOffset < 0);
796
+ });
797
+ it('handles invalid wsWriteTimestamp', () => {
798
+ const invalidTimestamps = [null, -1, 'invalid', undefined];
799
+ invalidTimestamps.forEach(invalidTimestamp => {
800
+ const event = {
801
+ data: {
802
+ wsWriteTimestamp: invalidTimestamp,
803
+ }
804
+ };
805
+ mercury._setTimeOffset(event);
806
+ assert.isUndefined(mercury.mercuryTimeOffset);
807
+ });
808
+ });
809
+ });
810
+
776
811
  describe('#_prepareUrl()', () => {
777
812
  beforeEach(() => {
778
813
  webex.internal.device.webSocketUrl = 'ws://example.com';