@webex/internal-plugin-device 3.7.0 → 3.8.0-next.2
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/device.js +80 -57
- package/dist/device.js.map +1 -1
- package/dist/ipNetworkDetector.js +1 -1
- package/package.json +10 -10
- package/src/device.js +101 -68
- package/test/unit/spec/device.js +192 -0
package/dist/device.js
CHANGED
|
@@ -21,6 +21,7 @@ var _common = require("@webex/common");
|
|
|
21
21
|
var _webexCore = require("@webex/webex-core");
|
|
22
22
|
var _commonTimers = require("@webex/common-timers");
|
|
23
23
|
var _lodash = require("lodash");
|
|
24
|
+
var _uuid = _interopRequireDefault(require("uuid"));
|
|
24
25
|
var _metrics = _interopRequireDefault(require("./metrics"));
|
|
25
26
|
var _constants = require("./constants");
|
|
26
27
|
var _featuresModel = _interopRequireDefault(require("./features/features-model"));
|
|
@@ -374,6 +375,8 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
374
375
|
} : {});
|
|
375
376
|
var _deviceRegistrationOp = deviceRegistrationOptions.includeDetails,
|
|
376
377
|
includeDetails = _deviceRegistrationOp === void 0 ? _types.CatalogDetails.all : _deviceRegistrationOp;
|
|
378
|
+
var requestId = _uuid.default.v4();
|
|
379
|
+
_this.set('refresh-request-id', requestId);
|
|
377
380
|
return _this.request({
|
|
378
381
|
method: 'PUT',
|
|
379
382
|
uri: _this.url,
|
|
@@ -383,6 +386,11 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
383
386
|
includeUpstreamServices: "".concat(includeDetails).concat(_this.config.energyForecast && _this.energyForecastConfig ? ',energyforecast' : '')
|
|
384
387
|
}
|
|
385
388
|
}).then(function (response) {
|
|
389
|
+
// If we've signed out in the mean time, the request ID will have changed
|
|
390
|
+
if (_this.get('refresh-request-id') !== requestId) {
|
|
391
|
+
_this.logger.info('device: refresh request ID mismatch, ignoring response');
|
|
392
|
+
return _promise.default.resolve();
|
|
393
|
+
}
|
|
386
394
|
return _this.processRegistrationSuccess(response);
|
|
387
395
|
}).catch(function (reason) {
|
|
388
396
|
// Handle a 404 error, which indicates that the device is no longer
|
|
@@ -444,14 +452,25 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
444
452
|
register: function register() {
|
|
445
453
|
var _this3 = this;
|
|
446
454
|
var deviceRegistrationOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
455
|
+
this.logger.info('device: registering');
|
|
456
|
+
this.webex.internal.newMetrics.callDiagnosticMetrics.setDeviceInfo(this);
|
|
457
|
+
|
|
458
|
+
// Validate that the device can be registered.
|
|
459
|
+
return this.canRegister().then(function () {
|
|
460
|
+
// Validate if the device is already registered and refresh instead.
|
|
461
|
+
if (_this3.registered) {
|
|
462
|
+
_this3.logger.info('device: device already registered, refreshing');
|
|
463
|
+
return _this3.refresh(deviceRegistrationOptions);
|
|
453
464
|
}
|
|
454
|
-
|
|
465
|
+
return _this3._registerInternal(deviceRegistrationOptions).catch(function (error) {
|
|
466
|
+
var _error$body;
|
|
467
|
+
if ((error === null || error === void 0 ? void 0 : (_error$body = error.body) === null || _error$body === void 0 ? void 0 : _error$body.message) === 'User has excessive device registrations') {
|
|
468
|
+
return _this3.deleteDevices().then(function () {
|
|
469
|
+
return _this3._registerInternal(deviceRegistrationOptions);
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
throw error;
|
|
473
|
+
});
|
|
455
474
|
});
|
|
456
475
|
},
|
|
457
476
|
_getBody: function _getBody() {
|
|
@@ -460,63 +479,61 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
460
479
|
_registerInternal: function _registerInternal() {
|
|
461
480
|
var _this4 = this;
|
|
462
481
|
var deviceRegistrationOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
463
|
-
this.logger.info('device:
|
|
464
|
-
this.webex.internal.newMetrics.callDiagnosticMetrics.setDeviceInfo(this);
|
|
482
|
+
this.logger.info('device: making registration request');
|
|
465
483
|
|
|
466
|
-
//
|
|
467
|
-
|
|
468
|
-
// Validate if the device is already registered and refresh instead.
|
|
469
|
-
if (_this4.registered) {
|
|
470
|
-
_this4.logger.info('device: device already registered, refreshing');
|
|
471
|
-
return _this4.refresh(deviceRegistrationOptions);
|
|
472
|
-
}
|
|
484
|
+
// Merge body configurations, overriding defaults.
|
|
485
|
+
var body = this._getBody();
|
|
473
486
|
|
|
474
|
-
|
|
475
|
-
|
|
487
|
+
// Merge header configurations, overriding defaults.
|
|
488
|
+
var headers = _objectSpread(_objectSpread({}, this.config.defaults.headers ? this.config.defaults.headers : {}), this.config.headers ? this.config.headers : {});
|
|
476
489
|
|
|
477
|
-
|
|
478
|
-
|
|
490
|
+
// Append a ttl value if the device is marked as ephemeral
|
|
491
|
+
if (this.config.ephemeral) {
|
|
492
|
+
body.ttl = this.config.ephemeralDeviceTTL;
|
|
493
|
+
}
|
|
494
|
+
this.webex.internal.newMetrics.submitInternalEvent({
|
|
495
|
+
name: 'internal.register.device.request'
|
|
496
|
+
});
|
|
497
|
+
var _deviceRegistrationOp2 = deviceRegistrationOptions.includeDetails,
|
|
498
|
+
includeDetails = _deviceRegistrationOp2 === void 0 ? _types.CatalogDetails.all : _deviceRegistrationOp2;
|
|
499
|
+
var requestId = _uuid.default.v4();
|
|
500
|
+
this.set('register-request-id', requestId);
|
|
479
501
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
502
|
+
// This will be replaced by a `create()` method.
|
|
503
|
+
return this.request({
|
|
504
|
+
method: 'POST',
|
|
505
|
+
service: 'wdm',
|
|
506
|
+
resource: 'devices',
|
|
507
|
+
body: body,
|
|
508
|
+
headers: headers,
|
|
509
|
+
qs: {
|
|
510
|
+
includeUpstreamServices: "".concat(includeDetails).concat(this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : '')
|
|
483
511
|
}
|
|
512
|
+
}).catch(function (error) {
|
|
484
513
|
_this4.webex.internal.newMetrics.submitInternalEvent({
|
|
485
|
-
name: 'internal.register.device.
|
|
514
|
+
name: 'internal.register.device.response'
|
|
486
515
|
});
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
516
|
+
throw error;
|
|
517
|
+
}).then(function (response) {
|
|
518
|
+
// If we've signed out in the mean time, the request ID will have changed
|
|
519
|
+
if (_this4.get('register-request-id') !== requestId) {
|
|
520
|
+
_this4.logger.info('device: register request ID mismatch, ignoring response');
|
|
521
|
+
return _promise.default.resolve();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Do not add any processing of response above this as that will affect timestamp
|
|
525
|
+
_this4.webex.internal.newMetrics.submitInternalEvent({
|
|
526
|
+
name: 'internal.register.device.response'
|
|
527
|
+
});
|
|
528
|
+
_this4.webex.internal.metrics.submitClientMetrics(_metrics.default.JS_SDK_WDM_REGISTRATION_SUCCESSFUL);
|
|
529
|
+
return _this4.processRegistrationSuccess(response);
|
|
530
|
+
}).catch(function (error) {
|
|
531
|
+
_this4.webex.internal.metrics.submitClientMetrics(_metrics.default.JS_SDK_WDM_REGISTRATION_FAILED, {
|
|
532
|
+
fields: {
|
|
533
|
+
error: error
|
|
499
534
|
}
|
|
500
|
-
}).catch(function (error) {
|
|
501
|
-
_this4.webex.internal.newMetrics.submitInternalEvent({
|
|
502
|
-
name: 'internal.register.device.response'
|
|
503
|
-
});
|
|
504
|
-
throw error;
|
|
505
|
-
}).then(function (response) {
|
|
506
|
-
// Do not add any processing of response above this as that will affect timestamp
|
|
507
|
-
_this4.webex.internal.newMetrics.submitInternalEvent({
|
|
508
|
-
name: 'internal.register.device.response'
|
|
509
|
-
});
|
|
510
|
-
_this4.webex.internal.metrics.submitClientMetrics(_metrics.default.JS_SDK_WDM_REGISTRATION_SUCCESSFUL);
|
|
511
|
-
return _this4.processRegistrationSuccess(response);
|
|
512
|
-
}).catch(function (error) {
|
|
513
|
-
_this4.webex.internal.metrics.submitClientMetrics(_metrics.default.JS_SDK_WDM_REGISTRATION_FAILED, {
|
|
514
|
-
fields: {
|
|
515
|
-
error: error
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
throw error;
|
|
519
535
|
});
|
|
536
|
+
throw error;
|
|
520
537
|
});
|
|
521
538
|
},
|
|
522
539
|
unregister: function unregister() {
|
|
@@ -531,6 +548,12 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
531
548
|
method: 'DELETE'
|
|
532
549
|
}).then(function () {
|
|
533
550
|
return _this5.clear();
|
|
551
|
+
}).catch(function (reason) {
|
|
552
|
+
if (reason.statusCode === 404) {
|
|
553
|
+
_this5.logger.info('device: 404 when deleting device, device is already deleted, clearing device');
|
|
554
|
+
_this5.clear();
|
|
555
|
+
}
|
|
556
|
+
throw reason;
|
|
534
557
|
});
|
|
535
558
|
},
|
|
536
559
|
/* eslint-enable require-jsdoc */
|
|
@@ -826,7 +849,7 @@ var Device = _webexCore.WebexPlugin.extend((_dec = (0, _webexCore.waitForValue)(
|
|
|
826
849
|
_this11.resetLogoutTimer();
|
|
827
850
|
});
|
|
828
851
|
} /* eslint-enable require-jsdoc */,
|
|
829
|
-
version: "3.
|
|
830
|
-
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "register", [
|
|
852
|
+
version: "3.8.0-next.2"
|
|
853
|
+
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "register", [_dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "register"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "_registerInternal", [_common.oneFlight, _dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "_registerInternal"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "unregister", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "unregister"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "markUrlFailedAndGetNew", [_dec5], (0, _getOwnPropertyDescriptor.default)(_obj, "markUrlFailedAndGetNew"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj)), _obj)));
|
|
831
854
|
var _default = exports.default = Device;
|
|
832
855
|
//# sourceMappingURL=device.js.map
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_common","require","_webexCore","_commonTimers","_lodash","_metrics","_interopRequireDefault","_constants","_featuresModel","_ipNetworkDetector","_types","_dec","_dec2","_dec3","_dec4","_dec5","_dec6","_obj","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","decider","config","ephemeral","Device","WebexPlugin","extend","waitForValue","deprecated","persist","namespace","extraProperties","idAttribute","children","features","FeaturesModel","ipNetworkDetector","IpNetworkDetector","props","clientMessagingGiphy","customerCompanyName","customerLogoUrl","deviceType","helpUrl","intranetInactivityDuration","intranetInactivityCheckUrl","inNetworkInactivityDuration","ecmEnabledForAllUsers","ecmSupportedStorageProviders","modificationTime","navigationBarColor","partnerCompanyName","partnerLogoUrl","peopleInsightsEnabled","reportingSiteDesc","reportingSiteUrl","searchEncryptionKeyUrl","showSupportText","supportProviderCompanyName","supportProviderLogoUrl","url","userId","webFileShareControl","webSocketUrl","whiteboardFileShareControl","derived","registered","deps","fn","session","logoutTimer","lastUserActivityDate","isReachabilityChecked","energyForecastConfig","isInMeeting","isInNetwork","meetingStarted","webex","trigger","meetingEnded","setEnergyForecastConfig","undefined","refresh","_this","deviceRegistrationOptions","logger","info","canRegister","then","register","body","serialize","mediaCluster","etag","ttl","ephemeralDeviceTTL","headers","defaults","_deviceRegistrationOp","includeDetails","CatalogDetails","all","request","method","uri","qs","includeUpstreamServices","concat","energyForecast","response","processRegistrationSuccess","catch","reason","statusCode","clear","_promise","reject","deleteDevices","_this2","service","resource","devices","_this2$_getBody","_getBody","webDevices","item","sortedDevices","orderBy","Date","totalItems","countToDelete","Math","ceil","urlsToDelete","slice","map","race","resolve","error","_this3","_registerInternal","_error$body","message","_this4","internal","newMetrics","callDiagnosticMetrics","setDeviceInfo","submitInternalEvent","name","_deviceRegistrationOp2","metrics","submitClientMetrics","METRICS","JS_SDK_WDM_REGISTRATION_SUCCESSFUL","JS_SDK_WDM_REGISTRATION_FAILED","fields","unregister","_this5","warn","services","waitForCatalog","canRegisterWaitDuration","get","Error","join","checkNetworkReachability","_this6","resetLogoutTimer","trackingid","_len","args","Array","_key","_apply","prototype","getWebSocketUrl","_this7","wait","waitForRegistration","convertUrlToPriorityHostUrl","wsUrl","_this8","serviceHostMap","_ref","user","reset","entitlement","set","delay","refreshTimer","safeSetTimeout","DEVICE_EVENT_REGISTRATION_SUCCESS","clearTimeout","off","unset","enableInactivityEnforcement","setLogoutTimer","duration","_this9","on","logout","_this10","timeout","timeoutTimer","once","markUrlFailedAndGetNew","markFailedUrl","initialize","_this11","_len2","_key2","FEATURE_COLLECTION_NAMES","collectionName","model","value","options","listenTo","_now","version","_applyDecoratedDescriptor2","oneFlight","_getOwnPropertyDescriptor","_default","exports"],"sources":["device.js"],"sourcesContent":["// Internal Dependencies\nimport {deprecated, oneFlight} from '@webex/common';\nimport {persist, waitForValue, WebexPlugin} from '@webex/webex-core';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {orderBy} from 'lodash';\n\nimport METRICS from './metrics';\nimport {FEATURE_COLLECTION_NAMES, DEVICE_EVENT_REGISTRATION_SUCCESS} from './constants';\nimport FeaturesModel from './features/features-model';\nimport IpNetworkDetector from './ipNetworkDetector';\nimport {CatalogDetails} from './types';\n\n/**\n * Determine if the plugin should be initialized based on cached storage.\n *\n * @returns {boolean} - If the device is ephemeral.\n */\nfunction decider() {\n return !this.config.ephemeral;\n}\n\nconst Device = WebexPlugin.extend({\n // Ampersand property members.\n\n namespace: 'Device',\n\n // Allow for extra properties to prevent the plugin from failing due to\n // **WDM** service DTO changes.\n extraProperties: 'allow',\n\n idAttribute: 'url',\n\n children: {\n /**\n * The class object that contains all of the feature collections.\n *\n * @type {FeaturesModel}\n */\n features: FeaturesModel,\n /**\n * Helper class for detecting what IP network version (ipv4, ipv6) we're on.\n *\n * @type {IpNetworkDetector}\n */\n ipNetworkDetector: IpNetworkDetector,\n },\n\n /**\n * A collection of device properties mostly assigned by the retrieved DTO from\n * the **WDM** service that are mapped against the ampersand properties.\n *\n * @type {Object}\n */\n props: {\n /**\n * This property determines whether or not giphy support is enabled.\n *\n * @type {'ALLOW' | 'BLOCK'}\n */\n clientMessagingGiphy: 'string',\n\n /**\n * This property should store the company name.\n *\n * @type {string}\n */\n customerCompanyName: 'string',\n\n /**\n * This property should store the logo url.\n *\n * @type {string}\n */\n customerLogoUrl: 'string',\n\n /**\n * This property doesn't have any real values, but is sent during device\n * refresh to prevent the **wdm** service from falling back to an iOS device\n * type.\n *\n * @type {string}\n */\n deviceType: 'string',\n\n /**\n * This property should store the help url.\n *\n * @type {string}\n */\n helpUrl: 'string',\n\n /**\n * This property should store the intranet inactivity timer duration.\n *\n * @type {number}\n */\n intranetInactivityDuration: 'number',\n\n /**\n * This property stores the url required to validate if the device is able\n * to actively reach the intranet network.\n *\n * @type {string}\n */\n intranetInactivityCheckUrl: 'string',\n\n /**\n * This property stores the inactivity timer duration, and could possibly\n * deprecate the `intranetInactivityDuration` property.\n *\n * @type {number}\n */\n inNetworkInactivityDuration: 'number',\n\n /**\n * This property stores the ECM (external content management) enabled value\n * for the whole organization.\n *\n * @type {boolean}\n */\n ecmEnabledForAllUsers: ['boolean', false, false],\n\n /**\n * This property stores an array of ECM (external content management)\n * providers that are currently available.\n *\n * @returns {Array<string>}\n */\n ecmSupportedStorageProviders: ['array', false, () => []],\n\n /**\n * This property stores the modification time value retrieved from the\n * **WDM** endpoint formatted as ISO 8601.\n *\n * @type {string}\n */\n modificationTime: 'string',\n\n /**\n * This property stores the navigation bar color.\n *\n * @type {string}\n */\n navigationBarColor: 'string',\n\n /**\n * This property stores the partner company's name when available.\n *\n * @type {string}\n */\n partnerCompanyName: 'string',\n\n /**\n * This property stores the partner company's logo when available.\n *\n * @type {string}\n */\n partnerLogoUrl: 'string',\n\n /**\n * This property stores the availability of people data from the **WDM**\n * service.\n *\n * @type {boolean}\n */\n peopleInsightsEnabled: 'boolean',\n\n /**\n * This property stores the reporting site's description when available.\n *\n * @type {string}\n */\n reportingSiteDesc: 'string',\n\n /**\n * This property stores the reporting site's access url when available.\n *\n * @type {string}\n */\n reportingSiteUrl: 'string',\n\n /**\n * This property stores the encryption key url when available.\n *\n * @type {string}\n */\n searchEncryptionKeyUrl: 'string',\n\n /**\n * This property stores the availability of support-provided text from the\n * **WDM** service.\n *\n * @type {boolean}\n */\n showSupportText: 'boolean',\n\n /**\n * This property stores the support provider's company name when available.\n *\n * @type {string}\n */\n supportProviderCompanyName: 'string',\n\n /**\n * This property stores the support provider's logo url when available.\n *\n * @type {string}\n */\n supportProviderLogoUrl: 'string',\n\n /**\n * This property stores the device's url retrieved from a registration\n * request. This property gets set via the initial registration process by a\n * `this.set()` method.\n *\n * @type {string}\n */\n url: 'string',\n\n /**\n * This property stores the device's userId uuid value, which can also be\n * derived from the device's registerd user's userId retrieved from\n * the **Hydra** service.\n *\n * @type {string}\n */\n userId: 'string',\n\n /**\n * This property stores whether or not file sharing is enabled\n *\n * @type {'BLOCK_BOTH' | 'BLOCK_UPLOAD'}\n */\n webFileShareControl: 'string',\n\n /**\n * This property stores the current web socket url used by the registered\n * device.\n *\n * @type {string}\n */\n webSocketUrl: 'string',\n\n /**\n * This property stores the value indicating whether or not white board file\n * sharing is enabled for the current device.\n *\n * @type {'ALLOW' | 'BLOCK'}\n */\n whiteboardFileShareControl: 'string',\n },\n\n /**\n * A list of derived properties that populate based when their parent data\n * available via the device's properties.\n *\n * @type {Object}\n */\n derived: {\n /**\n * This property determines if the current device is registered.\n *\n * @type {boolean}\n */\n registered: {\n deps: ['url'],\n\n /**\n * Checks if the device is registered by validating that the url exists.\n * Amperstand does not allow this to method to be written as an arrow\n * function.\n *\n * @returns {boolean}\n */\n fn() {\n return !!this.url;\n },\n },\n },\n\n /**\n * Stores timer data as well as other state details.\n *\n * @type {Object}\n */\n session: {\n /**\n * This property stores the logout timer object\n *\n * @type {any}\n */\n logoutTimer: 'any',\n\n /**\n * This property stores the date for the last activity the user made\n * with the current device.\n *\n * @type {number}\n */\n lastUserActivityDate: 'number',\n\n /**\n * This property stores whether or not the reachability check has been\n * performed to prevent the reachability check from performing its\n * operation more than once after a successful check.\n *\n * @returns {boolean}\n */\n isReachabilityChecked: ['boolean', false, false],\n\n /**\n * This property stores whether or not the next refresh or register request should request energy forecast data\n * in order to prevent over fetching energy forecasts\n *\n * @type {boolean}\n */\n energyForecastConfig: 'boolean',\n\n /**\n * This property stores whether or not the current device is in a meeting\n * to prevent an unneeded timeout of a meeting due to inactivity.\n *\n * @type {boolean}\n */\n isInMeeting: 'boolean',\n\n /**\n * This property identifies if the device is currently in network to prevent\n * the `resetLogoutTimer()` method from being called repeatedly once its\n * known client is connected to the organization's internal network.\n *\n * @type {boolean}\n */\n isInNetwork: 'boolean',\n },\n\n // Event method members.\n\n /**\n * Trigger meeting started event for webex instance. Used by web-client team.\n *\n * @returns {void}\n */\n meetingStarted() {\n this.webex.trigger('meeting started');\n },\n\n /**\n * Trigger meeting ended event for webex instance. Used by web-client team.\n *\n * @returns {void}\n */\n meetingEnded() {\n this.webex.trigger('meeting ended');\n },\n\n /**\n * Set the value of energy forecast config for the current registered device.\n * @param {boolean} [energyForecastConfig=false] - fetch an energy forecast on the next refresh/register\n * @returns {void}\n */\n setEnergyForecastConfig(energyForecastConfig = false) {\n this.energyForecastConfig = energyForecastConfig;\n },\n\n // Registration method members\n\n /**\n * Refresh the current registered device if able.\n *\n * @param {DeviceRegistrationOptions} options - The options for refresh.\n * @param {CatalogDetails} options.includeDetails - The details to include in the refresh/register request.\n * @returns {Promise<void, Error>}\n */\n @oneFlight\n @waitForValue('@')\n refresh(deviceRegistrationOptions = {}) {\n this.logger.info('device: refreshing');\n\n // Validate that the device can be registered.\n return this.canRegister().then(() => {\n // Validate if the device is not registered and register instead.\n if (!this.registered) {\n this.logger.info('device: device not registered, registering');\n\n return this.register(deviceRegistrationOptions);\n }\n\n // Merge body configurations, overriding defaults.\n const body = {\n ...this.serialize(),\n ...(this.config.body ? this.config.body : {}),\n };\n\n // Remove unneeded properties from the body object.\n delete body.features;\n delete body.mediaCluster;\n delete body.etag;\n\n // Append a ttl value if the device is marked as ephemeral.\n if (this.config.ephemeral) {\n body.ttl = this.config.ephemeralDeviceTTL;\n }\n\n // Merge header configurations, overriding defaults.\n const headers = {\n ...(this.config.defaults.headers ? this.config.defaults.headers : {}),\n ...(this.config.headers ? this.config.headers : {}),\n // If etag is sent, WDM will not send developer feature toggles unless they have changed\n ...(this.etag ? {'If-None-Match': this.etag} : {}),\n };\n\n const {includeDetails = CatalogDetails.all} = deviceRegistrationOptions;\n\n return this.request({\n method: 'PUT',\n uri: this.url,\n body,\n headers,\n qs: {\n includeUpstreamServices: `${includeDetails}${\n this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : ''\n }`,\n },\n })\n .then((response) => this.processRegistrationSuccess(response))\n .catch((reason) => {\n // Handle a 404 error, which indicates that the device is no longer\n // valid and needs to be registered as a new device.\n if (reason.statusCode === 404) {\n this.logger.info('device: refresh failed, device is not valid');\n this.logger.info('device: attempting to register a new device');\n\n this.clear();\n\n return this.register(deviceRegistrationOptions);\n }\n\n return Promise.reject(reason);\n });\n });\n },\n /**\n * Fetches the web devices and deletes the third of them which are not recent devices in use\n * @returns {Promise<void, Error>}\n */\n deleteDevices() {\n // Fetch devices with a GET request\n return this.request({\n method: 'GET',\n service: 'wdm',\n resource: 'devices',\n })\n .then((response) => {\n const {devices} = response.body;\n\n const {deviceType} = this._getBody();\n\n // Filter devices of type deviceType\n const webDevices = devices.filter((item) => item.deviceType === deviceType);\n\n const sortedDevices = orderBy(webDevices, [(item) => new Date(item.modificationTime)]);\n\n // If there are more than two devices, delete the last third\n if (sortedDevices.length > 2) {\n const totalItems = sortedDevices.length;\n const countToDelete = Math.ceil(totalItems / 3);\n const urlsToDelete = sortedDevices.slice(0, countToDelete).map((item) => item.url);\n\n return Promise.race(\n urlsToDelete.map((url) => {\n return this.request({\n uri: url,\n method: 'DELETE',\n });\n })\n );\n }\n\n return Promise.resolve();\n })\n .catch((error) => {\n this.logger.error('Failed to retrieve devices:', error);\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Registers and when fails deletes devices\n */\n @oneFlight\n @waitForValue('@')\n register(deviceRegistrationOptions = {}) {\n return this._registerInternal(deviceRegistrationOptions).catch((error) => {\n if (error?.body?.message === 'User has excessive device registrations') {\n return this.deleteDevices().then(() => {\n return this._registerInternal(deviceRegistrationOptions);\n });\n }\n throw error;\n });\n },\n\n _getBody() {\n return {\n ...(this.config.defaults.body ? this.config.defaults.body : {}),\n ...(this.config.body ? this.config.body : {}),\n };\n },\n\n /**\n * Register or refresh a device depending on the current device state. Device\n * registration utilizes the services plugin to send the request to the\n * **WDM** service.\n *\n * @param {Object} options - The options for registration.\n * @param {CatalogDetails} options.includeDetails - The details to include in the refresh/register request.\n * @returns {Promise<void, Error>}\n */\n @oneFlight\n @waitForValue('@')\n _registerInternal(deviceRegistrationOptions = {}) {\n this.logger.info('device: registering');\n\n this.webex.internal.newMetrics.callDiagnosticMetrics.setDeviceInfo(this);\n\n // Validate that the device can be registered.\n return this.canRegister().then(() => {\n // Validate if the device is already registered and refresh instead.\n if (this.registered) {\n this.logger.info('device: device already registered, refreshing');\n\n return this.refresh(deviceRegistrationOptions);\n }\n\n // Merge body configurations, overriding defaults.\n const body = this._getBody();\n\n // Merge header configurations, overriding defaults.\n const headers = {\n ...(this.config.defaults.headers ? this.config.defaults.headers : {}),\n ...(this.config.headers ? this.config.headers : {}),\n };\n\n // Append a ttl value if the device is marked as ephemeral\n if (this.config.ephemeral) {\n body.ttl = this.config.ephemeralDeviceTTL;\n }\n this.webex.internal.newMetrics.submitInternalEvent({\n name: 'internal.register.device.request',\n });\n\n const {includeDetails = CatalogDetails.all} = deviceRegistrationOptions;\n\n // This will be replaced by a `create()` method.\n return this.request({\n method: 'POST',\n service: 'wdm',\n resource: 'devices',\n body,\n headers,\n qs: {\n includeUpstreamServices: `${includeDetails}${\n this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : ''\n }`,\n },\n })\n .catch((error) => {\n this.webex.internal.newMetrics.submitInternalEvent({\n name: 'internal.register.device.response',\n });\n\n throw error;\n })\n .then((response) => {\n // Do not add any processing of response above this as that will affect timestamp\n this.webex.internal.newMetrics.submitInternalEvent({\n name: 'internal.register.device.response',\n });\n\n this.webex.internal.metrics.submitClientMetrics(\n METRICS.JS_SDK_WDM_REGISTRATION_SUCCESSFUL\n );\n\n return this.processRegistrationSuccess(response);\n })\n .catch((error) => {\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_WDM_REGISTRATION_FAILED, {\n fields: {error},\n });\n throw error;\n });\n });\n },\n /**\n * Unregister the current registered device if available. Unregistering a\n * device utilizes the services plugin to send the request to the **WDM**\n * service.\n *\n * @returns {Promise<void, Error>}\n */\n @oneFlight\n @waitForValue('@')\n unregister() {\n this.logger.info('device: unregistering');\n\n if (!this.registered) {\n this.logger.warn('device: not registered');\n\n return Promise.resolve();\n }\n\n return this.request({\n uri: this.url,\n method: 'DELETE',\n }).then(() => this.clear());\n },\n /* eslint-enable require-jsdoc */\n\n // Helper method members\n\n /**\n * Determine if registration methods can be performed. This method utilizes\n * the `services` plugin to confirm if the appropriate service urls are\n * available for device registration.\n *\n * @returns {Promise<void, Error>}\n */\n canRegister() {\n this.logger.info('device: validating if registration can occur');\n\n // Destructure the services plugin for ease of reference.\n const {services} = this.webex.internal;\n\n // Wait for the postauth catalog to populate.\n return services.waitForCatalog('postauth', this.config.canRegisterWaitDuration).then(() =>\n // Validate that the service exists after waiting for the catalog.\n services.get('wdm')\n ? Promise.resolve()\n : Promise.reject(\n new Error(\n [\n 'device: cannot register,',\n \"'wdm' service is not available from the postauth catalog\",\n ].join(' ')\n )\n )\n );\n },\n\n /**\n * Check if the device can currently reach the inactivity check url.\n *\n * @returns {Promise<void, Error>}\n */\n checkNetworkReachability() {\n this.logger.info('device: checking network reachability');\n\n // Validate if the device has been checked and reset the logout timer.\n if (this.isReachabilityChecked) {\n return Promise.resolve(this.resetLogoutTimer());\n }\n\n this.isReachabilityChecked = true;\n\n // Validate if the device has a intranet checking url.\n if (!this.intranetInactivityCheckUrl) {\n this.isInNetwork = false;\n\n return Promise.resolve(this.resetLogoutTimer());\n }\n\n // Clear unnecessary headers for reachability request.\n const headers = {\n 'cisco-no-http-redirect': null,\n 'spark-user-agent': null,\n trackingid: null,\n };\n\n // Send the network reachability request.\n return this.request({\n headers,\n method: 'GET',\n uri: this.intranetInactivityCheckUrl,\n })\n .then(() => {\n this.isInNetwork = true;\n\n return Promise.resolve(this.resetLogoutTimer());\n })\n .catch(() => {\n this.logger.info('device: did not reach ping endpoint');\n this.logger.info('device: triggering off-network timer');\n\n this.isInNetwork = false;\n\n return Promise.resolve(this.resetLogoutTimer());\n });\n },\n\n /**\n * Clears the registration ttl value if available.\n *\n * @param {Object} options - Values to be cleared.\n * @returns {void}\n */\n clear(...args) {\n this.logger.info('device: clearing registered device');\n\n // Prototype the extended class in order to preserve the parent member.\n Reflect.apply(WebexPlugin.prototype.clear, this, args);\n },\n\n /**\n * Get the current websocket url with the appropriate priority host.\n *\n * @param {boolean} [wait=false] - Willing to wait on a valid url.\n * @returns {Promise<string, Error>} - The priority-mapped web socket url.\n */\n getWebSocketUrl(wait = false) {\n this.logger.info('device: getting the current websocket url');\n\n // Destructure the services plugin for ease of reference.\n const {services} = this.webex.internal;\n\n // Validate if the method should wait for registration.\n if (wait) {\n return this.waitForRegistration()\n .then(() => services.convertUrlToPriorityHostUrl(this.webSocketUrl))\n .catch((error) => {\n this.logger.warn(error.message);\n\n return Promise.reject(new Error('device: failed to get the current websocket url'));\n });\n }\n\n // Validate if the device is registered.\n if (!this.registered) {\n return Promise.reject(\n new Error('device: cannot get websocket url, device is not registered')\n );\n }\n\n // Attempt to collect the priority-host-mapped web socket URL.\n const wsUrl = services.convertUrlToPriorityHostUrl(this.webSocketUrl);\n\n // Validate that the url was collected.\n if (wsUrl) {\n return Promise.resolve(wsUrl);\n }\n\n return Promise.reject(new Error('device: failed to get the current websocket url'));\n },\n\n /**\n * Process a successful device registration.\n *\n * @param {Object} response - response object from registration success.\n * @returns {void}\n */\n processRegistrationSuccess(response) {\n this.logger.info('device: received registration payload');\n\n // Clone the response body for service cleaning.\n const body = {...response.body};\n\n // Clean service data.\n delete body.services;\n delete body.serviceHostMap;\n\n const {etag} = response.headers || {};\n\n if (this.etag && etag && this.etag === etag) {\n // If current etag matches the previous one and we have sent\n // If-None-Match header the developer and entitlement feature\n // toggles will not be returned\n const {features} = body;\n\n delete body.features;\n // When using the etag feature cache, user and entitlement features are still returned\n this.features.user.reset(features.user);\n this.features.entitlement.reset(features.entitlement);\n }\n\n // Assign the recieved DTO from **WDM** to this device.\n this.set(body);\n\n // Assign the new etag to this device.\n this.set({etag});\n\n // Validate if device is ephemeral and setup refresh timer.\n if (this.config.ephemeral) {\n this.logger.info('device: enqueuing device refresh');\n\n const delay = (this.config.ephemeralDeviceTTL / 2 + 60) * 1000;\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), delay);\n }\n\n // Emit the registration:success event.\n this.trigger(DEVICE_EVENT_REGISTRATION_SUCCESS, this);\n },\n\n /**\n * Reset the current local logout timer for the registered device if\n * registered.\n *\n * @returns {void}\n */\n resetLogoutTimer() {\n this.logger.info('device: resetting logout timer');\n\n // Clear current logout timer.\n clearTimeout(this.logoutTimer);\n\n // Remove last activity date event listener.\n this.off('change:lastUserActivityDate');\n\n // Remove the logout timer.\n this.unset('logoutTimer');\n\n // Validate if the device is currently in a meeting and is configured to\n // required inactivity enforcement.\n if (\n !this.isInMeeting &&\n this.config.enableInactivityEnforcement &&\n this.isReachabilityChecked\n ) {\n if (this.isInNetwork) {\n this.setLogoutTimer(this.inNetworkInactivityDuration);\n } else {\n this.setLogoutTimer(this.intranetInactivityDuration);\n }\n }\n },\n\n /**\n * Set the value of the logout timer for the current registered device.\n *\n * @param {number} duration - Value in seconds of the new logout timer.\n * @returns {void}\n */\n setLogoutTimer(duration) {\n this.logger.info('device: setting logout timer');\n\n if (!duration || duration <= 0) {\n return;\n }\n\n // Setup user activity date event listener.\n this.on('change:lastUserActivityDate', () => {\n this.resetLogoutTimer();\n });\n\n // Initialize a new timer.\n this.logoutTimer = safeSetTimeout(() => {\n this.webex.logout();\n }, duration * 1000);\n },\n\n /**\n * Wait for the device to be registered.\n *\n * @param {number} [timeout=10] - The maximum duration to wait, in seconds.\n * @returns {Promise<void, Error>}\n */\n waitForRegistration(timeout = 10) {\n this.logger.info('device: waiting for registration');\n\n return new Promise((resolve, reject) => {\n if (this.registered) {\n resolve();\n }\n\n const timeoutTimer = safeSetTimeout(\n () => reject(new Error('device: timeout occured while waiting for registration')),\n timeout * 1000\n );\n\n this.once(DEVICE_EVENT_REGISTRATION_SUCCESS, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n\n // Deprecated methods.\n\n /**\n * Mark a url as failed and get the next priority host url.\n *\n * @param {string} url - The url to mark as failed.\n * @returns {Promise<string>} - The next priority url.\n */\n @deprecated('device#markUrlFailedAndGetNew(): Use services#markFailedUrl()')\n markUrlFailedAndGetNew(url) {\n return Promise.resolve(this.webex.internal.services.markFailedUrl(url));\n },\n\n // Ampersand method members\n\n /* eslint-disable require-jsdoc */\n /**\n * Initializer method for the device plugin.\n *\n * @override\n * @param {Array<any>} args - An array of items to be mapped as properties.\n * @returns {void}\n */\n @persist('@', decider)\n initialize(...args) {\n // Prototype the extended class in order to preserve the parent member.\n Reflect.apply(WebexPlugin.prototype.initialize, this, args);\n\n // Initialize feature events and listeners.\n FEATURE_COLLECTION_NAMES.forEach((collectionName) => {\n this.features.on(`change:${collectionName}`, (model, value, options) => {\n this.trigger('change', this, options);\n this.trigger('change:features', this, this.features, options);\n });\n });\n\n // Initialize network reachability checking event for url change.\n this.on('change:intranetInactivityCheckUrl', () => {\n this.checkNetworkReachability();\n });\n\n // Initialize network reachability checking event for duration change.\n this.on('change:intranetInactivityDuration', () => {\n this.checkNetworkReachability();\n });\n\n // Initialize network reachability checking event for duration change.\n this.on('change:inNetworkInactivityDuration', () => {\n this.checkNetworkReachability();\n });\n\n // Initialize listener for activity checking.\n this.listenTo(this.webex, 'user-activity', () => {\n this.lastUserActivityDate = Date.now();\n });\n\n // Initialize listener for meeting started event.\n this.listenTo(this.webex, 'meeting started', () => {\n this.isInMeeting = true;\n this.resetLogoutTimer();\n });\n\n // Initialize listener for meeting ended event.\n this.listenTo(this.webex, 'meeting ended', () => {\n this.isInMeeting = false;\n this.resetLogoutTimer();\n });\n },\n /* eslint-enable require-jsdoc */\n});\n\nexport default Device;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_common","require","_webexCore","_commonTimers","_lodash","_uuid","_interopRequireDefault","_metrics","_constants","_featuresModel","_ipNetworkDetector","_types","_dec","_dec2","_dec3","_dec4","_dec5","_dec6","_obj","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","decider","config","ephemeral","Device","WebexPlugin","extend","waitForValue","deprecated","persist","namespace","extraProperties","idAttribute","children","features","FeaturesModel","ipNetworkDetector","IpNetworkDetector","props","clientMessagingGiphy","customerCompanyName","customerLogoUrl","deviceType","helpUrl","intranetInactivityDuration","intranetInactivityCheckUrl","inNetworkInactivityDuration","ecmEnabledForAllUsers","ecmSupportedStorageProviders","modificationTime","navigationBarColor","partnerCompanyName","partnerLogoUrl","peopleInsightsEnabled","reportingSiteDesc","reportingSiteUrl","searchEncryptionKeyUrl","showSupportText","supportProviderCompanyName","supportProviderLogoUrl","url","userId","webFileShareControl","webSocketUrl","whiteboardFileShareControl","derived","registered","deps","fn","session","logoutTimer","lastUserActivityDate","isReachabilityChecked","energyForecastConfig","isInMeeting","isInNetwork","meetingStarted","webex","trigger","meetingEnded","setEnergyForecastConfig","undefined","refresh","_this","deviceRegistrationOptions","logger","info","canRegister","then","register","body","serialize","mediaCluster","etag","ttl","ephemeralDeviceTTL","headers","defaults","_deviceRegistrationOp","includeDetails","CatalogDetails","all","requestId","uuid","v4","set","request","method","uri","qs","includeUpstreamServices","concat","energyForecast","response","get","_promise","resolve","processRegistrationSuccess","catch","reason","statusCode","clear","reject","deleteDevices","_this2","service","resource","devices","_this2$_getBody","_getBody","webDevices","item","sortedDevices","orderBy","Date","totalItems","countToDelete","Math","ceil","urlsToDelete","slice","map","race","error","_this3","internal","newMetrics","callDiagnosticMetrics","setDeviceInfo","_registerInternal","_error$body","message","_this4","submitInternalEvent","name","_deviceRegistrationOp2","metrics","submitClientMetrics","METRICS","JS_SDK_WDM_REGISTRATION_SUCCESSFUL","JS_SDK_WDM_REGISTRATION_FAILED","fields","unregister","_this5","warn","services","waitForCatalog","canRegisterWaitDuration","Error","join","checkNetworkReachability","_this6","resetLogoutTimer","trackingid","_len","args","Array","_key","_apply","prototype","getWebSocketUrl","_this7","wait","waitForRegistration","convertUrlToPriorityHostUrl","wsUrl","_this8","serviceHostMap","_ref","user","reset","entitlement","delay","refreshTimer","safeSetTimeout","DEVICE_EVENT_REGISTRATION_SUCCESS","clearTimeout","off","unset","enableInactivityEnforcement","setLogoutTimer","duration","_this9","on","logout","_this10","timeout","timeoutTimer","once","markUrlFailedAndGetNew","markFailedUrl","initialize","_this11","_len2","_key2","FEATURE_COLLECTION_NAMES","collectionName","model","value","options","listenTo","_now","version","_applyDecoratedDescriptor2","oneFlight","_getOwnPropertyDescriptor","_default","exports"],"sources":["device.js"],"sourcesContent":["// Internal Dependencies\nimport {deprecated, oneFlight} from '@webex/common';\nimport {persist, waitForValue, WebexPlugin} from '@webex/webex-core';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {orderBy} from 'lodash';\nimport uuid from 'uuid';\n\nimport METRICS from './metrics';\nimport {FEATURE_COLLECTION_NAMES, DEVICE_EVENT_REGISTRATION_SUCCESS} from './constants';\nimport FeaturesModel from './features/features-model';\nimport IpNetworkDetector from './ipNetworkDetector';\nimport {CatalogDetails} from './types';\n\n/**\n * Determine if the plugin should be initialized based on cached storage.\n *\n * @returns {boolean} - If the device is ephemeral.\n */\nfunction decider() {\n return !this.config.ephemeral;\n}\n\nconst Device = WebexPlugin.extend({\n // Ampersand property members.\n\n namespace: 'Device',\n\n // Allow for extra properties to prevent the plugin from failing due to\n // **WDM** service DTO changes.\n extraProperties: 'allow',\n\n idAttribute: 'url',\n\n children: {\n /**\n * The class object that contains all of the feature collections.\n *\n * @type {FeaturesModel}\n */\n features: FeaturesModel,\n /**\n * Helper class for detecting what IP network version (ipv4, ipv6) we're on.\n *\n * @type {IpNetworkDetector}\n */\n ipNetworkDetector: IpNetworkDetector,\n },\n\n /**\n * A collection of device properties mostly assigned by the retrieved DTO from\n * the **WDM** service that are mapped against the ampersand properties.\n *\n * @type {Object}\n */\n props: {\n /**\n * This property determines whether or not giphy support is enabled.\n *\n * @type {'ALLOW' | 'BLOCK'}\n */\n clientMessagingGiphy: 'string',\n\n /**\n * This property should store the company name.\n *\n * @type {string}\n */\n customerCompanyName: 'string',\n\n /**\n * This property should store the logo url.\n *\n * @type {string}\n */\n customerLogoUrl: 'string',\n\n /**\n * This property doesn't have any real values, but is sent during device\n * refresh to prevent the **wdm** service from falling back to an iOS device\n * type.\n *\n * @type {string}\n */\n deviceType: 'string',\n\n /**\n * This property should store the help url.\n *\n * @type {string}\n */\n helpUrl: 'string',\n\n /**\n * This property should store the intranet inactivity timer duration.\n *\n * @type {number}\n */\n intranetInactivityDuration: 'number',\n\n /**\n * This property stores the url required to validate if the device is able\n * to actively reach the intranet network.\n *\n * @type {string}\n */\n intranetInactivityCheckUrl: 'string',\n\n /**\n * This property stores the inactivity timer duration, and could possibly\n * deprecate the `intranetInactivityDuration` property.\n *\n * @type {number}\n */\n inNetworkInactivityDuration: 'number',\n\n /**\n * This property stores the ECM (external content management) enabled value\n * for the whole organization.\n *\n * @type {boolean}\n */\n ecmEnabledForAllUsers: ['boolean', false, false],\n\n /**\n * This property stores an array of ECM (external content management)\n * providers that are currently available.\n *\n * @returns {Array<string>}\n */\n ecmSupportedStorageProviders: ['array', false, () => []],\n\n /**\n * This property stores the modification time value retrieved from the\n * **WDM** endpoint formatted as ISO 8601.\n *\n * @type {string}\n */\n modificationTime: 'string',\n\n /**\n * This property stores the navigation bar color.\n *\n * @type {string}\n */\n navigationBarColor: 'string',\n\n /**\n * This property stores the partner company's name when available.\n *\n * @type {string}\n */\n partnerCompanyName: 'string',\n\n /**\n * This property stores the partner company's logo when available.\n *\n * @type {string}\n */\n partnerLogoUrl: 'string',\n\n /**\n * This property stores the availability of people data from the **WDM**\n * service.\n *\n * @type {boolean}\n */\n peopleInsightsEnabled: 'boolean',\n\n /**\n * This property stores the reporting site's description when available.\n *\n * @type {string}\n */\n reportingSiteDesc: 'string',\n\n /**\n * This property stores the reporting site's access url when available.\n *\n * @type {string}\n */\n reportingSiteUrl: 'string',\n\n /**\n * This property stores the encryption key url when available.\n *\n * @type {string}\n */\n searchEncryptionKeyUrl: 'string',\n\n /**\n * This property stores the availability of support-provided text from the\n * **WDM** service.\n *\n * @type {boolean}\n */\n showSupportText: 'boolean',\n\n /**\n * This property stores the support provider's company name when available.\n *\n * @type {string}\n */\n supportProviderCompanyName: 'string',\n\n /**\n * This property stores the support provider's logo url when available.\n *\n * @type {string}\n */\n supportProviderLogoUrl: 'string',\n\n /**\n * This property stores the device's url retrieved from a registration\n * request. This property gets set via the initial registration process by a\n * `this.set()` method.\n *\n * @type {string}\n */\n url: 'string',\n\n /**\n * This property stores the device's userId uuid value, which can also be\n * derived from the device's registerd user's userId retrieved from\n * the **Hydra** service.\n *\n * @type {string}\n */\n userId: 'string',\n\n /**\n * This property stores whether or not file sharing is enabled\n *\n * @type {'BLOCK_BOTH' | 'BLOCK_UPLOAD'}\n */\n webFileShareControl: 'string',\n\n /**\n * This property stores the current web socket url used by the registered\n * device.\n *\n * @type {string}\n */\n webSocketUrl: 'string',\n\n /**\n * This property stores the value indicating whether or not white board file\n * sharing is enabled for the current device.\n *\n * @type {'ALLOW' | 'BLOCK'}\n */\n whiteboardFileShareControl: 'string',\n },\n\n /**\n * A list of derived properties that populate based when their parent data\n * available via the device's properties.\n *\n * @type {Object}\n */\n derived: {\n /**\n * This property determines if the current device is registered.\n *\n * @type {boolean}\n */\n registered: {\n deps: ['url'],\n\n /**\n * Checks if the device is registered by validating that the url exists.\n * Amperstand does not allow this to method to be written as an arrow\n * function.\n *\n * @returns {boolean}\n */\n fn() {\n return !!this.url;\n },\n },\n },\n\n /**\n * Stores timer data as well as other state details.\n *\n * @type {Object}\n */\n session: {\n /**\n * This property stores the logout timer object\n *\n * @type {any}\n */\n logoutTimer: 'any',\n\n /**\n * This property stores the date for the last activity the user made\n * with the current device.\n *\n * @type {number}\n */\n lastUserActivityDate: 'number',\n\n /**\n * This property stores whether or not the reachability check has been\n * performed to prevent the reachability check from performing its\n * operation more than once after a successful check.\n *\n * @returns {boolean}\n */\n isReachabilityChecked: ['boolean', false, false],\n\n /**\n * This property stores whether or not the next refresh or register request should request energy forecast data\n * in order to prevent over fetching energy forecasts\n *\n * @type {boolean}\n */\n energyForecastConfig: 'boolean',\n\n /**\n * This property stores whether or not the current device is in a meeting\n * to prevent an unneeded timeout of a meeting due to inactivity.\n *\n * @type {boolean}\n */\n isInMeeting: 'boolean',\n\n /**\n * This property identifies if the device is currently in network to prevent\n * the `resetLogoutTimer()` method from being called repeatedly once its\n * known client is connected to the organization's internal network.\n *\n * @type {boolean}\n */\n isInNetwork: 'boolean',\n },\n\n // Event method members.\n\n /**\n * Trigger meeting started event for webex instance. Used by web-client team.\n *\n * @returns {void}\n */\n meetingStarted() {\n this.webex.trigger('meeting started');\n },\n\n /**\n * Trigger meeting ended event for webex instance. Used by web-client team.\n *\n * @returns {void}\n */\n meetingEnded() {\n this.webex.trigger('meeting ended');\n },\n\n /**\n * Set the value of energy forecast config for the current registered device.\n * @param {boolean} [energyForecastConfig=false] - fetch an energy forecast on the next refresh/register\n * @returns {void}\n */\n setEnergyForecastConfig(energyForecastConfig = false) {\n this.energyForecastConfig = energyForecastConfig;\n },\n\n // Registration method members\n\n /**\n * Refresh the current registered device if able.\n *\n * @param {DeviceRegistrationOptions} options - The options for refresh.\n * @param {CatalogDetails} options.includeDetails - The details to include in the refresh/register request.\n * @returns {Promise<void, Error>}\n */\n @oneFlight\n @waitForValue('@')\n refresh(deviceRegistrationOptions = {}) {\n this.logger.info('device: refreshing');\n\n // Validate that the device can be registered.\n return this.canRegister().then(() => {\n // Validate if the device is not registered and register instead.\n if (!this.registered) {\n this.logger.info('device: device not registered, registering');\n\n return this.register(deviceRegistrationOptions);\n }\n\n // Merge body configurations, overriding defaults.\n const body = {\n ...this.serialize(),\n ...(this.config.body ? this.config.body : {}),\n };\n\n // Remove unneeded properties from the body object.\n delete body.features;\n delete body.mediaCluster;\n delete body.etag;\n\n // Append a ttl value if the device is marked as ephemeral.\n if (this.config.ephemeral) {\n body.ttl = this.config.ephemeralDeviceTTL;\n }\n\n // Merge header configurations, overriding defaults.\n const headers = {\n ...(this.config.defaults.headers ? this.config.defaults.headers : {}),\n ...(this.config.headers ? this.config.headers : {}),\n // If etag is sent, WDM will not send developer feature toggles unless they have changed\n ...(this.etag ? {'If-None-Match': this.etag} : {}),\n };\n\n const {includeDetails = CatalogDetails.all} = deviceRegistrationOptions;\n\n const requestId = uuid.v4();\n this.set('refresh-request-id', requestId);\n\n return this.request({\n method: 'PUT',\n uri: this.url,\n body,\n headers,\n qs: {\n includeUpstreamServices: `${includeDetails}${\n this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : ''\n }`,\n },\n })\n .then((response) => {\n // If we've signed out in the mean time, the request ID will have changed\n if (this.get('refresh-request-id') !== requestId) {\n this.logger.info('device: refresh request ID mismatch, ignoring response');\n\n return Promise.resolve();\n }\n\n return this.processRegistrationSuccess(response);\n })\n .catch((reason) => {\n // Handle a 404 error, which indicates that the device is no longer\n // valid and needs to be registered as a new device.\n if (reason.statusCode === 404) {\n this.logger.info('device: refresh failed, device is not valid');\n this.logger.info('device: attempting to register a new device');\n\n this.clear();\n\n return this.register(deviceRegistrationOptions);\n }\n\n return Promise.reject(reason);\n });\n });\n },\n /**\n * Fetches the web devices and deletes the third of them which are not recent devices in use\n * @returns {Promise<void, Error>}\n */\n deleteDevices() {\n // Fetch devices with a GET request\n return this.request({\n method: 'GET',\n service: 'wdm',\n resource: 'devices',\n })\n .then((response) => {\n const {devices} = response.body;\n\n const {deviceType} = this._getBody();\n\n // Filter devices of type deviceType\n const webDevices = devices.filter((item) => item.deviceType === deviceType);\n\n const sortedDevices = orderBy(webDevices, [(item) => new Date(item.modificationTime)]);\n\n // If there are more than two devices, delete the last third\n if (sortedDevices.length > 2) {\n const totalItems = sortedDevices.length;\n const countToDelete = Math.ceil(totalItems / 3);\n const urlsToDelete = sortedDevices.slice(0, countToDelete).map((item) => item.url);\n\n return Promise.race(\n urlsToDelete.map((url) => {\n return this.request({\n uri: url,\n method: 'DELETE',\n });\n })\n );\n }\n\n return Promise.resolve();\n })\n .catch((error) => {\n this.logger.error('Failed to retrieve devices:', error);\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Registers and when fails deletes devices\n */\n @waitForValue('@')\n register(deviceRegistrationOptions = {}) {\n this.logger.info('device: registering');\n\n this.webex.internal.newMetrics.callDiagnosticMetrics.setDeviceInfo(this);\n\n // Validate that the device can be registered.\n return this.canRegister().then(() => {\n // Validate if the device is already registered and refresh instead.\n if (this.registered) {\n this.logger.info('device: device already registered, refreshing');\n\n return this.refresh(deviceRegistrationOptions);\n }\n\n return this._registerInternal(deviceRegistrationOptions).catch((error) => {\n if (error?.body?.message === 'User has excessive device registrations') {\n return this.deleteDevices().then(() => {\n return this._registerInternal(deviceRegistrationOptions);\n });\n }\n throw error;\n });\n });\n },\n\n _getBody() {\n return {\n ...(this.config.defaults.body ? this.config.defaults.body : {}),\n ...(this.config.body ? this.config.body : {}),\n };\n },\n\n /**\n * Register or refresh a device depending on the current device state. Device\n * registration utilizes the services plugin to send the request to the\n * **WDM** service.\n *\n * @param {Object} options - The options for registration.\n * @param {CatalogDetails} options.includeDetails - The details to include in the refresh/register request.\n * @returns {Promise<void, Error>}\n */\n @oneFlight\n @waitForValue('@')\n _registerInternal(deviceRegistrationOptions = {}) {\n this.logger.info('device: making registration request');\n\n // Merge body configurations, overriding defaults.\n const body = this._getBody();\n\n // Merge header configurations, overriding defaults.\n const headers = {\n ...(this.config.defaults.headers ? this.config.defaults.headers : {}),\n ...(this.config.headers ? this.config.headers : {}),\n };\n\n // Append a ttl value if the device is marked as ephemeral\n if (this.config.ephemeral) {\n body.ttl = this.config.ephemeralDeviceTTL;\n }\n this.webex.internal.newMetrics.submitInternalEvent({\n name: 'internal.register.device.request',\n });\n\n const {includeDetails = CatalogDetails.all} = deviceRegistrationOptions;\n\n const requestId = uuid.v4();\n this.set('register-request-id', requestId);\n\n // This will be replaced by a `create()` method.\n return this.request({\n method: 'POST',\n service: 'wdm',\n resource: 'devices',\n body,\n headers,\n qs: {\n includeUpstreamServices: `${includeDetails}${\n this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : ''\n }`,\n },\n })\n .catch((error) => {\n this.webex.internal.newMetrics.submitInternalEvent({\n name: 'internal.register.device.response',\n });\n\n throw error;\n })\n .then((response) => {\n // If we've signed out in the mean time, the request ID will have changed\n if (this.get('register-request-id') !== requestId) {\n this.logger.info('device: register request ID mismatch, ignoring response');\n\n return Promise.resolve();\n }\n\n // Do not add any processing of response above this as that will affect timestamp\n this.webex.internal.newMetrics.submitInternalEvent({\n name: 'internal.register.device.response',\n });\n\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_WDM_REGISTRATION_SUCCESSFUL);\n\n return this.processRegistrationSuccess(response);\n })\n .catch((error) => {\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_WDM_REGISTRATION_FAILED, {\n fields: {error},\n });\n throw error;\n });\n },\n /**\n * Unregister the current registered device if available. Unregistering a\n * device utilizes the services plugin to send the request to the **WDM**\n * service.\n *\n * @returns {Promise<void, Error>}\n */\n @oneFlight\n @waitForValue('@')\n unregister() {\n this.logger.info('device: unregistering');\n\n if (!this.registered) {\n this.logger.warn('device: not registered');\n\n return Promise.resolve();\n }\n\n return this.request({\n uri: this.url,\n method: 'DELETE',\n })\n .then(() => this.clear())\n .catch((reason) => {\n if (reason.statusCode === 404) {\n this.logger.info(\n 'device: 404 when deleting device, device is already deleted, clearing device'\n );\n\n this.clear();\n }\n throw reason;\n });\n },\n /* eslint-enable require-jsdoc */\n\n // Helper method members\n\n /**\n * Determine if registration methods can be performed. This method utilizes\n * the `services` plugin to confirm if the appropriate service urls are\n * available for device registration.\n *\n * @returns {Promise<void, Error>}\n */\n canRegister() {\n this.logger.info('device: validating if registration can occur');\n\n // Destructure the services plugin for ease of reference.\n const {services} = this.webex.internal;\n\n // Wait for the postauth catalog to populate.\n return services.waitForCatalog('postauth', this.config.canRegisterWaitDuration).then(() =>\n // Validate that the service exists after waiting for the catalog.\n services.get('wdm')\n ? Promise.resolve()\n : Promise.reject(\n new Error(\n [\n 'device: cannot register,',\n \"'wdm' service is not available from the postauth catalog\",\n ].join(' ')\n )\n )\n );\n },\n\n /**\n * Check if the device can currently reach the inactivity check url.\n *\n * @returns {Promise<void, Error>}\n */\n checkNetworkReachability() {\n this.logger.info('device: checking network reachability');\n\n // Validate if the device has been checked and reset the logout timer.\n if (this.isReachabilityChecked) {\n return Promise.resolve(this.resetLogoutTimer());\n }\n\n this.isReachabilityChecked = true;\n\n // Validate if the device has a intranet checking url.\n if (!this.intranetInactivityCheckUrl) {\n this.isInNetwork = false;\n\n return Promise.resolve(this.resetLogoutTimer());\n }\n\n // Clear unnecessary headers for reachability request.\n const headers = {\n 'cisco-no-http-redirect': null,\n 'spark-user-agent': null,\n trackingid: null,\n };\n\n // Send the network reachability request.\n return this.request({\n headers,\n method: 'GET',\n uri: this.intranetInactivityCheckUrl,\n })\n .then(() => {\n this.isInNetwork = true;\n\n return Promise.resolve(this.resetLogoutTimer());\n })\n .catch(() => {\n this.logger.info('device: did not reach ping endpoint');\n this.logger.info('device: triggering off-network timer');\n\n this.isInNetwork = false;\n\n return Promise.resolve(this.resetLogoutTimer());\n });\n },\n\n /**\n * Clears the registration ttl value if available.\n *\n * @param {Object} options - Values to be cleared.\n * @returns {void}\n */\n clear(...args) {\n this.logger.info('device: clearing registered device');\n\n // Prototype the extended class in order to preserve the parent member.\n Reflect.apply(WebexPlugin.prototype.clear, this, args);\n },\n\n /**\n * Get the current websocket url with the appropriate priority host.\n *\n * @param {boolean} [wait=false] - Willing to wait on a valid url.\n * @returns {Promise<string, Error>} - The priority-mapped web socket url.\n */\n getWebSocketUrl(wait = false) {\n this.logger.info('device: getting the current websocket url');\n\n // Destructure the services plugin for ease of reference.\n const {services} = this.webex.internal;\n\n // Validate if the method should wait for registration.\n if (wait) {\n return this.waitForRegistration()\n .then(() => services.convertUrlToPriorityHostUrl(this.webSocketUrl))\n .catch((error) => {\n this.logger.warn(error.message);\n\n return Promise.reject(new Error('device: failed to get the current websocket url'));\n });\n }\n\n // Validate if the device is registered.\n if (!this.registered) {\n return Promise.reject(\n new Error('device: cannot get websocket url, device is not registered')\n );\n }\n\n // Attempt to collect the priority-host-mapped web socket URL.\n const wsUrl = services.convertUrlToPriorityHostUrl(this.webSocketUrl);\n\n // Validate that the url was collected.\n if (wsUrl) {\n return Promise.resolve(wsUrl);\n }\n\n return Promise.reject(new Error('device: failed to get the current websocket url'));\n },\n\n /**\n * Process a successful device registration.\n *\n * @param {Object} response - response object from registration success.\n * @returns {void}\n */\n processRegistrationSuccess(response) {\n this.logger.info('device: received registration payload');\n\n // Clone the response body for service cleaning.\n const body = {...response.body};\n\n // Clean service data.\n delete body.services;\n delete body.serviceHostMap;\n\n const {etag} = response.headers || {};\n\n if (this.etag && etag && this.etag === etag) {\n // If current etag matches the previous one and we have sent\n // If-None-Match header the developer and entitlement feature\n // toggles will not be returned\n const {features} = body;\n\n delete body.features;\n // When using the etag feature cache, user and entitlement features are still returned\n this.features.user.reset(features.user);\n this.features.entitlement.reset(features.entitlement);\n }\n\n // Assign the recieved DTO from **WDM** to this device.\n this.set(body);\n\n // Assign the new etag to this device.\n this.set({etag});\n\n // Validate if device is ephemeral and setup refresh timer.\n if (this.config.ephemeral) {\n this.logger.info('device: enqueuing device refresh');\n\n const delay = (this.config.ephemeralDeviceTTL / 2 + 60) * 1000;\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), delay);\n }\n\n // Emit the registration:success event.\n this.trigger(DEVICE_EVENT_REGISTRATION_SUCCESS, this);\n },\n\n /**\n * Reset the current local logout timer for the registered device if\n * registered.\n *\n * @returns {void}\n */\n resetLogoutTimer() {\n this.logger.info('device: resetting logout timer');\n\n // Clear current logout timer.\n clearTimeout(this.logoutTimer);\n\n // Remove last activity date event listener.\n this.off('change:lastUserActivityDate');\n\n // Remove the logout timer.\n this.unset('logoutTimer');\n\n // Validate if the device is currently in a meeting and is configured to\n // required inactivity enforcement.\n if (\n !this.isInMeeting &&\n this.config.enableInactivityEnforcement &&\n this.isReachabilityChecked\n ) {\n if (this.isInNetwork) {\n this.setLogoutTimer(this.inNetworkInactivityDuration);\n } else {\n this.setLogoutTimer(this.intranetInactivityDuration);\n }\n }\n },\n\n /**\n * Set the value of the logout timer for the current registered device.\n *\n * @param {number} duration - Value in seconds of the new logout timer.\n * @returns {void}\n */\n setLogoutTimer(duration) {\n this.logger.info('device: setting logout timer');\n\n if (!duration || duration <= 0) {\n return;\n }\n\n // Setup user activity date event listener.\n this.on('change:lastUserActivityDate', () => {\n this.resetLogoutTimer();\n });\n\n // Initialize a new timer.\n this.logoutTimer = safeSetTimeout(() => {\n this.webex.logout();\n }, duration * 1000);\n },\n\n /**\n * Wait for the device to be registered.\n *\n * @param {number} [timeout=10] - The maximum duration to wait, in seconds.\n * @returns {Promise<void, Error>}\n */\n waitForRegistration(timeout = 10) {\n this.logger.info('device: waiting for registration');\n\n return new Promise((resolve, reject) => {\n if (this.registered) {\n resolve();\n }\n\n const timeoutTimer = safeSetTimeout(\n () => reject(new Error('device: timeout occured while waiting for registration')),\n timeout * 1000\n );\n\n this.once(DEVICE_EVENT_REGISTRATION_SUCCESS, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n\n // Deprecated methods.\n\n /**\n * Mark a url as failed and get the next priority host url.\n *\n * @param {string} url - The url to mark as failed.\n * @returns {Promise<string>} - The next priority url.\n */\n @deprecated('device#markUrlFailedAndGetNew(): Use services#markFailedUrl()')\n markUrlFailedAndGetNew(url) {\n return Promise.resolve(this.webex.internal.services.markFailedUrl(url));\n },\n\n // Ampersand method members\n\n /* eslint-disable require-jsdoc */\n /**\n * Initializer method for the device plugin.\n *\n * @override\n * @param {Array<any>} args - An array of items to be mapped as properties.\n * @returns {void}\n */\n @persist('@', decider)\n initialize(...args) {\n // Prototype the extended class in order to preserve the parent member.\n Reflect.apply(WebexPlugin.prototype.initialize, this, args);\n\n // Initialize feature events and listeners.\n FEATURE_COLLECTION_NAMES.forEach((collectionName) => {\n this.features.on(`change:${collectionName}`, (model, value, options) => {\n this.trigger('change', this, options);\n this.trigger('change:features', this, this.features, options);\n });\n });\n\n // Initialize network reachability checking event for url change.\n this.on('change:intranetInactivityCheckUrl', () => {\n this.checkNetworkReachability();\n });\n\n // Initialize network reachability checking event for duration change.\n this.on('change:intranetInactivityDuration', () => {\n this.checkNetworkReachability();\n });\n\n // Initialize network reachability checking event for duration change.\n this.on('change:inNetworkInactivityDuration', () => {\n this.checkNetworkReachability();\n });\n\n // Initialize listener for activity checking.\n this.listenTo(this.webex, 'user-activity', () => {\n this.lastUserActivityDate = Date.now();\n });\n\n // Initialize listener for meeting started event.\n this.listenTo(this.webex, 'meeting started', () => {\n this.isInMeeting = true;\n this.resetLogoutTimer();\n });\n\n // Initialize listener for meeting ended event.\n this.listenTo(this.webex, 'meeting ended', () => {\n this.isInMeeting = false;\n this.resetLogoutTimer();\n });\n },\n /* eslint-enable require-jsdoc */\n});\n\nexport default Device;\n"],"mappings":"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"}
|
|
@@ -225,7 +225,7 @@ var IpNetworkDetector = _webexCore.WebexPlugin.extend({
|
|
|
225
225
|
}, _callee2, null, [[6,, 12, 16]]);
|
|
226
226
|
}))();
|
|
227
227
|
},
|
|
228
|
-
version: "3.
|
|
228
|
+
version: "3.8.0-next.2"
|
|
229
229
|
});
|
|
230
230
|
var _default = exports.default = IpNetworkDetector;
|
|
231
231
|
//# sourceMappingURL=ipNetworkDetector.js.map
|
package/package.json
CHANGED
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
26
26
|
"@webex/jest-config-legacy": "0.0.0",
|
|
27
27
|
"@webex/legacy-tools": "0.0.0",
|
|
28
|
-
"@webex/test-helper-chai": "3.
|
|
29
|
-
"@webex/test-helper-mocha": "3.
|
|
30
|
-
"@webex/test-helper-mock-webex": "3.
|
|
31
|
-
"@webex/test-helper-test-users": "3.
|
|
28
|
+
"@webex/test-helper-chai": "3.8.0-next.2",
|
|
29
|
+
"@webex/test-helper-mocha": "3.8.0-next.2",
|
|
30
|
+
"@webex/test-helper-mock-webex": "3.8.0-next.2",
|
|
31
|
+
"@webex/test-helper-test-users": "3.8.0-next.2",
|
|
32
32
|
"chai": "^4.3.4",
|
|
33
33
|
"chai-as-promised": "^7.1.1",
|
|
34
34
|
"eslint": "^8.24.0",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"sinon": "^9.2.4"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@webex/common": "3.
|
|
40
|
-
"@webex/common-timers": "3.
|
|
41
|
-
"@webex/http-core": "3.
|
|
42
|
-
"@webex/internal-plugin-metrics": "3.
|
|
43
|
-
"@webex/webex-core": "3.
|
|
39
|
+
"@webex/common": "3.8.0-next.2",
|
|
40
|
+
"@webex/common-timers": "3.8.0-next.2",
|
|
41
|
+
"@webex/http-core": "3.8.0-next.2",
|
|
42
|
+
"@webex/internal-plugin-metrics": "3.8.0-next.2",
|
|
43
|
+
"@webex/webex-core": "3.8.0-next.2",
|
|
44
44
|
"ampersand-collection": "^2.0.2",
|
|
45
45
|
"ampersand-state": "^5.0.3",
|
|
46
46
|
"lodash": "^4.17.21"
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"test:style": "eslint ./src/**/*.*",
|
|
55
55
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
56
56
|
},
|
|
57
|
-
"version": "3.
|
|
57
|
+
"version": "3.8.0-next.2"
|
|
58
58
|
}
|
package/src/device.js
CHANGED
|
@@ -3,6 +3,7 @@ import {deprecated, oneFlight} from '@webex/common';
|
|
|
3
3
|
import {persist, waitForValue, WebexPlugin} from '@webex/webex-core';
|
|
4
4
|
import {safeSetTimeout} from '@webex/common-timers';
|
|
5
5
|
import {orderBy} from 'lodash';
|
|
6
|
+
import uuid from 'uuid';
|
|
6
7
|
|
|
7
8
|
import METRICS from './metrics';
|
|
8
9
|
import {FEATURE_COLLECTION_NAMES, DEVICE_EVENT_REGISTRATION_SUCCESS} from './constants';
|
|
@@ -412,6 +413,9 @@ const Device = WebexPlugin.extend({
|
|
|
412
413
|
|
|
413
414
|
const {includeDetails = CatalogDetails.all} = deviceRegistrationOptions;
|
|
414
415
|
|
|
416
|
+
const requestId = uuid.v4();
|
|
417
|
+
this.set('refresh-request-id', requestId);
|
|
418
|
+
|
|
415
419
|
return this.request({
|
|
416
420
|
method: 'PUT',
|
|
417
421
|
uri: this.url,
|
|
@@ -423,7 +427,16 @@ const Device = WebexPlugin.extend({
|
|
|
423
427
|
}`,
|
|
424
428
|
},
|
|
425
429
|
})
|
|
426
|
-
.then((response) =>
|
|
430
|
+
.then((response) => {
|
|
431
|
+
// If we've signed out in the mean time, the request ID will have changed
|
|
432
|
+
if (this.get('refresh-request-id') !== requestId) {
|
|
433
|
+
this.logger.info('device: refresh request ID mismatch, ignoring response');
|
|
434
|
+
|
|
435
|
+
return Promise.resolve();
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
return this.processRegistrationSuccess(response);
|
|
439
|
+
})
|
|
427
440
|
.catch((reason) => {
|
|
428
441
|
// Handle a 404 error, which indicates that the device is no longer
|
|
429
442
|
// valid and needs to be registered as a new device.
|
|
@@ -489,16 +502,29 @@ const Device = WebexPlugin.extend({
|
|
|
489
502
|
/**
|
|
490
503
|
* Registers and when fails deletes devices
|
|
491
504
|
*/
|
|
492
|
-
@oneFlight
|
|
493
505
|
@waitForValue('@')
|
|
494
506
|
register(deviceRegistrationOptions = {}) {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
507
|
+
this.logger.info('device: registering');
|
|
508
|
+
|
|
509
|
+
this.webex.internal.newMetrics.callDiagnosticMetrics.setDeviceInfo(this);
|
|
510
|
+
|
|
511
|
+
// Validate that the device can be registered.
|
|
512
|
+
return this.canRegister().then(() => {
|
|
513
|
+
// Validate if the device is already registered and refresh instead.
|
|
514
|
+
if (this.registered) {
|
|
515
|
+
this.logger.info('device: device already registered, refreshing');
|
|
516
|
+
|
|
517
|
+
return this.refresh(deviceRegistrationOptions);
|
|
500
518
|
}
|
|
501
|
-
|
|
519
|
+
|
|
520
|
+
return this._registerInternal(deviceRegistrationOptions).catch((error) => {
|
|
521
|
+
if (error?.body?.message === 'User has excessive device registrations') {
|
|
522
|
+
return this.deleteDevices().then(() => {
|
|
523
|
+
return this._registerInternal(deviceRegistrationOptions);
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
throw error;
|
|
527
|
+
});
|
|
502
528
|
});
|
|
503
529
|
},
|
|
504
530
|
|
|
@@ -521,77 +547,73 @@ const Device = WebexPlugin.extend({
|
|
|
521
547
|
@oneFlight
|
|
522
548
|
@waitForValue('@')
|
|
523
549
|
_registerInternal(deviceRegistrationOptions = {}) {
|
|
524
|
-
this.logger.info('device:
|
|
550
|
+
this.logger.info('device: making registration request');
|
|
525
551
|
|
|
526
|
-
|
|
552
|
+
// Merge body configurations, overriding defaults.
|
|
553
|
+
const body = this._getBody();
|
|
527
554
|
|
|
528
|
-
//
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
555
|
+
// Merge header configurations, overriding defaults.
|
|
556
|
+
const headers = {
|
|
557
|
+
...(this.config.defaults.headers ? this.config.defaults.headers : {}),
|
|
558
|
+
...(this.config.headers ? this.config.headers : {}),
|
|
559
|
+
};
|
|
533
560
|
|
|
534
|
-
|
|
535
|
-
|
|
561
|
+
// Append a ttl value if the device is marked as ephemeral
|
|
562
|
+
if (this.config.ephemeral) {
|
|
563
|
+
body.ttl = this.config.ephemeralDeviceTTL;
|
|
564
|
+
}
|
|
565
|
+
this.webex.internal.newMetrics.submitInternalEvent({
|
|
566
|
+
name: 'internal.register.device.request',
|
|
567
|
+
});
|
|
536
568
|
|
|
537
|
-
|
|
538
|
-
const body = this._getBody();
|
|
569
|
+
const {includeDetails = CatalogDetails.all} = deviceRegistrationOptions;
|
|
539
570
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
...(this.config.defaults.headers ? this.config.defaults.headers : {}),
|
|
543
|
-
...(this.config.headers ? this.config.headers : {}),
|
|
544
|
-
};
|
|
571
|
+
const requestId = uuid.v4();
|
|
572
|
+
this.set('register-request-id', requestId);
|
|
545
573
|
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
574
|
+
// This will be replaced by a `create()` method.
|
|
575
|
+
return this.request({
|
|
576
|
+
method: 'POST',
|
|
577
|
+
service: 'wdm',
|
|
578
|
+
resource: 'devices',
|
|
579
|
+
body,
|
|
580
|
+
headers,
|
|
581
|
+
qs: {
|
|
582
|
+
includeUpstreamServices: `${includeDetails}${
|
|
583
|
+
this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : ''
|
|
584
|
+
}`,
|
|
585
|
+
},
|
|
586
|
+
})
|
|
587
|
+
.catch((error) => {
|
|
588
|
+
this.webex.internal.newMetrics.submitInternalEvent({
|
|
589
|
+
name: 'internal.register.device.response',
|
|
590
|
+
});
|
|
555
591
|
|
|
556
|
-
|
|
557
|
-
return this.request({
|
|
558
|
-
method: 'POST',
|
|
559
|
-
service: 'wdm',
|
|
560
|
-
resource: 'devices',
|
|
561
|
-
body,
|
|
562
|
-
headers,
|
|
563
|
-
qs: {
|
|
564
|
-
includeUpstreamServices: `${includeDetails}${
|
|
565
|
-
this.config.energyForecast && this.energyForecastConfig ? ',energyforecast' : ''
|
|
566
|
-
}`,
|
|
567
|
-
},
|
|
592
|
+
throw error;
|
|
568
593
|
})
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
594
|
+
.then((response) => {
|
|
595
|
+
// If we've signed out in the mean time, the request ID will have changed
|
|
596
|
+
if (this.get('register-request-id') !== requestId) {
|
|
597
|
+
this.logger.info('device: register request ID mismatch, ignoring response');
|
|
573
598
|
|
|
574
|
-
|
|
575
|
-
}
|
|
576
|
-
.then((response) => {
|
|
577
|
-
// Do not add any processing of response above this as that will affect timestamp
|
|
578
|
-
this.webex.internal.newMetrics.submitInternalEvent({
|
|
579
|
-
name: 'internal.register.device.response',
|
|
580
|
-
});
|
|
599
|
+
return Promise.resolve();
|
|
600
|
+
}
|
|
581
601
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
602
|
+
// Do not add any processing of response above this as that will affect timestamp
|
|
603
|
+
this.webex.internal.newMetrics.submitInternalEvent({
|
|
604
|
+
name: 'internal.register.device.response',
|
|
605
|
+
});
|
|
585
606
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
.
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
607
|
+
this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_WDM_REGISTRATION_SUCCESSFUL);
|
|
608
|
+
|
|
609
|
+
return this.processRegistrationSuccess(response);
|
|
610
|
+
})
|
|
611
|
+
.catch((error) => {
|
|
612
|
+
this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_WDM_REGISTRATION_FAILED, {
|
|
613
|
+
fields: {error},
|
|
593
614
|
});
|
|
594
|
-
|
|
615
|
+
throw error;
|
|
616
|
+
});
|
|
595
617
|
},
|
|
596
618
|
/**
|
|
597
619
|
* Unregister the current registered device if available. Unregistering a
|
|
@@ -614,7 +636,18 @@ const Device = WebexPlugin.extend({
|
|
|
614
636
|
return this.request({
|
|
615
637
|
uri: this.url,
|
|
616
638
|
method: 'DELETE',
|
|
617
|
-
})
|
|
639
|
+
})
|
|
640
|
+
.then(() => this.clear())
|
|
641
|
+
.catch((reason) => {
|
|
642
|
+
if (reason.statusCode === 404) {
|
|
643
|
+
this.logger.info(
|
|
644
|
+
'device: 404 when deleting device, device is already deleted, clearing device'
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
this.clear();
|
|
648
|
+
}
|
|
649
|
+
throw reason;
|
|
650
|
+
});
|
|
618
651
|
},
|
|
619
652
|
/* eslint-enable require-jsdoc */
|
|
620
653
|
|
package/test/unit/spec/device.js
CHANGED
|
@@ -7,6 +7,13 @@ import {CatalogDetails} from '@webex/internal-plugin-device';
|
|
|
7
7
|
|
|
8
8
|
import dto from './wdm-dto';
|
|
9
9
|
|
|
10
|
+
const waitForAsync = () =>
|
|
11
|
+
new Promise((resolve) =>
|
|
12
|
+
setImmediate(() => {
|
|
13
|
+
return resolve();
|
|
14
|
+
})
|
|
15
|
+
);
|
|
16
|
+
|
|
10
17
|
describe('plugin-device', () => {
|
|
11
18
|
describe('Device', () => {
|
|
12
19
|
let webex;
|
|
@@ -355,6 +362,69 @@ describe('plugin-device', () => {
|
|
|
355
362
|
|
|
356
363
|
assert.calledWith(registerSpy, {includeDetails: CatalogDetails.websocket});
|
|
357
364
|
});
|
|
365
|
+
|
|
366
|
+
it('does not process refresh if log out between start and end of request', async () => {
|
|
367
|
+
setup();
|
|
368
|
+
|
|
369
|
+
let resolve;
|
|
370
|
+
|
|
371
|
+
const requestFn = () => {
|
|
372
|
+
return new Promise((r) => {
|
|
373
|
+
resolve = r;
|
|
374
|
+
});
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
device.request.restore();
|
|
378
|
+
|
|
379
|
+
sinon.stub(device, 'request').callsFake(requestFn);
|
|
380
|
+
|
|
381
|
+
const resultPromise = device.refresh();
|
|
382
|
+
|
|
383
|
+
await waitForAsync();
|
|
384
|
+
|
|
385
|
+
device.clear();
|
|
386
|
+
|
|
387
|
+
resolve({
|
|
388
|
+
body: {
|
|
389
|
+
exampleKey: 'example response value',
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
await resultPromise;
|
|
394
|
+
|
|
395
|
+
assert.notCalled(device.processRegistrationSuccess);
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
it('processes refresh if refresh id does not change', async () => {
|
|
399
|
+
setup();
|
|
400
|
+
|
|
401
|
+
let resolve;
|
|
402
|
+
|
|
403
|
+
const requestFn = () => {
|
|
404
|
+
return new Promise((r) => {
|
|
405
|
+
resolve = r;
|
|
406
|
+
});
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
device.request.restore();
|
|
410
|
+
|
|
411
|
+
sinon.stub(device, 'request').callsFake(requestFn);
|
|
412
|
+
|
|
413
|
+
const resultPromise = device.refresh();
|
|
414
|
+
|
|
415
|
+
await waitForAsync();
|
|
416
|
+
|
|
417
|
+
resolve({
|
|
418
|
+
body: {
|
|
419
|
+
exampleKey: 'example response value',
|
|
420
|
+
},
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
await resultPromise;
|
|
424
|
+
|
|
425
|
+
assert.calledOnce(device.processRegistrationSuccess);
|
|
426
|
+
});
|
|
427
|
+
|
|
358
428
|
});
|
|
359
429
|
|
|
360
430
|
describe('deleteDevices()', () => {
|
|
@@ -419,6 +489,48 @@ describe('plugin-device', () => {
|
|
|
419
489
|
});
|
|
420
490
|
});
|
|
421
491
|
|
|
492
|
+
describe('#unregister()', () => {
|
|
493
|
+
it('resolves immediately if the device is not registered', async () => {
|
|
494
|
+
const requestSpy = sinon.spy(device, 'request');
|
|
495
|
+
|
|
496
|
+
device.set('registered', false);
|
|
497
|
+
|
|
498
|
+
await device.unregister();
|
|
499
|
+
|
|
500
|
+
assert.notCalled(requestSpy);
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
it('clears the device in the event of 404', async () => {
|
|
504
|
+
sinon.stub(device, 'request').rejects({statusCode: 404});
|
|
505
|
+
|
|
506
|
+
const clearSpy = sinon.spy(device, 'clear');
|
|
507
|
+
|
|
508
|
+
await assert.isRejected(device.unregister());
|
|
509
|
+
|
|
510
|
+
assert.calledWith(device.request, {
|
|
511
|
+
uri: 'https://locus-a.wbx2.com/locus/api/v1/devices/88888888-4444-4444-4444-CCCCCCCCCCCC',
|
|
512
|
+
method: 'DELETE',
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
assert.calledOnce(clearSpy);
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
it('does not clear the device in the event of non 404 failure', async () => {
|
|
519
|
+
sinon.stub(device, 'request').rejects(new Error('some error'));
|
|
520
|
+
|
|
521
|
+
const clearSpy = sinon.spy(device, 'clear');
|
|
522
|
+
|
|
523
|
+
await assert.isRejected(device.unregister());
|
|
524
|
+
|
|
525
|
+
assert.calledWith(device.request, {
|
|
526
|
+
uri: 'https://locus-a.wbx2.com/locus/api/v1/devices/88888888-4444-4444-4444-CCCCCCCCCCCC',
|
|
527
|
+
method: 'DELETE',
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
assert.notCalled(clearSpy);
|
|
531
|
+
});
|
|
532
|
+
});
|
|
533
|
+
|
|
422
534
|
describe('#register()', () => {
|
|
423
535
|
const setup = (config = {}) => {
|
|
424
536
|
webex.internal.metrics.submitClientMetrics = sinon.stub();
|
|
@@ -450,6 +562,7 @@ describe('plugin-device', () => {
|
|
|
450
562
|
|
|
451
563
|
it('calls delete devices when errors with User has excessive device registrations', async () => {
|
|
452
564
|
setup();
|
|
565
|
+
sinon.stub(device, 'canRegister').callsFake(() => Promise.resolve());
|
|
453
566
|
const deleteDeviceSpy = sinon.stub(device, 'deleteDevices').callsFake(() => Promise.resolve());
|
|
454
567
|
const registerStub = sinon.stub(device, '_registerInternal');
|
|
455
568
|
|
|
@@ -468,6 +581,7 @@ describe('plugin-device', () => {
|
|
|
468
581
|
it('does not call delete devices when some other error', async () => {
|
|
469
582
|
setup();
|
|
470
583
|
|
|
584
|
+
sinon.stub(device, 'canRegister').callsFake(() => Promise.resolve());
|
|
471
585
|
const deleteDeviceSpy = sinon.stub(device, 'deleteDevices').callsFake(() => Promise.resolve());
|
|
472
586
|
const registerStub = sinon.stub(device, '_registerInternal').rejects(new Error('some error'));
|
|
473
587
|
|
|
@@ -496,6 +610,67 @@ describe('plugin-device', () => {
|
|
|
496
610
|
});
|
|
497
611
|
});
|
|
498
612
|
|
|
613
|
+
it('does not process registration if log out between start and end of request', async () => {
|
|
614
|
+
setup();
|
|
615
|
+
sinon.stub(device, 'canRegister').callsFake(() => Promise.resolve());
|
|
616
|
+
|
|
617
|
+
let resolve;
|
|
618
|
+
|
|
619
|
+
const requestFn = () => {
|
|
620
|
+
return new Promise((r) => {
|
|
621
|
+
resolve = r;
|
|
622
|
+
});
|
|
623
|
+
};
|
|
624
|
+
|
|
625
|
+
sinon.stub(device, 'request').callsFake(requestFn);
|
|
626
|
+
|
|
627
|
+
const resultPromise = device.register();
|
|
628
|
+
|
|
629
|
+
await waitForAsync();
|
|
630
|
+
|
|
631
|
+
device.clear();
|
|
632
|
+
|
|
633
|
+
resolve({
|
|
634
|
+
body: {
|
|
635
|
+
exampleKey: 'example response value',
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
await resultPromise;
|
|
640
|
+
|
|
641
|
+
assert.notCalled(device.processRegistrationSuccess);
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
it('calls process registration if request id matches', async () => {
|
|
645
|
+
setup();
|
|
646
|
+
sinon.stub(device, 'canRegister').callsFake(() => Promise.resolve());
|
|
647
|
+
|
|
648
|
+
let resolve;
|
|
649
|
+
|
|
650
|
+
const requestFn = () => {
|
|
651
|
+
return new Promise((r) => {
|
|
652
|
+
resolve = r;
|
|
653
|
+
});
|
|
654
|
+
};
|
|
655
|
+
|
|
656
|
+
sinon.stub(device, 'request').callsFake(requestFn);
|
|
657
|
+
|
|
658
|
+
const resultPromise = device.register();
|
|
659
|
+
|
|
660
|
+
await waitForAsync();
|
|
661
|
+
|
|
662
|
+
resolve({
|
|
663
|
+
body: {
|
|
664
|
+
exampleKey: 'example response value',
|
|
665
|
+
},
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
await resultPromise;
|
|
669
|
+
|
|
670
|
+
assert.calledOnce(device.processRegistrationSuccess);
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
|
|
499
674
|
it('checks that submitInternalEvent gets called with internal.register.device.response on success', async () => {
|
|
500
675
|
setup();
|
|
501
676
|
sinon.stub(device, 'canRegister').callsFake(() => Promise.resolve());
|
|
@@ -644,6 +819,23 @@ describe('plugin-device', () => {
|
|
|
644
819
|
|
|
645
820
|
assert.calledWith(refreshSpy, {includeDetails: CatalogDetails.websocket});
|
|
646
821
|
});
|
|
822
|
+
|
|
823
|
+
it('works when request returns 404 when already registered', async () => {
|
|
824
|
+
setup();
|
|
825
|
+
|
|
826
|
+
sinon.stub(device, 'canRegister').callsFake(() => Promise.resolve());
|
|
827
|
+
|
|
828
|
+
const requestStub = sinon.stub(device, 'request');
|
|
829
|
+
|
|
830
|
+
requestStub.onFirstCall().rejects({statusCode: 404});
|
|
831
|
+
requestStub.onSecondCall().resolves({some: 'data'});
|
|
832
|
+
|
|
833
|
+
device.set('registered', true);
|
|
834
|
+
|
|
835
|
+
await device.register();
|
|
836
|
+
|
|
837
|
+
assert.calledWith(device.processRegistrationSuccess, {some: 'data'});
|
|
838
|
+
});
|
|
647
839
|
});
|
|
648
840
|
|
|
649
841
|
describe('#processRegistrationSuccess()', () => {
|