@webex/webex-core 3.8.0 → 3.8.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +87 -27
  2. package/dist/index.js +43 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/interceptors/redirect.js +18 -0
  5. package/dist/interceptors/redirect.js.map +1 -1
  6. package/dist/lib/batcher.js +1 -1
  7. package/dist/lib/credentials/credentials.js +1 -1
  8. package/dist/lib/credentials/token.js +1 -1
  9. package/dist/lib/services/services.js +1 -1
  10. package/dist/lib/services-v2/constants.js +17 -0
  11. package/dist/lib/services-v2/constants.js.map +1 -0
  12. package/dist/lib/services-v2/index.js +58 -0
  13. package/dist/lib/services-v2/index.js.map +1 -0
  14. package/dist/lib/services-v2/interceptors/hostmap.js +64 -0
  15. package/dist/lib/services-v2/interceptors/hostmap.js.map +1 -0
  16. package/dist/lib/services-v2/interceptors/server-error.js +77 -0
  17. package/dist/lib/services-v2/interceptors/server-error.js.map +1 -0
  18. package/dist/lib/services-v2/interceptors/service.js +137 -0
  19. package/dist/lib/services-v2/interceptors/service.js.map +1 -0
  20. package/dist/lib/services-v2/metrics.js +12 -0
  21. package/dist/lib/services-v2/metrics.js.map +1 -0
  22. package/dist/lib/services-v2/service-catalog.js +346 -0
  23. package/dist/lib/services-v2/service-catalog.js.map +1 -0
  24. package/dist/lib/services-v2/service-detail.js +94 -0
  25. package/dist/lib/services-v2/service-detail.js.map +1 -0
  26. package/dist/lib/services-v2/service-fed-ramp.js +13 -0
  27. package/dist/lib/services-v2/service-fed-ramp.js.map +1 -0
  28. package/dist/lib/services-v2/services-v2.js +985 -0
  29. package/dist/lib/services-v2/services-v2.js.map +1 -0
  30. package/dist/lib/services-v2/types.js +7 -0
  31. package/dist/lib/services-v2/types.js.map +1 -0
  32. package/dist/plugins/logger.js +1 -1
  33. package/dist/webex-core.js +2 -2
  34. package/dist/webex-core.js.map +1 -1
  35. package/package.json +13 -13
  36. package/src/index.js +10 -0
  37. package/src/interceptors/redirect.js +28 -0
  38. package/src/lib/services-v2/README.md +3 -0
  39. package/src/lib/services-v2/constants.ts +21 -0
  40. package/src/lib/services-v2/index.ts +23 -0
  41. package/src/lib/services-v2/interceptors/hostmap.js +36 -0
  42. package/src/lib/services-v2/interceptors/server-error.js +48 -0
  43. package/src/lib/services-v2/interceptors/service.js +101 -0
  44. package/src/lib/services-v2/metrics.js +4 -0
  45. package/src/lib/services-v2/service-catalog.ts +360 -0
  46. package/src/lib/services-v2/service-detail.ts +97 -0
  47. package/src/lib/services-v2/service-fed-ramp.ts +5 -0
  48. package/src/lib/services-v2/services-v2.js +988 -0
  49. package/src/lib/services-v2/types.ts +13 -0
  50. package/test/fixtures/host-catalog-v2.ts +249 -0
  51. package/test/integration/spec/services/services.js +12 -10
  52. package/test/unit/spec/interceptors/redirect.js +72 -0
  53. package/test/unit/spec/services-v2/service-catalog.ts +288 -0
  54. package/test/unit/spec/services-v2/service-detail.ts +147 -0
  55. package/test/unit/spec/services-v2/services-v2.ts +562 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
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");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
14
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
15
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
16
+ var _httpCore = require("@webex/http-core");
17
+ var _webexHttpError = _interopRequireDefault(require("../../webex-http-error"));
18
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
19
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /*!
20
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
21
+ */
22
+ /**
23
+ * Changes server url when it fails
24
+ */
25
+ var ServerErrorInterceptor = exports.default = /*#__PURE__*/function (_Interceptor) {
26
+ (0, _inherits2.default)(ServerErrorInterceptor, _Interceptor);
27
+ var _super = _createSuper(ServerErrorInterceptor);
28
+ function ServerErrorInterceptor() {
29
+ (0, _classCallCheck2.default)(this, ServerErrorInterceptor);
30
+ return _super.apply(this, arguments);
31
+ }
32
+ (0, _createClass2.default)(ServerErrorInterceptor, [{
33
+ key: "onResponseError",
34
+ value:
35
+ /**
36
+ * @see Interceptor#onResponseError
37
+ * @param {Object} options
38
+ * @param {Object} reason
39
+ * @returns {Object}
40
+ */
41
+ function onResponseError(options, reason) {
42
+ if ((reason instanceof _webexHttpError.default.InternalServerError || reason instanceof _webexHttpError.default.BadGateway || reason instanceof _webexHttpError.default.ServiceUnavailable) && options.uri) {
43
+ var feature = this.webex.internal.device.features.developer.get('web-high-availability');
44
+ if (feature && feature.value) {
45
+ this.webex.internal.metrics.submitClientMetrics('web-ha', {
46
+ fields: {
47
+ success: false
48
+ },
49
+ tags: {
50
+ action: 'failed',
51
+ error: reason.message,
52
+ url: options.uri
53
+ }
54
+ });
55
+ return _promise.default.resolve(this.webex.internal.services.markFailedUrl(options.uri)).then(function () {
56
+ return _promise.default.reject(reason);
57
+ });
58
+ }
59
+ }
60
+ return _promise.default.reject(reason);
61
+ }
62
+ }], [{
63
+ key: "create",
64
+ value:
65
+ /**
66
+ * @returns {HAMessagingInterceptor}
67
+ */
68
+ function create() {
69
+ // eslint-disable-next-line no-invalid-this
70
+ return new ServerErrorInterceptor({
71
+ webex: this
72
+ });
73
+ }
74
+ }]);
75
+ return ServerErrorInterceptor;
76
+ }(_httpCore.Interceptor);
77
+ //# sourceMappingURL=server-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_httpCore","require","_webexHttpError","_interopRequireDefault","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","ServerErrorInterceptor","exports","_Interceptor","_inherits2","_super","_classCallCheck2","_createClass2","key","value","onResponseError","options","reason","WebexHttpError","InternalServerError","BadGateway","ServiceUnavailable","uri","feature","webex","internal","device","features","developer","get","metrics","submitClientMetrics","fields","success","tags","action","error","message","url","_promise","resolve","services","markFailedUrl","then","reject","create","Interceptor"],"sources":["server-error.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\nimport WebexHttpError from '../../webex-http-error';\n/**\n * Changes server url when it fails\n */\nexport default class ServerErrorInterceptor extends Interceptor {\n /**\n * @returns {HAMessagingInterceptor}\n */\n static create() {\n // eslint-disable-next-line no-invalid-this\n return new ServerErrorInterceptor({webex: this});\n }\n\n /**\n * @see Interceptor#onResponseError\n * @param {Object} options\n * @param {Object} reason\n * @returns {Object}\n */\n onResponseError(options, reason) {\n if (\n (reason instanceof WebexHttpError.InternalServerError ||\n reason instanceof WebexHttpError.BadGateway ||\n reason instanceof WebexHttpError.ServiceUnavailable) &&\n options.uri\n ) {\n const feature = this.webex.internal.device.features.developer.get('web-high-availability');\n\n if (feature && feature.value) {\n this.webex.internal.metrics.submitClientMetrics('web-ha', {\n fields: {success: false},\n tags: {action: 'failed', error: reason.message, url: options.uri},\n });\n\n return Promise.resolve(this.webex.internal.services.markFailedUrl(options.uri)).then(() =>\n Promise.reject(reason)\n );\n }\n }\n\n return Promise.reject(reason);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAIA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAoD,SAAAG,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAG,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAN,KAAA,EAAAO,SAAA,EAAAH,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAQ,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAP,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAY,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAV,kBAAA,CAAAO,OAAA,8CAAAI,CAAA,sBALpD;AACA;AACA;AAIA;AACA;AACA;AAFA,IAGqBC,sBAAsB,GAAAC,OAAA,CAAAjB,OAAA,0BAAAkB,YAAA;EAAA,IAAAC,UAAA,CAAAnB,OAAA,EAAAgB,sBAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA3B,YAAA,CAAAuB,sBAAA;EAAA,SAAAA,uBAAA;IAAA,IAAAK,gBAAA,CAAArB,OAAA,QAAAgB,sBAAA;IAAA,OAAAI,MAAA,CAAAd,KAAA,OAAAD,SAAA;EAAA;EAAA,IAAAiB,aAAA,CAAAtB,OAAA,EAAAgB,sBAAA;IAAAO,GAAA;IAAAC,KAAA;IASzC;AACF;AACA;AACA;AACA;AACA;IACE,SAAAC,gBAAgBC,OAAO,EAAEC,MAAM,EAAE;MAC/B,IACE,CAACA,MAAM,YAAYC,uBAAc,CAACC,mBAAmB,IACnDF,MAAM,YAAYC,uBAAc,CAACE,UAAU,IAC3CH,MAAM,YAAYC,uBAAc,CAACG,kBAAkB,KACrDL,OAAO,CAACM,GAAG,EACX;QACA,IAAMC,OAAO,GAAG,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACC,QAAQ,CAACC,SAAS,CAACC,GAAG,CAAC,uBAAuB,CAAC;QAE1F,IAAIN,OAAO,IAAIA,OAAO,CAACT,KAAK,EAAE;UAC5B,IAAI,CAACU,KAAK,CAACC,QAAQ,CAACK,OAAO,CAACC,mBAAmB,CAAC,QAAQ,EAAE;YACxDC,MAAM,EAAE;cAACC,OAAO,EAAE;YAAK,CAAC;YACxBC,IAAI,EAAE;cAACC,MAAM,EAAE,QAAQ;cAAEC,KAAK,EAAEnB,MAAM,CAACoB,OAAO;cAAEC,GAAG,EAAEtB,OAAO,CAACM;YAAG;UAClE,CAAC,CAAC;UAEF,OAAOiB,QAAA,CAAAjD,OAAA,CAAQkD,OAAO,CAAC,IAAI,CAAChB,KAAK,CAACC,QAAQ,CAACgB,QAAQ,CAACC,aAAa,CAAC1B,OAAO,CAACM,GAAG,CAAC,CAAC,CAACqB,IAAI,CAAC;YAAA,OACnFJ,QAAA,CAAAjD,OAAA,CAAQsD,MAAM,CAAC3B,MAAM,CAAC;UAAA,CACxB,CAAC;QACH;MACF;MAEA,OAAOsB,QAAA,CAAAjD,OAAA,CAAQsD,MAAM,CAAC3B,MAAM,CAAC;IAC/B;EAAC;IAAAJ,GAAA;IAAAC,KAAA;IApCD;AACF;AACA;IACE,SAAA+B,OAAA,EAAgB;MACd;MACA,OAAO,IAAIvC,sBAAsB,CAAC;QAACkB,KAAK,EAAE;MAAI,CAAC,CAAC;IAClD;EAAC;EAAA,OAAAlB,sBAAA;AAAA,EAPiDwC,qBAAW"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+
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");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
14
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
15
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
16
+ var _httpCore = require("@webex/http-core");
17
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
18
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /*!
19
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
20
+ */
21
+ var trailingSlashes = /(?:^\/)|(?:\/$)/;
22
+
23
+ /**
24
+ * @class
25
+ */
26
+ var ServiceInterceptor = exports.default = /*#__PURE__*/function (_Interceptor) {
27
+ (0, _inherits2.default)(ServiceInterceptor, _Interceptor);
28
+ var _super = _createSuper(ServiceInterceptor);
29
+ function ServiceInterceptor() {
30
+ (0, _classCallCheck2.default)(this, ServiceInterceptor);
31
+ return _super.apply(this, arguments);
32
+ }
33
+ (0, _createClass2.default)(ServiceInterceptor, [{
34
+ key: "onRequest",
35
+ value: /* eslint-disable no-param-reassign */
36
+ /**
37
+ * @see Interceptor#onRequest
38
+ * @param {Object} options - The request PTO.
39
+ * @returns {Object} - The mutated request PTO.
40
+ */
41
+ function onRequest(options) {
42
+ var _this = this;
43
+ // Validate that the PTO includes a uri property.
44
+ if (options.uri) {
45
+ return options;
46
+ }
47
+
48
+ // Normalize and validate the PTO.
49
+ this.normalizeOptions(options);
50
+ this.validateOptions(options);
51
+
52
+ // Destructure commonly referenced namespaces.
53
+ var services = this.webex.internal.services;
54
+ var service = options.service,
55
+ resource = options.resource,
56
+ waitForServiceTimeout = options.waitForServiceTimeout;
57
+
58
+ // Attempt to collect the service url.
59
+ return services.waitForService({
60
+ name: service,
61
+ timeout: waitForServiceTimeout
62
+ }).then(function (serviceUrl) {
63
+ // Generate the combined service url and resource.
64
+ options.uri = _this.generateUri(serviceUrl, resource);
65
+ return options;
66
+ }).catch(function () {
67
+ return _promise.default.reject(new Error("service-interceptor: '".concat(service, "' is not a known service")));
68
+ });
69
+ }
70
+
71
+ /* eslint-disable class-methods-use-this */
72
+ /**
73
+ * Generate a usable request uri string from a service url and a resouce.
74
+ *
75
+ * @param {string} serviceUrl - The service url.
76
+ * @param {string} [resource] - The resouce to be appended to the service url.
77
+ * @returns {string} - The combined service url and resource.
78
+ */
79
+ }, {
80
+ key: "generateUri",
81
+ value: function generateUri(serviceUrl) {
82
+ var resource = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
83
+ var formattedService = serviceUrl.replace(trailingSlashes, '');
84
+ var formattedResource = resource.replace(trailingSlashes, '');
85
+ return "".concat(formattedService, "/").concat(formattedResource);
86
+ }
87
+
88
+ /**
89
+ * Normalizes request options relative to service identification.
90
+ *
91
+ * @param {Object} options - The request PTO.
92
+ * @returns {Object} - The mutated request PTO.
93
+ */
94
+ }, {
95
+ key: "normalizeOptions",
96
+ value: function normalizeOptions(options) {
97
+ // Validate if the api property is used.
98
+ if (options.api) {
99
+ // Assign the service property the value of the api property if necessary.
100
+ options.service = options.service || options.api;
101
+ delete options.api;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Validates that the appropriate options for this interceptor are present.
107
+ *
108
+ * @param {Object} options - The request PTO.
109
+ * @returns {Object} - The mutated request PTO.
110
+ */
111
+ }, {
112
+ key: "validateOptions",
113
+ value: function validateOptions(options) {
114
+ if (!options.resource) {
115
+ throw new Error('a `resource` parameter is required');
116
+ }
117
+ if (!options.service) {
118
+ throw new Error("a valid 'service' parameter is required");
119
+ }
120
+ }
121
+ /* eslint-enable class-methods-use-this, no-param-reassign */
122
+ }], [{
123
+ key: "create",
124
+ value:
125
+ /**
126
+ * @returns {ServiceInterceptor}
127
+ */
128
+ function create() {
129
+ /* eslint no-invalid-this: [0] */
130
+ return new ServiceInterceptor({
131
+ webex: this
132
+ });
133
+ }
134
+ }]);
135
+ return ServiceInterceptor;
136
+ }(_httpCore.Interceptor);
137
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_httpCore","require","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","trailingSlashes","ServiceInterceptor","exports","_Interceptor","_inherits2","_super","_classCallCheck2","_createClass2","key","value","onRequest","options","_this","uri","normalizeOptions","validateOptions","services","webex","internal","service","resource","waitForServiceTimeout","waitForService","name","timeout","then","serviceUrl","generateUri","catch","_promise","reject","Error","concat","length","undefined","formattedService","replace","formattedResource","api","create","Interceptor"],"sources":["service.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\n\nconst trailingSlashes = /(?:^\\/)|(?:\\/$)/;\n\n/**\n * @class\n */\nexport default class ServiceInterceptor extends Interceptor {\n /**\n * @returns {ServiceInterceptor}\n */\n static create() {\n /* eslint no-invalid-this: [0] */\n return new ServiceInterceptor({webex: this});\n }\n\n /* eslint-disable no-param-reassign */\n /**\n * @see Interceptor#onRequest\n * @param {Object} options - The request PTO.\n * @returns {Object} - The mutated request PTO.\n */\n onRequest(options) {\n // Validate that the PTO includes a uri property.\n if (options.uri) {\n return options;\n }\n\n // Normalize and validate the PTO.\n this.normalizeOptions(options);\n this.validateOptions(options);\n\n // Destructure commonly referenced namespaces.\n const {services} = this.webex.internal;\n const {service, resource, waitForServiceTimeout} = options;\n\n // Attempt to collect the service url.\n return services\n .waitForService({name: service, timeout: waitForServiceTimeout})\n .then((serviceUrl) => {\n // Generate the combined service url and resource.\n options.uri = this.generateUri(serviceUrl, resource);\n\n return options;\n })\n .catch(() =>\n Promise.reject(new Error(`service-interceptor: '${service}' is not a known service`))\n );\n }\n\n /* eslint-disable class-methods-use-this */\n /**\n * Generate a usable request uri string from a service url and a resouce.\n *\n * @param {string} serviceUrl - The service url.\n * @param {string} [resource] - The resouce to be appended to the service url.\n * @returns {string} - The combined service url and resource.\n */\n generateUri(serviceUrl, resource = '') {\n const formattedService = serviceUrl.replace(trailingSlashes, '');\n const formattedResource = resource.replace(trailingSlashes, '');\n\n return `${formattedService}/${formattedResource}`;\n }\n\n /**\n * Normalizes request options relative to service identification.\n *\n * @param {Object} options - The request PTO.\n * @returns {Object} - The mutated request PTO.\n */\n normalizeOptions(options) {\n // Validate if the api property is used.\n if (options.api) {\n // Assign the service property the value of the api property if necessary.\n options.service = options.service || options.api;\n delete options.api;\n }\n }\n\n /**\n * Validates that the appropriate options for this interceptor are present.\n *\n * @param {Object} options - The request PTO.\n * @returns {Object} - The mutated request PTO.\n */\n validateOptions(options) {\n if (!options.resource) {\n throw new Error('a `resource` parameter is required');\n }\n\n if (!options.service) {\n throw new Error(\"a valid 'service' parameter is required\");\n }\n }\n /* eslint-enable class-methods-use-this, no-param-reassign */\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ // Metrics for service catalog
9
+ var _default = exports.default = {
10
+ JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND'
11
+ };
12
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_default","exports","default","JS_SDK_SERVICE_NOT_FOUND"],"sources":["metrics.js"],"sourcesContent":["// Metrics for service catalog\nexport default {\n JS_SDK_SERVICE_NOT_FOUND: 'JS_SDK_SERVICE_NOT_FOUND',\n};\n"],"mappings":";;;;;;;AAAA;AAAA,IAAAA,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACe;EACbC,wBAAwB,EAAE;AAC5B,CAAC"}
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+
3
+ var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
4
+ var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
5
+ var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
6
+ var _Array$isArray = require("@babel/runtime-corejs2/core-js/array/is-array");
7
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
8
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
9
+ _Object$defineProperty(exports, "__esModule", {
10
+ value: true
11
+ });
12
+ exports.default = void 0;
13
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
15
+ var _ampersandState = _interopRequireDefault(require("ampersand-state"));
16
+ var _lodash = require("lodash");
17
+ var _serviceDetail = _interopRequireDefault(require("./service-detail"));
18
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && o[_Symbol$iterator] || o["@@iterator"]; if (!it) { if (_Array$isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
19
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
20
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
21
+ /**
22
+ * @class
23
+ */
24
+ var ServiceCatalog = _ampersandState.default.extend({
25
+ namespace: 'ServiceCatalog',
26
+ props: {
27
+ serviceGroups: ['object', true, function () {
28
+ return {
29
+ discovery: [],
30
+ override: [],
31
+ preauth: [],
32
+ postauth: [],
33
+ signin: []
34
+ };
35
+ }],
36
+ status: ['object', true, function () {
37
+ return {
38
+ discovery: {
39
+ ready: false,
40
+ collecting: false
41
+ },
42
+ override: {
43
+ ready: false,
44
+ collecting: false
45
+ },
46
+ preauth: {
47
+ ready: false,
48
+ collecting: false
49
+ },
50
+ postauth: {
51
+ ready: false,
52
+ collecting: false
53
+ },
54
+ signin: {
55
+ ready: false,
56
+ collecting: false
57
+ }
58
+ };
59
+ }],
60
+ isReady: ['boolean', false, false],
61
+ allowedDomains: ['array', false, function () {
62
+ return [];
63
+ }]
64
+ },
65
+ /**
66
+ * @private
67
+ * Get all service details for a given service group or return all details if no group is specified.
68
+ * @param {string} serviceGroup - The name of the service group to retrieve details for.
69
+ * @returns {Array<IServiceDetail>} - An array of service details.
70
+ */
71
+ _getAllServiceDetails: function _getAllServiceDetails(serviceGroup) {
72
+ var serviceDetails = typeof serviceGroup === 'string' ? this.serviceGroups[serviceGroup] || [] : [].concat((0, _toConsumableArray2.default)(this.serviceGroups.override), (0, _toConsumableArray2.default)(this.serviceGroups.postauth), (0, _toConsumableArray2.default)(this.serviceGroups.signin), (0, _toConsumableArray2.default)(this.serviceGroups.preauth), (0, _toConsumableArray2.default)(this.serviceGroups.discovery));
73
+ return serviceDetails;
74
+ },
75
+ /**
76
+ * @private
77
+ * Search the service details array to locate a `ServiceDetails`
78
+ * class object based on its id.
79
+ * @param {string} clusterId
80
+ * @param {string} [serviceGroup]
81
+ * @returns {IServiceDetail}
82
+ */
83
+ _getServiceDetail: function _getServiceDetail(clusterId, serviceGroup) {
84
+ var serviceDetails = this._getAllServiceDetails(serviceGroup);
85
+ return serviceDetails.find(function (serviceDetail) {
86
+ return serviceDetail.id === clusterId;
87
+ });
88
+ },
89
+ /**
90
+ * @private
91
+ * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.
92
+ * @param {string} serviceGroup
93
+ * @param {Array<ServiceDetail>} serviceDetails
94
+ * @returns {void}
95
+ */
96
+ _loadServiceDetails: function _loadServiceDetails(serviceGroup, serviceDetails) {
97
+ var _this = this;
98
+ // declare namespaces outside of loop
99
+ var existingService;
100
+ serviceDetails.forEach(function (service) {
101
+ existingService = _this._getServiceDetail(service.id, serviceGroup);
102
+ if (!existingService) {
103
+ _this.serviceGroups[serviceGroup].push(service);
104
+ }
105
+ });
106
+ },
107
+ /**
108
+ * @private
109
+ * Safely unload one or more `ServiceDetail`s into this `Services` instance
110
+ * @param {string} serviceGroup
111
+ * @param {Array<ServiceDetail>} serviceDetails
112
+ * @returns {void}
113
+ */
114
+ _unloadServiceDetails: function _unloadServiceDetails(serviceGroup, serviceDetails) {
115
+ var _this2 = this;
116
+ // declare namespaces outside of loop
117
+ var existingService;
118
+ serviceDetails.forEach(function (service) {
119
+ existingService = _this2._getServiceDetail(service.id, serviceGroup);
120
+ if (existingService) {
121
+ _this2.serviceGroups[serviceGroup].splice(_this2.serviceGroups[serviceGroup].indexOf(existingService), 1);
122
+ }
123
+ });
124
+ },
125
+ /**
126
+ * Clear all collected catalog data and reset catalog status.
127
+ *
128
+ * @returns {void}
129
+ */
130
+ clean: function clean() {
131
+ this.serviceGroups.preauth.length = 0;
132
+ this.serviceGroups.signin.length = 0;
133
+ this.serviceGroups.postauth.length = 0;
134
+ this.status.preauth = {
135
+ ready: false
136
+ };
137
+ this.status.signin = {
138
+ ready: false
139
+ };
140
+ this.status.postauth = {
141
+ ready: false
142
+ };
143
+ },
144
+ /**
145
+ * Search over all service groups to find a cluster id based
146
+ * on a given url.
147
+ * @param {string} url - Must be parsable by `Url`
148
+ * @returns {string | undefined} - ClusterId of a given url
149
+ */
150
+ findClusterId: function findClusterId(url) {
151
+ try {
152
+ var _allServiceDetails$fi;
153
+ var incomingUrlObj = new URL(url);
154
+ var allServiceDetails = this._getAllServiceDetails();
155
+ return (_allServiceDetails$fi = allServiceDetails.find(function (serviceDetail) {
156
+ return serviceDetail.serviceUrls.find(function (_ref) {
157
+ var host = _ref.host;
158
+ return host === incomingUrlObj.host;
159
+ });
160
+ })) === null || _allServiceDetails$fi === void 0 ? void 0 : _allServiceDetails$fi.id;
161
+ } catch (_unused) {
162
+ // If the URL is invalid or can't be found, return undefined
163
+ return undefined;
164
+ }
165
+ },
166
+ /**
167
+ * Search over all service groups and return a service value from a provided
168
+ * clusterId.
169
+ * @param {object} params
170
+ * @param {string} params.clusterId - clusterId of found service
171
+ * @param {string} [params.serviceGroup] - specify service group
172
+ * @returns {object} service
173
+ * @returns {string} service.name
174
+ * @returns {string} service.url
175
+ */
176
+ findServiceFromClusterId: function findServiceFromClusterId() {
177
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
178
+ clusterId = _ref2.clusterId,
179
+ serviceGroup = _ref2.serviceGroup;
180
+ var serviceDetails = this._getServiceDetail(clusterId, serviceGroup);
181
+ if (serviceDetails) {
182
+ return {
183
+ name: serviceDetails.serviceName,
184
+ url: serviceDetails.get()
185
+ };
186
+ }
187
+ return undefined;
188
+ },
189
+ /**
190
+ * Find a service based on the provided url.
191
+ * @param {string} url - Must be parsable by `Url`
192
+ * @returns {IServiceDetail} - ServiceDetail assocated with provided url
193
+ */
194
+ findServiceDetailFromUrl: function findServiceDetailFromUrl(url) {
195
+ var serviceDetails = this._getAllServiceDetails();
196
+ return serviceDetails.find(function (_ref3) {
197
+ var serviceUrls = _ref3.serviceUrls;
198
+ var _iterator = _createForOfIteratorHelper(serviceUrls),
199
+ _step;
200
+ try {
201
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
202
+ var serviceUrl = _step.value;
203
+ if (url.startsWith(serviceUrl.baseUrl)) {
204
+ return true;
205
+ }
206
+ }
207
+ } catch (err) {
208
+ _iterator.e(err);
209
+ } finally {
210
+ _iterator.f();
211
+ }
212
+ return false;
213
+ });
214
+ },
215
+ /**
216
+ * Finds an allowed domain that matches a specific url.
217
+ *
218
+ * @param {string} url - The url to match the allowed domains against.
219
+ * @returns {string} - The matching allowed domain.
220
+ */
221
+ findAllowedDomain: function findAllowedDomain(url) {
222
+ try {
223
+ var urlObj = new URL(url);
224
+ return this.allowedDomains.find(function (allowedDomain) {
225
+ return urlObj.host.includes(allowedDomain);
226
+ });
227
+ } catch (_unused2) {
228
+ // If the URL is invalid or can't be found, return undefined
229
+ return undefined;
230
+ }
231
+ },
232
+ /**
233
+ * Get a service url from the current services list by name.
234
+ * @param {string} clusterId
235
+ * @param {string} serviceGroup
236
+ * @returns {string}
237
+ */
238
+ get: function get(clusterId, serviceGroup) {
239
+ var serviceDetail = this._getServiceDetail(clusterId, serviceGroup);
240
+ return serviceDetail ? serviceDetail.get() : undefined;
241
+ },
242
+ /**
243
+ * Get the current allowed domains list.
244
+ *
245
+ * @returns {Array<string>} - the current allowed domains list.
246
+ */
247
+ getAllowedDomains: function getAllowedDomains() {
248
+ return (0, _toConsumableArray2.default)(this.allowedDomains);
249
+ },
250
+ /**
251
+ * Mark a priority host service url as failed.
252
+ * This will mark the host associated with the
253
+ * `ServiceDetail` to be removed from the its
254
+ * respective host array, and then return the next
255
+ * viable host from the `ServiceDetail` host array,
256
+ * or the `ServiceDetail` default url if no other priority
257
+ * hosts are available, or if `noPriorityHosts` is set to
258
+ * `true`.
259
+ * @param {string} url
260
+ * @returns {string}
261
+ */
262
+ markFailedServiceUrl: function markFailedServiceUrl(url) {
263
+ var serviceDetails = this._getAllServiceDetails();
264
+ var serviceDetailWithFailedHost = serviceDetails.find(function (serviceDetail) {
265
+ return serviceDetail.failHost(url);
266
+ });
267
+
268
+ // if we couldn't find the url we wanted to fail, return undefined
269
+ if (!serviceDetailWithFailedHost) {
270
+ return undefined;
271
+ }
272
+ return serviceDetailWithFailedHost.get();
273
+ },
274
+ /**
275
+ * Set the allowed domains for the catalog.
276
+ *
277
+ * @param {Array<string>} allowedDomains - allowed domains to be assigned.
278
+ * @returns {void}
279
+ */
280
+ setAllowedDomains: function setAllowedDomains(allowedDomains) {
281
+ this.allowedDomains = (0, _toConsumableArray2.default)(allowedDomains);
282
+ },
283
+ /**
284
+ *
285
+ * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains
286
+ * @returns {void}
287
+ */
288
+ addAllowedDomains: function addAllowedDomains(newAllowedDomains) {
289
+ this.allowedDomains = (0, _lodash.union)(this.allowedDomains, newAllowedDomains);
290
+ },
291
+ /**
292
+ * Update the current list of `ServiceDetail`s against a provided
293
+ * service hostmap.
294
+ * @emits ServiceCatalog#preauthorized
295
+ * @emits ServiceCatalog#postauthorized
296
+ * @param {string} serviceGroup
297
+ * @param {Array<IServiceDetail>} serviceDetails
298
+ * @returns {void}
299
+ */
300
+ updateServiceGroups: function updateServiceGroups(serviceGroup, serviceDetails) {
301
+ var _this3 = this;
302
+ var currentServiceDetails = this.serviceGroups[serviceGroup];
303
+ var unusedServicesDetails = currentServiceDetails.filter(function (serviceDetail) {
304
+ return serviceDetails.every(function (_ref4) {
305
+ var id = _ref4.id;
306
+ return id !== serviceDetail.id;
307
+ });
308
+ });
309
+ this._unloadServiceDetails(serviceGroup, unusedServicesDetails);
310
+ serviceDetails.forEach(function (serviceObj) {
311
+ var serviceDetail = _this3._getServiceDetail(serviceObj.id, serviceGroup);
312
+ if (serviceDetail) {
313
+ serviceDetail.serviceUrls = serviceObj.serviceUrls || [];
314
+ } else {
315
+ _this3._loadServiceDetails(serviceGroup, [new _serviceDetail.default(serviceObj)]);
316
+ }
317
+ });
318
+ this.status[serviceGroup].ready = true;
319
+ this.trigger(serviceGroup);
320
+ },
321
+ /**
322
+ * Wait until the service catalog is available,
323
+ * or reject after a timeout of 60 seconds.
324
+ * @param {string} serviceGroup
325
+ * @param {number} [timeout] - in seconds
326
+ * @returns {Promise<void>}
327
+ */
328
+ waitForCatalog: function waitForCatalog(serviceGroup, timeout) {
329
+ var _this4 = this;
330
+ return new _promise.default(function (resolve, reject) {
331
+ if (_this4.status[serviceGroup].ready) {
332
+ resolve();
333
+ }
334
+ var validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;
335
+ var timeoutTimer = setTimeout(function () {
336
+ return reject(new Error("services: timeout occured while waiting for '".concat(serviceGroup, "' catalog to populate")));
337
+ }, validatedTimeout * 1000);
338
+ _this4.once(serviceGroup, function () {
339
+ clearTimeout(timeoutTimer);
340
+ resolve();
341
+ });
342
+ });
343
+ }
344
+ });
345
+ var _default = exports.default = ServiceCatalog;
346
+ //# sourceMappingURL=service-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","_ref3","_iterator","_step","serviceUrl","startsWith","baseUrl","findAllowedDomain","urlObj","allowedDomain","includes","_unused2","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","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} from './types';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n 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 {string} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup: string): 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 {string} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup: string): 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 {string} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: string, 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 {string} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: string, 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 {string} [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: string}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (url.startsWith(serviceUrl.baseUrl)) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n\n return this.allowedDomains.find((allowedDomain) => urlObj.host.includes(allowedDomain));\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} clusterId\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(clusterId: string, serviceGroup: string): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = [...allowedDomains];\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, newAllowedDomains);\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {string} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @returns {void}\n */\n updateServiceGroups(serviceGroup: string, serviceDetails: Array<IServiceDetail>) {\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\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\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 {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: string, 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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"}