@webex/webex-core 3.12.0-next.5 → 3.12.0-next.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -1
- package/dist/credentials-config.js +12 -0
- package/dist/credentials-config.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/catalog-url.js +87 -0
- package/dist/interceptors/catalog-url.js.map +1 -0
- package/dist/interceptors/payload-transformer.js +25 -4
- package/dist/interceptors/payload-transformer.js.map +1 -1
- package/dist/lib/batcher.js +23 -7
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +103 -4
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/domains.js +90 -0
- package/dist/lib/domains.js.map +1 -0
- package/dist/lib/services/service-catalog.js +108 -18
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/services.js +232 -34
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/services-v2/service-catalog.js +14 -13
- package/dist/lib/services-v2/service-catalog.js.map +1 -1
- package/dist/lib/services-v2/services-v2.js +241 -37
- package/dist/lib/services-v2/services-v2.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +11 -3
- package/dist/webex-core.js.map +1 -1
- package/package.json +13 -13
- package/src/config.js +42 -0
- package/src/credentials-config.js +13 -0
- package/src/index.js +1 -0
- package/src/interceptors/catalog-url.js +66 -0
- package/src/interceptors/payload-transformer.js +23 -1
- package/src/lib/batcher.js +25 -10
- package/src/lib/credentials/credentials.js +93 -3
- package/src/lib/domains.ts +94 -0
- package/src/lib/services/service-catalog.js +112 -16
- package/src/lib/services/services.js +208 -20
- package/src/lib/services-v2/service-catalog.ts +16 -12
- package/src/lib/services-v2/services-v2.ts +218 -21
- package/src/webex-core.js +8 -0
- package/test/fixtures/activation-email.ts +22 -0
- package/test/integration/spec/services/services.js +183 -112
- package/test/integration/spec/services-v2/services-v2.js +169 -98
- package/test/unit/spec/credentials/credentials.js +247 -3
- package/test/unit/spec/interceptors/auth.js +56 -0
- package/test/unit/spec/interceptors/catalog-url.js +224 -0
- package/test/unit/spec/interceptors/payload-transformer.js +119 -1
- package/test/unit/spec/lib/batcher.js +56 -0
- package/test/unit/spec/services/service-catalog.js +368 -11
- package/test/unit/spec/services/services.js +440 -2
- package/test/unit/spec/services-v2/service-catalog.ts +134 -11
- package/test/unit/spec/services-v2/services-v2.ts +467 -0
- package/test/unit/spec/webex-core.js +77 -1
|
@@ -15,19 +15,108 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
15
15
|
value: true
|
|
16
16
|
});
|
|
17
17
|
exports.default = void 0;
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
exports.matchesCatalogUrl = matchesCatalogUrl;
|
|
19
|
+
exports.matchesParsedCatalogUrl = matchesParsedCatalogUrl;
|
|
20
|
+
exports.parseCatalogUrl = parseCatalogUrl;
|
|
20
21
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
21
22
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
|
23
|
+
var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
|
|
24
|
+
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
25
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
22
26
|
var _url = _interopRequireDefault(require("url"));
|
|
23
27
|
var _ampersandState = _interopRequireDefault(require("ampersand-state"));
|
|
24
28
|
var _lodash = require("lodash");
|
|
25
29
|
var _serviceUrl = _interopRequireDefault(require("./service-url"));
|
|
30
|
+
var _domains = require("../domains");
|
|
26
31
|
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
32
|
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
33
|
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; } } }; }
|
|
29
34
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
30
35
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
36
|
+
// Catalog base URLs are a small, stable set, so their parsed origin/path is
|
|
37
|
+
// memoized to avoid repeated `new URL()` work when scanning the catalog on the
|
|
38
|
+
// request hot path.
|
|
39
|
+
var catalogUrlCache = new _map.default();
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Parse a catalog URL into the origin and normalized path used for matching,
|
|
43
|
+
* memoizing the result. Returns null when the URL is unparsable.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} catalogUrlString - The catalog URL to parse
|
|
46
|
+
* @returns {{origin: string, path: string} | null} - Parsed catalog URL, or null
|
|
47
|
+
*/
|
|
48
|
+
function parseCatalogUrl(catalogUrlString) {
|
|
49
|
+
if (catalogUrlCache.has(catalogUrlString)) {
|
|
50
|
+
return catalogUrlCache.get(catalogUrlString);
|
|
51
|
+
}
|
|
52
|
+
var parsed = null;
|
|
53
|
+
try {
|
|
54
|
+
var catalogUrl = new URL(catalogUrlString);
|
|
55
|
+
|
|
56
|
+
// Normalize paths by removing trailing slashes (except root "/")
|
|
57
|
+
parsed = {
|
|
58
|
+
origin: catalogUrl.origin,
|
|
59
|
+
path: catalogUrl.pathname.replace(/\/$/, '') || '/'
|
|
60
|
+
};
|
|
61
|
+
} catch (_unused) {
|
|
62
|
+
parsed = null;
|
|
63
|
+
}
|
|
64
|
+
catalogUrlCache.set(catalogUrlString, parsed);
|
|
65
|
+
return parsed;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check if an already-parsed candidate URL matches a parsed catalog URL with
|
|
70
|
+
* proper origin validation. Allocates nothing, so it is safe to call in a tight
|
|
71
|
+
* loop over the whole catalog.
|
|
72
|
+
*
|
|
73
|
+
* @param {URL} candidateUrl - The parsed candidate URL to validate
|
|
74
|
+
* @param {{origin: string, path: string} | null} parsedCatalogUrl - The parsed catalog URL
|
|
75
|
+
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
76
|
+
*/
|
|
77
|
+
function matchesParsedCatalogUrl(candidateUrl, parsedCatalogUrl) {
|
|
78
|
+
if (!candidateUrl || !parsedCatalogUrl) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Origins must match exactly (scheme + host + port)
|
|
83
|
+
if (candidateUrl.origin !== parsedCatalogUrl.origin) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
var catalogPath = parsedCatalogUrl.path;
|
|
87
|
+
if (catalogPath === '/') {
|
|
88
|
+
// Root path matches everything under this origin
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
var candidatePath = candidateUrl.pathname;
|
|
92
|
+
if (candidatePath.startsWith(catalogPath)) {
|
|
93
|
+
// Ensure we're at a path boundary, not mid-segment
|
|
94
|
+
// e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
|
|
95
|
+
// nextChar is undefined for exact match, '/' for valid extension
|
|
96
|
+
var nextChar = candidatePath[catalogPath.length];
|
|
97
|
+
return nextChar === '/' || nextChar === undefined;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Check if a candidate URL matches a catalog URL with proper origin validation.
|
|
104
|
+
* This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
|
|
105
|
+
*
|
|
106
|
+
* @param {string} candidateUrlString - The URL to validate
|
|
107
|
+
* @param {string} catalogUrlString - The catalog URL to compare against
|
|
108
|
+
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
109
|
+
*/
|
|
110
|
+
function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
|
|
111
|
+
var candidateUrl;
|
|
112
|
+
try {
|
|
113
|
+
candidateUrl = new URL(candidateUrlString);
|
|
114
|
+
} catch (_unused2) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));
|
|
118
|
+
}
|
|
119
|
+
|
|
31
120
|
/* eslint-disable no-underscore-dangle */
|
|
32
121
|
/**
|
|
33
122
|
* @class
|
|
@@ -254,15 +343,21 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
254
343
|
*/
|
|
255
344
|
findServiceUrlFromUrl: function findServiceUrlFromUrl(url) {
|
|
256
345
|
var serviceUrls = [].concat((0, _toConsumableArray2.default)(this.serviceGroups.discovery), (0, _toConsumableArray2.default)(this.serviceGroups.preauth), (0, _toConsumableArray2.default)(this.serviceGroups.signin), (0, _toConsumableArray2.default)(this.serviceGroups.postauth), (0, _toConsumableArray2.default)(this.serviceGroups.override));
|
|
346
|
+
|
|
347
|
+
// Invalid URLs cannot match any service
|
|
348
|
+
var candidateUrl;
|
|
349
|
+
try {
|
|
350
|
+
candidateUrl = new URL(url);
|
|
351
|
+
} catch (_unused3) {
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
257
354
|
return serviceUrls.find(function (serviceUrl) {
|
|
258
|
-
// Check
|
|
259
|
-
if (
|
|
355
|
+
// Check if the URL matches the default URL with proper origin validation
|
|
356
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {
|
|
260
357
|
return true;
|
|
261
358
|
}
|
|
262
359
|
|
|
263
|
-
//
|
|
264
|
-
// These are made by swapping the host of the default URL
|
|
265
|
-
// with that of an alternate host
|
|
360
|
+
// Check alternate URLs (built by swapping host with alternate hosts)
|
|
266
361
|
var _iterator4 = _createForOfIteratorHelper(serviceUrl.hosts),
|
|
267
362
|
_step4;
|
|
268
363
|
try {
|
|
@@ -270,7 +365,7 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
270
365
|
var host = _step4.value;
|
|
271
366
|
var alternateUrl = new URL(serviceUrl.defaultUrl);
|
|
272
367
|
alternateUrl.host = host.host;
|
|
273
|
-
if (
|
|
368
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(alternateUrl.toString()))) {
|
|
274
369
|
return true;
|
|
275
370
|
}
|
|
276
371
|
}
|
|
@@ -283,19 +378,14 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
283
378
|
});
|
|
284
379
|
},
|
|
285
380
|
/**
|
|
286
|
-
* Finds an allowed domain that matches a specific url.
|
|
381
|
+
* Finds an allowed domain that matches a specific url. The url's hostname
|
|
382
|
+
* must be the allowed domain itself or a subdomain of it.
|
|
287
383
|
*
|
|
288
384
|
* @param {string} url - The url to match the allowed domains against.
|
|
289
385
|
* @returns {string} - The matching allowed domain.
|
|
290
386
|
*/
|
|
291
387
|
findAllowedDomain: function findAllowedDomain(url) {
|
|
292
|
-
|
|
293
|
-
if (!urlObj.host) {
|
|
294
|
-
return undefined;
|
|
295
|
-
}
|
|
296
|
-
return this.allowedDomains.find(function (allowedDomain) {
|
|
297
|
-
return urlObj.host.includes(allowedDomain);
|
|
298
|
-
});
|
|
388
|
+
return (0, _domains.matchAllowedDomain)(url, this.allowedDomains);
|
|
299
389
|
},
|
|
300
390
|
/**
|
|
301
391
|
* Get a service url from the current services list by name.
|
|
@@ -363,7 +453,7 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
363
453
|
* @returns {void}
|
|
364
454
|
*/
|
|
365
455
|
setAllowedDomains: function setAllowedDomains(allowedDomains) {
|
|
366
|
-
this.allowedDomains = (0,
|
|
456
|
+
this.allowedDomains = (0, _domains.normalizeAllowedDomains)(allowedDomains);
|
|
367
457
|
},
|
|
368
458
|
/**
|
|
369
459
|
*
|
|
@@ -371,7 +461,7 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
371
461
|
* @returns {void}
|
|
372
462
|
*/
|
|
373
463
|
addAllowedDomains: function addAllowedDomains(newAllowedDomains) {
|
|
374
|
-
this.allowedDomains = (0, _lodash.union)(this.allowedDomains, newAllowedDomains);
|
|
464
|
+
this.allowedDomains = (0, _lodash.union)(this.allowedDomains, (0, _domains.normalizeAllowedDomains)(newAllowedDomains));
|
|
375
465
|
},
|
|
376
466
|
/**
|
|
377
467
|
* 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","catalogUrlCache","_map","parseCatalogUrl","catalogUrlString","has","get","parsed","catalogUrl","URL","origin","path","pathname","replace","_unused","set","matchesParsedCatalogUrl","candidateUrl","parsedCatalogUrl","catalogPath","candidatePath","startsWith","nextChar","undefined","matchesCatalogUrl","candidateUrlString","_unused2","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","findServiceFromClusterId","_ref","clusterId","_ref$priorityHost","priorityHost","identifiedServiceUrl","findServiceUrlFromUrl","_unused3","_iterator4","_step4","alternateUrl","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// Catalog base URLs are a small, stable set, so their parsed origin/path is\n// memoized to avoid repeated `new URL()` work when scanning the catalog on the\n// request hot path.\nconst catalogUrlCache = new Map();\n\n/**\n * Parse a catalog URL into the origin and normalized path used for matching,\n * memoizing the result. Returns null when the URL is unparsable.\n *\n * @param {string} catalogUrlString - The catalog URL to parse\n * @returns {{origin: string, path: string} | null} - Parsed catalog URL, or null\n */\nexport function parseCatalogUrl(catalogUrlString) {\n if (catalogUrlCache.has(catalogUrlString)) {\n return catalogUrlCache.get(catalogUrlString);\n }\n\n let parsed = null;\n\n try {\n const catalogUrl = new URL(catalogUrlString);\n\n // Normalize paths by removing trailing slashes (except root \"/\")\n parsed = {origin: catalogUrl.origin, path: catalogUrl.pathname.replace(/\\/$/, '') || '/'};\n } catch {\n parsed = null;\n }\n\n catalogUrlCache.set(catalogUrlString, parsed);\n\n return parsed;\n}\n\n/**\n * Check if an already-parsed candidate URL matches a parsed catalog URL with\n * proper origin validation. Allocates nothing, so it is safe to call in a tight\n * loop over the whole catalog.\n *\n * @param {URL} candidateUrl - The parsed candidate URL to validate\n * @param {{origin: string, path: string} | null} parsedCatalogUrl - The parsed catalog URL\n * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path\n */\nexport function matchesParsedCatalogUrl(candidateUrl, parsedCatalogUrl) {\n if (!candidateUrl || !parsedCatalogUrl) {\n return false;\n }\n\n // Origins must match exactly (scheme + host + port)\n if (candidateUrl.origin !== parsedCatalogUrl.origin) {\n return false;\n }\n\n const catalogPath = parsedCatalogUrl.path;\n\n if (catalogPath === '/') {\n // Root path matches everything under this origin\n return true;\n }\n\n const candidatePath = candidateUrl.pathname;\n\n if (candidatePath.startsWith(catalogPath)) {\n // Ensure we're at a path boundary, not mid-segment\n // e.g., /api/v1 should match /api/v1/foo but not /api/v1extra\n // nextChar is undefined for exact match, '/' for valid extension\n const nextChar = candidatePath[catalogPath.length];\n\n return nextChar === '/' || nextChar === undefined;\n }\n\n return false;\n}\n\n/**\n * Check if a candidate URL matches a catalog URL with proper origin validation.\n * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example\n *\n * @param {string} candidateUrlString - The URL to validate\n * @param {string} catalogUrlString - The catalog URL to compare against\n * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path\n */\nexport function matchesCatalogUrl(candidateUrlString, catalogUrlString) {\n let candidateUrl;\n\n try {\n candidateUrl = new URL(candidateUrlString);\n } catch {\n return false;\n }\n\n return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));\n}\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 // Invalid URLs cannot match any service\n let candidateUrl;\n\n try {\n candidateUrl = new URL(url);\n } catch {\n return undefined;\n }\n\n return serviceUrls.find((serviceUrl) => {\n // Check if the URL matches the default URL with proper origin validation\n if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {\n return true;\n }\n\n // Check alternate URLs (built by swapping host with alternate hosts)\n for (const host of serviceUrl.hosts) {\n const alternateUrl = new URL(serviceUrl.defaultUrl);\n alternateUrl.host = host.host;\n\n if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(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":[]}
|