@webex/webex-core 1.143.2 → 1.144.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/config.js CHANGED
@@ -58,6 +58,11 @@ var _default = {
58
58
  */
59
59
  validateDomains: true,
60
60
 
61
+ /**
62
+ * services that don't need auth validation
63
+ */
64
+ servicesNotNeedValidation: ['webex-appapi-service'],
65
+
61
66
  /**
62
67
  * Contains a list of allowed domain host addresses.
63
68
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["config.js"],"names":["maxAppLevelRedirects","maxLocusRedirects","maxAuthenticationReplays","maxReconnectAttempts","onBeforeLogout","trackingIdPrefix","trackingIdSuffix","AlternateLogger","undefined","credentials","CredentialsConfig","services","discovery","hydra","process","env","HYDRA_SERVICE_URL","u2c","U2C_SERVICE_URL","validateDomains","allowedDomains","device","preDiscoveryServices","hydraServiceUrl","whitelistedServiceDomains","payloadTransformer","predicates","transforms","storage","boundedAdapter","MemoryStoreAdapter","unboundedAdapter"],"mappings":";;;;;;;;;;;;AAMA;;AACA;;AAPA;AACA;AACA;;AAEA;eAMe;AACbA,EAAAA,oBAAoB,EAAE,EADT;AAEbC,EAAAA,iBAAiB,EAAE,CAFN;AAGbC,EAAAA,wBAAwB,EAAE,CAHb;AAIbC,EAAAA,oBAAoB,EAAE,CAJT;AAKbC,EAAAA,cAAc,EAAE,EALH;AAMbC,EAAAA,gBAAgB,EAAE,cANL;AAObC,EAAAA,gBAAgB,EAAE,EAPL;AAQbC,EAAAA,eAAe,EAAEC,SARJ;AASbC,EAAAA,WAAW,EAAE,IAAIC,0BAAJ,EATA;AAUbC,EAAAA,QAAQ,EAAE;AACR;AACJ;AACA;AACA;AACA;AACIC,IAAAA,SAAS,EAAE;AACT;AACN;AACA;AACA;AACA;AACMC,MAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,iBAAZ,IAAiC,+BAN/B;;AAQT;AACN;AACA;AACA;AACA;AACMC,MAAAA,GAAG,EAAEH,OAAO,CAACC,GAAR,CAAYG,eAAZ,IAA+B;AAb3B,KANH;;AAsBR;AACJ;AACA;AACA;AACA;AACIC,IAAAA,eAAe,EAAE,IA3BT;;AA6BR;AACJ;AACA;AACA;AACA;AACIC,IAAAA,cAAc,EAAE,CACd,UADc,EAEd,gBAFc,EAGd,WAHc,EAId,eAJc;AAlCR,GAVG;AAmDbC,EAAAA,MAAM,EAAE;AACNC,IAAAA,oBAAoB,EAAE;AACpBT,MAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,iBAAZ,IAAiC,+BADpB;AAEpBO,MAAAA,eAAe,EAAET,OAAO,CAACC,GAAR,CAAYC,iBAAZ,IAAiC;AAF9B,KADhB;AAKNG,IAAAA,eAAe,EAAE,IALX;AAMN;AACAK,IAAAA,yBAAyB,EAAE,CACzB,UADyB,EAEzB,gBAFyB,EAGzB,WAHyB;AAPrB,GAnDK;AAgEbC,EAAAA,kBAAkB,EAAE;AAClBC,IAAAA,UAAU,EAAE,EADM;AAElBC,IAAAA,UAAU,EAAE;AAFM,GAhEP;AAoEbC,EAAAA,OAAO,EAAE;AACPC,IAAAA,cAAc,EAAEC,2BADT;AAEPC,IAAAA,gBAAgB,EAAED;AAFX;AApEI,C","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {MemoryStoreAdapter} from './lib/storage';\nimport CredentialsConfig from './credentials-config';\n\n\nexport default {\n maxAppLevelRedirects: 10,\n maxLocusRedirects: 5,\n maxAuthenticationReplays: 1,\n maxReconnectAttempts: 1,\n onBeforeLogout: [],\n trackingIdPrefix: 'webex-js-sdk',\n trackingIdSuffix: '',\n AlternateLogger: undefined,\n credentials: new CredentialsConfig(),\n services: {\n /**\n * A list of services that are available prior to catalog collection.\n *\n * @type {Object}\n */\n discovery: {\n /**\n * The hydra discovery url.\n *\n * @type {string}\n */\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n\n /**\n * The u2c discovery url\n *\n * @type {string}\n */\n u2c: process.env.U2C_SERVICE_URL || 'https://u2c.wbx2.com/u2c/api/v1'\n },\n\n /**\n * When true, considers all urls in `allowedDomains` as safe for auth tokens\n *\n * @type {boolean}\n */\n validateDomains: true,\n\n /**\n * Contains a list of allowed domain host addresses.\n *\n * @type {Array<string>}\n */\n allowedDomains: [\n 'wbx2.com',\n 'ciscospark.com',\n 'webex.com',\n 'webexapis.com'\n ]\n },\n device: {\n preDiscoveryServices: {\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n hydraServiceUrl: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1'\n },\n validateDomains: true,\n // It is okay to pass the auth token to the following domains:\n whitelistedServiceDomains: [\n 'wbx2.com',\n 'ciscospark.com',\n 'webex.com'\n ]\n },\n payloadTransformer: {\n predicates: [],\n transforms: []\n },\n storage: {\n boundedAdapter: MemoryStoreAdapter,\n unboundedAdapter: MemoryStoreAdapter\n }\n};\n"]}
1
+ {"version":3,"sources":["config.js"],"names":["maxAppLevelRedirects","maxLocusRedirects","maxAuthenticationReplays","maxReconnectAttempts","onBeforeLogout","trackingIdPrefix","trackingIdSuffix","AlternateLogger","undefined","credentials","CredentialsConfig","services","discovery","hydra","process","env","HYDRA_SERVICE_URL","u2c","U2C_SERVICE_URL","validateDomains","servicesNotNeedValidation","allowedDomains","device","preDiscoveryServices","hydraServiceUrl","whitelistedServiceDomains","payloadTransformer","predicates","transforms","storage","boundedAdapter","MemoryStoreAdapter","unboundedAdapter"],"mappings":";;;;;;;;;;;;AAMA;;AACA;;AAPA;AACA;AACA;;AAEA;eAMe;AACbA,EAAAA,oBAAoB,EAAE,EADT;AAEbC,EAAAA,iBAAiB,EAAE,CAFN;AAGbC,EAAAA,wBAAwB,EAAE,CAHb;AAIbC,EAAAA,oBAAoB,EAAE,CAJT;AAKbC,EAAAA,cAAc,EAAE,EALH;AAMbC,EAAAA,gBAAgB,EAAE,cANL;AAObC,EAAAA,gBAAgB,EAAE,EAPL;AAQbC,EAAAA,eAAe,EAAEC,SARJ;AASbC,EAAAA,WAAW,EAAE,IAAIC,0BAAJ,EATA;AAUbC,EAAAA,QAAQ,EAAE;AACR;AACJ;AACA;AACA;AACA;AACIC,IAAAA,SAAS,EAAE;AACT;AACN;AACA;AACA;AACA;AACMC,MAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,iBAAZ,IAAiC,+BAN/B;;AAQT;AACN;AACA;AACA;AACA;AACMC,MAAAA,GAAG,EAAEH,OAAO,CAACC,GAAR,CAAYG,eAAZ,IAA+B;AAb3B,KANH;;AAsBR;AACJ;AACA;AACA;AACA;AACIC,IAAAA,eAAe,EAAE,IA3BT;;AA6BR;AACJ;AACA;AAEIC,IAAAA,yBAAyB,EAAE,CACzB,sBADyB,CAjCnB;;AAqCR;AACJ;AACA;AACA;AACA;AACIC,IAAAA,cAAc,EAAE,CACd,UADc,EAEd,gBAFc,EAGd,WAHc,EAId,eAJc;AA1CR,GAVG;AA2DbC,EAAAA,MAAM,EAAE;AACNC,IAAAA,oBAAoB,EAAE;AACpBV,MAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,iBAAZ,IAAiC,+BADpB;AAEpBQ,MAAAA,eAAe,EAAEV,OAAO,CAACC,GAAR,CAAYC,iBAAZ,IAAiC;AAF9B,KADhB;AAKNG,IAAAA,eAAe,EAAE,IALX;AAMN;AACAM,IAAAA,yBAAyB,EAAE,CACzB,UADyB,EAEzB,gBAFyB,EAGzB,WAHyB;AAPrB,GA3DK;AAwEbC,EAAAA,kBAAkB,EAAE;AAClBC,IAAAA,UAAU,EAAE,EADM;AAElBC,IAAAA,UAAU,EAAE;AAFM,GAxEP;AA4EbC,EAAAA,OAAO,EAAE;AACPC,IAAAA,cAAc,EAAEC,2BADT;AAEPC,IAAAA,gBAAgB,EAAED;AAFX;AA5EI,C","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {MemoryStoreAdapter} from './lib/storage';\nimport CredentialsConfig from './credentials-config';\n\n\nexport default {\n maxAppLevelRedirects: 10,\n maxLocusRedirects: 5,\n maxAuthenticationReplays: 1,\n maxReconnectAttempts: 1,\n onBeforeLogout: [],\n trackingIdPrefix: 'webex-js-sdk',\n trackingIdSuffix: '',\n AlternateLogger: undefined,\n credentials: new CredentialsConfig(),\n services: {\n /**\n * A list of services that are available prior to catalog collection.\n *\n * @type {Object}\n */\n discovery: {\n /**\n * The hydra discovery url.\n *\n * @type {string}\n */\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n\n /**\n * The u2c discovery url\n *\n * @type {string}\n */\n u2c: process.env.U2C_SERVICE_URL || 'https://u2c.wbx2.com/u2c/api/v1'\n },\n\n /**\n * When true, considers all urls in `allowedDomains` as safe for auth tokens\n *\n * @type {boolean}\n */\n validateDomains: true,\n\n /**\n * services that don't need auth validation\n */\n\n servicesNotNeedValidation: [\n 'webex-appapi-service'\n ],\n\n /**\n * Contains a list of allowed domain host addresses.\n *\n * @type {Array<string>}\n */\n allowedDomains: [\n 'wbx2.com',\n 'ciscospark.com',\n 'webex.com',\n 'webexapis.com'\n ]\n },\n device: {\n preDiscoveryServices: {\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n hydraServiceUrl: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1'\n },\n validateDomains: true,\n // It is okay to pass the auth token to the following domains:\n whitelistedServiceDomains: [\n 'wbx2.com',\n 'ciscospark.com',\n 'webex.com'\n ]\n },\n payloadTransformer: {\n predicates: [],\n transforms: []\n },\n storage: {\n boundedAdapter: MemoryStoreAdapter,\n unboundedAdapter: MemoryStoreAdapter\n }\n};\n"]}
@@ -329,7 +329,7 @@ var Batcher = _webexPlugin.default.extend({
329
329
  fingerprintResponse: function fingerprintResponse(item) {
330
330
  throw new Error('fingerprintResponse() must be implemented');
331
331
  },
332
- version: "1.143.2"
332
+ version: "1.144.2"
333
333
  });
334
334
 
335
335
  var _default2 = Batcher;
@@ -590,7 +590,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
590
590
  this.refresh();
591
591
  }
592
592
  },
593
- version: "1.143.2"
593
+ version: "1.144.2"
594
594
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "getUserToken", [_dec, _dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "getUserToken"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "invalidate", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "invalidate"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec5, _dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj)), _obj)));
595
595
 
596
596
  var _default = Credentials;
@@ -605,7 +605,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
605
605
  return res.body;
606
606
  });
607
607
  },
608
- version: "1.143.2"
608
+ version: "1.144.2"
609
609
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "downscope", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "downscope"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "revoke", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "revoke"), _obj)), _obj)));
610
610
 
611
611
  var _default = Token;
@@ -22,10 +22,10 @@ exports.default = void 0;
22
22
 
23
23
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
24
24
 
25
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
26
-
27
25
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
28
26
 
27
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
28
+
29
29
  var _weakMap = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/weak-map"));
30
30
 
31
31
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
@@ -83,6 +83,7 @@ var Services = _webexPlugin.default.extend({
83
83
  validateDomains: ['boolean', false, true]
84
84
  },
85
85
  _catalogs: new _weakMap.default(),
86
+ _serviceUrls: null,
86
87
 
87
88
  /**
88
89
  * Get the registry associated with this webex instance.
@@ -183,6 +184,15 @@ var Services = _webexPlugin.default.extend({
183
184
  return catalog.markFailedUrl(url, noPriorityHosts);
184
185
  },
185
186
 
187
+ /**
188
+ * saves all the services from the pre and post catalog service
189
+ * @param {Object} serviceUrls
190
+ * @returns {void}
191
+ */
192
+ _updateServiceUrls: function _updateServiceUrls(serviceUrls) {
193
+ this._serviceUrls = _objectSpread(_objectSpread({}, this._serviceUrls), serviceUrls);
194
+ },
195
+
186
196
  /**
187
197
  * Update a list of `serviceUrls` to the most current
188
198
  * catalog via the defined `discoveryUrl` then returns the current
@@ -636,15 +646,24 @@ var Services = _webexPlugin.default.extend({
636
646
  _ref8$timeout = _ref8.timeout,
637
647
  timeout = _ref8$timeout === void 0 ? 5 : _ref8$timeout,
638
648
  url = _ref8.url;
649
+ var services = this.webex.config.services; // Save memory by grabbing the catalog after there isn't a priortyURL
650
+
651
+ var catalog = this._getCatalog();
652
+
653
+ var fetchFromServiceUrl = services.servicesNotNeedValidation.find(function (service) {
654
+ return service === name;
655
+ });
656
+
657
+ if (fetchFromServiceUrl) {
658
+ return _promise.default.resolve(this._serviceUrls[name]);
659
+ }
660
+
639
661
  var priorityUrl = this.get(name, true);
640
662
  var priorityUrlObj = this.getServiceFromUrl(url);
641
663
 
642
664
  if (priorityUrl || priorityUrlObj) {
643
665
  return _promise.default.resolve(priorityUrl || priorityUrlObj.priorityUrl);
644
- } // Save memory by grabbing the catalog after there isn't a priortyURL
645
-
646
-
647
- var catalog = this._getCatalog();
666
+ }
648
667
 
649
668
  if (catalog.isReady) {
650
669
  return url ? _promise.default.resolve(url) : _promise.default.reject(new Error("services: service '".concat(name, "' was not found in any of the catalogs")));
@@ -736,7 +755,10 @@ var Services = _webexPlugin.default.extend({
736
755
  hosts: []
737
756
  });
738
757
  }
739
- });
758
+ }); // update all the service urls in the host catalog
759
+
760
+ this._updateServiceUrls(serviceHostmap.serviceLinks);
761
+
740
762
  return formattedHostmap;
741
763
  },
742
764
 
@@ -1014,7 +1036,7 @@ var Services = _webexPlugin.default.extend({
1014
1036
  }
1015
1037
  });
1016
1038
  },
1017
- version: "1.143.2"
1039
+ version: "1.144.2"
1018
1040
  });
1019
1041
  /* eslint-enable no-underscore-dangle */
1020
1042
 
@@ -1 +1 @@
1
- {"version":3,"sources":["services.js"],"names":["trailingSlashes","Services","WebexPlugin","extend","namespace","registries","states","props","validateDomains","_catalogs","getRegistry","get","webex","getState","_getCatalog","name","priorityHost","serviceGroup","catalog","hasService","serviceName","hasAllowedDomains","getAllowedDomains","length","list","markFailedUrl","url","noPriorityHosts","updateServices","from","query","token","forceRefresh","formattedQuery","status","collecting","waitForCatalog","queryKey","includes","reject","Error","email","emailhash","toLowerCase","toString","_fetchNewServiceHostmap","then","serviceHostMap","updateServiceUrls","updateCredentialsConfig","catch","error","validateUser","reqId","activationOptions","preloginUserId","logger","info","canAuthorize","credentials","getUserToken","sendUserActivation","userObj","activated","exists","details","user","config","client_id","client_secret","collectPreauthCatalog","idbrokerService","getClientToken","uri","scope","tokenObj","collectSigninCatalog","rto","all","response","statusCode","responseText","body","message","fetchClientRegionInfo","request","addAuthHeader","headers","res","err","countryCode","timezone","clientRegionInfo","service","resource","method","accept","authorization","timeZone","shouldRefreshAccessToken","mode","idbroker","identity","authorizationString","authorizeUrl","replace","setConfig","timeout","supertoken","access_token","postauth","ready","preauth","initServiceCatalogs","waitForService","priorityUrl","priorityUrlObj","getServiceFromUrl","resolve","isReady","groupsToCheck","checkCatalog","catalogGroup","scopedPriorityUrl","scopedPrioriryUrlObj","undefined","map","group","_formatReceivedHostmap","serviceHostmap","formattedHostmap","hostCatalog","reduce","accumulator","key","id","split","defaultUrl","serviceLinks","serviceItem","find","item","defaultHost","Url","parse","hostname","hosts","push","host","ttl","priority","homeCluster","forEach","getClusterId","findClusterId","getServiceFromClusterId","params","findServiceFromClusterId","findServiceUrlFromUrl","isServiceUrl","isAllowedDomainUrl","findAllowedDomain","convertUrlToPriorityHostUrl","data","qs","format","timestamp","Date","getTime","requestObject","initConfig","services","discovery","formattedDiscoveryServices","override","formattedOverrideServices","allowedDomains","setAllowedDomains","getOrgId","orgId","warn","initialize","ServiceCatalog","registry","ServiceRegistry","state","ServiceState","set","listenToOnce"],"mappings":"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","sourcesContent":["import Url from 'url';\n\nimport sha256 from 'crypto-js/sha256';\n\nimport WebexPlugin from '../webex-plugin';\n\nimport ServiceCatalog from './service-catalog';\nimport ServiceRegistry from './service-registry';\nimport ServiceState from './service-state';\n\n\nconst trailingSlashes = /(?:^\\/)|(?:\\/$)/;\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst Services = WebexPlugin.extend({\n namespace: 'Services',\n\n /**\n * The {@link WeakMap} of {@link ServiceRegistry} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceRegistry>}\n * @private\n * @memberof Services\n */\n registries: new WeakMap(),\n\n /**\n * The {@link WeakMap} of {@link ServiceState} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceState>}\n * @private\n * @memberof Services\n */\n states: new WeakMap(),\n\n props: {\n validateDomains: ['boolean', false, true]\n },\n\n _catalogs: new WeakMap(),\n\n /**\n * Get the registry associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceRegistry} - The associated {@link ServiceRegistry}.\n */\n getRegistry() {\n return this.registries.get(this.webex);\n },\n\n /**\n * Get the state associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceState} - The associated {@link ServiceState}.\n */\n getState() {\n return this.states.get(this.webex);\n },\n\n /**\n * @private\n * Get the current catalog based on the assocaited\n * webex instance.\n * @returns {ServiceCatalog}\n */\n _getCatalog() {\n return this._catalogs.get(this.webex);\n },\n\n /**\n * Get a service url from the current services list by name\n * from the associated instance catalog.\n * @param {string} name\n * @param {boolean} [priorityHost]\n * @param {string} [serviceGroup]\n * @returns {string|undefined}\n */\n get(name, priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.get(name, priorityHost, serviceGroup);\n },\n\n /**\n * Determine if the catalog contains a specific service\n *\n * @param {string} serviceName - The service name to validate.\n * @returns {boolean} - True if the service exists.\n */\n hasService(serviceName) {\n return !!(this.get(serviceName));\n },\n\n /**\n * Determine if a whilelist exists in the service catalog.\n *\n * @returns {boolean} - True if a allowed domains list exists.\n */\n hasAllowedDomains() {\n const catalog = this._getCatalog();\n\n return (catalog.getAllowedDomains().length > 0);\n },\n\n /**\n * Generate a service catalog as an object from\n * the associated instance catalog.\n * @param {boolean} [priorityHost] - use highest priority host if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.list(priorityHost, serviceGroup);\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceUrl` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceUrls` host array,\n * or the `ServiceUrls` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @param {boolean} noPriorityHosts\n * @returns {string}\n */\n markFailedUrl(url, noPriorityHosts) {\n const catalog = this._getCatalog();\n\n return catalog.markFailedUrl(url, noPriorityHosts);\n },\n\n /**\n * Update a list of `serviceUrls` to the most current\n * catalog via the defined `discoveryUrl` then returns the current\n * list of services.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n updateServices({\n from, query, token, forceRefresh\n } = {}) {\n const catalog = this._getCatalog();\n let formattedQuery, serviceGroup;\n\n // map catalog name to service group name.\n switch (from) {\n case 'limited': serviceGroup = 'preauth'; break;\n case 'signin': serviceGroup = 'signin'; break;\n default: serviceGroup = 'postauth'; break;\n }\n\n // confirm catalog update for group is not in progress.\n if (catalog.status[serviceGroup].collecting) {\n return this.waitForCatalog(serviceGroup);\n }\n\n catalog.status[serviceGroup].collecting = true;\n\n if (serviceGroup === 'preauth') {\n const queryKey = query && Object.keys(query)[0];\n\n if (!['email', 'emailhash', 'userId', 'orgId', 'mode'].includes(queryKey)) {\n return Promise.reject(new Error('a query param of email, emailhash, userId, orgId, or mode is required'));\n }\n }\n // encode email when query key is email\n if (serviceGroup === 'preauth' || serviceGroup === 'signin') {\n const queryKey = Object.keys(query)[0];\n\n formattedQuery = {};\n\n if (queryKey === 'email' && query.email) {\n formattedQuery.emailhash = sha256(query.email.toLowerCase()).toString();\n }\n else {\n formattedQuery[queryKey] = query[queryKey];\n }\n }\n\n return this._fetchNewServiceHostmap({\n from,\n token,\n query: formattedQuery,\n forceRefresh\n })\n .then((serviceHostMap) => {\n catalog.updateServiceUrls(serviceGroup, serviceHostMap);\n this.updateCredentialsConfig();\n catalog.status[serviceGroup].collecting = false;\n })\n .catch((error) => {\n catalog.status[serviceGroup].collecting = false;\n\n return Promise.reject(error);\n });\n },\n\n /**\n * User validation parameter transfer object for {@link validateUser}.\n * @param {object} ValidateUserPTO\n * @property {string} ValidateUserPTO.email - The email of the user.\n * @property {string} [ValidateUserPTO.reqId] - The activation requester.\n * @property {object} [ValidateUserPTO.activationOptions] - Extra options to pass when sending the activation\n * @property {object} [ValidateUserPTO.preloginUserId] - The prelogin user id to set when sending the activation.\n */\n\n /**\n * User validation return transfer object for {@link validateUser}.\n * @param {object} ValidateUserRTO\n * @property {boolean} ValidateUserRTO.activated - If the user is activated.\n * @property {boolean} ValidateUserRTO.exists - If the user exists.\n * @property {string} ValidateUserRTO.details - A descriptive status message.\n * @property {object} ValidateUserRTO.user - **License** service user object.\n */\n\n /**\n * Validate if a user is activated and update the service catalogs as needed\n * based on the user's activation status.\n *\n * @param {ValidateUserPTO} - The parameter transfer object.\n * @returns {ValidateUserRTO} - The return transfer object.\n */\n validateUser({\n email,\n reqId = 'WEBCLIENT',\n forceRefresh = false,\n activationOptions = {},\n preloginUserId\n }) {\n this.logger.info('services: validating a user');\n\n // Validate that an email parameter key was provided.\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n\n // Destructure the credentials object.\n const {canAuthorize} = this.webex.credentials;\n\n // Validate that the user is already authorized.\n if (canAuthorize) {\n return this.updateServices({forceRefresh})\n .then(() => this.webex.credentials.getUserToken())\n .then((token) => this.sendUserActivation({\n email,\n reqId,\n token: token.toString(),\n activationOptions,\n preloginUserId\n }))\n .then((userObj) => ({\n activated: true,\n exists: true,\n details: 'user is authorized via a user token',\n user: userObj\n }));\n }\n\n // Destructure the client authorization details.\n /* eslint-disable camelcase */\n const {client_id, client_secret} = this.webex.credentials.config;\n\n // Validate that client authentication details exist.\n if (!client_id || !client_secret) {\n return Promise.reject(new Error(\n 'client authentication details are not available'\n ));\n }\n /* eslint-enable camelcase */\n\n // Declare a class-memeber-scoped token for usage within the promise chain.\n let token;\n\n // Begin client authentication user validation.\n return this.collectPreauthCatalog({email})\n .then(() => {\n // Retrieve the service url from the updated catalog. This is required\n // since `WebexCore` is usually not fully initialized at the time this\n // request completes.\n const idbrokerService = this.get('idbroker', true);\n\n // Collect the client auth token.\n return this.webex.credentials.getClientToken({\n uri: `${idbrokerService}idb/oauth2/v1/access_token`,\n scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM'\n });\n })\n .then((tokenObj) => {\n // Generate the token string.\n token = tokenObj.toString();\n\n // Collect the signin catalog using the client auth information.\n return this.collectSigninCatalog({email, token, forceRefresh});\n })\n // Validate if collecting the signin catalog failed and populate the RTO\n // with the appropriate content.\n .catch((error) => ({\n exists: (error.name !== 'NotFound'),\n activated: false,\n details: (error.name !== 'NotFound') ?\n 'user exists but is not activated' :\n 'user does not exist and is not activated'\n }))\n // Validate if the previous promise resolved with an RTO and populate the\n // new RTO accordingly.\n .then((rto) => Promise.all([\n rto || {\n activated: true,\n exists: true,\n details: 'user exists and is activated'\n },\n this.sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n })\n ]))\n .then(([rto, user]) => ({...rto, user}))\n .catch((error) => {\n const response = {\n statusCode: error.statusCode,\n responseText: error.body && error.body.message,\n body: error.body\n };\n\n return Promise.reject(response);\n });\n },\n\n /**\n * Fetches client region info such as countryCode and timezone.\n *\n * @returns {object} - The region info object.\n */\n fetchClientRegionInfo() {\n return this.request({\n uri: 'https://ds.ciscospark.com/v1/region',\n addAuthHeader: false,\n headers: {\n 'spark-user-agent': null\n }\n }).then((res) => {\n this.logger.info('services: received user region info');\n\n return res.body;\n }).catch((err) => {\n this.logger.info('services: was not able to get user region info', err);\n // resolve successfully even if request failed\n });\n },\n\n /**\n * User activation parameter transfer object for {@link sendUserActivation}.\n * @typedef {object} SendUserActivationPTO\n * @property {string} SendUserActivationPTO.email - The email of the user.\n * @property {string} SendUserActivationPTO.reqId - The activation requester.\n * @property {string} SendUserActivationPTO.token - The client auth token.\n * @property {object} SendUserActivationPTO.activationOptions - Extra options to pass when sending the activation.\n * @property {object} SendUserActivationPTO.preloginUserId - The prelogin user id to set when sending the activation.\n */\n\n /**\n * Send a request to activate a user using a client token.\n *\n * @param {SendUserActivationPTO} - The Parameter transfer object.\n * @returns {LicenseDTO} - The DTO returned from the **License** service.\n */\n sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n }) {\n this.logger.info('services: sending user activation request');\n let countryCode, timezone;\n\n\n // try to fetch client region info first\n return this.fetchClientRegionInfo()\n .then((clientRegionInfo) => {\n if (clientRegionInfo) {\n ({countryCode, timezone} = clientRegionInfo);\n }\n\n // Send the user activation request to the **License** service.\n return this.request({\n service: 'license',\n resource: 'users/activations',\n method: 'POST',\n headers: {\n accept: 'application/json',\n authorization: token,\n 'x-prelogin-userid': preloginUserId\n },\n body: {\n email,\n reqId,\n countryCode,\n timeZone: timezone,\n ...activationOptions\n },\n shouldRefreshAccessToken: false\n });\n })\n // On success, return the **License** user object.\n .then(({body}) => body)\n // On failure, reject with error from **License**.\n .catch((error) => Promise.reject(error));\n },\n\n /**\n * simplified method to update the preauth catalog via email\n *\n * @param {object} query\n * @param {string} query.email - A standard format email.\n * @param {string} query.orgId - The user's OrgId.\n * @param {boolean} forceRefresh - Boolean to bypass u2c cache control header\n * @returns {Promise<void>}\n */\n collectPreauthCatalog(query, forceRefresh = false) {\n if (!query) {\n return this.updateServices({from: 'limited', query: {mode: 'DEFAULT_BY_PROXIMITY'}, forceRefresh});\n }\n\n return this.updateServices({from: 'limited', query, forceRefresh});\n },\n\n /**\n * simplified method to update the signin catalog via email and token\n * @param {object} param\n * @param {string} param.email - must be a standard-format email\n * @param {string} param.token - must be a client token\n * @returns {Promise<void>}\n */\n collectSigninCatalog({email, token, forceRefresh} = {}) {\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n if (!token) {\n return Promise.reject(new Error('`token` is required'));\n }\n\n return this.updateServices({\n from: 'signin', query: {email}, token, forceRefresh\n });\n },\n\n /**\n * Updates credentials config to utilize u2c catalog\n * urls.\n * @returns {void}\n */\n updateCredentialsConfig() {\n const {idbroker, identity} = this.list(true);\n\n if (idbroker && identity) {\n const {authorizationString, authorizeUrl} = this.webex.config.credentials;\n\n // This must be set outside of the setConfig method used to assign the\n // idbroker and identity url values.\n this.webex.config.credentials.authorizeUrl = authorizationString ?\n authorizeUrl :\n `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;\n\n\n this.webex.setConfig({\n credentials: {\n idbroker: {\n url: idbroker.replace(trailingSlashes, '') // remove trailing slash\n },\n identity: {\n url: identity.replace(trailingSlashes, '') // remove trailing slash\n }\n }\n });\n }\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject afte ra timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n const catalog = this._getCatalog();\n const {supertoken} = this.webex.credentials;\n\n if (\n serviceGroup === 'postauth' &&\n supertoken &&\n supertoken.access_token &&\n !catalog.status.postauth.collecting &&\n !catalog.status.postauth.ready\n ) {\n if (!catalog.status.preauth.ready) {\n return this.initServiceCatalogs();\n }\n\n return this.updateServices();\n }\n\n return catalog.waitForCatalog(serviceGroup, timeout);\n },\n\n /**\n * Service waiting parameter transfer object for {@link waitForService}.\n *\n * @typedef {object} WaitForServicePTO\n * @property {string} [WaitForServicePTO.name] - The service name.\n * @property {string} [WaitForServicePTO.url] - The service url.\n * @property {string} [WaitForServicePTO.timeout] - wait duration in seconds.\n */\n\n /**\n * Wait until the service has been ammended to any service catalog. This\n * method prioritizes the service name over the service url when searching.\n *\n * @param {WaitForServicePTO} - The parameter transfer object.\n * @returns {Promise<string>} - Resolves to the priority host of a service.\n */\n waitForService({name, timeout = 5, url}) {\n const priorityUrl = this.get(name, true);\n const priorityUrlObj = this.getServiceFromUrl(url);\n\n if (priorityUrl || priorityUrlObj) {\n return Promise.resolve(priorityUrl || priorityUrlObj.priorityUrl);\n }\n\n // Save memory by grabbing the catalog after there isn't a priortyURL\n const catalog = this._getCatalog();\n\n if (catalog.isReady) {\n return url ?\n Promise.resolve(url) :\n Promise.reject(new Error(\n `services: service '${name}' was not found in any of the catalogs`\n ));\n }\n\n return new Promise((resolve, reject) => {\n const groupsToCheck = ['preauth', 'signin', 'postauth'];\n const checkCatalog = (catalogGroup) =>\n catalog.waitForCatalog(catalogGroup, timeout)\n .then(() => {\n const scopedPriorityUrl = this.get(name, true);\n const scopedPrioriryUrlObj = this.getServiceFromUrl(url);\n\n if (scopedPriorityUrl || scopedPrioriryUrlObj) {\n resolve(scopedPriorityUrl || scopedPrioriryUrlObj.priorityUrl);\n }\n })\n .catch(() => undefined);\n\n Promise.all(groupsToCheck.map((group) => checkCatalog(group)))\n .then(() => {\n reject(new Error(\n `services: service '${name}' was not found after waiting`\n ));\n });\n });\n },\n\n /**\n * @private\n * Organize a received hostmap from a service\n * catalog endpoint.\n * @param {object} serviceHostmap\n * @returns {object}\n */\n _formatReceivedHostmap(serviceHostmap) {\n // map the host catalog items to a formatted hostmap\n const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce(\n (accumulator, key) => {\n if (serviceHostmap.hostCatalog[key].length === 0) {\n return accumulator;\n }\n\n const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];\n const defaultUrl = serviceHostmap.serviceLinks[serviceName];\n\n let serviceItem = accumulator.find(\n (item) => item.name === serviceName\n );\n\n if (!serviceItem) {\n serviceItem = {\n name: serviceName,\n defaultUrl,\n defaultHost: Url.parse(defaultUrl).hostname,\n hosts: []\n };\n\n accumulator.push(serviceItem);\n }\n\n serviceItem.hosts.push(\n // map the default key as a low priority default for cluster matching\n {\n host: key,\n ttl: -1,\n priority: 10,\n id: serviceHostmap.hostCatalog[key][0].id,\n homeCluster: serviceItem.defaultHost === key\n },\n // map the rest of the hosts in their proper locations\n ...serviceHostmap.hostCatalog[key].map(\n (host) => ({\n ...host,\n homeCluster: serviceItem.defaultHost === key\n })\n )\n );\n\n return accumulator;\n }, []\n );\n\n // append service links that do not exist in the host catalog\n Object.keys(serviceHostmap.serviceLinks).forEach((key) => {\n const service = formattedHostmap.find((item) => item.name === key);\n\n if (!service) {\n formattedHostmap.push({\n name: key,\n defaultUrl: serviceHostmap.serviceLinks[key],\n defaultHost: Url.parse(serviceHostmap.serviceLinks[key]).hostname,\n hosts: []\n });\n }\n });\n\n return formattedHostmap;\n },\n\n /**\n * Get the clusterId associated with a URL string.\n * @param {string} url\n * @returns {string} - Cluster ID of url provided\n */\n getClusterId(url) {\n const catalog = this._getCatalog();\n\n return catalog.findClusterId(url);\n },\n\n /**\n * Get a service value from a provided clusterId. This method will\n * return an object containing both the name and url of a found service.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost] - returns priority host url if true\n * @param {string} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n getServiceFromClusterId(params) {\n const catalog = this._getCatalog();\n\n return catalog.findServiceFromClusterId(params);\n },\n\n /**\n * Get a service object from a service url if the service url exists in the\n * catalog.\n *\n * @param {string} url - The url to be validated.\n * @returns {object} - Service object.\n * @returns {object.name} - The name of the service found.\n * @returns {object.priorityUrl} - The priority url of the found service.\n * @returns {object.defaultUrl} - The default url of the found service.\n */\n getServiceFromUrl(url = '') {\n const service = this._getCatalog().findServiceUrlFromUrl(url);\n\n if (!service) {\n return undefined;\n }\n\n return {\n name: service.name,\n priorityUrl: service.get(true),\n defaultUrl: service.get()\n };\n },\n\n /**\n * Verify that a provided url exists in the service\n * catalog.\n * @param {string} url\n * @returns {boolean} - true if exists, false otherwise\n */\n isServiceUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findServiceUrlFromUrl(url));\n },\n\n /**\n * Determine if a provided url is in the catalog's allowed domains.\n *\n * @param {string} url - The url to match allowed domains against.\n * @returns {boolean} - True if the url provided is allowed.\n */\n isAllowedDomainUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findAllowedDomain(url));\n },\n\n /**\n * Converts the host portion of the url from default host\n * to a priority host\n *\n * @param {string} url a service url that contains a default host\n * @returns {string} a service url that contains the top priority host.\n * @throws if url isn't a service url\n */\n convertUrlToPriorityHostUrl(url = '') {\n const data = this.getServiceFromUrl(url);\n\n if (!data) {\n throw Error(`No service associated with url: [${url}]`);\n }\n\n return url.replace(data.defaultUrl, data.priorityUrl);\n },\n\n /**\n * @private\n * Simplified method wrapper for sending a request to get\n * an updated service hostmap.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n _fetchNewServiceHostmap({\n from, query, token, forceRefresh\n } = {}) {\n const service = 'u2c';\n const resource = from ? `/${from}/catalog` : '/catalog';\n const qs = {...query, format: 'hostmap'};\n\n if (forceRefresh) {\n qs.timestamp = new Date().getTime();\n }\n\n const requestObject = {\n method: 'GET', service, resource, qs\n };\n\n if (token) {\n requestObject.headers = {authorization: token};\n }\n\n return this.request(requestObject)\n .then(({body}) => this._formatReceivedHostmap(body));\n },\n\n /**\n * Initialize the discovery services and the whitelisted services.\n *\n * @returns {void}\n */\n initConfig() {\n // Get the catalog and destructure the services config.\n const catalog = this._getCatalog();\n const {services} = this.webex.config;\n\n // Validate that the services configuration exists.\n if (services) {\n // Check for discovery services.\n if (services.discovery) {\n // Format the discovery configuration into an injectable array.\n const formattedDiscoveryServices = Object.keys(services.discovery)\n .map((key) => ({\n name: key,\n defaultUrl: services.discovery[key]\n }));\n\n // Inject formatted discovery services into services catalog.\n catalog.updateServiceUrls('discovery', formattedDiscoveryServices);\n }\n\n if (services.override) {\n // Format the override configuration into an injectable array.\n const formattedOverrideServices = Object.keys(services.override)\n .map((key) => ({\n name: key,\n defaultUrl: services.override[key]\n }));\n\n // Inject formatted override services into services catalog.\n catalog.updateServiceUrls('override', formattedOverrideServices);\n }\n\n // Check for allowed host domains.\n if (services.allowedDomains) {\n // Store the allowed domains as a property of the catalog.\n catalog.setAllowedDomains(services.allowedDomains);\n }\n\n // Set `validateDomains` property to match configuration\n this.validateDomains = services.validateDomains;\n }\n },\n\n /**\n * Make the initial requests to collect the root catalogs.\n *\n * @returns {Promise<void, Error>} - Errors if the token is unavailable.\n */\n initServiceCatalogs() {\n this.logger.info('services: initializing initial service catalogs');\n\n // Destructure the credentials plugin.\n const {credentials} = this.webex;\n\n // Init a promise chain. Must be done as a Promise.resolve() to allow\n // credentials#getOrgId() to properly throw.\n return Promise.resolve()\n // Get the user's OrgId.\n .then(() => credentials.getOrgId())\n // Begin collecting the preauth/limited catalog.\n .then((orgId) => this.collectPreauthCatalog({orgId}))\n .then(() => {\n // Validate if the token is authorized.\n if (credentials.canAuthorize) {\n // Attempt to collect the postauth catalog.\n return this.updateServices()\n .catch(() => this.logger.warn(\n 'services: cannot retrieve postauth catalog'\n ));\n }\n\n // Return a resolved promise for consistent return value.\n return Promise.resolve();\n });\n },\n\n /**\n * Initializer\n *\n * @instance\n * @memberof Services\n * @returns {Services}\n */\n initialize() {\n const catalog = new ServiceCatalog();\n const registry = new ServiceRegistry();\n const state = new ServiceState();\n\n this._catalogs.set(this.webex, catalog);\n this.registries.set(this.webex, registry);\n this.states.set(this.webex, state);\n\n // Listen for configuration changes once.\n this.listenToOnce(this.webex, 'change:config', () => {\n this.initConfig();\n });\n\n // wait for webex instance to be ready before attempting\n // to update the service catalogs\n this.listenToOnce(this.webex, 'ready', () => {\n const {supertoken} = this.webex.credentials;\n\n // Validate if the supertoken exists.\n if (supertoken && supertoken.access_token) {\n this.initServiceCatalogs()\n .then(() => {\n catalog.isReady = true;\n })\n .catch((error) => this.logger.error(\n `services: failed to init initial services, ${error.message}`\n ));\n }\n else {\n const {email} = this.webex.config;\n\n this.collectPreauthCatalog(email ? {email} : undefined);\n }\n });\n }\n});\n/* eslint-enable no-underscore-dangle */\n\nexport default Services;\n"]}
1
+ {"version":3,"sources":["services.js"],"names":["trailingSlashes","Services","WebexPlugin","extend","namespace","registries","states","props","validateDomains","_catalogs","_serviceUrls","getRegistry","get","webex","getState","_getCatalog","name","priorityHost","serviceGroup","catalog","hasService","serviceName","hasAllowedDomains","getAllowedDomains","length","list","markFailedUrl","url","noPriorityHosts","_updateServiceUrls","serviceUrls","updateServices","from","query","token","forceRefresh","formattedQuery","status","collecting","waitForCatalog","queryKey","includes","reject","Error","email","emailhash","toLowerCase","toString","_fetchNewServiceHostmap","then","serviceHostMap","updateServiceUrls","updateCredentialsConfig","catch","error","validateUser","reqId","activationOptions","preloginUserId","logger","info","canAuthorize","credentials","getUserToken","sendUserActivation","userObj","activated","exists","details","user","config","client_id","client_secret","collectPreauthCatalog","idbrokerService","getClientToken","uri","scope","tokenObj","collectSigninCatalog","rto","all","response","statusCode","responseText","body","message","fetchClientRegionInfo","request","addAuthHeader","headers","res","err","countryCode","timezone","clientRegionInfo","service","resource","method","accept","authorization","timeZone","shouldRefreshAccessToken","mode","idbroker","identity","authorizationString","authorizeUrl","replace","setConfig","timeout","supertoken","access_token","postauth","ready","preauth","initServiceCatalogs","waitForService","services","fetchFromServiceUrl","servicesNotNeedValidation","find","resolve","priorityUrl","priorityUrlObj","getServiceFromUrl","isReady","groupsToCheck","checkCatalog","catalogGroup","scopedPriorityUrl","scopedPrioriryUrlObj","undefined","map","group","_formatReceivedHostmap","serviceHostmap","formattedHostmap","hostCatalog","reduce","accumulator","key","id","split","defaultUrl","serviceLinks","serviceItem","item","defaultHost","Url","parse","hostname","hosts","push","host","ttl","priority","homeCluster","forEach","getClusterId","findClusterId","getServiceFromClusterId","params","findServiceFromClusterId","findServiceUrlFromUrl","isServiceUrl","isAllowedDomainUrl","findAllowedDomain","convertUrlToPriorityHostUrl","data","qs","format","timestamp","Date","getTime","requestObject","initConfig","discovery","formattedDiscoveryServices","override","formattedOverrideServices","allowedDomains","setAllowedDomains","getOrgId","orgId","warn","initialize","ServiceCatalog","registry","ServiceRegistry","state","ServiceState","set","listenToOnce"],"mappings":"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","sourcesContent":["import Url from 'url';\n\nimport sha256 from 'crypto-js/sha256';\n\nimport WebexPlugin from '../webex-plugin';\n\nimport ServiceCatalog from './service-catalog';\nimport ServiceRegistry from './service-registry';\nimport ServiceState from './service-state';\n\n\nconst trailingSlashes = /(?:^\\/)|(?:\\/$)/;\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst Services = WebexPlugin.extend({\n namespace: 'Services',\n\n /**\n * The {@link WeakMap} of {@link ServiceRegistry} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceRegistry>}\n * @private\n * @memberof Services\n */\n registries: new WeakMap(),\n\n /**\n * The {@link WeakMap} of {@link ServiceState} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceState>}\n * @private\n * @memberof Services\n */\n states: new WeakMap(),\n\n props: {\n validateDomains: ['boolean', false, true]\n },\n\n _catalogs: new WeakMap(),\n\n _serviceUrls: null,\n\n /**\n * Get the registry associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceRegistry} - The associated {@link ServiceRegistry}.\n */\n getRegistry() {\n return this.registries.get(this.webex);\n },\n\n /**\n * Get the state associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceState} - The associated {@link ServiceState}.\n */\n getState() {\n return this.states.get(this.webex);\n },\n\n /**\n * @private\n * Get the current catalog based on the assocaited\n * webex instance.\n * @returns {ServiceCatalog}\n */\n _getCatalog() {\n return this._catalogs.get(this.webex);\n },\n\n /**\n * Get a service url from the current services list by name\n * from the associated instance catalog.\n * @param {string} name\n * @param {boolean} [priorityHost]\n * @param {string} [serviceGroup]\n * @returns {string|undefined}\n */\n get(name, priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.get(name, priorityHost, serviceGroup);\n },\n\n /**\n * Determine if the catalog contains a specific service\n *\n * @param {string} serviceName - The service name to validate.\n * @returns {boolean} - True if the service exists.\n */\n hasService(serviceName) {\n return !!(this.get(serviceName));\n },\n\n /**\n * Determine if a whilelist exists in the service catalog.\n *\n * @returns {boolean} - True if a allowed domains list exists.\n */\n hasAllowedDomains() {\n const catalog = this._getCatalog();\n\n return (catalog.getAllowedDomains().length > 0);\n },\n\n /**\n * Generate a service catalog as an object from\n * the associated instance catalog.\n * @param {boolean} [priorityHost] - use highest priority host if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.list(priorityHost, serviceGroup);\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceUrl` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceUrls` host array,\n * or the `ServiceUrls` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @param {boolean} noPriorityHosts\n * @returns {string}\n */\n markFailedUrl(url, noPriorityHosts) {\n const catalog = this._getCatalog();\n\n return catalog.markFailedUrl(url, noPriorityHosts);\n },\n\n /**\n * saves all the services from the pre and post catalog service\n * @param {Object} serviceUrls\n * @returns {void}\n */\n _updateServiceUrls(serviceUrls) {\n this._serviceUrls = {...this._serviceUrls, ...serviceUrls};\n },\n\n\n /**\n * Update a list of `serviceUrls` to the most current\n * catalog via the defined `discoveryUrl` then returns the current\n * list of services.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n updateServices({\n from, query, token, forceRefresh\n } = {}) {\n const catalog = this._getCatalog();\n let formattedQuery, serviceGroup;\n\n // map catalog name to service group name.\n switch (from) {\n case 'limited': serviceGroup = 'preauth'; break;\n case 'signin': serviceGroup = 'signin'; break;\n default: serviceGroup = 'postauth'; break;\n }\n\n // confirm catalog update for group is not in progress.\n if (catalog.status[serviceGroup].collecting) {\n return this.waitForCatalog(serviceGroup);\n }\n\n catalog.status[serviceGroup].collecting = true;\n\n if (serviceGroup === 'preauth') {\n const queryKey = query && Object.keys(query)[0];\n\n if (!['email', 'emailhash', 'userId', 'orgId', 'mode'].includes(queryKey)) {\n return Promise.reject(new Error('a query param of email, emailhash, userId, orgId, or mode is required'));\n }\n }\n // encode email when query key is email\n if (serviceGroup === 'preauth' || serviceGroup === 'signin') {\n const queryKey = Object.keys(query)[0];\n\n formattedQuery = {};\n\n if (queryKey === 'email' && query.email) {\n formattedQuery.emailhash = sha256(query.email.toLowerCase()).toString();\n }\n else {\n formattedQuery[queryKey] = query[queryKey];\n }\n }\n\n return this._fetchNewServiceHostmap({\n from,\n token,\n query: formattedQuery,\n forceRefresh\n })\n .then((serviceHostMap) => {\n catalog.updateServiceUrls(serviceGroup, serviceHostMap);\n this.updateCredentialsConfig();\n catalog.status[serviceGroup].collecting = false;\n })\n .catch((error) => {\n catalog.status[serviceGroup].collecting = false;\n\n return Promise.reject(error);\n });\n },\n\n /**\n * User validation parameter transfer object for {@link validateUser}.\n * @param {object} ValidateUserPTO\n * @property {string} ValidateUserPTO.email - The email of the user.\n * @property {string} [ValidateUserPTO.reqId] - The activation requester.\n * @property {object} [ValidateUserPTO.activationOptions] - Extra options to pass when sending the activation\n * @property {object} [ValidateUserPTO.preloginUserId] - The prelogin user id to set when sending the activation.\n */\n\n /**\n * User validation return transfer object for {@link validateUser}.\n * @param {object} ValidateUserRTO\n * @property {boolean} ValidateUserRTO.activated - If the user is activated.\n * @property {boolean} ValidateUserRTO.exists - If the user exists.\n * @property {string} ValidateUserRTO.details - A descriptive status message.\n * @property {object} ValidateUserRTO.user - **License** service user object.\n */\n\n /**\n * Validate if a user is activated and update the service catalogs as needed\n * based on the user's activation status.\n *\n * @param {ValidateUserPTO} - The parameter transfer object.\n * @returns {ValidateUserRTO} - The return transfer object.\n */\n validateUser({\n email,\n reqId = 'WEBCLIENT',\n forceRefresh = false,\n activationOptions = {},\n preloginUserId\n }) {\n this.logger.info('services: validating a user');\n\n // Validate that an email parameter key was provided.\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n\n // Destructure the credentials object.\n const {canAuthorize} = this.webex.credentials;\n\n // Validate that the user is already authorized.\n if (canAuthorize) {\n return this.updateServices({forceRefresh})\n .then(() => this.webex.credentials.getUserToken())\n .then((token) => this.sendUserActivation({\n email,\n reqId,\n token: token.toString(),\n activationOptions,\n preloginUserId\n }))\n .then((userObj) => ({\n activated: true,\n exists: true,\n details: 'user is authorized via a user token',\n user: userObj\n }));\n }\n\n // Destructure the client authorization details.\n /* eslint-disable camelcase */\n const {client_id, client_secret} = this.webex.credentials.config;\n\n // Validate that client authentication details exist.\n if (!client_id || !client_secret) {\n return Promise.reject(new Error(\n 'client authentication details are not available'\n ));\n }\n /* eslint-enable camelcase */\n\n // Declare a class-memeber-scoped token for usage within the promise chain.\n let token;\n\n // Begin client authentication user validation.\n return this.collectPreauthCatalog({email})\n .then(() => {\n // Retrieve the service url from the updated catalog. This is required\n // since `WebexCore` is usually not fully initialized at the time this\n // request completes.\n const idbrokerService = this.get('idbroker', true);\n\n // Collect the client auth token.\n return this.webex.credentials.getClientToken({\n uri: `${idbrokerService}idb/oauth2/v1/access_token`,\n scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM'\n });\n })\n .then((tokenObj) => {\n // Generate the token string.\n token = tokenObj.toString();\n\n // Collect the signin catalog using the client auth information.\n return this.collectSigninCatalog({email, token, forceRefresh});\n })\n // Validate if collecting the signin catalog failed and populate the RTO\n // with the appropriate content.\n .catch((error) => ({\n exists: (error.name !== 'NotFound'),\n activated: false,\n details: (error.name !== 'NotFound') ?\n 'user exists but is not activated' :\n 'user does not exist and is not activated'\n }))\n // Validate if the previous promise resolved with an RTO and populate the\n // new RTO accordingly.\n .then((rto) => Promise.all([\n rto || {\n activated: true,\n exists: true,\n details: 'user exists and is activated'\n },\n this.sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n })\n ]))\n .then(([rto, user]) => ({...rto, user}))\n .catch((error) => {\n const response = {\n statusCode: error.statusCode,\n responseText: error.body && error.body.message,\n body: error.body\n };\n\n return Promise.reject(response);\n });\n },\n\n /**\n * Fetches client region info such as countryCode and timezone.\n *\n * @returns {object} - The region info object.\n */\n fetchClientRegionInfo() {\n return this.request({\n uri: 'https://ds.ciscospark.com/v1/region',\n addAuthHeader: false,\n headers: {\n 'spark-user-agent': null\n }\n }).then((res) => {\n this.logger.info('services: received user region info');\n\n return res.body;\n }).catch((err) => {\n this.logger.info('services: was not able to get user region info', err);\n // resolve successfully even if request failed\n });\n },\n\n /**\n * User activation parameter transfer object for {@link sendUserActivation}.\n * @typedef {object} SendUserActivationPTO\n * @property {string} SendUserActivationPTO.email - The email of the user.\n * @property {string} SendUserActivationPTO.reqId - The activation requester.\n * @property {string} SendUserActivationPTO.token - The client auth token.\n * @property {object} SendUserActivationPTO.activationOptions - Extra options to pass when sending the activation.\n * @property {object} SendUserActivationPTO.preloginUserId - The prelogin user id to set when sending the activation.\n */\n\n /**\n * Send a request to activate a user using a client token.\n *\n * @param {SendUserActivationPTO} - The Parameter transfer object.\n * @returns {LicenseDTO} - The DTO returned from the **License** service.\n */\n sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n }) {\n this.logger.info('services: sending user activation request');\n let countryCode, timezone;\n\n\n // try to fetch client region info first\n return this.fetchClientRegionInfo()\n .then((clientRegionInfo) => {\n if (clientRegionInfo) {\n ({countryCode, timezone} = clientRegionInfo);\n }\n\n // Send the user activation request to the **License** service.\n return this.request({\n service: 'license',\n resource: 'users/activations',\n method: 'POST',\n headers: {\n accept: 'application/json',\n authorization: token,\n 'x-prelogin-userid': preloginUserId\n },\n body: {\n email,\n reqId,\n countryCode,\n timeZone: timezone,\n ...activationOptions\n },\n shouldRefreshAccessToken: false\n });\n })\n // On success, return the **License** user object.\n .then(({body}) => body)\n // On failure, reject with error from **License**.\n .catch((error) => Promise.reject(error));\n },\n\n /**\n * simplified method to update the preauth catalog via email\n *\n * @param {object} query\n * @param {string} query.email - A standard format email.\n * @param {string} query.orgId - The user's OrgId.\n * @param {boolean} forceRefresh - Boolean to bypass u2c cache control header\n * @returns {Promise<void>}\n */\n collectPreauthCatalog(query, forceRefresh = false) {\n if (!query) {\n return this.updateServices({from: 'limited', query: {mode: 'DEFAULT_BY_PROXIMITY'}, forceRefresh});\n }\n\n return this.updateServices({from: 'limited', query, forceRefresh});\n },\n\n /**\n * simplified method to update the signin catalog via email and token\n * @param {object} param\n * @param {string} param.email - must be a standard-format email\n * @param {string} param.token - must be a client token\n * @returns {Promise<void>}\n */\n collectSigninCatalog({email, token, forceRefresh} = {}) {\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n if (!token) {\n return Promise.reject(new Error('`token` is required'));\n }\n\n return this.updateServices({\n from: 'signin', query: {email}, token, forceRefresh\n });\n },\n\n /**\n * Updates credentials config to utilize u2c catalog\n * urls.\n * @returns {void}\n */\n updateCredentialsConfig() {\n const {idbroker, identity} = this.list(true);\n\n if (idbroker && identity) {\n const {authorizationString, authorizeUrl} = this.webex.config.credentials;\n\n // This must be set outside of the setConfig method used to assign the\n // idbroker and identity url values.\n this.webex.config.credentials.authorizeUrl = authorizationString ?\n authorizeUrl :\n `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;\n\n\n this.webex.setConfig({\n credentials: {\n idbroker: {\n url: idbroker.replace(trailingSlashes, '') // remove trailing slash\n },\n identity: {\n url: identity.replace(trailingSlashes, '') // remove trailing slash\n }\n }\n });\n }\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject afte ra timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n const catalog = this._getCatalog();\n const {supertoken} = this.webex.credentials;\n\n if (\n serviceGroup === 'postauth' &&\n supertoken &&\n supertoken.access_token &&\n !catalog.status.postauth.collecting &&\n !catalog.status.postauth.ready\n ) {\n if (!catalog.status.preauth.ready) {\n return this.initServiceCatalogs();\n }\n\n return this.updateServices();\n }\n\n return catalog.waitForCatalog(serviceGroup, timeout);\n },\n\n /**\n * Service waiting parameter transfer object for {@link waitForService}.\n *\n * @typedef {object} WaitForServicePTO\n * @property {string} [WaitForServicePTO.name] - The service name.\n * @property {string} [WaitForServicePTO.url] - The service url.\n * @property {string} [WaitForServicePTO.timeout] - wait duration in seconds.\n */\n\n /**\n * Wait until the service has been ammended to any service catalog. This\n * method prioritizes the service name over the service url when searching.\n *\n * @param {WaitForServicePTO} - The parameter transfer object.\n * @returns {Promise<string>} - Resolves to the priority host of a service.\n */\n waitForService({name, timeout = 5, url}) {\n const {services} = this.webex.config;\n\n // Save memory by grabbing the catalog after there isn't a priortyURL\n const catalog = this._getCatalog();\n\n const fetchFromServiceUrl = services.servicesNotNeedValidation.find((service) => service === name);\n\n if (fetchFromServiceUrl) {\n return Promise.resolve(this._serviceUrls[name]);\n }\n\n const priorityUrl = this.get(name, true);\n const priorityUrlObj = this.getServiceFromUrl(url);\n\n if (priorityUrl || priorityUrlObj) {\n return Promise.resolve(priorityUrl || priorityUrlObj.priorityUrl);\n }\n\n if (catalog.isReady) {\n return url ?\n Promise.resolve(url) :\n Promise.reject(new Error(\n `services: service '${name}' was not found in any of the catalogs`\n ));\n }\n\n return new Promise((resolve, reject) => {\n const groupsToCheck = ['preauth', 'signin', 'postauth'];\n const checkCatalog = (catalogGroup) =>\n catalog.waitForCatalog(catalogGroup, timeout)\n .then(() => {\n const scopedPriorityUrl = this.get(name, true);\n const scopedPrioriryUrlObj = this.getServiceFromUrl(url);\n\n if (scopedPriorityUrl || scopedPrioriryUrlObj) {\n resolve(scopedPriorityUrl || scopedPrioriryUrlObj.priorityUrl);\n }\n })\n .catch(() => undefined);\n\n Promise.all(groupsToCheck.map((group) => checkCatalog(group)))\n .then(() => {\n reject(new Error(\n `services: service '${name}' was not found after waiting`\n ));\n });\n });\n },\n\n /**\n * @private\n * Organize a received hostmap from a service\n * catalog endpoint.\n * @param {object} serviceHostmap\n * @returns {object}\n */\n _formatReceivedHostmap(serviceHostmap) {\n // map the host catalog items to a formatted hostmap\n const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce(\n (accumulator, key) => {\n if (serviceHostmap.hostCatalog[key].length === 0) {\n return accumulator;\n }\n\n const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];\n const defaultUrl = serviceHostmap.serviceLinks[serviceName];\n\n let serviceItem = accumulator.find(\n (item) => item.name === serviceName\n );\n\n if (!serviceItem) {\n serviceItem = {\n name: serviceName,\n defaultUrl,\n defaultHost: Url.parse(defaultUrl).hostname,\n hosts: []\n };\n\n accumulator.push(serviceItem);\n }\n\n serviceItem.hosts.push(\n // map the default key as a low priority default for cluster matching\n {\n host: key,\n ttl: -1,\n priority: 10,\n id: serviceHostmap.hostCatalog[key][0].id,\n homeCluster: serviceItem.defaultHost === key\n },\n // map the rest of the hosts in their proper locations\n ...serviceHostmap.hostCatalog[key].map(\n (host) => ({\n ...host,\n homeCluster: serviceItem.defaultHost === key\n })\n )\n );\n\n return accumulator;\n }, []\n );\n\n // append service links that do not exist in the host catalog\n Object.keys(serviceHostmap.serviceLinks).forEach((key) => {\n const service = formattedHostmap.find((item) => item.name === key);\n\n if (!service) {\n formattedHostmap.push({\n name: key,\n defaultUrl: serviceHostmap.serviceLinks[key],\n defaultHost: Url.parse(serviceHostmap.serviceLinks[key]).hostname,\n hosts: []\n });\n }\n });\n\n // update all the service urls in the host catalog\n\n this._updateServiceUrls(serviceHostmap.serviceLinks);\n\n return formattedHostmap;\n },\n\n /**\n * Get the clusterId associated with a URL string.\n * @param {string} url\n * @returns {string} - Cluster ID of url provided\n */\n getClusterId(url) {\n const catalog = this._getCatalog();\n\n return catalog.findClusterId(url);\n },\n\n /**\n * Get a service value from a provided clusterId. This method will\n * return an object containing both the name and url of a found service.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost] - returns priority host url if true\n * @param {string} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n getServiceFromClusterId(params) {\n const catalog = this._getCatalog();\n\n return catalog.findServiceFromClusterId(params);\n },\n\n /**\n * Get a service object from a service url if the service url exists in the\n * catalog.\n *\n * @param {string} url - The url to be validated.\n * @returns {object} - Service object.\n * @returns {object.name} - The name of the service found.\n * @returns {object.priorityUrl} - The priority url of the found service.\n * @returns {object.defaultUrl} - The default url of the found service.\n */\n getServiceFromUrl(url = '') {\n const service = this._getCatalog().findServiceUrlFromUrl(url);\n\n if (!service) {\n return undefined;\n }\n\n return {\n name: service.name,\n priorityUrl: service.get(true),\n defaultUrl: service.get()\n };\n },\n\n /**\n * Verify that a provided url exists in the service\n * catalog.\n * @param {string} url\n * @returns {boolean} - true if exists, false otherwise\n */\n isServiceUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findServiceUrlFromUrl(url));\n },\n\n /**\n * Determine if a provided url is in the catalog's allowed domains.\n *\n * @param {string} url - The url to match allowed domains against.\n * @returns {boolean} - True if the url provided is allowed.\n */\n isAllowedDomainUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findAllowedDomain(url));\n },\n\n /**\n * Converts the host portion of the url from default host\n * to a priority host\n *\n * @param {string} url a service url that contains a default host\n * @returns {string} a service url that contains the top priority host.\n * @throws if url isn't a service url\n */\n convertUrlToPriorityHostUrl(url = '') {\n const data = this.getServiceFromUrl(url);\n\n if (!data) {\n throw Error(`No service associated with url: [${url}]`);\n }\n\n return url.replace(data.defaultUrl, data.priorityUrl);\n },\n\n /**\n * @private\n * Simplified method wrapper for sending a request to get\n * an updated service hostmap.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n _fetchNewServiceHostmap({\n from, query, token, forceRefresh\n } = {}) {\n const service = 'u2c';\n const resource = from ? `/${from}/catalog` : '/catalog';\n const qs = {...query, format: 'hostmap'};\n\n if (forceRefresh) {\n qs.timestamp = new Date().getTime();\n }\n\n const requestObject = {\n method: 'GET', service, resource, qs\n };\n\n if (token) {\n requestObject.headers = {authorization: token};\n }\n\n return this.request(requestObject)\n .then(({body}) => this._formatReceivedHostmap(body));\n },\n\n /**\n * Initialize the discovery services and the whitelisted services.\n *\n * @returns {void}\n */\n initConfig() {\n // Get the catalog and destructure the services config.\n const catalog = this._getCatalog();\n const {services} = this.webex.config;\n\n // Validate that the services configuration exists.\n if (services) {\n // Check for discovery services.\n if (services.discovery) {\n // Format the discovery configuration into an injectable array.\n const formattedDiscoveryServices = Object.keys(services.discovery)\n .map((key) => ({\n name: key,\n defaultUrl: services.discovery[key]\n }));\n\n // Inject formatted discovery services into services catalog.\n catalog.updateServiceUrls('discovery', formattedDiscoveryServices);\n }\n\n if (services.override) {\n // Format the override configuration into an injectable array.\n const formattedOverrideServices = Object.keys(services.override)\n .map((key) => ({\n name: key,\n defaultUrl: services.override[key]\n }));\n\n // Inject formatted override services into services catalog.\n catalog.updateServiceUrls('override', formattedOverrideServices);\n }\n\n // Check for allowed host domains.\n if (services.allowedDomains) {\n // Store the allowed domains as a property of the catalog.\n catalog.setAllowedDomains(services.allowedDomains);\n }\n\n // Set `validateDomains` property to match configuration\n this.validateDomains = services.validateDomains;\n }\n },\n\n /**\n * Make the initial requests to collect the root catalogs.\n *\n * @returns {Promise<void, Error>} - Errors if the token is unavailable.\n */\n initServiceCatalogs() {\n this.logger.info('services: initializing initial service catalogs');\n\n // Destructure the credentials plugin.\n const {credentials} = this.webex;\n\n // Init a promise chain. Must be done as a Promise.resolve() to allow\n // credentials#getOrgId() to properly throw.\n return Promise.resolve()\n // Get the user's OrgId.\n .then(() => credentials.getOrgId())\n // Begin collecting the preauth/limited catalog.\n .then((orgId) => this.collectPreauthCatalog({orgId}))\n .then(() => {\n // Validate if the token is authorized.\n if (credentials.canAuthorize) {\n // Attempt to collect the postauth catalog.\n return this.updateServices()\n .catch(() => this.logger.warn(\n 'services: cannot retrieve postauth catalog'\n ));\n }\n\n // Return a resolved promise for consistent return value.\n return Promise.resolve();\n });\n },\n\n /**\n * Initializer\n *\n * @instance\n * @memberof Services\n * @returns {Services}\n */\n initialize() {\n const catalog = new ServiceCatalog();\n const registry = new ServiceRegistry();\n const state = new ServiceState();\n\n this._catalogs.set(this.webex, catalog);\n this.registries.set(this.webex, registry);\n this.states.set(this.webex, state);\n\n // Listen for configuration changes once.\n this.listenToOnce(this.webex, 'change:config', () => {\n this.initConfig();\n });\n\n // wait for webex instance to be ready before attempting\n // to update the service catalogs\n this.listenToOnce(this.webex, 'ready', () => {\n const {supertoken} = this.webex.credentials;\n\n // Validate if the supertoken exists.\n if (supertoken && supertoken.access_token) {\n this.initServiceCatalogs()\n .then(() => {\n catalog.isReady = true;\n })\n .catch((error) => this.logger.error(\n `services: failed to init initial services, ${error.message}`\n ));\n }\n else {\n const {email} = this.webex.config;\n\n this.collectPreauthCatalog(email ? {email} : undefined);\n }\n });\n }\n});\n/* eslint-enable no-underscore-dangle */\n\nexport default Services;\n"]}
@@ -70,7 +70,7 @@ var Logger = _webexPlugin.default.extend({
70
70
  info: wrapConsoleMethod('info'),
71
71
  debug: wrapConsoleMethod('debug'),
72
72
  trace: wrapConsoleMethod('trace'),
73
- version: "1.143.2"
73
+ version: "1.144.2"
74
74
  });
75
75
 
76
76
  (0, _webexCore.registerPlugin)('logger', Logger);
@@ -159,7 +159,7 @@ var MAX_FILE_SIZE_IN_MB = 2048;
159
159
  */
160
160
 
161
161
  var WebexCore = _ampersandState.default.extend((_obj = {
162
- version: "1.143.2",
162
+ version: "1.144.2",
163
163
  children: {
164
164
  internal: _webexInternalCore.default
165
165
  },
@@ -757,7 +757,7 @@ var WebexCore = _ampersandState.default.extend((_obj = {
757
757
  }
758
758
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj)), _obj));
759
759
 
760
- WebexCore.version = "1.143.2";
760
+ WebexCore.version = "1.144.2";
761
761
  (0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
762
762
  (0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
763
763
  var _default = WebexCore;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/webex-core",
3
- "version": "1.143.2",
3
+ "version": "1.144.2",
4
4
  "description": "Plugin handling for Cisco Webex",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -28,15 +28,15 @@
28
28
  "@babel/runtime-corejs2": "^7.14.8",
29
29
  "lodash": "^4.17.21",
30
30
  "ampersand-state": "^5.0.3",
31
- "@webex/common": "1.143.2",
31
+ "@webex/common": "1.144.2",
32
32
  "ampersand-events": "^2.0.2",
33
- "@webex/http-core": "1.143.2",
33
+ "@webex/http-core": "1.144.2",
34
34
  "uuid": "^3.3.2",
35
35
  "jsonwebtoken": "^8.5.1",
36
- "@webex/common-timers": "1.143.2",
36
+ "@webex/common-timers": "1.144.2",
37
37
  "ampersand-collection": "^2.0.2",
38
38
  "crypto-js": "^3.1.9-1",
39
- "@webex/webex-core": "1.143.2",
39
+ "@webex/webex-core": "1.144.2",
40
40
  "core-decorators": "^0.20.0",
41
41
  "envify": "^4.1.0"
42
42
  }
package/src/config.js CHANGED
@@ -47,6 +47,14 @@ export default {
47
47
  */
48
48
  validateDomains: true,
49
49
 
50
+ /**
51
+ * services that don't need auth validation
52
+ */
53
+
54
+ servicesNotNeedValidation: [
55
+ 'webex-appapi-service'
56
+ ],
57
+
50
58
  /**
51
59
  * Contains a list of allowed domain host addresses.
52
60
  *
@@ -46,6 +46,8 @@ const Services = WebexPlugin.extend({
46
46
 
47
47
  _catalogs: new WeakMap(),
48
48
 
49
+ _serviceUrls: null,
50
+
49
51
  /**
50
52
  * Get the registry associated with this webex instance.
51
53
  *
@@ -145,6 +147,16 @@ const Services = WebexPlugin.extend({
145
147
  return catalog.markFailedUrl(url, noPriorityHosts);
146
148
  },
147
149
 
150
+ /**
151
+ * saves all the services from the pre and post catalog service
152
+ * @param {Object} serviceUrls
153
+ * @returns {void}
154
+ */
155
+ _updateServiceUrls(serviceUrls) {
156
+ this._serviceUrls = {...this._serviceUrls, ...serviceUrls};
157
+ },
158
+
159
+
148
160
  /**
149
161
  * Update a list of `serviceUrls` to the most current
150
162
  * catalog via the defined `discoveryUrl` then returns the current
@@ -546,6 +558,17 @@ const Services = WebexPlugin.extend({
546
558
  * @returns {Promise<string>} - Resolves to the priority host of a service.
547
559
  */
548
560
  waitForService({name, timeout = 5, url}) {
561
+ const {services} = this.webex.config;
562
+
563
+ // Save memory by grabbing the catalog after there isn't a priortyURL
564
+ const catalog = this._getCatalog();
565
+
566
+ const fetchFromServiceUrl = services.servicesNotNeedValidation.find((service) => service === name);
567
+
568
+ if (fetchFromServiceUrl) {
569
+ return Promise.resolve(this._serviceUrls[name]);
570
+ }
571
+
549
572
  const priorityUrl = this.get(name, true);
550
573
  const priorityUrlObj = this.getServiceFromUrl(url);
551
574
 
@@ -553,9 +576,6 @@ const Services = WebexPlugin.extend({
553
576
  return Promise.resolve(priorityUrl || priorityUrlObj.priorityUrl);
554
577
  }
555
578
 
556
- // Save memory by grabbing the catalog after there isn't a priortyURL
557
- const catalog = this._getCatalog();
558
-
559
579
  if (catalog.isReady) {
560
580
  return url ?
561
581
  Promise.resolve(url) :
@@ -656,6 +676,10 @@ const Services = WebexPlugin.extend({
656
676
  }
657
677
  });
658
678
 
679
+ // update all the service urls in the host catalog
680
+
681
+ this._updateServiceUrls(serviceHostmap.serviceLinks);
682
+
659
683
  return formattedHostmap;
660
684
  },
661
685