@webex/webex-core 3.12.0-next.4 → 3.12.0-next.40

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 (43) 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/credentials-config.js +12 -0
  5. package/dist/credentials-config.js.map +1 -1
  6. package/dist/lib/batcher.js +23 -7
  7. package/dist/lib/batcher.js.map +1 -1
  8. package/dist/lib/credentials/credentials.js +48 -4
  9. package/dist/lib/credentials/credentials.js.map +1 -1
  10. package/dist/lib/credentials/token.js +1 -1
  11. package/dist/lib/domains.js +90 -0
  12. package/dist/lib/domains.js.map +1 -0
  13. package/dist/lib/services/service-catalog.js +6 -10
  14. package/dist/lib/services/service-catalog.js.map +1 -1
  15. package/dist/lib/services/services.js +196 -28
  16. package/dist/lib/services/services.js.map +1 -1
  17. package/dist/lib/services-v2/service-catalog.js +6 -12
  18. package/dist/lib/services-v2/service-catalog.js.map +1 -1
  19. package/dist/lib/services-v2/services-v2.js +203 -30
  20. package/dist/lib/services-v2/services-v2.js.map +1 -1
  21. package/dist/plugins/logger.js +1 -1
  22. package/dist/webex-core.js +2 -2
  23. package/dist/webex-core.js.map +1 -1
  24. package/package.json +13 -13
  25. package/src/config.js +17 -0
  26. package/src/credentials-config.js +13 -0
  27. package/src/lib/batcher.js +25 -10
  28. package/src/lib/credentials/credentials.js +50 -3
  29. package/src/lib/domains.ts +94 -0
  30. package/src/lib/services/service-catalog.js +6 -10
  31. package/src/lib/services/services.js +170 -17
  32. package/src/lib/services-v2/service-catalog.ts +6 -11
  33. package/src/lib/services-v2/services-v2.ts +174 -17
  34. package/test/fixtures/activation-email.ts +22 -0
  35. package/test/integration/spec/services/services.js +44 -8
  36. package/test/integration/spec/services-v2/services-v2.js +44 -8
  37. package/test/unit/spec/credentials/credentials.js +133 -2
  38. package/test/unit/spec/interceptors/auth.js +56 -0
  39. package/test/unit/spec/lib/batcher.js +56 -0
  40. package/test/unit/spec/services/service-catalog.js +93 -11
  41. package/test/unit/spec/services/services.js +307 -2
  42. package/test/unit/spec/services-v2/service-catalog.ts +93 -11
  43. package/test/unit/spec/services-v2/services-v2.ts +311 -0
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.normalizeAllowedDomains = exports.matchAllowedDomain = exports.default = void 0;
9
+ var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
10
+ var _url = _interopRequireDefault(require("url"));
11
+ var _lodash = require("lodash");
12
+ // Canonicalise a hostname for comparison: lowercase, drop the brackets around
13
+ // an IPv6 literal, and drop leading/trailing dots. DNS treats `Example.com`,
14
+ // `example.com.` and `example.com` as the same name.
15
+ //
16
+ // Node's `url.domainToASCII` looks like the standard way to do this, but the
17
+ // `url` polyfill this package bundles for the browser does not implement it,
18
+ // so it cannot be used here. It also leaves trailing dots in place.
19
+ var normalizeHostname = function normalizeHostname(value) {
20
+ return typeof value === 'string' ? value.toLowerCase().replace(/^\[|\]$/g, '').replace(/^\.+/, '').replace(/\.+$/, '') : '';
21
+ };
22
+
23
+ /**
24
+ * Canonicalise a list of configured allowed domains, discarding any entry that
25
+ * is not a usable hostname. Callers normalise on the way in so the stored list
26
+ * is already canonical, rather than re-deriving it on every request.
27
+ *
28
+ * @param {Array<string>} allowedDomains - The configured allowed domains.
29
+ * @returns {Array<string>} - Normalized, de-duplicated, non-empty entries.
30
+ */
31
+ var normalizeAllowedDomains = exports.normalizeAllowedDomains = function normalizeAllowedDomains(allowedDomains) {
32
+ return (0, _lodash.uniq)(((0, _isArray.default)(allowedDomains) ? allowedDomains : []).map(normalizeHostname).filter(Boolean));
33
+ };
34
+
35
+ /**
36
+ * Determine if a hostname is covered by an allowed domain, matching only on DNS
37
+ * label boundaries, so that a hostname is allowed only when it is the domain
38
+ * itself or a subdomain of it. Matching on a substring instead would treat
39
+ * unrelated hostnames that merely contain the domain as allowed.
40
+ *
41
+ * @param {string} hostname - Hostname to test. Must not include a port.
42
+ * @param {string} allowedDomain - The configured allowed domain.
43
+ * @returns {boolean} - True when the hostname is the domain or a subdomain of it.
44
+ */
45
+ var hostnameMatchesDomain = function hostnameMatchesDomain(hostname, allowedDomain) {
46
+ // The stored list is normalized on write, but `allowedDomains` is a public
47
+ // property, so normalize again here rather than trust it.
48
+ var host = normalizeHostname(hostname);
49
+ var domain = normalizeHostname(allowedDomain);
50
+ return !!host && !!domain && (host === domain || host.endsWith(".".concat(domain)));
51
+ };
52
+
53
+ /**
54
+ * Find the allowed domain covering a url, or `undefined` if there is none.
55
+ *
56
+ * Parsing lives here rather than in the callers, and deliberately uses both url
57
+ * parsers, because this check gates an `Authorization` header. The two
58
+ * transports behind `@webex/http-core` do not use the same url parser: the
59
+ * browser transport parses per WHATWG, the node transport uses Node's legacy
60
+ * `Url.parse`, and for some inputs the two resolve different hosts.
61
+ *
62
+ * Rather than picking one, require both to agree and fail closed when they do
63
+ * not, so this check can never authorize a host that differs from the one a
64
+ * transport would actually connect to. Do not narrow this to a single parser.
65
+ *
66
+ * @param {string} url - The url to match the allowed domains against.
67
+ * @param {Array<string>} allowedDomains - The configured allowed domains.
68
+ * @returns {string} - The matching allowed domain, or undefined if there is none.
69
+ */
70
+ var matchAllowedDomain = exports.matchAllowedDomain = function matchAllowedDomain(url, allowedDomains) {
71
+ var hostname;
72
+ var legacyHostname;
73
+ try {
74
+ var _URL = new URL(url);
75
+ hostname = _URL.hostname;
76
+ var _Url$parse = _url.default.parse(url);
77
+ legacyHostname = _Url$parse.hostname;
78
+ } catch (_unused) {
79
+ // Not a parsable absolute url, so it cannot belong to an allowed domain.
80
+ return undefined;
81
+ }
82
+ if (normalizeHostname(hostname) !== normalizeHostname(legacyHostname)) {
83
+ return undefined;
84
+ }
85
+ return (allowedDomains || []).find(function (allowedDomain) {
86
+ return hostnameMatchesDomain(hostname, allowedDomain);
87
+ });
88
+ };
89
+ var _default = exports.default = matchAllowedDomain;
90
+ //# sourceMappingURL=domains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_url","_interopRequireDefault","require","_lodash","normalizeHostname","value","toLowerCase","replace","normalizeAllowedDomains","exports","allowedDomains","uniq","_isArray","default","map","filter","Boolean","hostnameMatchesDomain","hostname","allowedDomain","host","domain","endsWith","concat","matchAllowedDomain","url","legacyHostname","_URL","URL","_Url$parse","Url","parse","_unused","undefined","find","_default"],"sources":["domains.ts"],"sourcesContent":["import Url from 'url';\n\nimport {uniq} from 'lodash';\n\n// Canonicalise a hostname for comparison: lowercase, drop the brackets around\n// an IPv6 literal, and drop leading/trailing dots. DNS treats `Example.com`,\n// `example.com.` and `example.com` as the same name.\n//\n// Node's `url.domainToASCII` looks like the standard way to do this, but the\n// `url` polyfill this package bundles for the browser does not implement it,\n// so it cannot be used here. It also leaves trailing dots in place.\nconst normalizeHostname = (value: string): string =>\n typeof value === 'string'\n ? value\n .toLowerCase()\n .replace(/^\\[|\\]$/g, '')\n .replace(/^\\.+/, '')\n .replace(/\\.+$/, '')\n : '';\n\n/**\n * Canonicalise a list of configured allowed domains, discarding any entry that\n * is not a usable hostname. Callers normalise on the way in so the stored list\n * is already canonical, rather than re-deriving it on every request.\n *\n * @param {Array<string>} allowedDomains - The configured allowed domains.\n * @returns {Array<string>} - Normalized, de-duplicated, non-empty entries.\n */\nexport const normalizeAllowedDomains = (allowedDomains: Array<string>): Array<string> =>\n uniq(\n (Array.isArray(allowedDomains) ? allowedDomains : []).map(normalizeHostname).filter(Boolean)\n );\n\n/**\n * Determine if a hostname is covered by an allowed domain, matching only on DNS\n * label boundaries, so that a hostname is allowed only when it is the domain\n * itself or a subdomain of it. Matching on a substring instead would treat\n * unrelated hostnames that merely contain the domain as allowed.\n *\n * @param {string} hostname - Hostname to test. Must not include a port.\n * @param {string} allowedDomain - The configured allowed domain.\n * @returns {boolean} - True when the hostname is the domain or a subdomain of it.\n */\nconst hostnameMatchesDomain = (hostname: string, allowedDomain: string): boolean => {\n // The stored list is normalized on write, but `allowedDomains` is a public\n // property, so normalize again here rather than trust it.\n const host = normalizeHostname(hostname);\n const domain = normalizeHostname(allowedDomain);\n\n return !!host && !!domain && (host === domain || host.endsWith(`.${domain}`));\n};\n\n/**\n * Find the allowed domain covering a url, or `undefined` if there is none.\n *\n * Parsing lives here rather than in the callers, and deliberately uses both url\n * parsers, because this check gates an `Authorization` header. The two\n * transports behind `@webex/http-core` do not use the same url parser: the\n * browser transport parses per WHATWG, the node transport uses Node's legacy\n * `Url.parse`, and for some inputs the two resolve different hosts.\n *\n * Rather than picking one, require both to agree and fail closed when they do\n * not, so this check can never authorize a host that differs from the one a\n * transport would actually connect to. Do not narrow this to a single parser.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @param {Array<string>} allowedDomains - The configured allowed domains.\n * @returns {string} - The matching allowed domain, or undefined if there is none.\n */\nexport const matchAllowedDomain = (\n url: string,\n allowedDomains: Array<string>\n): string | undefined => {\n let hostname: string;\n let legacyHostname: string;\n\n try {\n ({hostname} = new URL(url));\n ({hostname: legacyHostname} = Url.parse(url));\n } catch {\n // Not a parsable absolute url, so it cannot belong to an allowed domain.\n return undefined;\n }\n\n if (normalizeHostname(hostname) !== normalizeHostname(legacyHostname)) {\n return undefined;\n }\n\n return (allowedDomains || []).find((allowedDomain) =>\n hostnameMatchesDomain(hostname, allowedDomain)\n );\n};\n\nexport default matchAllowedDomain;\n"],"mappings":";;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAME,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAIC,KAAa;EAAA,OACtC,OAAOA,KAAK,KAAK,QAAQ,GACrBA,KAAK,CACFC,WAAW,CAAC,CAAC,CACbC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CACvBA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CACnBA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GACtB,EAAE;AAAA;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMC,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA,GAAG,SAA1BA,uBAAuBA,CAAIE,cAA6B;EAAA,OACnE,IAAAC,YAAI,EACF,CAAC,IAAAC,QAAA,CAAAC,OAAA,EAAcH,cAAc,CAAC,GAAGA,cAAc,GAAG,EAAE,EAAEI,GAAG,CAACV,iBAAiB,CAAC,CAACW,MAAM,CAACC,OAAO,CAC7F,CAAC;AAAA;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAIC,QAAgB,EAAEC,aAAqB,EAAc;EAClF;EACA;EACA,IAAMC,IAAI,GAAGhB,iBAAiB,CAACc,QAAQ,CAAC;EACxC,IAAMG,MAAM,GAAGjB,iBAAiB,CAACe,aAAa,CAAC;EAE/C,OAAO,CAAC,CAACC,IAAI,IAAI,CAAC,CAACC,MAAM,KAAKD,IAAI,KAAKC,MAAM,IAAID,IAAI,CAACE,QAAQ,KAAAC,MAAA,CAAKF,MAAM,CAAE,CAAC,CAAC;AAC/E,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMG,kBAAkB,GAAAf,OAAA,CAAAe,kBAAA,GAAG,SAArBA,kBAAkBA,CAC7BC,GAAW,EACXf,cAA6B,EACN;EACvB,IAAIQ,QAAgB;EACpB,IAAIQ,cAAsB;EAE1B,IAAI;IAAA,IAAAC,IAAA,GACY,IAAIC,GAAG,CAACH,GAAG,CAAC;IAAxBP,QAAQ,GAAAS,IAAA,CAART,QAAQ;IAAA,IAAAW,UAAA,GACoBC,YAAG,CAACC,KAAK,CAACN,GAAG,CAAC;IAAhCC,cAAc,GAAAG,UAAA,CAAxBX,QAAQ;EACZ,CAAC,CAAC,OAAAc,OAAA,EAAM;IACN;IACA,OAAOC,SAAS;EAClB;EAEA,IAAI7B,iBAAiB,CAACc,QAAQ,CAAC,KAAKd,iBAAiB,CAACsB,cAAc,CAAC,EAAE;IACrE,OAAOO,SAAS;EAClB;EAEA,OAAO,CAACvB,cAAc,IAAI,EAAE,EAAEwB,IAAI,CAAC,UAACf,aAAa;IAAA,OAC/CF,qBAAqB,CAACC,QAAQ,EAAEC,aAAa,CAAC;EAAA,CAChD,CAAC;AACH,CAAC;AAAC,IAAAgB,QAAA,GAAA1B,OAAA,CAAAI,OAAA,GAEaW,kBAAkB","ignoreList":[]}
@@ -23,6 +23,7 @@ var _url = _interopRequireDefault(require("url"));
23
23
  var _ampersandState = _interopRequireDefault(require("ampersand-state"));
24
24
  var _lodash = require("lodash");
25
25
  var _serviceUrl = _interopRequireDefault(require("./service-url"));
26
+ var _domains = require("../domains");
26
27
  function ownKeys(e, r) { var t = _Object$keys3(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
27
28
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
28
29
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
@@ -283,19 +284,14 @@ var ServiceCatalog = _ampersandState.default.extend({
283
284
  });
284
285
  },
285
286
  /**
286
- * Finds an allowed domain that matches a specific url.
287
+ * Finds an allowed domain that matches a specific url. The url's hostname
288
+ * must be the allowed domain itself or a subdomain of it.
287
289
  *
288
290
  * @param {string} url - The url to match the allowed domains against.
289
291
  * @returns {string} - The matching allowed domain.
290
292
  */
291
293
  findAllowedDomain: function findAllowedDomain(url) {
292
- var urlObj = _url.default.parse(url);
293
- if (!urlObj.host) {
294
- return undefined;
295
- }
296
- return this.allowedDomains.find(function (allowedDomain) {
297
- return urlObj.host.includes(allowedDomain);
298
- });
294
+ return (0, _domains.matchAllowedDomain)(url, this.allowedDomains);
299
295
  },
300
296
  /**
301
297
  * Get a service url from the current services list by name.
@@ -363,7 +359,7 @@ var ServiceCatalog = _ampersandState.default.extend({
363
359
  * @returns {void}
364
360
  */
365
361
  setAllowedDomains: function setAllowedDomains(allowedDomains) {
366
- this.allowedDomains = (0, _toConsumableArray2.default)(allowedDomains);
362
+ this.allowedDomains = (0, _domains.normalizeAllowedDomains)(allowedDomains);
367
363
  },
368
364
  /**
369
365
  *
@@ -371,7 +367,7 @@ var ServiceCatalog = _ampersandState.default.extend({
371
367
  * @returns {void}
372
368
  */
373
369
  addAllowedDomains: function addAllowedDomains(newAllowedDomains) {
374
- this.allowedDomains = (0, _lodash.union)(this.allowedDomains, newAllowedDomains);
370
+ this.allowedDomains = (0, _lodash.union)(this.allowedDomains, (0, _domains.normalizeAllowedDomains)(newAllowedDomains));
375
371
  },
376
372
  /**
377
373
  * Update the current list of `ServiceUrl`s against a provided
@@ -1 +1 @@
1
- {"version":3,"names":["_url","_interopRequireDefault","require","_ampersandState","_lodash","_serviceUrl","ownKeys","e","r","t","_Object$keys3","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","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","allowedDomains","_getUrl","serviceGroup","serviceUrls","concat","_toConsumableArray2","find","serviceUrl","_listServiceUrls","_loadServiceUrls","services","_this","existingService","service","_unloadServiceUrls","_this2","splice","indexOf","clean","findClusterId","url","incomingUrlObj","Url","parse","serviceUrlObj","_i","_Object$keys","_keys","key","_iterator","_step","defaultUrl","_iterator2","hosts","_step2","host","hostname","id","err","_iterator3","_step3","homeCluster","undefined","findServiceFromClusterId","_ref","clusterId","_ref$priorityHost","priorityHost","identifiedServiceUrl","get","findServiceUrlFromUrl","startsWith","_iterator4","_step4","alternateUrl","URL","findAllowedDomain","urlObj","allowedDomain","includes","getAllowedDomains","list","output","markFailedUrl","noPriorityHosts","_this3","failHost","setAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceUrls","serviceHostmap","_this4","currentServiceUrls","unusedUrls","every","item","serviceObj","ServiceUrl","trigger","waitForCatalog","timeout","_this5","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.js"],"sourcesContent":["import Url from 'url';\n\nimport AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceUrl from './service-url';\n\n/* eslint-disable no-underscore-dangle */\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 allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Search the service url array to locate a `ServiceUrl`\n * class object based on its name.\n * @param {string} name\n * @param {string} [serviceGroup]\n * @returns {ServiceUrl}\n */\n _getUrl(name, serviceGroup) {\n const serviceUrls =\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 serviceUrls.find((serviceUrl) => serviceUrl.name === name);\n },\n\n /**\n * @private\n * Generate an array of `ServiceUrl`s that is organized from highest auth\n * level to lowest auth level.\n * @returns {Array<ServiceUrl>} - array of `ServiceUrl`s\n */\n _listServiceUrls() {\n return [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n },\n\n /**\n * @private\n * Safely load one or more `ServiceUrl`s into this `Services` instance.\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _loadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n\n return this;\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceUrl`s into this `Services` instance\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _unloadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n\n return this;\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean() {\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} - ClusterId of a given url\n */\n findClusterId(url) {\n const incomingUrlObj = Url.parse(url);\n let serviceUrlObj;\n\n for (const key of Object.keys(this.serviceGroups)) {\n for (const service of this.serviceGroups[key]) {\n serviceUrlObj = Url.parse(service.defaultUrl);\n\n for (const host of service.hosts) {\n if (incomingUrlObj.hostname === host.host && host.id) {\n return host.id;\n }\n }\n\n if (serviceUrlObj.hostname === incomingUrlObj.hostname && service.hosts.length > 0) {\n // no exact match, so try to grab the first home cluster\n for (const host of service.hosts) {\n if (host.homeCluster) {\n return host.id;\n }\n }\n\n // no match found still, so return the first entry\n return service.hosts[0].id;\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId. Currently, this method will return either a service name, or a\n * service url depending on the `value` parameter. If the `value` parameter\n * is set to `name`, it will return a service name to be utilized within the\n * Services plugin methods.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost = true] - 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 findServiceFromClusterId({clusterId, priorityHost = true, serviceGroup} = {}) {\n const serviceUrls =\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 const identifiedServiceUrl = serviceUrls.find((serviceUrl) =>\n serviceUrl.hosts.find((host) => host.id === clusterId)\n );\n\n if (identifiedServiceUrl) {\n return {\n name: identifiedServiceUrl.name,\n url: identifiedServiceUrl.get(priorityHost, clusterId),\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 {serviceUrl} - ServiceUrl assocated with provided url\n */\n findServiceUrlFromUrl(url) {\n const serviceUrls = [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n return serviceUrls.find((serviceUrl) => {\n // Check to see if the URL we are checking starts with the default URL\n if (url.startsWith(serviceUrl.defaultUrl)) {\n return true;\n }\n\n // If not, we check to see if the alternate URLs match\n // These are made by swapping the host of the default URL\n // with that of an alternate host\n for (const host of serviceUrl.hosts) {\n const alternateUrl = new URL(serviceUrl.defaultUrl);\n alternateUrl.host = host.host;\n\n if (url.startsWith(alternateUrl.toString())) {\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) {\n const urlObj = Url.parse(url);\n\n if (!urlObj.host) {\n return undefined;\n }\n\n return this.allowedDomains.find((allowedDomain) => urlObj.host.includes(allowedDomain));\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} name\n * @param {boolean} priorityHost\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(name, priorityHost, serviceGroup) {\n const serviceUrl = this._getUrl(name, serviceGroup);\n\n return serviceUrl ? serviceUrl.get(priorityHost) : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains() {\n return [...this.allowedDomains];\n },\n\n /**\n * Creates an object where the keys are the service names\n * and the values are the service urls.\n * @param {boolean} priorityHost - use the highest priority if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const output = {};\n\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n if (serviceUrls) {\n serviceUrls.forEach((serviceUrl) => {\n output[serviceUrl.name] = serviceUrl.get(priorityHost);\n });\n }\n\n return output;\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 serviceUrl = this._getUrl(\n Object.keys(this.list()).find((key) => this._getUrl(key).failHost(url))\n );\n\n if (!serviceUrl) {\n return undefined;\n }\n\n return noPriorityHosts ? serviceUrl.get(false) : serviceUrl.get(true);\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) {\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) {\n this.allowedDomains = union(this.allowedDomains, newAllowedDomains);\n },\n\n /**\n * Update the current list of `ServiceUrl`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {string} serviceGroup\n * @param {object} serviceHostmap\n * @returns {Services}\n */\n updateServiceUrls(serviceGroup, serviceHostmap) {\n const currentServiceUrls = this.serviceGroups[serviceGroup];\n\n const unusedUrls = currentServiceUrls.filter((serviceUrl) =>\n serviceHostmap.every((item) => item.name !== serviceUrl.name)\n );\n\n this._unloadServiceUrls(serviceGroup, unusedUrls);\n\n serviceHostmap.forEach((serviceObj) => {\n const service = this._getUrl(serviceObj.name, serviceGroup);\n\n if (service) {\n service.defaultUrl = serviceObj.defaultUrl;\n service.hosts = serviceObj.hosts || [];\n } else {\n this._loadServiceUrls(serviceGroup, [\n new ServiceUrl({\n ...serviceObj,\n }),\n ]);\n }\n });\n\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n\n return this;\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n return new Promise((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/* eslint-enable no-underscore-dangle */\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_url","_interopRequireDefault","require","_ampersandState","_lodash","_serviceUrl","_domains","ownKeys","e","r","t","_Object$keys3","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","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","allowedDomains","_getUrl","serviceGroup","serviceUrls","concat","_toConsumableArray2","find","serviceUrl","_listServiceUrls","_loadServiceUrls","services","_this","existingService","service","_unloadServiceUrls","_this2","splice","indexOf","clean","findClusterId","url","incomingUrlObj","Url","parse","serviceUrlObj","_i","_Object$keys","_keys","key","_iterator","_step","defaultUrl","_iterator2","hosts","_step2","host","hostname","id","err","_iterator3","_step3","homeCluster","undefined","findServiceFromClusterId","_ref","clusterId","_ref$priorityHost","priorityHost","identifiedServiceUrl","get","findServiceUrlFromUrl","startsWith","_iterator4","_step4","alternateUrl","URL","findAllowedDomain","matchAllowedDomain","getAllowedDomains","list","output","markFailedUrl","noPriorityHosts","_this3","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceUrls","serviceHostmap","_this4","currentServiceUrls","unusedUrls","every","item","serviceObj","ServiceUrl","trigger","waitForCatalog","timeout","_this5","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.js"],"sourcesContent":["import Url from 'url';\n\nimport AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceUrl from './service-url';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\n\n/* eslint-disable no-underscore-dangle */\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 allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Search the service url array to locate a `ServiceUrl`\n * class object based on its name.\n * @param {string} name\n * @param {string} [serviceGroup]\n * @returns {ServiceUrl}\n */\n _getUrl(name, serviceGroup) {\n const serviceUrls =\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 serviceUrls.find((serviceUrl) => serviceUrl.name === name);\n },\n\n /**\n * @private\n * Generate an array of `ServiceUrl`s that is organized from highest auth\n * level to lowest auth level.\n * @returns {Array<ServiceUrl>} - array of `ServiceUrl`s\n */\n _listServiceUrls() {\n return [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n },\n\n /**\n * @private\n * Safely load one or more `ServiceUrl`s into this `Services` instance.\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _loadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n\n return this;\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceUrl`s into this `Services` instance\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _unloadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n\n return this;\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean() {\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} - ClusterId of a given url\n */\n findClusterId(url) {\n const incomingUrlObj = Url.parse(url);\n let serviceUrlObj;\n\n for (const key of Object.keys(this.serviceGroups)) {\n for (const service of this.serviceGroups[key]) {\n serviceUrlObj = Url.parse(service.defaultUrl);\n\n for (const host of service.hosts) {\n if (incomingUrlObj.hostname === host.host && host.id) {\n return host.id;\n }\n }\n\n if (serviceUrlObj.hostname === incomingUrlObj.hostname && service.hosts.length > 0) {\n // no exact match, so try to grab the first home cluster\n for (const host of service.hosts) {\n if (host.homeCluster) {\n return host.id;\n }\n }\n\n // no match found still, so return the first entry\n return service.hosts[0].id;\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId. Currently, this method will return either a service name, or a\n * service url depending on the `value` parameter. If the `value` parameter\n * is set to `name`, it will return a service name to be utilized within the\n * Services plugin methods.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost = true] - 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 findServiceFromClusterId({clusterId, priorityHost = true, serviceGroup} = {}) {\n const serviceUrls =\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 const identifiedServiceUrl = serviceUrls.find((serviceUrl) =>\n serviceUrl.hosts.find((host) => host.id === clusterId)\n );\n\n if (identifiedServiceUrl) {\n return {\n name: identifiedServiceUrl.name,\n url: identifiedServiceUrl.get(priorityHost, clusterId),\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 {serviceUrl} - ServiceUrl assocated with provided url\n */\n findServiceUrlFromUrl(url) {\n const serviceUrls = [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n return serviceUrls.find((serviceUrl) => {\n // Check to see if the URL we are checking starts with the default URL\n if (url.startsWith(serviceUrl.defaultUrl)) {\n return true;\n }\n\n // If not, we check to see if the alternate URLs match\n // These are made by swapping the host of the default URL\n // with that of an alternate host\n for (const host of serviceUrl.hosts) {\n const alternateUrl = new URL(serviceUrl.defaultUrl);\n alternateUrl.host = host.host;\n\n if (url.startsWith(alternateUrl.toString())) {\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) {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} name\n * @param {boolean} priorityHost\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(name, priorityHost, serviceGroup) {\n const serviceUrl = this._getUrl(name, serviceGroup);\n\n return serviceUrl ? serviceUrl.get(priorityHost) : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains() {\n return [...this.allowedDomains];\n },\n\n /**\n * Creates an object where the keys are the service names\n * and the values are the service urls.\n * @param {boolean} priorityHost - use the highest priority if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const output = {};\n\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n if (serviceUrls) {\n serviceUrls.forEach((serviceUrl) => {\n output[serviceUrl.name] = serviceUrl.get(priorityHost);\n });\n }\n\n return output;\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 serviceUrl = this._getUrl(\n Object.keys(this.list()).find((key) => this._getUrl(key).failHost(url))\n );\n\n if (!serviceUrl) {\n return undefined;\n }\n\n return noPriorityHosts ? serviceUrl.get(false) : serviceUrl.get(true);\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) {\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) {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceUrl`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {string} serviceGroup\n * @param {object} serviceHostmap\n * @returns {Services}\n */\n updateServiceUrls(serviceGroup, serviceHostmap) {\n const currentServiceUrls = this.serviceGroups[serviceGroup];\n\n const unusedUrls = currentServiceUrls.filter((serviceUrl) =>\n serviceHostmap.every((item) => item.name !== serviceUrl.name)\n );\n\n this._unloadServiceUrls(serviceGroup, unusedUrls);\n\n serviceHostmap.forEach((serviceObj) => {\n const service = this._getUrl(serviceObj.name, serviceGroup);\n\n if (service) {\n service.defaultUrl = serviceObj.defaultUrl;\n service.hosts = serviceObj.hosts || [];\n } else {\n this._loadServiceUrls(serviceGroup, [\n new ServiceUrl({\n ...serviceObj,\n }),\n ]);\n }\n });\n\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n\n return this;\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n return new Promise((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/* eslint-enable no-underscore-dangle */\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
@@ -73,6 +73,21 @@ var Services = _webexPlugin.default.extend({
73
73
  validateDomains: ['boolean', false, true],
74
74
  initFailed: ['boolean', false, false]
75
75
  },
76
+ session: {
77
+ /**
78
+ * Becomes `true` once the initial catalog collection has completed
79
+ * (successfully or otherwise) and any in-flight credentials refresh has
80
+ * settled. Blocks `webex.ready` so consumers can rely on `webex.ready`
81
+ * implying "catalogs populated AND credential state stable".
82
+ * @instance
83
+ * @memberof Services
84
+ * @type {boolean}
85
+ */
86
+ ready: {
87
+ default: false,
88
+ type: 'boolean'
89
+ }
90
+ },
76
91
  _catalogs: new _weakMap.default(),
77
92
  _serviceUrls: null,
78
93
  _hostCatalog: null,
@@ -1350,6 +1365,7 @@ var Services = _webexPlugin.default.extend({
1350
1365
 
1351
1366
  // Destructure the credentials plugin.
1352
1367
  var credentials = this.webex.credentials;
1368
+ var catalog = this._getCatalog();
1353
1369
 
1354
1370
  // Init a promise chain. Must be done as a Promise.resolve() to allow
1355
1371
  // credentials#getOrgId() to properly throw.
@@ -1366,9 +1382,13 @@ var Services = _webexPlugin.default.extend({
1366
1382
  }).then(function () {
1367
1383
  // Validate if the token is authorized.
1368
1384
  if (credentials.canAuthorize) {
1369
- // Attempt to collect the postauth catalog.
1370
-
1371
- return _this0.updateServices().catch(function () {
1385
+ // Attempt to collect the postauth catalog, then mark the catalog
1386
+ // ready. Setting `isReady` here - rather than only in the init
1387
+ // callers - means a slow postauth fetch that loses the gated-init
1388
+ // timeout race still marks the catalog ready once it completes.
1389
+ return _this0.updateServices().then(function () {
1390
+ catalog.isReady = true;
1391
+ }).catch(function () {
1372
1392
  _this0.initFailed = true;
1373
1393
  _this0.logger.warn('services: cannot retrieve postauth catalog');
1374
1394
  });
@@ -1378,6 +1398,42 @@ var Services = _webexPlugin.default.extend({
1378
1398
  return _promise.default.resolve();
1379
1399
  });
1380
1400
  },
1401
+ /**
1402
+ * Await any in-flight credentials refresh, then flip `services.ready` so
1403
+ * `webex.ready` can fire. Closes the parallel-refresh window: if a credential
1404
+ * refresh is in flight when initial catalog collection settles, we must not
1405
+ * signal ready until the refresh has resolved - otherwise downstream
1406
+ * consumers may observe `canAuthorize`/token state that is about to change
1407
+ * under them.
1408
+ *
1409
+ * @private
1410
+ * @returns {Promise<void>}
1411
+ */
1412
+ _finalizeReady: function _finalizeReady() {
1413
+ var _this1 = this;
1414
+ return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
1415
+ var credentials;
1416
+ return _regenerator.default.wrap(function (_context4) {
1417
+ while (1) switch (_context4.prev = _context4.next) {
1418
+ case 0:
1419
+ credentials = _this1.webex.credentials;
1420
+ if (!(credentials && credentials.isRefreshing)) {
1421
+ _context4.next = 1;
1422
+ break;
1423
+ }
1424
+ _context4.next = 1;
1425
+ return new _promise.default(function (resolve) {
1426
+ credentials.once('change:isRefreshing', resolve);
1427
+ });
1428
+ case 1:
1429
+ _this1.ready = true;
1430
+ case 2:
1431
+ case "end":
1432
+ return _context4.stop();
1433
+ }
1434
+ }, _callee4);
1435
+ }))();
1436
+ },
1381
1437
  /**
1382
1438
  * Initializer
1383
1439
  *
@@ -1386,7 +1442,7 @@ var Services = _webexPlugin.default.extend({
1386
1442
  * @returns {Services}
1387
1443
  */
1388
1444
  initialize: function initialize() {
1389
- var _this1 = this;
1445
+ var _this10 = this;
1390
1446
  var catalog = new _serviceCatalog.default();
1391
1447
  var registry = new _serviceRegistry.default();
1392
1448
  var state = new _serviceState.default();
@@ -1394,56 +1450,168 @@ var Services = _webexPlugin.default.extend({
1394
1450
  this.registries.set(this.webex, registry);
1395
1451
  this.states.set(this.webex, state);
1396
1452
 
1397
- // Listen for configuration changes once.
1453
+ // Listen for configuration changes once. The config is not populated on the
1454
+ // webex instance until the `change:config` event fires, so any decision that
1455
+ // depends on config values (such as the gated-vs-ungated init below) must be
1456
+ // made from within this handler rather than synchronously in `initialize()`.
1398
1457
  this.listenToOnce(this.webex, 'change:config', function () {
1399
- _this1.initConfig();
1400
- });
1458
+ var _this10$webex$config, _this10$webex$config$;
1459
+ _this10.initConfig();
1401
1460
 
1461
+ // Feature flag: when enabled, `webex.ready` is blocked until the initial
1462
+ // catalog collection has settled AND any in-flight credentials refresh has
1463
+ // completed. When disabled (the default), preserves the pre-existing
1464
+ // behavior where `webex.ready` fires as soon as `webex.loaded` does and
1465
+ // the catalog is collected out-of-band.
1466
+ var waitForCatalogInit = ((_this10$webex$config = _this10.webex.config) === null || _this10$webex$config === void 0 ? void 0 : (_this10$webex$config$ = _this10$webex$config.services) === null || _this10$webex$config$ === void 0 ? void 0 : _this10$webex$config$.waitForCatalogInit) === true;
1467
+ if (waitForCatalogInit) {
1468
+ _this10._initializeCatalogsGated(catalog);
1469
+ } else {
1470
+ // Not gating - immediately mark ready so we do not block webex.ready.
1471
+ _this10.ready = true;
1472
+ _this10._initializeCatalogsUngated(catalog);
1473
+ }
1474
+ });
1475
+ },
1476
+ /**
1477
+ * Original (pre-verified-ready) initialization path. Runs on `webex.ready`
1478
+ * and collects catalogs opportunistically without blocking anything.
1479
+ *
1480
+ * @private
1481
+ * @param {ServiceCatalog} catalog
1482
+ * @returns {void}
1483
+ */
1484
+ _initializeCatalogsUngated: function _initializeCatalogsUngated(catalog) {
1485
+ var _this11 = this;
1402
1486
  // wait for webex instance to be ready before attempting
1403
1487
  // to update the service catalogs
1404
1488
  // this can cause a race condition because credentials may
1405
1489
  // not be valid when services is initialized
1406
- this.listenToOnce(this.webex, 'ready', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee4() {
1490
+ this.listenToOnce(this.webex, 'ready', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee5() {
1407
1491
  var cachedCatalog, supertoken, email;
1408
- return _regenerator.default.wrap(function (_context4) {
1409
- while (1) switch (_context4.prev = _context4.next) {
1492
+ return _regenerator.default.wrap(function (_context5) {
1493
+ while (1) switch (_context5.prev = _context5.next) {
1410
1494
  case 0:
1411
- _context4.next = 1;
1412
- return _this1._loadCatalogFromCache();
1495
+ _context5.next = 1;
1496
+ return _this11._loadCatalogFromCache();
1413
1497
  case 1:
1414
- cachedCatalog = _context4.sent;
1498
+ cachedCatalog = _context5.sent;
1415
1499
  if (!cachedCatalog) {
1416
- _context4.next = 2;
1500
+ _context5.next = 2;
1417
1501
  break;
1418
1502
  }
1419
1503
  catalog.isReady = true;
1420
- return _context4.abrupt("return");
1504
+ return _context5.abrupt("return");
1421
1505
  case 2:
1422
- supertoken = _this1.webex.credentials.supertoken; // Validate if the supertoken exists.
1506
+ supertoken = _this11.webex.credentials.supertoken; // Validate if the supertoken exists.
1423
1507
  if (supertoken && supertoken.access_token) {
1424
- _this1.initServiceCatalogs().then(function () {
1425
- catalog.isReady = true;
1426
- }).catch(function (error) {
1427
- _this1.initFailed = true;
1428
- _this1.logger.error("services: failed to init initial services when credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1508
+ // `initServiceCatalogs` marks the catalog ready internally once the
1509
+ // postauth catalog is collected.
1510
+ _this11.initServiceCatalogs().catch(function (error) {
1511
+ _this11.initFailed = true;
1512
+ _this11.logger.error("services: failed to init initial services when credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1429
1513
  });
1430
1514
  } else {
1431
- email = _this1.webex.config.email;
1432
- _this1.collectPreauthCatalog(email ? {
1515
+ email = _this11.webex.config.email;
1516
+ _this11.collectPreauthCatalog(email ? {
1433
1517
  email: email
1434
1518
  } : undefined).catch(function (error) {
1435
- _this1.initFailed = true;
1436
- _this1.logger.error("services: failed to init initial services when no credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1519
+ _this11.initFailed = true;
1520
+ _this11.logger.error("services: failed to init initial services when no credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1437
1521
  });
1438
1522
  }
1439
1523
  case 3:
1440
1524
  case "end":
1441
- return _context4.stop();
1525
+ return _context5.stop();
1442
1526
  }
1443
- }, _callee4);
1527
+ }, _callee5);
1528
+ })));
1529
+ },
1530
+ /**
1531
+ * Verified-ready initialization path. Blocks `webex.ready` until the initial
1532
+ * catalog fetch has settled (or timed out) AND any in-flight credentials
1533
+ * refresh has completed. Also handles the fresh-login case where OAuth
1534
+ * completes after `loaded` fires.
1535
+ *
1536
+ * @private
1537
+ * @param {ServiceCatalog} catalog
1538
+ * @returns {void}
1539
+ */
1540
+ _initializeCatalogsGated: function _initializeCatalogsGated(catalog) {
1541
+ var _this12 = this;
1542
+ // Wait for storage to be loaded before attempting to update the service
1543
+ // catalogs. We listen for 'loaded' instead of 'ready' because `services.ready`
1544
+ // now blocks `webex.ready` - listening to 'ready' would deadlock.
1545
+ this.listenToOnce(this.webex, 'loaded', /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee6() {
1546
+ var _this12$webex$config, _this12$webex$config$;
1547
+ var cachedCatalog, supertoken, initTimeoutMs, initServiceCatalogsTimeout, email;
1548
+ return _regenerator.default.wrap(function (_context6) {
1549
+ while (1) switch (_context6.prev = _context6.next) {
1550
+ case 0:
1551
+ _context6.next = 1;
1552
+ return _this12._loadCatalogFromCache();
1553
+ case 1:
1554
+ cachedCatalog = _context6.sent;
1555
+ if (!cachedCatalog) {
1556
+ _context6.next = 3;
1557
+ break;
1558
+ }
1559
+ catalog.isReady = true;
1560
+ _context6.next = 2;
1561
+ return _this12._finalizeReady();
1562
+ case 2:
1563
+ return _context6.abrupt("return");
1564
+ case 3:
1565
+ supertoken = _this12.webex.credentials.supertoken; // Race init against a hard timeout so a hung request never leaves
1566
+ // `services.ready` false forever - that would stall `webex.ready` and
1567
+ // leave consumers waiting on it indefinitely. Timeout is configurable via
1568
+ // `config.services.catalogInitTimeout` (defaults to 15s in config).
1569
+ initTimeoutMs = (_this12$webex$config = _this12.webex.config) === null || _this12$webex$config === void 0 ? void 0 : (_this12$webex$config$ = _this12$webex$config.services) === null || _this12$webex$config$ === void 0 ? void 0 : _this12$webex$config$.catalogInitTimeout;
1570
+ initServiceCatalogsTimeout = new _promise.default(function (_, reject) {
1571
+ setTimeout(function () {
1572
+ return reject(new Error("services: init timed out after ".concat(initTimeoutMs, "ms")));
1573
+ }, initTimeoutMs);
1574
+ }); // Validate if the supertoken exists.
1575
+ if (supertoken && supertoken.access_token) {
1576
+ // `initServiceCatalogs` marks the catalog ready internally once the
1577
+ // postauth catalog is collected - even if it loses the timeout race
1578
+ // above, so a slow fetch still eventually flips `catalog.isReady`.
1579
+ _promise.default.race([_this12.initServiceCatalogs(), initServiceCatalogsTimeout]).catch(function (error) {
1580
+ _this12.initFailed = true;
1581
+ _this12.logger.error("services: failed to init initial services when credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1582
+ }).finally(function () {
1583
+ return _this12._finalizeReady();
1584
+ });
1585
+ } else {
1586
+ email = _this12.webex.config.email;
1587
+ _promise.default.race([_this12.collectPreauthCatalog(email ? {
1588
+ email: email
1589
+ } : undefined), initServiceCatalogsTimeout]).catch(function (error) {
1590
+ _this12.initFailed = true;
1591
+ _this12.logger.error("services: failed to init initial services when no credentials available, ".concat(error === null || error === void 0 ? void 0 : error.message));
1592
+ }).finally(function () {
1593
+ return _this12._finalizeReady();
1594
+ });
1595
+
1596
+ // Handle fresh login: 'loaded' fires before OAuth completes, so listen
1597
+ // for `canAuthorize` flipping true and then collect the postauth catalog.
1598
+ _this12.listenToOnce(_this12.webex, 'change:canAuthorize', function () {
1599
+ if (_this12.webex.canAuthorize && !catalog.status.postauth.ready) {
1600
+ // `initServiceCatalogs` marks the catalog ready internally.
1601
+ _this12.initServiceCatalogs().catch(function (error) {
1602
+ _this12.logger.error("services: failed to init service catalogs after auth, ".concat(error === null || error === void 0 ? void 0 : error.message));
1603
+ });
1604
+ }
1605
+ });
1606
+ }
1607
+ case 4:
1608
+ case "end":
1609
+ return _context6.stop();
1610
+ }
1611
+ }, _callee6);
1444
1612
  })));
1445
1613
  },
1446
- version: "3.12.0-next.4"
1614
+ version: "3.12.0-next.40"
1447
1615
  });
1448
1616
  /* eslint-enable no-underscore-dangle */
1449
1617
  var _default = exports.default = Services;