@webex/webex-core 3.12.0-webex-services-ready.2 → 3.12.0-webex-services-ready.4

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.
Files changed (36) hide show
  1. package/README.md +5 -2
  2. package/dist/config.js +15 -0
  3. package/dist/config.js.map +1 -1
  4. package/dist/lib/batcher.js +1 -1
  5. package/dist/lib/credentials/credentials.js +1 -1
  6. package/dist/lib/credentials/token.js +1 -1
  7. package/dist/lib/domains.js +90 -0
  8. package/dist/lib/domains.js.map +1 -0
  9. package/dist/lib/services/service-catalog.js +6 -10
  10. package/dist/lib/services/service-catalog.js.map +1 -1
  11. package/dist/lib/services/services.js +26 -22
  12. package/dist/lib/services/services.js.map +1 -1
  13. package/dist/lib/services-v2/service-catalog.js +6 -12
  14. package/dist/lib/services-v2/service-catalog.js.map +1 -1
  15. package/dist/lib/services-v2/services-v2.js +33 -24
  16. package/dist/lib/services-v2/services-v2.js.map +1 -1
  17. package/dist/plugins/logger.js +1 -1
  18. package/dist/webex-core.js +2 -2
  19. package/package.json +13 -13
  20. package/src/config.js +17 -0
  21. package/src/lib/domains.ts +94 -0
  22. package/src/lib/services/service-catalog.js +6 -10
  23. package/src/lib/services/services.js +37 -31
  24. package/src/lib/services-v2/service-catalog.ts +6 -11
  25. package/src/lib/services-v2/services-v2.ts +41 -31
  26. package/test/fixtures/activation-email.ts +22 -0
  27. package/test/integration/spec/services/service-catalog.js +7 -6
  28. package/test/integration/spec/services/services.js +11 -8
  29. package/test/integration/spec/services-v2/services-v2.js +11 -8
  30. package/test/unit/spec/interceptors/auth.js +56 -0
  31. package/test/unit/spec/services/service-catalog.js +93 -11
  32. package/test/unit/spec/services/services.js +6 -1
  33. package/test/unit/spec/services-v2/service-catalog.ts +93 -11
  34. package/test/unit/spec/services-v2/services-v2.ts +22 -1
  35. package/test/unit/spec/webex-core.js +0 -2
  36. package/test/unit/spec/webex-internal-core.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","timestamp","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","_ref3","_iterator","_step","serviceUrl","startsWith","baseUrl","err","findAllowedDomain","urlObj","allowedDomain","includes","_unused2","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","_serviceObj$serviceUr","sort","b","priority","ServiceDetail","trigger","waitForCatalog","timeout","_this4","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceDetail from './service-detail';\nimport {IServiceDetail, ServiceGroup} from './types';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n timestamp: ['string', false, ''],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails?.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (url.startsWith(serviceUrl.baseUrl)) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n\n return this.allowedDomains.find((allowedDomain) => urlObj.host.includes(allowedDomain));\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = [...allowedDomains];\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, newAllowedDomains);\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @param {timestamp<string>} timestamp of the catalog\n * @returns {void}\n */\n updateServiceGroups(\n serviceGroup: ServiceGroup,\n serviceDetails: Array<IServiceDetail>,\n timestamp?: string\n ) {\n const currentServiceDetails = this.serviceGroups[serviceGroup];\n\n const unusedServicesDetails = currentServiceDetails?.filter((serviceDetail) =>\n serviceDetails?.every(({id}) => id !== serviceDetail.id)\n );\n\n this._unloadServiceDetails(serviceGroup, unusedServicesDetails);\n\n serviceDetails?.forEach((serviceObj) => {\n const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);\n serviceObj?.serviceUrls?.sort((a, b) => {\n if (a.priority < 0 && b.priority < 0) return 0;\n if (a.priority < 0) return 1;\n if (b.priority < 0) return -1;\n\n return a.priority - b.priority;\n });\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\n this.timestamp = timestamp;\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {ServiceGroup} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: ServiceGroup, timeout?: number): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_domains","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","timestamp","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","_ref3","_iterator","_step","serviceUrl","startsWith","baseUrl","err","findAllowedDomain","matchAllowedDomain","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","_serviceObj$serviceUr","sort","b","priority","ServiceDetail","trigger","waitForCatalog","timeout","_this4","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceDetail from './service-detail';\nimport {IServiceDetail, ServiceGroup} from './types';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n timestamp: ['string', false, ''],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails?.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (url.startsWith(serviceUrl.baseUrl)) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @param {timestamp<string>} timestamp of the catalog\n * @returns {void}\n */\n updateServiceGroups(\n serviceGroup: ServiceGroup,\n serviceDetails: Array<IServiceDetail>,\n timestamp?: string\n ) {\n const currentServiceDetails = this.serviceGroups[serviceGroup];\n\n const unusedServicesDetails = currentServiceDetails?.filter((serviceDetail) =>\n serviceDetails?.every(({id}) => id !== serviceDetail.id)\n );\n\n this._unloadServiceDetails(serviceGroup, unusedServicesDetails);\n\n serviceDetails?.forEach((serviceObj) => {\n const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);\n serviceObj?.serviceUrls?.sort((a, b) => {\n if (a.priority < 0 && b.priority < 0) return 0;\n if (a.priority < 0) return 1;\n if (b.priority < 0) return -1;\n\n return a.priority - b.priority;\n });\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\n this.timestamp = timestamp;\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {ServiceGroup} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: ServiceGroup, timeout?: number): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
@@ -42,12 +42,6 @@ var DEFAULT_CLUSTER_IDENTIFIER = process.env.WEBEX_CONVERSATION_DEFAULT_CLUSTER
42
42
  var CATALOG_CACHE_KEY_V2 = 'services.v2.u2cHostMap';
43
43
  var CATALOG_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
44
44
 
45
- // Maximum time we will wait for the initial catalog collection before letting
46
- // `services.ready` (and therefore `webex.ready`) fire anyway. A hung request
47
- // must never leave the app on a permanent spinner - past this point downstream
48
- // consumers must fall through to their normal error/login paths.
49
- var SERVICES_INIT_TIMEOUT_MS = 15000;
50
-
51
45
  /* eslint-disable no-underscore-dangle */
52
46
  /**
53
47
  * @class
@@ -1194,7 +1188,9 @@ var Services = _webexPlugin.default.extend({
1194
1188
  * @returns {Promise<object>}
1195
1189
  */
1196
1190
  _fetchNewServiceHostmap: function _fetchNewServiceHostmap() {
1197
- var _this1 = this;
1191
+ var _this$webex$config2,
1192
+ _this$webex$config2$s,
1193
+ _this1 = this;
1198
1194
  var _ref11 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
1199
1195
  from = _ref11.from,
1200
1196
  query = _ref11.query,
@@ -1204,6 +1200,8 @@ var Services = _webexPlugin.default.extend({
1204
1200
  var resource = from ? "/".concat(from, "/catalog") : '/catalog';
1205
1201
  var qs = _objectSpread(_objectSpread({}, query || {}), {}, {
1206
1202
  format: 'U2CV2'
1203
+ }, ((_this$webex$config2 = this.webex.config) === null || _this$webex$config2 === void 0 ? void 0 : (_this$webex$config2$s = _this$webex$config2.services) === null || _this$webex$config2$s === void 0 ? void 0 : _this$webex$config2$s.useCatalogOverride) && {
1204
+ useCatalogOverride: true
1207
1205
  });
1208
1206
  if (forceRefresh) {
1209
1207
  qs.timestamp = new Date().getTime();
@@ -1236,9 +1234,9 @@ var Services = _webexPlugin.default.extend({
1236
1234
  var _this10 = this;
1237
1235
  // Get the catalog and destructure the services config.
1238
1236
  var catalog = this._getCatalog();
1239
- var _this$webex$config2 = this.webex.config,
1240
- services = _this$webex$config2.services,
1241
- fedramp = _this$webex$config2.fedramp;
1237
+ var _this$webex$config3 = this.webex.config,
1238
+ services = _this$webex$config3.services,
1239
+ fedramp = _this$webex$config3.fedramp;
1242
1240
 
1243
1241
  // Validate that the services configuration exists.
1244
1242
  if (services) {
@@ -1306,6 +1304,7 @@ var Services = _webexPlugin.default.extend({
1306
1304
 
1307
1305
  // Destructure the credentials plugin.
1308
1306
  var credentials = this.webex.credentials;
1307
+ var catalog = this._getCatalog();
1309
1308
 
1310
1309
  // Init a promise chain. Must be done as a Promise.resolve() to allow
1311
1310
  // credentials#getOrgId() to properly throw.
@@ -1322,9 +1321,14 @@ var Services = _webexPlugin.default.extend({
1322
1321
  }).then(function () {
1323
1322
  // Validate if the token is authorized.
1324
1323
  if (credentials.canAuthorize) {
1325
- // Attempt to collect the postauth catalog.
1324
+ // Attempt to collect the postauth catalog, then mark the catalog
1325
+ // ready. Setting `isReady` here - rather than only in the init
1326
+ // callers - means a slow postauth fetch that loses the gated-init
1327
+ // timeout race still marks the catalog ready once it completes.
1326
1328
  return _this11.updateServices({
1327
1329
  forceRefresh: refresh
1330
+ }).then(function () {
1331
+ catalog.isReady = true;
1328
1332
  }).catch(function () {
1329
1333
  _this11.initFailed = true;
1330
1334
  _this11.logger.warn('services: cannot retrieve postauth catalog');
@@ -1436,9 +1440,9 @@ var Services = _webexPlugin.default.extend({
1436
1440
  case 2:
1437
1441
  supertoken = _this14.webex.credentials.supertoken; // Validate if the supertoken exists.
1438
1442
  if (supertoken && supertoken.access_token) {
1439
- _this14.initServiceCatalogs().then(function () {
1440
- catalog.isReady = true;
1441
- }).catch(function (error) {
1443
+ // `initServiceCatalogs` marks the catalog ready internally once the
1444
+ // postauth catalog is collected.
1445
+ _this14.initServiceCatalogs().catch(function (error) {
1442
1446
  _this14.initFailed = true;
1443
1447
  _this14.logger.error("services: failed to init initial services when credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1444
1448
  });
@@ -1474,7 +1478,8 @@ var Services = _webexPlugin.default.extend({
1474
1478
  // catalogs. We listen for 'loaded' instead of 'ready' because `services.ready`
1475
1479
  // now blocks `webex.ready` - listening to 'ready' would deadlock.
1476
1480
  this.listenToOnce(this.webex, 'loaded', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5() {
1477
- var warmed, supertoken, timeout, email;
1481
+ var _this15$webex$config, _this15$webex$config$;
1482
+ var warmed, supertoken, initTimeoutMs, initServiceCatalogsTimeout, email;
1478
1483
  return _regenerator.default.wrap(function (_context5) {
1479
1484
  while (1) switch (_context5.prev = _context5.next) {
1480
1485
  case 0:
@@ -1494,16 +1499,19 @@ var Services = _webexPlugin.default.extend({
1494
1499
  case 3:
1495
1500
  supertoken = _this15.webex.credentials.supertoken; // Race init against a hard timeout so a hung request never leaves
1496
1501
  // `services.ready` false forever - that would stall `webex.ready` and
1497
- // leave the app on a permanent spinner.
1498
- timeout = new _promise.default(function (_, reject) {
1502
+ // leave consumers waiting on it indefinitely. Timeout is configurable via
1503
+ // `config.services.catalogInitTimeout` (defaults to 15s in config).
1504
+ initTimeoutMs = (_this15$webex$config = _this15.webex.config) === null || _this15$webex$config === void 0 ? void 0 : (_this15$webex$config$ = _this15$webex$config.services) === null || _this15$webex$config$ === void 0 ? void 0 : _this15$webex$config$.catalogInitTimeout;
1505
+ initServiceCatalogsTimeout = new _promise.default(function (_, reject) {
1499
1506
  setTimeout(function () {
1500
- return reject(new Error("services: init timed out after ".concat(SERVICES_INIT_TIMEOUT_MS, "ms")));
1501
- }, SERVICES_INIT_TIMEOUT_MS);
1507
+ return reject(new Error("services: init timed out after ".concat(initTimeoutMs, "ms")));
1508
+ }, initTimeoutMs);
1502
1509
  }); // Validate if the supertoken exists.
1503
1510
  if (supertoken && supertoken.access_token) {
1504
- _promise.default.race([_this15.initServiceCatalogs(), timeout]).then(function () {
1505
- catalog.isReady = true;
1506
- }).catch(function (error) {
1511
+ // `initServiceCatalogs` marks the catalog ready internally once the
1512
+ // postauth catalog is collected - even if it loses the timeout race
1513
+ // above, so a slow fetch still eventually flips `catalog.isReady`.
1514
+ _promise.default.race([_this15.initServiceCatalogs(), initServiceCatalogsTimeout]).catch(function (error) {
1507
1515
  _this15.initFailed = true;
1508
1516
  _this15.logger.error("services: failed to init initial services when credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1509
1517
  }).finally(function () {
@@ -1513,7 +1521,7 @@ var Services = _webexPlugin.default.extend({
1513
1521
  email = _this15.webex.config.email;
1514
1522
  _promise.default.race([_this15.collectPreauthCatalog(email ? {
1515
1523
  email: email
1516
- } : undefined), timeout]).catch(function (error) {
1524
+ } : undefined), initServiceCatalogsTimeout]).catch(function (error) {
1517
1525
  _this15.initFailed = true;
1518
1526
  _this15.logger.error("services: failed to init initial services when no credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1519
1527
  }).finally(function () {
@@ -1524,6 +1532,7 @@ var Services = _webexPlugin.default.extend({
1524
1532
  // for `canAuthorize` flipping true and then collect the postauth catalog.
1525
1533
  _this15.listenToOnce(_this15.webex, 'change:canAuthorize', function () {
1526
1534
  if (_this15.webex.canAuthorize && !catalog.status.postauth.ready) {
1535
+ // `initServiceCatalogs` marks the catalog ready internally.
1527
1536
  _this15.initServiceCatalogs().catch(function (error) {
1528
1537
  _this15.logger.error("services: failed to init service catalogs after auth, ".concat(error === null || error === void 0 ? void 0 : error.message));
1529
1538
  });
@@ -1537,7 +1546,7 @@ var Services = _webexPlugin.default.extend({
1537
1546
  }, _callee5);
1538
1547
  })));
1539
1548
  },
1540
- version: "3.12.0-webex-services-ready.2"
1549
+ version: "3.12.0-webex-services-ready.4"
1541
1550
  });
1542
1551
  /* eslint-enable no-underscore-dangle */
1543
1552
  var _default = exports.default = Services;