@webex/webex-core 3.12.0-next.47 → 3.12.0-next.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.js CHANGED
@@ -123,6 +123,11 @@ var _default = exports.default = {
123
123
  cacheU2C: false
124
124
  },
125
125
  payloadTransformer: {
126
+ /**
127
+ * When true, inbound payload transforms run at most once for the same successful response object.
128
+ * This supports request flows that pass a response through more than one interceptor pipeline.
129
+ */
130
+ skipRepeatedInboundTransforms: false,
126
131
  predicates: [],
127
132
  transforms: []
128
133
  },
@@ -1 +1 @@
1
- {"version":3,"names":["_storage","require","_credentialsConfig","_interopRequireDefault","_default","exports","default","maxAppLevelRedirects","maxLocusRedirects","maxAuthenticationReplays","maxReconnectAttempts","onBeforeLogout","trackingIdPrefix","trackingIdSuffix","AlternateLogger","undefined","credentials","CredentialsConfig","fedramp","process","env","ENABLE_FEDRAMP","services","useUserOnboardingServiceForActivations","useCatalogOverride","skipPreauthCatalogOnUnauthenticated","catalogInitTimeout","discovery","hydra","HYDRA_SERVICE_URL","sqdiscovery","SQDISCOVERY_SERVICE_URL","u2c","U2C_SERVICE_URL","validateDomains","validateCatalogUrls","servicesNotNeedValidation","allowedDomains","device","preDiscoveryServices","hydraServiceUrl","metrics","type","calling","cacheU2C","payloadTransformer","predicates","transforms","storage","boundedAdapter","MemoryStoreAdapter","unboundedAdapter"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {MemoryStoreAdapter} from './lib/storage';\nimport CredentialsConfig from './credentials-config';\n\nexport default {\n maxAppLevelRedirects: 10,\n maxLocusRedirects: 5,\n maxAuthenticationReplays: 1,\n maxReconnectAttempts: 1,\n onBeforeLogout: [],\n trackingIdPrefix: 'webex-js-sdk',\n trackingIdSuffix: '',\n AlternateLogger: undefined,\n credentials: new CredentialsConfig(),\n fedramp: process.env.ENABLE_FEDRAMP || false,\n services: {\n /**\n * When true, uses the user-onboarding service for user activation.\n * When false (default), uses the license service.\n *\n * @type {boolean}\n */\n useUserOnboardingServiceForActivations: false,\n\n /**\n * When true, requests the U2C catalog override.\n *\n * @type {boolean}\n */\n useCatalogOverride: false,\n\n /**\n * When true, skips fetching the preauth catalog during initialization\n * while the user is unauthenticated (no existing token). The catalog is\n * expected to be collected manually later instead. When false (default),\n * the preauth catalog is collected automatically during init.\n *\n * @type {boolean}\n */\n skipPreauthCatalogOnUnauthenticated: false,\n\n /**\n * Maximum time (in milliseconds) to wait for the initial service catalog\n * collection when `waitForCatalogInit` is enabled, before letting\n * `services.ready` (and therefore `webex.ready`) fire anyway. Prevents a\n * hung catalog request from leaving the app on a permanent spinner.\n *\n * @type {number}\n */\n catalogInitTimeout: 15000,\n\n /**\n * A list of services that are available prior to catalog collection.\n *\n * @type {Object}\n */\n discovery: {\n /**\n * The hydra discovery url.\n *\n * @type {string}\n */\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n\n /**\n * load balanced region info url\n */\n sqdiscovery: process.env.SQDISCOVERY_SERVICE_URL || 'https://ds.ciscospark.com/v1/region',\n\n /**\n * The u2c discovery url\n *\n * @type {string}\n */\n u2c: process.env.U2C_SERVICE_URL || 'https://u2c.wbx2.com/u2c/api/v1',\n },\n\n /**\n * When true, considers all urls in `allowedDomains` as safe for auth tokens\n *\n * @type {boolean}\n */\n validateDomains: true,\n\n /**\n * When true, enables the CatalogUrlInterceptor which validates that all\n * outbound request URLs are in the service catalog or allowed domains.\n * This prevents SSRF attacks where attacker-controlled URLs could be\n * sent to the SDK.\n *\n * @type {boolean}\n */\n validateCatalogUrls: false,\n\n /**\n * services that don't need auth validation\n */\n\n servicesNotNeedValidation: ['webex-appapi-service'],\n\n /**\n * Contains a list of allowed domain host addresses.\n *\n * @type {Array<string>}\n */\n allowedDomains: [],\n },\n device: {\n preDiscoveryServices: {\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n hydraServiceUrl: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n },\n validateDomains: true,\n },\n metrics: {\n type: ['behavioral', 'operational'],\n },\n calling: {\n /**\n * Controls whether U2C service catalogs should be cached and warmed from cache.\n * When false, the services layer will skip reading and writing the U2C cache.\n */\n cacheU2C: false,\n },\n payloadTransformer: {\n predicates: [],\n transforms: [],\n },\n storage: {\n boundedAdapter: MemoryStoreAdapter,\n unboundedAdapter: MemoryStoreAdapter,\n },\n};\n"],"mappings":";;;;;;;;AAMA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;AAEA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAKe;EACbC,oBAAoB,EAAE,EAAE;EACxBC,iBAAiB,EAAE,CAAC;EACpBC,wBAAwB,EAAE,CAAC;EAC3BC,oBAAoB,EAAE,CAAC;EACvBC,cAAc,EAAE,EAAE;EAClBC,gBAAgB,EAAE,cAAc;EAChCC,gBAAgB,EAAE,EAAE;EACpBC,eAAe,EAAEC,SAAS;EAC1BC,WAAW,EAAE,IAAIC,0BAAiB,CAAC,CAAC;EACpCC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAACC,cAAc,IAAI,KAAK;EAC5CC,QAAQ,EAAE;IACR;AACJ;AACA;AACA;AACA;AACA;IACIC,sCAAsC,EAAE,KAAK;IAE7C;AACJ;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mCAAmC,EAAE,KAAK;IAE1C;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;IACIC,SAAS,EAAE;MACT;AACN;AACA;AACA;AACA;MACMC,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MAEvE;AACN;AACA;MACMC,WAAW,EAAEX,OAAO,CAACC,GAAG,CAACW,uBAAuB,IAAI,qCAAqC;MAEzF;AACN;AACA;AACA;AACA;MACMC,GAAG,EAAEb,OAAO,CAACC,GAAG,CAACa,eAAe,IAAI;IACtC,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIC,eAAe,EAAE,IAAI;IAErB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mBAAmB,EAAE,KAAK;IAE1B;AACJ;AACA;;IAEIC,yBAAyB,EAAE,CAAC,sBAAsB,CAAC;IAEnD;AACJ;AACA;AACA;AACA;IACIC,cAAc,EAAE;EAClB,CAAC;EACDC,MAAM,EAAE;IACNC,oBAAoB,EAAE;MACpBX,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MACvEW,eAAe,EAAErB,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI;IACpD,CAAC;IACDK,eAAe,EAAE;EACnB,CAAC;EACDO,OAAO,EAAE;IACPC,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa;EACpC,CAAC;EACDC,OAAO,EAAE;IACP;AACJ;AACA;AACA;IACIC,QAAQ,EAAE;EACZ,CAAC;EACDC,kBAAkB,EAAE;IAClBC,UAAU,EAAE,EAAE;IACdC,UAAU,EAAE;EACd,CAAC;EACDC,OAAO,EAAE;IACPC,cAAc,EAAEC,2BAAkB;IAClCC,gBAAgB,EAAED;EACpB;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_storage","require","_credentialsConfig","_interopRequireDefault","_default","exports","default","maxAppLevelRedirects","maxLocusRedirects","maxAuthenticationReplays","maxReconnectAttempts","onBeforeLogout","trackingIdPrefix","trackingIdSuffix","AlternateLogger","undefined","credentials","CredentialsConfig","fedramp","process","env","ENABLE_FEDRAMP","services","useUserOnboardingServiceForActivations","useCatalogOverride","skipPreauthCatalogOnUnauthenticated","catalogInitTimeout","discovery","hydra","HYDRA_SERVICE_URL","sqdiscovery","SQDISCOVERY_SERVICE_URL","u2c","U2C_SERVICE_URL","validateDomains","validateCatalogUrls","servicesNotNeedValidation","allowedDomains","device","preDiscoveryServices","hydraServiceUrl","metrics","type","calling","cacheU2C","payloadTransformer","skipRepeatedInboundTransforms","predicates","transforms","storage","boundedAdapter","MemoryStoreAdapter","unboundedAdapter"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {MemoryStoreAdapter} from './lib/storage';\nimport CredentialsConfig from './credentials-config';\n\nexport default {\n maxAppLevelRedirects: 10,\n maxLocusRedirects: 5,\n maxAuthenticationReplays: 1,\n maxReconnectAttempts: 1,\n onBeforeLogout: [],\n trackingIdPrefix: 'webex-js-sdk',\n trackingIdSuffix: '',\n AlternateLogger: undefined,\n credentials: new CredentialsConfig(),\n fedramp: process.env.ENABLE_FEDRAMP || false,\n services: {\n /**\n * When true, uses the user-onboarding service for user activation.\n * When false (default), uses the license service.\n *\n * @type {boolean}\n */\n useUserOnboardingServiceForActivations: false,\n\n /**\n * When true, requests the U2C catalog override.\n *\n * @type {boolean}\n */\n useCatalogOverride: false,\n\n /**\n * When true, skips fetching the preauth catalog during initialization\n * while the user is unauthenticated (no existing token). The catalog is\n * expected to be collected manually later instead. When false (default),\n * the preauth catalog is collected automatically during init.\n *\n * @type {boolean}\n */\n skipPreauthCatalogOnUnauthenticated: false,\n\n /**\n * Maximum time (in milliseconds) to wait for the initial service catalog\n * collection when `waitForCatalogInit` is enabled, before letting\n * `services.ready` (and therefore `webex.ready`) fire anyway. Prevents a\n * hung catalog request from leaving the app on a permanent spinner.\n *\n * @type {number}\n */\n catalogInitTimeout: 15000,\n\n /**\n * A list of services that are available prior to catalog collection.\n *\n * @type {Object}\n */\n discovery: {\n /**\n * The hydra discovery url.\n *\n * @type {string}\n */\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n\n /**\n * load balanced region info url\n */\n sqdiscovery: process.env.SQDISCOVERY_SERVICE_URL || 'https://ds.ciscospark.com/v1/region',\n\n /**\n * The u2c discovery url\n *\n * @type {string}\n */\n u2c: process.env.U2C_SERVICE_URL || 'https://u2c.wbx2.com/u2c/api/v1',\n },\n\n /**\n * When true, considers all urls in `allowedDomains` as safe for auth tokens\n *\n * @type {boolean}\n */\n validateDomains: true,\n\n /**\n * When true, enables the CatalogUrlInterceptor which validates that all\n * outbound request URLs are in the service catalog or allowed domains.\n * This prevents SSRF attacks where attacker-controlled URLs could be\n * sent to the SDK.\n *\n * @type {boolean}\n */\n validateCatalogUrls: false,\n\n /**\n * services that don't need auth validation\n */\n\n servicesNotNeedValidation: ['webex-appapi-service'],\n\n /**\n * Contains a list of allowed domain host addresses.\n *\n * @type {Array<string>}\n */\n allowedDomains: [],\n },\n device: {\n preDiscoveryServices: {\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n hydraServiceUrl: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n },\n validateDomains: true,\n },\n metrics: {\n type: ['behavioral', 'operational'],\n },\n calling: {\n /**\n * Controls whether U2C service catalogs should be cached and warmed from cache.\n * When false, the services layer will skip reading and writing the U2C cache.\n */\n cacheU2C: false,\n },\n payloadTransformer: {\n /**\n * When true, inbound payload transforms run at most once for the same successful response object.\n * This supports request flows that pass a response through more than one interceptor pipeline.\n */\n skipRepeatedInboundTransforms: false,\n predicates: [],\n transforms: [],\n },\n storage: {\n boundedAdapter: MemoryStoreAdapter,\n unboundedAdapter: MemoryStoreAdapter,\n },\n};\n"],"mappings":";;;;;;;;AAMA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;AAEA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAKe;EACbC,oBAAoB,EAAE,EAAE;EACxBC,iBAAiB,EAAE,CAAC;EACpBC,wBAAwB,EAAE,CAAC;EAC3BC,oBAAoB,EAAE,CAAC;EACvBC,cAAc,EAAE,EAAE;EAClBC,gBAAgB,EAAE,cAAc;EAChCC,gBAAgB,EAAE,EAAE;EACpBC,eAAe,EAAEC,SAAS;EAC1BC,WAAW,EAAE,IAAIC,0BAAiB,CAAC,CAAC;EACpCC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAACC,cAAc,IAAI,KAAK;EAC5CC,QAAQ,EAAE;IACR;AACJ;AACA;AACA;AACA;AACA;IACIC,sCAAsC,EAAE,KAAK;IAE7C;AACJ;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mCAAmC,EAAE,KAAK;IAE1C;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;IACIC,SAAS,EAAE;MACT;AACN;AACA;AACA;AACA;MACMC,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MAEvE;AACN;AACA;MACMC,WAAW,EAAEX,OAAO,CAACC,GAAG,CAACW,uBAAuB,IAAI,qCAAqC;MAEzF;AACN;AACA;AACA;AACA;MACMC,GAAG,EAAEb,OAAO,CAACC,GAAG,CAACa,eAAe,IAAI;IACtC,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIC,eAAe,EAAE,IAAI;IAErB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mBAAmB,EAAE,KAAK;IAE1B;AACJ;AACA;;IAEIC,yBAAyB,EAAE,CAAC,sBAAsB,CAAC;IAEnD;AACJ;AACA;AACA;AACA;IACIC,cAAc,EAAE;EAClB,CAAC;EACDC,MAAM,EAAE;IACNC,oBAAoB,EAAE;MACpBX,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MACvEW,eAAe,EAAErB,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI;IACpD,CAAC;IACDK,eAAe,EAAE;EACnB,CAAC;EACDO,OAAO,EAAE;IACPC,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa;EACpC,CAAC;EACDC,OAAO,EAAE;IACP;AACJ;AACA;AACA;IACIC,QAAQ,EAAE;EACZ,CAAC;EACDC,kBAAkB,EAAE;IAClB;AACJ;AACA;AACA;IACIC,6BAA6B,EAAE,KAAK;IACpCC,UAAU,EAAE,EAAE;IACdC,UAAU,EAAE;EACd,CAAC;EACDC,OAAO,EAAE;IACPC,cAAc,EAAEC,2BAAkB;IAClCC,gBAAgB,EAAED;EACpB;AACF,CAAC","ignoreList":[]}
@@ -1,23 +1,28 @@
1
1
  "use strict";
2
2
 
3
3
  var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
5
5
  var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
- _Object$defineProperty(exports, "__esModule", {
6
+ _Object$defineProperty2(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  exports.default = void 0;
10
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
13
12
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
14
13
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
15
14
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
15
+ var _symbol = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol"));
16
+ var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/delete-property"));
17
+ var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
18
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
16
19
  var _httpCore = require("@webex/http-core");
17
20
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
18
21
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /*!
19
22
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
20
23
  */
24
+ var inboundTransformPromise = (0, _symbol.default)('inboundTransformPromise');
25
+
21
26
  /**
22
27
  * @class
23
28
  */
@@ -54,7 +59,23 @@ var PayloadTransformerInterceptor = exports.default = /*#__PURE__*/function (_In
54
59
  if (options.disableTransform) {
55
60
  return response;
56
61
  }
57
- return this.webex.transform('inbound', response);
62
+ if (!this.webex.config.payloadTransformer.skipRepeatedInboundTransforms) {
63
+ return this.webex.transform('inbound', response);
64
+ }
65
+ if (response[inboundTransformPromise]) {
66
+ return response[inboundTransformPromise];
67
+ }
68
+ var transformPromise = this.webex.transform('inbound', response).catch(function (error) {
69
+ (0, _deleteProperty.default)(response, inboundTransformPromise);
70
+ throw error;
71
+ });
72
+
73
+ // Store the in-flight promise so concurrent interceptor pipelines share the same transform.
74
+ (0, _defineProperty.default)(response, inboundTransformPromise, {
75
+ configurable: true,
76
+ value: transformPromise
77
+ });
78
+ return transformPromise;
58
79
  }
59
80
 
60
81
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_httpCore","require","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","PayloadTransformerInterceptor","exports","_Interceptor","_classCallCheck2","arguments","_inherits2","_createClass2","key","value","onRequest","options","noTransform","webex","transform","onResponse","response","disableTransform","onResponseError","reason","then","r","_promise","reject","create","Interceptor"],"sources":["payload-transformer.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\n\n/**\n * @class\n */\nexport default class PayloadTransformerInterceptor extends Interceptor {\n /**\n * @param {Object} options\n * @returns {PayloadTransformerInterceptor}\n */\n static create() {\n return new PayloadTransformerInterceptor({webex: this});\n }\n\n /**\n * @see Interceptor#onRequest\n * @param {Object} options\n * @returns {Object}\n */\n onRequest(options) {\n if (options.noTransform) {\n return options;\n }\n\n return this.webex.transform('outbound', options);\n }\n\n /**\n * @see Interceptor#onResponse\n * @param {Object} options\n * @param {HttpResponse} response\n * @returns {Object}\n */\n onResponse(options, response) {\n if (options.disableTransform) {\n return response;\n }\n\n return this.webex.transform('inbound', response);\n }\n\n /**\n * @see Interceptor#onResponseError\n * @param {Object} options\n * @param {Error} reason\n * @returns {Object}\n */\n onResponseError(options, reason) {\n return this.webex.transform('inbound', reason).then((r) => Promise.reject(r || reason));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAIA,IAAAA,SAAA,GAAAC,OAAA;AAA6C,SAAAC,WAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,WAAAD,CAAA,OAAAE,gBAAA,CAAAC,OAAA,EAAAH,CAAA,OAAAI,2BAAA,CAAAD,OAAA,EAAAJ,CAAA,EAAAM,yBAAA,KAAAC,kBAAA,CAAAN,CAAA,EAAAC,CAAA,YAAAC,gBAAA,CAAAC,OAAA,EAAAJ,CAAA,EAAAQ,WAAA,IAAAP,CAAA,CAAAQ,KAAA,CAAAT,CAAA,EAAAE,CAAA;AAAA,SAAAI,0BAAA,cAAAN,CAAA,IAAAU,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAN,kBAAA,CAAAG,OAAA,iCAAAV,CAAA,aAAAM,yBAAA,YAAAA,0BAAA,aAAAN,CAAA,UAJ7C;AACA;AACA;AAIA;AACA;AACA;AAFA,IAGqBc,6BAA6B,GAAAC,OAAA,CAAAX,OAAA,0BAAAY,YAAA;EAAA,SAAAF,8BAAA;IAAA,IAAAG,gBAAA,CAAAb,OAAA,QAAAU,6BAAA;IAAA,OAAAf,UAAA,OAAAe,6BAAA,EAAAI,SAAA;EAAA;EAAA,IAAAC,UAAA,CAAAf,OAAA,EAAAU,6BAAA,EAAAE,YAAA;EAAA,WAAAI,aAAA,CAAAhB,OAAA,EAAAU,6BAAA;IAAAO,GAAA;IAAAC,KAAA;IAShD;AACF;AACA;AACA;AACA;IACE,SAAAC,SAASA,CAACC,OAAO,EAAE;MACjB,IAAIA,OAAO,CAACC,WAAW,EAAE;QACvB,OAAOD,OAAO;MAChB;MAEA,OAAO,IAAI,CAACE,KAAK,CAACC,SAAS,CAAC,UAAU,EAAEH,OAAO,CAAC;IAClD;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAH,GAAA;IAAAC,KAAA,EAMA,SAAAM,UAAUA,CAACJ,OAAO,EAAEK,QAAQ,EAAE;MAC5B,IAAIL,OAAO,CAACM,gBAAgB,EAAE;QAC5B,OAAOD,QAAQ;MACjB;MAEA,OAAO,IAAI,CAACH,KAAK,CAACC,SAAS,CAAC,SAAS,EAAEE,QAAQ,CAAC;IAClD;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAR,GAAA;IAAAC,KAAA,EAMA,SAAAS,eAAeA,CAACP,OAAO,EAAEQ,MAAM,EAAE;MAC/B,OAAO,IAAI,CAACN,KAAK,CAACC,SAAS,CAAC,SAAS,EAAEK,MAAM,CAAC,CAACC,IAAI,CAAC,UAACC,CAAC;QAAA,OAAKC,QAAA,CAAA/B,OAAA,CAAQgC,MAAM,CAACF,CAAC,IAAIF,MAAM,CAAC;MAAA,EAAC;IACzF;EAAC;IAAAX,GAAA;IAAAC,KAAA;IA3CD;AACF;AACA;AACA;IACE,SAAOe,MAAMA,CAAA,EAAG;MACd,OAAO,IAAIvB,6BAA6B,CAAC;QAACY,KAAK,EAAE;MAAI,CAAC,CAAC;IACzD;EAAC;AAAA,EAPwDY,qBAAW","ignoreList":[]}
1
+ {"version":3,"names":["_httpCore","require","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","inboundTransformPromise","_symbol","PayloadTransformerInterceptor","exports","_Interceptor","_classCallCheck2","arguments","_inherits2","_createClass2","key","value","onRequest","options","noTransform","webex","transform","onResponse","response","disableTransform","config","payloadTransformer","skipRepeatedInboundTransforms","transformPromise","catch","error","_deleteProperty","_defineProperty","configurable","onResponseError","reason","then","r","_promise","reject","create","Interceptor"],"sources":["payload-transformer.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\n\nconst inboundTransformPromise = Symbol('inboundTransformPromise');\n\n/**\n * @class\n */\nexport default class PayloadTransformerInterceptor extends Interceptor {\n /**\n * @param {Object} options\n * @returns {PayloadTransformerInterceptor}\n */\n static create() {\n return new PayloadTransformerInterceptor({webex: this});\n }\n\n /**\n * @see Interceptor#onRequest\n * @param {Object} options\n * @returns {Object}\n */\n onRequest(options) {\n if (options.noTransform) {\n return options;\n }\n\n return this.webex.transform('outbound', options);\n }\n\n /**\n * @see Interceptor#onResponse\n * @param {Object} options\n * @param {HttpResponse} response\n * @returns {Object}\n */\n onResponse(options, response) {\n if (options.disableTransform) {\n return response;\n }\n\n if (!this.webex.config.payloadTransformer.skipRepeatedInboundTransforms) {\n return this.webex.transform('inbound', response);\n }\n\n if (response[inboundTransformPromise]) {\n return response[inboundTransformPromise];\n }\n\n const transformPromise = this.webex.transform('inbound', response).catch((error) => {\n Reflect.deleteProperty(response, inboundTransformPromise);\n\n throw error;\n });\n\n // Store the in-flight promise so concurrent interceptor pipelines share the same transform.\n Object.defineProperty(response, inboundTransformPromise, {\n configurable: true,\n value: transformPromise,\n });\n\n return transformPromise;\n }\n\n /**\n * @see Interceptor#onResponseError\n * @param {Object} options\n * @param {Error} reason\n * @returns {Object}\n */\n onResponseError(options, reason) {\n return this.webex.transform('inbound', reason).then((r) => Promise.reject(r || reason));\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -302,7 +302,7 @@ var Batcher = _webexPlugin.default.extend({
302
302
  fingerprintResponse: function fingerprintResponse(item) {
303
303
  throw new Error('fingerprintResponse() must be implemented');
304
304
  },
305
- version: "3.12.0-next.47"
305
+ version: "3.12.0-next.48"
306
306
  });
307
307
  var _default2 = exports.default = Batcher;
308
308
  //# sourceMappingURL=batcher.js.map
@@ -655,7 +655,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
655
655
  this.refresh();
656
656
  }
657
657
  },
658
- version: "3.12.0-next.47"
658
+ version: "3.12.0-next.48"
659
659
  }, (0, _applyDecoratedDescriptor2.default)(_obj, "getUserToken", [_dec, _dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "getUserToken"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "invalidate", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "invalidate"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec5, _dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), _obj));
660
660
  var _default = exports.default = Credentials;
661
661
  //# sourceMappingURL=credentials.js.map
@@ -532,7 +532,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
532
532
  return res.body;
533
533
  });
534
534
  },
535
- version: "3.12.0-next.47"
535
+ version: "3.12.0-next.48"
536
536
  }, (0, _applyDecoratedDescriptor2.default)(_obj, "downscope", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "downscope"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "revoke", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "revoke"), _obj), _obj));
537
537
  var _default = exports.default = Token;
538
538
  //# sourceMappingURL=token.js.map
@@ -16,10 +16,13 @@ _Object$defineProperty(exports, "__esModule", {
16
16
  });
17
17
  exports.default = void 0;
18
18
  exports.matchesCatalogUrl = matchesCatalogUrl;
19
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
20
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
19
+ exports.matchesParsedCatalogUrl = matchesParsedCatalogUrl;
20
+ exports.parseCatalogUrl = parseCatalogUrl;
21
21
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
22
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"));
23
26
  var _url = _interopRequireDefault(require("url"));
24
27
  var _ampersandState = _interopRequireDefault(require("ampersand-state"));
25
28
  var _lodash = require("lodash");
@@ -30,6 +33,72 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
30
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; } } }; }
31
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; } }
32
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
+
33
102
  /**
34
103
  * Check if a candidate URL matches a catalog URL with proper origin validation.
35
104
  * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
@@ -39,33 +108,13 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
39
108
  * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
40
109
  */
41
110
  function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
111
+ var candidateUrl;
42
112
  try {
43
- var candidateUrl = new URL(candidateUrlString);
44
- var catalogUrl = new URL(catalogUrlString);
45
-
46
- // Origins must match exactly (scheme + host + port)
47
- if (candidateUrl.origin !== catalogUrl.origin) {
48
- return false;
49
- }
50
-
51
- // Normalize paths by removing trailing slashes (except root "/")
52
- var catalogPath = catalogUrl.pathname.replace(/\/$/, '') || '/';
53
- var candidatePath = candidateUrl.pathname;
54
- if (catalogPath === '/') {
55
- // Root path matches everything under this origin
56
- return true;
57
- }
58
- if (candidatePath.startsWith(catalogPath)) {
59
- // Ensure we're at a path boundary, not mid-segment
60
- // e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
61
- // nextChar is undefined for exact match, '/' for valid extension
62
- var nextChar = candidatePath[catalogPath.length];
63
- return nextChar === '/' || nextChar === undefined;
64
- }
65
- return false;
66
- } catch (_unused) {
113
+ candidateUrl = new URL(candidateUrlString);
114
+ } catch (_unused2) {
67
115
  return false;
68
116
  }
117
+ return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));
69
118
  }
70
119
 
71
120
  /* eslint-disable no-underscore-dangle */
@@ -296,15 +345,15 @@ var ServiceCatalog = _ampersandState.default.extend({
296
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));
297
346
 
298
347
  // Invalid URLs cannot match any service
348
+ var candidateUrl;
299
349
  try {
300
- // eslint-disable-next-line no-new
301
- new URL(url);
302
- } catch (_unused2) {
350
+ candidateUrl = new URL(url);
351
+ } catch (_unused3) {
303
352
  return undefined;
304
353
  }
305
354
  return serviceUrls.find(function (serviceUrl) {
306
355
  // Check if the URL matches the default URL with proper origin validation
307
- if (matchesCatalogUrl(url, serviceUrl.defaultUrl)) {
356
+ if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {
308
357
  return true;
309
358
  }
310
359
 
@@ -316,7 +365,7 @@ var ServiceCatalog = _ampersandState.default.extend({
316
365
  var host = _step4.value;
317
366
  var alternateUrl = new URL(serviceUrl.defaultUrl);
318
367
  alternateUrl.host = host.host;
319
- if (matchesCatalogUrl(url, alternateUrl.toString())) {
368
+ if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(alternateUrl.toString()))) {
320
369
  return true;
321
370
  }
322
371
  }
@@ -1 +1 @@
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","matchesCatalogUrl","candidateUrlString","catalogUrlString","candidateUrl","URL","catalogUrl","origin","catalogPath","pathname","replace","candidatePath","startsWith","nextChar","undefined","_unused","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","get","findServiceUrlFromUrl","_unused2","_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/**\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 try {\n const candidateUrl = new URL(candidateUrlString);\n const catalogUrl = new URL(catalogUrlString);\n\n // Origins must match exactly (scheme + host + port)\n if (candidateUrl.origin !== catalogUrl.origin) {\n return false;\n }\n\n // Normalize paths by removing trailing slashes (except root \"/\")\n const catalogPath = catalogUrl.pathname.replace(/\\/$/, '') || '/';\n const candidatePath = candidateUrl.pathname;\n\n if (catalogPath === '/') {\n // Root path matches everything under this origin\n return true;\n }\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 } catch {\n return false;\n }\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 try {\n // eslint-disable-next-line no-new\n 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 (matchesCatalogUrl(url, 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 (matchesCatalogUrl(url, 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":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AAAuE,SAAAK,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,aAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,2BAAApB,CAAA,EAAAD,CAAA,QAAAE,CAAA,yBAAAoB,OAAA,IAAArB,CAAA,CAAAsB,gBAAA,KAAAtB,CAAA,qBAAAC,CAAA,QAAAsB,cAAA,CAAAvB,CAAA,MAAAC,CAAA,GAAAuB,2BAAA,CAAAxB,CAAA,MAAAD,CAAA,IAAAC,CAAA,uBAAAA,CAAA,CAAAY,MAAA,IAAAX,CAAA,KAAAD,CAAA,GAAAC,CAAA,OAAAwB,EAAA,MAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,WAAAH,EAAA,IAAAzB,CAAA,CAAAY,MAAA,KAAAiB,IAAA,WAAAA,IAAA,MAAAC,KAAA,EAAA9B,CAAA,CAAAyB,EAAA,UAAA1B,CAAA,WAAAA,EAAAC,CAAA,UAAAA,CAAA,KAAA+B,CAAA,EAAAL,CAAA,gBAAAM,SAAA,iJAAA5B,CAAA,EAAA6B,CAAA,OAAAC,CAAA,gBAAAP,CAAA,WAAAA,EAAA,IAAA1B,CAAA,GAAAA,CAAA,CAAAkC,IAAA,CAAAnC,CAAA,MAAA4B,CAAA,WAAAA,EAAA,QAAA5B,CAAA,GAAAC,CAAA,CAAAmC,IAAA,WAAAH,CAAA,GAAAjC,CAAA,CAAA6B,IAAA,EAAA7B,CAAA,KAAAD,CAAA,WAAAA,EAAAC,CAAA,IAAAkC,CAAA,OAAA9B,CAAA,GAAAJ,CAAA,KAAA+B,CAAA,WAAAA,EAAA,UAAAE,CAAA,YAAAhC,CAAA,CAAAoC,MAAA,IAAApC,CAAA,CAAAoC,MAAA,oBAAAH,CAAA,QAAA9B,CAAA;AAAA,SAAAoB,4BAAAxB,CAAA,EAAAiC,CAAA,QAAAjC,CAAA,2BAAAA,CAAA,SAAAsC,iBAAA,CAAAtC,CAAA,EAAAiC,CAAA,OAAAhC,CAAA,MAAAsC,QAAA,CAAAJ,IAAA,CAAAnC,CAAA,EAAAwC,KAAA,6BAAAvC,CAAA,IAAAD,CAAA,CAAAyC,WAAA,KAAAxC,CAAA,GAAAD,CAAA,CAAAyC,WAAA,CAAAC,IAAA,aAAAzC,CAAA,cAAAA,CAAA,GAAA0C,WAAA,CAAA3C,CAAA,oBAAAC,CAAA,+CAAA2C,IAAA,CAAA3C,CAAA,IAAAqC,iBAAA,CAAAtC,CAAA,EAAAiC,CAAA;AAAA,SAAAK,kBAAAtC,CAAA,EAAAiC,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAjC,CAAA,CAAAY,MAAA,MAAAqB,CAAA,GAAAjC,CAAA,CAAAY,MAAA,YAAAb,CAAA,MAAA6B,CAAA,GAAAiB,KAAA,CAAAZ,CAAA,GAAAlC,CAAA,GAAAkC,CAAA,EAAAlC,CAAA,IAAA6B,CAAA,CAAA7B,CAAA,IAAAC,CAAA,CAAAD,CAAA,UAAA6B,CAAA;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASkB,iBAAiBA,CAACC,kBAAkB,EAAEC,gBAAgB,EAAE;EACtE,IAAI;IACF,IAAMC,YAAY,GAAG,IAAIC,GAAG,CAACH,kBAAkB,CAAC;IAChD,IAAMI,UAAU,GAAG,IAAID,GAAG,CAACF,gBAAgB,CAAC;;IAE5C;IACA,IAAIC,YAAY,CAACG,MAAM,KAAKD,UAAU,CAACC,MAAM,EAAE;MAC7C,OAAO,KAAK;IACd;;IAEA;IACA,IAAMC,WAAW,GAAGF,UAAU,CAACG,QAAQ,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG;IACjE,IAAMC,aAAa,GAAGP,YAAY,CAACK,QAAQ;IAE3C,IAAID,WAAW,KAAK,GAAG,EAAE;MACvB;MACA,OAAO,IAAI;IACb;IAEA,IAAIG,aAAa,CAACC,UAAU,CAACJ,WAAW,CAAC,EAAE;MACzC;MACA;MACA;MACA,IAAMK,QAAQ,GAAGF,aAAa,CAACH,WAAW,CAACzC,MAAM,CAAC;MAElD,OAAO8C,QAAQ,KAAK,GAAG,IAAIA,QAAQ,KAAKC,SAAS;IACnD;IAEA,OAAO,KAAK;EACd,CAAC,CAAC,OAAAC,OAAA,EAAM;IACN,OAAO,KAAK;EACd;AACF;;AAEA;AACA;AACA;AACA;AACA,IAAMC,cAAc,GAAGC,uBAAQ,CAACC,MAAM,CAAC;EACrCC,SAAS,EAAE,gBAAgB;EAE3BC,KAAK,EAAE;IACLC,aAAa,EAAE,CACb,QAAQ,EACR,IAAI,EACJ;MAAA,OAAO;QACLC,SAAS,EAAE,EAAE;QACbC,QAAQ,EAAE,EAAE;QACZC,OAAO,EAAE,EAAE;QACXC,QAAQ,EAAE,EAAE;QACZC,MAAM,EAAE;MACV,CAAC;IAAA,CAAC,CACH;IACDC,MAAM,EAAE,CACN,QAAQ,EACR,IAAI,EACJ;MAAA,OAAO;QACLL,SAAS,EAAE;UACTM,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDN,QAAQ,EAAE;UACRK,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDL,OAAO,EAAE;UACPI,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDJ,QAAQ,EAAE;UACRG,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDH,MAAM,EAAE;UACNE,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd;MACF,CAAC;IAAA,CAAC,CACH;IACDC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAClCC,cAAc,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE;MAAA,OAAM,EAAE;IAAA;EAC3C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,OAAO,WAAPA,OAAOA,CAACnC,IAAI,EAAEoC,YAAY,EAAE;IAC1B,IAAMC,WAAW,GACf,OAAOD,YAAY,KAAK,QAAQ,GAC5B,IAAI,CAACZ,aAAa,CAACY,YAAY,CAAC,IAAI,EAAE,MAAAE,MAAA,KAAAC,mBAAA,CAAAjE,OAAA,EAEjC,IAAI,CAACkD,aAAa,CAACE,QAAQ,OAAAa,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACI,QAAQ,OAAAW,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACK,MAAM,OAAAU,mBAAA,CAAAjE,OAAA,EACzB,IAAI,CAACkD,aAAa,CAACG,OAAO,OAAAY,mBAAA,CAAAjE,OAAA,EAC1B,IAAI,CAACkD,aAAa,CAACC,SAAS,EAChC;IAEP,OAAOY,WAAW,CAACG,IAAI,CAAC,UAACC,UAAU;MAAA,OAAKA,UAAU,CAACzC,IAAI,KAAKA,IAAI;IAAA,EAAC;EACnE,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACE0C,gBAAgB,WAAhBA,gBAAgBA,CAAA,EAAG;IACjB,UAAAJ,MAAA,KAAAC,mBAAA,CAAAjE,OAAA,EACK,IAAI,CAACkD,aAAa,CAACE,QAAQ,OAAAa,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACI,QAAQ,OAAAW,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACK,MAAM,OAAAU,mBAAA,CAAAjE,OAAA,EACzB,IAAI,CAACkD,aAAa,CAACG,OAAO,OAAAY,mBAAA,CAAAjE,OAAA,EAC1B,IAAI,CAACkD,aAAa,CAACC,SAAS;EAEnC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEkB,gBAAgB,WAAhBA,gBAAgBA,CAACP,YAAY,EAAEQ,QAAQ,EAAE;IAAA,IAAAC,KAAA;IACvC;IACA,IAAIC,eAAe;IAEnBF,QAAQ,CAACxE,OAAO,CAAC,UAAC2E,OAAO,EAAK;MAC5BD,eAAe,GAAGD,KAAI,CAACV,OAAO,CAACY,OAAO,CAAC/C,IAAI,EAAEoC,YAAY,CAAC;MAE1D,IAAI,CAACU,eAAe,EAAE;QACpBD,KAAI,CAACrB,aAAa,CAACY,YAAY,CAAC,CAACtE,IAAI,CAACiF,OAAO,CAAC;MAChD;IACF,CAAC,CAAC;IAEF,OAAO,IAAI;EACb,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,kBAAkB,WAAlBA,kBAAkBA,CAACZ,YAAY,EAAEQ,QAAQ,EAAE;IAAA,IAAAK,MAAA;IACzC;IACA,IAAIH,eAAe;IAEnBF,QAAQ,CAACxE,OAAO,CAAC,UAAC2E,OAAO,EAAK;MAC5BD,eAAe,GAAGG,MAAI,CAACd,OAAO,CAACY,OAAO,CAAC/C,IAAI,EAAEoC,YAAY,CAAC;MAE1D,IAAIU,eAAe,EAAE;QACnBG,MAAI,CAACzB,aAAa,CAACY,YAAY,CAAC,CAACc,MAAM,CACrCD,MAAI,CAACzB,aAAa,CAACY,YAAY,CAAC,CAACe,OAAO,CAACL,eAAe,CAAC,EACzD,CACF,CAAC;MACH;IACF,CAAC,CAAC;IAEF,OAAO,IAAI;EACb,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,KAAK,WAALA,KAAKA,CAAA,EAAG;IACN,IAAI,CAAC5B,aAAa,CAACG,OAAO,CAACzD,MAAM,GAAG,CAAC;IACrC,IAAI,CAACsD,aAAa,CAACK,MAAM,CAAC3D,MAAM,GAAG,CAAC;IACpC,IAAI,CAACsD,aAAa,CAACI,QAAQ,CAAC1D,MAAM,GAAG,CAAC;IACtC,IAAI,CAAC4D,MAAM,CAACH,OAAO,GAAG;MAACI,KAAK,EAAE;IAAK,CAAC;IACpC,IAAI,CAACD,MAAM,CAACD,MAAM,GAAG;MAACE,KAAK,EAAE;IAAK,CAAC;IACnC,IAAI,CAACD,MAAM,CAACF,QAAQ,GAAG;MAACG,KAAK,EAAE;IAAK,CAAC;EACvC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEsB,aAAa,WAAbA,aAAaA,CAACC,GAAG,EAAE;IACjB,IAAMC,cAAc,GAAGC,YAAG,CAACC,KAAK,CAACH,GAAG,CAAC;IACrC,IAAII,aAAa;IAEjB,SAAAC,EAAA,MAAAC,YAAA,GAAkB,IAAAC,KAAA,CAAAvF,OAAA,EAAY,IAAI,CAACkD,aAAa,CAAC,EAAAmC,EAAA,GAAAC,YAAA,CAAA1F,MAAA,EAAAyF,EAAA,IAAE;MAA9C,IAAMG,GAAG,GAAAF,YAAA,CAAAD,EAAA;MAAA,IAAAI,SAAA,GAAArF,0BAAA,CACU,IAAI,CAAC8C,aAAa,CAACsC,GAAG,CAAC;QAAAE,KAAA;MAAA;QAA7C,KAAAD,SAAA,CAAA9E,CAAA,MAAA+E,KAAA,GAAAD,SAAA,CAAA7E,CAAA,IAAAC,IAAA,GAA+C;UAAA,IAApC4D,OAAO,GAAAiB,KAAA,CAAA5E,KAAA;UAChBsE,aAAa,GAAGF,YAAG,CAACC,KAAK,CAACV,OAAO,CAACkB,UAAU,CAAC;UAAC,IAAAC,UAAA,GAAAxF,0BAAA,CAE3BqE,OAAO,CAACoB,KAAK;YAAAC,MAAA;UAAA;YAAhC,KAAAF,UAAA,CAAAjF,CAAA,MAAAmF,MAAA,GAAAF,UAAA,CAAAhF,CAAA,IAAAC,IAAA,GAAkC;cAAA,IAAvBkF,KAAI,GAAAD,MAAA,CAAAhF,KAAA;cACb,IAAImE,cAAc,CAACe,QAAQ,KAAKD,KAAI,CAACA,IAAI,IAAIA,KAAI,CAACE,EAAE,EAAE;gBACpD,OAAOF,KAAI,CAACE,EAAE;cAChB;YACF;UAAC,SAAAC,GAAA;YAAAN,UAAA,CAAA7G,CAAA,CAAAmH,GAAA;UAAA;YAAAN,UAAA,CAAA7E,CAAA;UAAA;UAED,IAAIqE,aAAa,CAACY,QAAQ,KAAKf,cAAc,CAACe,QAAQ,IAAIvB,OAAO,CAACoB,KAAK,CAACjG,MAAM,GAAG,CAAC,EAAE;YAClF;YAAA,IAAAuG,UAAA,GAAA/F,0BAAA,CACmBqE,OAAO,CAACoB,KAAK;cAAAO,MAAA;YAAA;cAAhC,KAAAD,UAAA,CAAAxF,CAAA,MAAAyF,MAAA,GAAAD,UAAA,CAAAvF,CAAA,IAAAC,IAAA,GAAkC;gBAAA,IAAvBkF,IAAI,GAAAK,MAAA,CAAAtF,KAAA;gBACb,IAAIiF,IAAI,CAACM,WAAW,EAAE;kBACpB,OAAON,IAAI,CAACE,EAAE;gBAChB;cACF;;cAEA;YAAA,SAAAC,GAAA;cAAAC,UAAA,CAAApH,CAAA,CAAAmH,GAAA;YAAA;cAAAC,UAAA,CAAApF,CAAA;YAAA;YACA,OAAO0D,OAAO,CAACoB,KAAK,CAAC,CAAC,CAAC,CAACI,EAAE;UAC5B;QACF;MAAC,SAAAC,GAAA;QAAAT,SAAA,CAAA1G,CAAA,CAAAmH,GAAA;MAAA;QAAAT,SAAA,CAAA1E,CAAA;MAAA;IACH;IAEA,OAAO4B,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE2D,wBAAwB,WAAxBA,wBAAwBA,CAAA,EAAsD;IAAA,IAAAC,IAAA,GAAA5G,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAgD,SAAA,GAAAhD,SAAA,MAAJ,CAAC,CAAC;MAAlD6G,SAAS,GAAAD,IAAA,CAATC,SAAS;MAAAC,iBAAA,GAAAF,IAAA,CAAEG,YAAY;MAAZA,YAAY,GAAAD,iBAAA,cAAG,IAAI,GAAAA,iBAAA;MAAE3C,YAAY,GAAAyC,IAAA,CAAZzC,YAAY;IACpE,IAAMC,WAAW,GACf,OAAOD,YAAY,KAAK,QAAQ,GAC5B,IAAI,CAACZ,aAAa,CAACY,YAAY,CAAC,IAAI,EAAE,MAAAE,MAAA,KAAAC,mBAAA,CAAAjE,OAAA,EAEjC,IAAI,CAACkD,aAAa,CAACE,QAAQ,OAAAa,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACI,QAAQ,OAAAW,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACK,MAAM,OAAAU,mBAAA,CAAAjE,OAAA,EACzB,IAAI,CAACkD,aAAa,CAACG,OAAO,OAAAY,mBAAA,CAAAjE,OAAA,EAC1B,IAAI,CAACkD,aAAa,CAACC,SAAS,EAChC;IAEP,IAAMwD,oBAAoB,GAAG5C,WAAW,CAACG,IAAI,CAAC,UAACC,UAAU;MAAA,OACvDA,UAAU,CAAC0B,KAAK,CAAC3B,IAAI,CAAC,UAAC6B,IAAI;QAAA,OAAKA,IAAI,CAACE,EAAE,KAAKO,SAAS;MAAA,EAAC;IAAA,CACxD,CAAC;IAED,IAAIG,oBAAoB,EAAE;MACxB,OAAO;QACLjF,IAAI,EAAEiF,oBAAoB,CAACjF,IAAI;QAC/BsD,GAAG,EAAE2B,oBAAoB,CAACC,GAAG,CAACF,YAAY,EAAEF,SAAS;MACvD,CAAC;IACH;IAEA,OAAO7D,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEkE,qBAAqB,WAArBA,qBAAqBA,CAAC7B,GAAG,EAAE;IACzB,IAAMjB,WAAW,MAAAC,MAAA,KAAAC,mBAAA,CAAAjE,OAAA,EACZ,IAAI,CAACkD,aAAa,CAACC,SAAS,OAAAc,mBAAA,CAAAjE,OAAA,EAC5B,IAAI,CAACkD,aAAa,CAACG,OAAO,OAAAY,mBAAA,CAAAjE,OAAA,EAC1B,IAAI,CAACkD,aAAa,CAACK,MAAM,OAAAU,mBAAA,CAAAjE,OAAA,EACzB,IAAI,CAACkD,aAAa,CAACI,QAAQ,OAAAW,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACE,QAAQ,EAC/B;;IAED;IACA,IAAI;MACF;MACA,IAAIlB,GAAG,CAAC8C,GAAG,CAAC;IACd,CAAC,CAAC,OAAA8B,QAAA,EAAM;MACN,OAAOnE,SAAS;IAClB;IAEA,OAAOoB,WAAW,CAACG,IAAI,CAAC,UAACC,UAAU,EAAK;MACtC;MACA,IAAIrC,iBAAiB,CAACkD,GAAG,EAAEb,UAAU,CAACwB,UAAU,CAAC,EAAE;QACjD,OAAO,IAAI;MACb;;MAEA;MAAA,IAAAoB,UAAA,GAAA3G,0BAAA,CACmB+D,UAAU,CAAC0B,KAAK;QAAAmB,MAAA;MAAA;QAAnC,KAAAD,UAAA,CAAApG,CAAA,MAAAqG,MAAA,GAAAD,UAAA,CAAAnG,CAAA,IAAAC,IAAA,GAAqC;UAAA,IAA1BkF,IAAI,GAAAiB,MAAA,CAAAlG,KAAA;UACb,IAAMmG,YAAY,GAAG,IAAI/E,GAAG,CAACiC,UAAU,CAACwB,UAAU,CAAC;UACnDsB,YAAY,CAAClB,IAAI,GAAGA,IAAI,CAACA,IAAI;UAE7B,IAAIjE,iBAAiB,CAACkD,GAAG,EAAEiC,YAAY,CAAC1F,QAAQ,CAAC,CAAC,CAAC,EAAE;YACnD,OAAO,IAAI;UACb;QACF;MAAC,SAAA2E,GAAA;QAAAa,UAAA,CAAAhI,CAAA,CAAAmH,GAAA;MAAA;QAAAa,UAAA,CAAAhG,CAAA;MAAA;MAED,OAAO,KAAK;IACd,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEmG,iBAAiB,WAAjBA,iBAAiBA,CAAClC,GAAG,EAAE;IACrB,OAAO,IAAAmC,2BAAkB,EAACnC,GAAG,EAAE,IAAI,CAACpB,cAAc,CAAC;EACrD,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEgD,GAAG,WAAHA,GAAGA,CAAClF,IAAI,EAAEgF,YAAY,EAAE5C,YAAY,EAAE;IACpC,IAAMK,UAAU,GAAG,IAAI,CAACN,OAAO,CAACnC,IAAI,EAAEoC,YAAY,CAAC;IAEnD,OAAOK,UAAU,GAAGA,UAAU,CAACyC,GAAG,CAACF,YAAY,CAAC,GAAG/D,SAAS;EAC9D,CAAC;EAED;AACF;AACA;AACA;AACA;EACEyE,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;IAClB,WAAAnD,mBAAA,CAAAjE,OAAA,EAAW,IAAI,CAAC4D,cAAc;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEyD,IAAI,WAAJA,IAAIA,CAACX,YAAY,EAAE5C,YAAY,EAAE;IAC/B,IAAMwD,MAAM,GAAG,CAAC,CAAC;IAEjB,IAAMvD,WAAW,GACf,OAAOD,YAAY,KAAK,QAAQ,GAC5B,IAAI,CAACZ,aAAa,CAACY,YAAY,CAAC,IAAI,EAAE,MAAAE,MAAA,KAAAC,mBAAA,CAAAjE,OAAA,EAEjC,IAAI,CAACkD,aAAa,CAACC,SAAS,OAAAc,mBAAA,CAAAjE,OAAA,EAC5B,IAAI,CAACkD,aAAa,CAACG,OAAO,OAAAY,mBAAA,CAAAjE,OAAA,EAC1B,IAAI,CAACkD,aAAa,CAACK,MAAM,OAAAU,mBAAA,CAAAjE,OAAA,EACzB,IAAI,CAACkD,aAAa,CAACI,QAAQ,OAAAW,mBAAA,CAAAjE,OAAA,EAC3B,IAAI,CAACkD,aAAa,CAACE,QAAQ,EAC/B;IAEP,IAAIW,WAAW,EAAE;MACfA,WAAW,CAACjE,OAAO,CAAC,UAACqE,UAAU,EAAK;QAClCmD,MAAM,CAACnD,UAAU,CAACzC,IAAI,CAAC,GAAGyC,UAAU,CAACyC,GAAG,CAACF,YAAY,CAAC;MACxD,CAAC,CAAC;IACJ;IAEA,OAAOY,MAAM;EACf,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,aAAa,WAAbA,aAAaA,CAACvC,GAAG,EAAEwC,eAAe,EAAE;IAAA,IAAAC,MAAA;IAClC,IAAMtD,UAAU,GAAG,IAAI,CAACN,OAAO,CAC7B,IAAA0B,KAAA,CAAAvF,OAAA,EAAY,IAAI,CAACqH,IAAI,CAAC,CAAC,CAAC,CAACnD,IAAI,CAAC,UAACsB,GAAG;MAAA,OAAKiC,MAAI,CAAC5D,OAAO,CAAC2B,GAAG,CAAC,CAACkC,QAAQ,CAAC1C,GAAG,CAAC;IAAA,EACxE,CAAC;IAED,IAAI,CAACb,UAAU,EAAE;MACf,OAAOxB,SAAS;IAClB;IAEA,OAAO6E,eAAe,GAAGrD,UAAU,CAACyC,GAAG,CAAC,KAAK,CAAC,GAAGzC,UAAU,CAACyC,GAAG,CAAC,IAAI,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEe,iBAAiB,WAAjBA,iBAAiBA,CAAC/D,cAAc,EAAE;IAChC,IAAI,CAACA,cAAc,GAAG,IAAAgE,gCAAuB,EAAChE,cAAc,CAAC;EAC/D,CAAC;EAED;AACF;AACA;AACA;AACA;EACEiE,iBAAiB,WAAjBA,iBAAiBA,CAACC,iBAAiB,EAAE;IACnC,IAAI,CAAClE,cAAc,GAAG,IAAAmE,aAAK,EAAC,IAAI,CAACnE,cAAc,EAAE,IAAAgE,gCAAuB,EAACE,iBAAiB,CAAC,CAAC;EAC9F,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,iBAAiB,WAAjBA,iBAAiBA,CAAClE,YAAY,EAAEmE,cAAc,EAAE;IAAA,IAAAC,MAAA;IAC9C,IAAMC,kBAAkB,GAAG,IAAI,CAACjF,aAAa,CAACY,YAAY,CAAC;IAE3D,IAAMsE,UAAU,GAAGD,kBAAkB,CAAC9I,MAAM,CAAC,UAAC8E,UAAU;MAAA,OACtD8D,cAAc,CAACI,KAAK,CAAC,UAACC,IAAI;QAAA,OAAKA,IAAI,CAAC5G,IAAI,KAAKyC,UAAU,CAACzC,IAAI;MAAA,EAAC;IAAA,CAC/D,CAAC;IAED,IAAI,CAACgD,kBAAkB,CAACZ,YAAY,EAAEsE,UAAU,CAAC;IAEjDH,cAAc,CAACnI,OAAO,CAAC,UAACyI,UAAU,EAAK;MACrC,IAAM9D,OAAO,GAAGyD,MAAI,CAACrE,OAAO,CAAC0E,UAAU,CAAC7G,IAAI,EAAEoC,YAAY,CAAC;MAE3D,IAAIW,OAAO,EAAE;QACXA,OAAO,CAACkB,UAAU,GAAG4C,UAAU,CAAC5C,UAAU;QAC1ClB,OAAO,CAACoB,KAAK,GAAG0C,UAAU,CAAC1C,KAAK,IAAI,EAAE;MACxC,CAAC,MAAM;QACLqC,MAAI,CAAC7D,gBAAgB,CAACP,YAAY,EAAE,CAClC,IAAI0E,mBAAU,CAAA9I,aAAA,KACT6I,UAAU,CACd,CAAC,CACH,CAAC;MACJ;IACF,CAAC,CAAC;IAEF,IAAI,CAAC/E,MAAM,CAACM,YAAY,CAAC,CAACL,KAAK,GAAG,IAAI;IACtC,IAAI,CAACgF,OAAO,CAAC3E,YAAY,CAAC;IAE1B,OAAO,IAAI;EACb,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACE4E,cAAc,WAAdA,cAAcA,CAAC5E,YAAY,EAAE6E,OAAO,EAAE;IAAA,IAAAC,MAAA;IACpC,OAAO,IAAAC,QAAA,CAAA7I,OAAA,CAAY,UAAC8I,OAAO,EAAEC,MAAM,EAAK;MACtC,IAAIH,MAAI,CAACpF,MAAM,CAACM,YAAY,CAAC,CAACL,KAAK,EAAE;QACnCqF,OAAO,CAAC,CAAC;MACX;MAEA,IAAME,gBAAgB,GAAG,OAAOL,OAAO,KAAK,QAAQ,IAAIA,OAAO,IAAI,CAAC,GAAGA,OAAO,GAAG,EAAE;MAEnF,IAAMM,YAAY,GAAGC,UAAU,CAC7B;QAAA,OACEH,MAAM,CACJ,IAAII,KAAK,iDAAAnF,MAAA,CACyCF,YAAY,0BAC9D,CACF,CAAC;MAAA,GACHkF,gBAAgB,GAAG,IACrB,CAAC;MAEDJ,MAAI,CAACQ,IAAI,CAACtF,YAAY,EAAE,YAAM;QAC5BuF,YAAY,CAACJ,YAAY,CAAC;QAC1BH,OAAO,CAAC,CAAC;MACX,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;AACF,CAAC,CAAC;AACF;AAAA,IAAAQ,QAAA,GAAAC,OAAA,CAAAvJ,OAAA,GAEe6C,cAAc","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":[]}
@@ -1641,7 +1641,7 @@ var Services = _webexPlugin.default.extend({
1641
1641
  }, _callee6);
1642
1642
  })));
1643
1643
  },
1644
- version: "3.12.0-next.47"
1644
+ version: "3.12.0-next.48"
1645
1645
  });
1646
1646
  /* eslint-enable no-underscore-dangle */
1647
1647
  var _default = exports.default = Services;
@@ -196,6 +196,12 @@ var ServiceCatalog = _ampersandState.default.extend({
196
196
  */
197
197
  findServiceDetailFromUrl: function findServiceDetailFromUrl(url) {
198
198
  var serviceDetails = this._getAllServiceDetails();
199
+ var candidateUrl;
200
+ try {
201
+ candidateUrl = new URL(url);
202
+ } catch (_unused2) {
203
+ return undefined;
204
+ }
199
205
  return serviceDetails.find(function (_ref3) {
200
206
  var serviceUrls = _ref3.serviceUrls;
201
207
  var _iterator = _createForOfIteratorHelper(serviceUrls),
@@ -203,7 +209,7 @@ var ServiceCatalog = _ampersandState.default.extend({
203
209
  try {
204
210
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
205
211
  var serviceUrl = _step.value;
206
- if ((0, _serviceCatalog.matchesCatalogUrl)(url, serviceUrl.baseUrl)) {
212
+ if ((0, _serviceCatalog.matchesParsedCatalogUrl)(candidateUrl, (0, _serviceCatalog.parseCatalogUrl)(serviceUrl.baseUrl))) {
207
213
  return true;
208
214
  }
209
215
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_domains","_serviceCatalog","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","timestamp","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","_ref3","_iterator","_step","serviceUrl","matchesCatalogUrl","baseUrl","err","findAllowedDomain","matchAllowedDomain","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","_serviceObj$serviceUr","sort","b","priority","ServiceDetail","trigger","waitForCatalog","timeout","_this4","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceDetail from './service-detail';\nimport {IServiceDetail, ServiceGroup} from './types';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\nimport {matchesCatalogUrl} from '../services/service-catalog';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n timestamp: ['string', false, ''],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails?.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (matchesCatalogUrl(url, serviceUrl.baseUrl)) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @param {timestamp<string>} timestamp of the catalog\n * @returns {void}\n */\n updateServiceGroups(\n serviceGroup: ServiceGroup,\n serviceDetails: Array<IServiceDetail>,\n timestamp?: string\n ) {\n const currentServiceDetails = this.serviceGroups[serviceGroup];\n\n const unusedServicesDetails = currentServiceDetails?.filter((serviceDetail) =>\n serviceDetails?.every(({id}) => id !== serviceDetail.id)\n );\n\n this._unloadServiceDetails(serviceGroup, unusedServicesDetails);\n\n serviceDetails?.forEach((serviceObj) => {\n const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);\n serviceObj?.serviceUrls?.sort((a, b) => {\n if (a.priority < 0 && b.priority < 0) return 0;\n if (a.priority < 0) return 1;\n if (b.priority < 0) return -1;\n\n return a.priority - b.priority;\n });\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\n this.timestamp = timestamp;\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {ServiceGroup} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: ServiceGroup, timeout?: number): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_domains","_serviceCatalog","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","timestamp","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","candidateUrl","_unused2","_ref3","_iterator","_step","serviceUrl","matchesParsedCatalogUrl","parseCatalogUrl","baseUrl","err","findAllowedDomain","matchAllowedDomain","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","_serviceObj$serviceUr","sort","b","priority","ServiceDetail","trigger","waitForCatalog","timeout","_this4","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceDetail from './service-detail';\nimport {IServiceDetail, ServiceGroup} from './types';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\nimport {matchesParsedCatalogUrl, parseCatalogUrl} from '../services/service-catalog';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n timestamp: ['string', false, ''],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails?.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n let candidateUrl: URL;\n\n try {\n candidateUrl = new URL(url);\n } catch {\n return undefined;\n }\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.baseUrl))) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @param {timestamp<string>} timestamp of the catalog\n * @returns {void}\n */\n updateServiceGroups(\n serviceGroup: ServiceGroup,\n serviceDetails: Array<IServiceDetail>,\n timestamp?: string\n ) {\n const currentServiceDetails = this.serviceGroups[serviceGroup];\n\n const unusedServicesDetails = currentServiceDetails?.filter((serviceDetail) =>\n serviceDetails?.every(({id}) => id !== serviceDetail.id)\n );\n\n this._unloadServiceDetails(serviceGroup, unusedServicesDetails);\n\n serviceDetails?.forEach((serviceObj) => {\n const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);\n serviceObj?.serviceUrls?.sort((a, b) => {\n if (a.priority < 0 && b.priority < 0) return 0;\n if (a.priority < 0) return 1;\n if (b.priority < 0) return -1;\n\n return a.priority - b.priority;\n });\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\n this.timestamp = timestamp;\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {ServiceGroup} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: ServiceGroup, timeout?: number): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
@@ -1577,7 +1577,7 @@ var Services = _webexPlugin.default.extend({
1577
1577
  }, _callee5);
1578
1578
  })));
1579
1579
  },
1580
- version: "3.12.0-next.47"
1580
+ version: "3.12.0-next.48"
1581
1581
  });
1582
1582
  /* eslint-enable no-underscore-dangle */
1583
1583
  var _default = exports.default = Services;
@@ -57,7 +57,7 @@ var Logger = _webexPlugin.default.extend({
57
57
  info: wrapConsoleMethod('info'),
58
58
  debug: wrapConsoleMethod('debug'),
59
59
  trace: wrapConsoleMethod('trace'),
60
- version: "3.12.0-next.47"
60
+ version: "3.12.0-next.48"
61
61
  });
62
62
  (0, _webexCore.registerPlugin)('logger', Logger);
63
63
  var _default = exports.default = Logger;
@@ -98,7 +98,7 @@ var MAX_FILE_SIZE_IN_MB = 2048;
98
98
  * @class
99
99
  */
100
100
  var WebexCore = _ampersandState.default.extend((_obj = {
101
- version: "3.12.0-next.47",
101
+ version: "3.12.0-next.48",
102
102
  children: {
103
103
  internal: _webexInternalCore.default
104
104
  },
@@ -642,7 +642,7 @@ var WebexCore = _ampersandState.default.extend((_obj = {
642
642
  });
643
643
  }
644
644
  }, (0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj), _obj));
645
- WebexCore.version = "3.12.0-next.47";
645
+ WebexCore.version = "3.12.0-next.48";
646
646
  (0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
647
647
  (0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
648
648
  var _default = exports.default = WebexCore;
package/package.json CHANGED
@@ -33,10 +33,10 @@
33
33
  "@sinonjs/fake-timers": "^6.0.1",
34
34
  "@webex/babel-config-legacy": "0.0.0",
35
35
  "@webex/eslint-config-legacy": "0.0.0",
36
- "@webex/internal-plugin-device": "3.12.0-next.47",
36
+ "@webex/internal-plugin-device": "3.12.0-next.48",
37
37
  "@webex/jest-config-legacy": "0.0.0",
38
38
  "@webex/legacy-tools": "0.0.0",
39
- "@webex/plugin-logger": "3.12.0-next.47",
39
+ "@webex/plugin-logger": "3.12.0-next.48",
40
40
  "@webex/test-helper-chai": "3.12.0-next.6",
41
41
  "@webex/test-helper-make-local-url": "3.12.0-next.6",
42
42
  "@webex/test-helper-mocha": "3.12.0-next.6",
@@ -73,5 +73,5 @@
73
73
  "test:style": "eslint ./src/**/*.*",
74
74
  "test:unit": "webex-legacy-tools test --unit --runner jest"
75
75
  },
76
- "version": "3.12.0-next.47"
76
+ "version": "3.12.0-next.48"
77
77
  }
package/src/config.js CHANGED
@@ -128,6 +128,11 @@ export default {
128
128
  cacheU2C: false,
129
129
  },
130
130
  payloadTransformer: {
131
+ /**
132
+ * When true, inbound payload transforms run at most once for the same successful response object.
133
+ * This supports request flows that pass a response through more than one interceptor pipeline.
134
+ */
135
+ skipRepeatedInboundTransforms: false,
131
136
  predicates: [],
132
137
  transforms: [],
133
138
  },
@@ -4,6 +4,8 @@
4
4
 
5
5
  import {Interceptor} from '@webex/http-core';
6
6
 
7
+ const inboundTransformPromise = Symbol('inboundTransformPromise');
8
+
7
9
  /**
8
10
  * @class
9
11
  */
@@ -40,7 +42,27 @@ export default class PayloadTransformerInterceptor extends Interceptor {
40
42
  return response;
41
43
  }
42
44
 
43
- return this.webex.transform('inbound', response);
45
+ if (!this.webex.config.payloadTransformer.skipRepeatedInboundTransforms) {
46
+ return this.webex.transform('inbound', response);
47
+ }
48
+
49
+ if (response[inboundTransformPromise]) {
50
+ return response[inboundTransformPromise];
51
+ }
52
+
53
+ const transformPromise = this.webex.transform('inbound', response).catch((error) => {
54
+ Reflect.deleteProperty(response, inboundTransformPromise);
55
+
56
+ throw error;
57
+ });
58
+
59
+ // Store the in-flight promise so concurrent interceptor pipelines share the same transform.
60
+ Object.defineProperty(response, inboundTransformPromise, {
61
+ configurable: true,
62
+ value: transformPromise,
63
+ });
64
+
65
+ return transformPromise;
44
66
  }
45
67
 
46
68
  /**
@@ -6,46 +6,97 @@ import {union} from 'lodash';
6
6
  import ServiceUrl from './service-url';
7
7
  import {matchAllowedDomain, normalizeAllowedDomains} from '../domains';
8
8
 
9
+ // Catalog base URLs are a small, stable set, so their parsed origin/path is
10
+ // memoized to avoid repeated `new URL()` work when scanning the catalog on the
11
+ // request hot path.
12
+ const catalogUrlCache = new Map();
13
+
9
14
  /**
10
- * Check if a candidate URL matches a catalog URL with proper origin validation.
11
- * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
15
+ * Parse a catalog URL into the origin and normalized path used for matching,
16
+ * memoizing the result. Returns null when the URL is unparsable.
12
17
  *
13
- * @param {string} candidateUrlString - The URL to validate
14
- * @param {string} catalogUrlString - The catalog URL to compare against
15
- * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
18
+ * @param {string} catalogUrlString - The catalog URL to parse
19
+ * @returns {{origin: string, path: string} | null} - Parsed catalog URL, or null
16
20
  */
17
- export function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
21
+ export function parseCatalogUrl(catalogUrlString) {
22
+ if (catalogUrlCache.has(catalogUrlString)) {
23
+ return catalogUrlCache.get(catalogUrlString);
24
+ }
25
+
26
+ let parsed = null;
27
+
18
28
  try {
19
- const candidateUrl = new URL(candidateUrlString);
20
29
  const catalogUrl = new URL(catalogUrlString);
21
30
 
22
- // Origins must match exactly (scheme + host + port)
23
- if (candidateUrl.origin !== catalogUrl.origin) {
24
- return false;
25
- }
26
-
27
31
  // Normalize paths by removing trailing slashes (except root "/")
28
- const catalogPath = catalogUrl.pathname.replace(/\/$/, '') || '/';
29
- const candidatePath = candidateUrl.pathname;
32
+ parsed = {origin: catalogUrl.origin, path: catalogUrl.pathname.replace(/\/$/, '') || '/'};
33
+ } catch {
34
+ parsed = null;
35
+ }
30
36
 
31
- if (catalogPath === '/') {
32
- // Root path matches everything under this origin
33
- return true;
34
- }
37
+ catalogUrlCache.set(catalogUrlString, parsed);
35
38
 
36
- if (candidatePath.startsWith(catalogPath)) {
37
- // Ensure we're at a path boundary, not mid-segment
38
- // e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
39
- // nextChar is undefined for exact match, '/' for valid extension
40
- const nextChar = candidatePath[catalogPath.length];
39
+ return parsed;
40
+ }
41
41
 
42
- return nextChar === '/' || nextChar === undefined;
43
- }
42
+ /**
43
+ * Check if an already-parsed candidate URL matches a parsed catalog URL with
44
+ * proper origin validation. Allocates nothing, so it is safe to call in a tight
45
+ * loop over the whole catalog.
46
+ *
47
+ * @param {URL} candidateUrl - The parsed candidate URL to validate
48
+ * @param {{origin: string, path: string} | null} parsedCatalogUrl - The parsed catalog URL
49
+ * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
50
+ */
51
+ export function matchesParsedCatalogUrl(candidateUrl, parsedCatalogUrl) {
52
+ if (!candidateUrl || !parsedCatalogUrl) {
53
+ return false;
54
+ }
44
55
 
56
+ // Origins must match exactly (scheme + host + port)
57
+ if (candidateUrl.origin !== parsedCatalogUrl.origin) {
45
58
  return false;
59
+ }
60
+
61
+ const catalogPath = parsedCatalogUrl.path;
62
+
63
+ if (catalogPath === '/') {
64
+ // Root path matches everything under this origin
65
+ return true;
66
+ }
67
+
68
+ const candidatePath = candidateUrl.pathname;
69
+
70
+ if (candidatePath.startsWith(catalogPath)) {
71
+ // Ensure we're at a path boundary, not mid-segment
72
+ // e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
73
+ // nextChar is undefined for exact match, '/' for valid extension
74
+ const nextChar = candidatePath[catalogPath.length];
75
+
76
+ return nextChar === '/' || nextChar === undefined;
77
+ }
78
+
79
+ return false;
80
+ }
81
+
82
+ /**
83
+ * Check if a candidate URL matches a catalog URL with proper origin validation.
84
+ * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
85
+ *
86
+ * @param {string} candidateUrlString - The URL to validate
87
+ * @param {string} catalogUrlString - The catalog URL to compare against
88
+ * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
89
+ */
90
+ export function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
91
+ let candidateUrl;
92
+
93
+ try {
94
+ candidateUrl = new URL(candidateUrlString);
46
95
  } catch {
47
96
  return false;
48
97
  }
98
+
99
+ return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));
49
100
  }
50
101
 
51
102
  /* eslint-disable no-underscore-dangle */
@@ -289,16 +340,17 @@ const ServiceCatalog = AmpState.extend({
289
340
  ];
290
341
 
291
342
  // Invalid URLs cannot match any service
343
+ let candidateUrl;
344
+
292
345
  try {
293
- // eslint-disable-next-line no-new
294
- new URL(url);
346
+ candidateUrl = new URL(url);
295
347
  } catch {
296
348
  return undefined;
297
349
  }
298
350
 
299
351
  return serviceUrls.find((serviceUrl) => {
300
352
  // Check if the URL matches the default URL with proper origin validation
301
- if (matchesCatalogUrl(url, serviceUrl.defaultUrl)) {
353
+ if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {
302
354
  return true;
303
355
  }
304
356
 
@@ -307,7 +359,7 @@ const ServiceCatalog = AmpState.extend({
307
359
  const alternateUrl = new URL(serviceUrl.defaultUrl);
308
360
  alternateUrl.host = host.host;
309
361
 
310
- if (matchesCatalogUrl(url, alternateUrl.toString())) {
362
+ if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(alternateUrl.toString()))) {
311
363
  return true;
312
364
  }
313
365
  }
@@ -4,7 +4,7 @@ import {union} from 'lodash';
4
4
  import ServiceDetail from './service-detail';
5
5
  import {IServiceDetail, ServiceGroup} from './types';
6
6
  import {matchAllowedDomain, normalizeAllowedDomains} from '../domains';
7
- import {matchesCatalogUrl} from '../services/service-catalog';
7
+ import {matchesParsedCatalogUrl, parseCatalogUrl} from '../services/service-catalog';
8
8
 
9
9
  /**
10
10
  * @class
@@ -200,9 +200,17 @@ const ServiceCatalog = AmpState.extend({
200
200
  findServiceDetailFromUrl(url: string): IServiceDetail | undefined {
201
201
  const serviceDetails = this._getAllServiceDetails();
202
202
 
203
+ let candidateUrl: URL;
204
+
205
+ try {
206
+ candidateUrl = new URL(url);
207
+ } catch {
208
+ return undefined;
209
+ }
210
+
203
211
  return serviceDetails.find(({serviceUrls}) => {
204
212
  for (const serviceUrl of serviceUrls) {
205
- if (matchesCatalogUrl(url, serviceUrl.baseUrl)) {
213
+ if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.baseUrl))) {
206
214
  return true;
207
215
  }
208
216
  }
@@ -4,7 +4,8 @@
4
4
 
5
5
  import {assert} from '@webex/test-helper-chai';
6
6
  import {capitalize} from 'lodash';
7
- import WebexCore from '@webex/webex-core';
7
+ import sinon from 'sinon';
8
+ import WebexCore, {PayloadTransformerInterceptor} from '@webex/webex-core';
8
9
  // TODO: fix circular dependency core->metrics->core https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-515520
9
10
  require('@webex/internal-plugin-metrics');
10
11
 
@@ -153,5 +154,122 @@ describe('webex-core', () => {
153
154
  ));
154
155
  });
155
156
  });
157
+
158
+ describe('PayloadTransformerInterceptor repeated inbound transforms', () => {
159
+ const createInterceptor = (skipRepeatedInboundTransforms) => {
160
+ const transform = sinon.stub().callsFake((direction, value) => Promise.resolve(value));
161
+ const interceptor = new PayloadTransformerInterceptor({
162
+ webex: {
163
+ config: {payloadTransformer: {skipRepeatedInboundTransforms}},
164
+ transform,
165
+ },
166
+ });
167
+
168
+ return {interceptor, transform};
169
+ };
170
+
171
+ describe('#onResponse()', () => {
172
+ it('transforms the same response every time when skipping repeated transforms is disabled', async () => {
173
+ const {interceptor, transform} = createInterceptor(false);
174
+ const response = {};
175
+
176
+ await interceptor.onResponse({}, response);
177
+ await interceptor.onResponse({}, response);
178
+
179
+ assert.calledTwice(transform);
180
+ });
181
+
182
+ it('transforms the same response only once when repeated transforms are skipped', async () => {
183
+ const {interceptor, transform} = createInterceptor(true);
184
+ const response = {};
185
+
186
+ assert.equal(await interceptor.onResponse({}, response), response);
187
+ assert.equal(await interceptor.onResponse({}, response), response);
188
+ assert.calledOnceWithExactly(transform, 'inbound', response);
189
+ });
190
+
191
+ it('shares an in-flight transform for concurrent calls with the same response', async () => {
192
+ const {interceptor, transform} = createInterceptor(true);
193
+ const response = {};
194
+ let resolveTransform;
195
+
196
+ transform.callsFake(
197
+ (direction, value) =>
198
+ new Promise((resolve) => {
199
+ resolveTransform = () => resolve(value);
200
+ })
201
+ );
202
+
203
+ const firstTransform = interceptor.onResponse({}, response);
204
+ const secondTransform = interceptor.onResponse({}, response);
205
+
206
+ assert.equal(firstTransform, secondTransform);
207
+ assert.calledOnceWithExactly(transform, 'inbound', response);
208
+
209
+ resolveTransform();
210
+
211
+ assert.equal(await firstTransform, response);
212
+ assert.equal(await secondTransform, response);
213
+ });
214
+
215
+ it('transforms distinct response objects independently', async () => {
216
+ const {interceptor, transform} = createInterceptor(true);
217
+ const firstResponse = {};
218
+ const secondResponse = {};
219
+
220
+ await interceptor.onResponse({}, firstResponse);
221
+ await interceptor.onResponse({}, secondResponse);
222
+
223
+ assert.calledTwice(transform);
224
+ assert.isTrue(transform.firstCall.calledWithExactly('inbound', firstResponse));
225
+ assert.isTrue(transform.secondCall.calledWithExactly('inbound', secondResponse));
226
+ });
227
+
228
+ it('retries transformation after a failed transform', async () => {
229
+ const {interceptor, transform} = createInterceptor(true);
230
+ const response = {};
231
+
232
+ transform.onFirstCall().rejects(new Error('transform failed'));
233
+
234
+ await assert.isRejected(interceptor.onResponse({}, response), 'transform failed');
235
+ assert.equal(await interceptor.onResponse({}, response), response);
236
+ assert.calledTwice(transform);
237
+ });
238
+
239
+ it('stores transform state as non-enumerable response metadata', async () => {
240
+ const {interceptor} = createInterceptor(true);
241
+ const response = {body: {value: true}};
242
+
243
+ await interceptor.onResponse({}, response);
244
+
245
+ const [marker] = Object.getOwnPropertySymbols(response);
246
+
247
+ assert.isDefined(marker);
248
+ assert.isFalse(Object.getOwnPropertyDescriptor(response, marker).enumerable);
249
+ assert.deepEqual(JSON.parse(JSON.stringify(response)), {body: {value: true}});
250
+ });
251
+
252
+ it('does not mark a response when transforms are disabled for that request', async () => {
253
+ const {interceptor, transform} = createInterceptor(true);
254
+ const response = {};
255
+
256
+ assert.equal(await interceptor.onResponse({disableTransform: true}, response), response);
257
+ assert.equal(await interceptor.onResponse({}, response), response);
258
+ assert.calledOnceWithExactly(transform, 'inbound', response);
259
+ });
260
+ });
261
+
262
+ describe('#onResponseError()', () => {
263
+ it('continues transforming repeated error objects independently', async () => {
264
+ const {interceptor, transform} = createInterceptor(true);
265
+ const reason = new Error('request failed');
266
+
267
+ await assert.isRejected(interceptor.onResponseError({}, reason), 'request failed');
268
+ await assert.isRejected(interceptor.onResponseError({}, reason), 'request failed');
269
+ assert.calledTwice(transform);
270
+ assert.alwaysCalledWithExactly(transform, 'inbound', reason);
271
+ });
272
+ });
273
+ });
156
274
  });
157
275
  });
@@ -5,7 +5,11 @@
5
5
  import {assert} from '@webex/test-helper-chai';
6
6
  import MockWebex from '@webex/test-helper-mock-webex';
7
7
  import {Services} from '@webex/webex-core';
8
- import {matchesCatalogUrl} from '../../../../src/lib/services/service-catalog';
8
+ import {
9
+ matchesCatalogUrl,
10
+ matchesParsedCatalogUrl,
11
+ parseCatalogUrl,
12
+ } from '../../../../src/lib/services/service-catalog';
9
13
 
10
14
  describe('matchesCatalogUrl()', () => {
11
15
  describe('origin validation', () => {
@@ -94,6 +98,86 @@ describe('matchesCatalogUrl()', () => {
94
98
  });
95
99
  });
96
100
 
101
+ describe('parseCatalogUrl()', () => {
102
+ it('returns the origin and pathname for a valid url', () => {
103
+ assert.deepEqual(parseCatalogUrl('https://example.com/api/v1'), {
104
+ origin: 'https://example.com',
105
+ path: '/api/v1',
106
+ });
107
+ });
108
+
109
+ it('strips a trailing slash from the path', () => {
110
+ assert.deepEqual(parseCatalogUrl('https://example.com/api/v1/'), {
111
+ origin: 'https://example.com',
112
+ path: '/api/v1',
113
+ });
114
+ });
115
+
116
+ it('normalizes a root url to the "/" path', () => {
117
+ assert.deepEqual(parseCatalogUrl('https://example.com'), {
118
+ origin: 'https://example.com',
119
+ path: '/',
120
+ });
121
+ });
122
+
123
+ it('returns null for an unparsable url', () => {
124
+ assert.isNull(parseCatalogUrl('not-a-url'));
125
+ });
126
+
127
+ it('memoizes results, returning the same reference for repeated calls', () => {
128
+ const first = parseCatalogUrl('https://memoized.example.com/api/v1');
129
+ const second = parseCatalogUrl('https://memoized.example.com/api/v1');
130
+
131
+ assert.strictEqual(first, second);
132
+ });
133
+ });
134
+
135
+ describe('matchesParsedCatalogUrl()', () => {
136
+ it('returns true when the candidate is under the catalog origin and path', () => {
137
+ assert.isTrue(
138
+ matchesParsedCatalogUrl(
139
+ new URL('https://example.com/api/v1/users'),
140
+ parseCatalogUrl('https://example.com/api/v1')
141
+ )
142
+ );
143
+ });
144
+
145
+ it('returns false when origins differ (SECURITY)', () => {
146
+ assert.isFalse(
147
+ matchesParsedCatalogUrl(
148
+ new URL('https://trusted.example.attacker.com/activities/id'),
149
+ parseCatalogUrl('https://trusted.example')
150
+ )
151
+ );
152
+ });
153
+
154
+ it('returns false when the catalog path is not matched at a boundary (SECURITY)', () => {
155
+ assert.isFalse(
156
+ matchesParsedCatalogUrl(
157
+ new URL('https://example.com/api/v1extra/something'),
158
+ parseCatalogUrl('https://example.com/api/v1')
159
+ )
160
+ );
161
+ });
162
+
163
+ it('returns true for a root catalog path', () => {
164
+ assert.isTrue(
165
+ matchesParsedCatalogUrl(
166
+ new URL('https://example.com/any/path'),
167
+ parseCatalogUrl('https://example.com/')
168
+ )
169
+ );
170
+ });
171
+
172
+ it('returns false when the candidate url is missing', () => {
173
+ assert.isFalse(matchesParsedCatalogUrl(undefined, parseCatalogUrl('https://example.com/api')));
174
+ });
175
+
176
+ it('returns false when the parsed catalog url is null', () => {
177
+ assert.isFalse(matchesParsedCatalogUrl(new URL('https://example.com/api'), null));
178
+ });
179
+ });
180
+
97
181
  /* eslint-disable no-underscore-dangle */
98
182
  describe('webex-core', () => {
99
183
  describe('ServiceCatalog', () => {
@@ -396,6 +396,16 @@ describe('webex-core', () => {
396
396
 
397
397
  assert.isUndefined(service);
398
398
  });
399
+
400
+ it('returns undefined for an unparsable url', () => {
401
+ const exampleService = {
402
+ serviceUrls: [{baseUrl: 'https://example.com/resource'}],
403
+ };
404
+
405
+ catalog.serviceGroups.postauth.push(exampleService);
406
+
407
+ assert.isUndefined(catalog.findServiceDetailFromUrl('not-a-url'));
408
+ });
399
409
  });
400
410
  });
401
411
  });