@webex/webex-core 3.8.0 → 3.8.1-next.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -27
- package/dist/index.js +28 -9
- package/dist/index.js.map +1 -1
- package/dist/interceptors/redirect.js +18 -0
- package/dist/interceptors/redirect.js.map +1 -1
- package/dist/lib/batcher.js +1 -1
- package/dist/lib/constants.js +10 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/credentials/credentials.js +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/{services/interceptors → interceptors}/server-error.js +1 -1
- package/dist/lib/interceptors/server-error.js.map +1 -0
- package/dist/lib/services/index.js +2 -29
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/service-host.js +1 -1
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js +1 -1
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js +1 -1
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/services.js +3 -3
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/services-v2/index.js +29 -0
- package/dist/lib/services-v2/index.js.map +1 -0
- package/dist/lib/services-v2/metrics.js +12 -0
- package/dist/lib/services-v2/metrics.js.map +1 -0
- package/dist/lib/services-v2/service-catalog.js +347 -0
- package/dist/lib/services-v2/service-catalog.js.map +1 -0
- package/dist/lib/services-v2/service-detail.js +94 -0
- package/dist/lib/services-v2/service-detail.js.map +1 -0
- package/dist/lib/services-v2/service-fed-ramp.js +13 -0
- package/dist/lib/services-v2/service-fed-ramp.js.map +1 -0
- package/dist/lib/services-v2/services-v2.js +974 -0
- package/dist/lib/services-v2/services-v2.js.map +1 -0
- package/dist/lib/services-v2/types.js +7 -0
- package/dist/lib/services-v2/types.js.map +1 -0
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +3 -3
- package/dist/webex-core.js.map +1 -1
- package/package.json +13 -13
- package/src/index.js +5 -4
- package/src/interceptors/redirect.js +28 -0
- package/src/lib/constants.js +29 -1
- package/src/lib/{services/interceptors → interceptors}/server-error.js +1 -1
- package/src/lib/services/index.js +2 -7
- package/src/lib/services/service-host.js +1 -1
- package/src/lib/services/service-registry.js +1 -1
- package/src/lib/services/service-state.js +1 -1
- package/src/lib/services/services.js +2 -2
- package/src/lib/services-v2/README.md +3 -0
- package/src/lib/services-v2/index.ts +7 -0
- package/src/lib/services-v2/metrics.ts +4 -0
- package/src/lib/services-v2/service-catalog.ts +361 -0
- package/src/lib/services-v2/service-detail.ts +97 -0
- package/src/lib/services-v2/service-fed-ramp.ts +5 -0
- package/src/lib/services-v2/services-v2.ts +1010 -0
- package/src/lib/services-v2/types.ts +73 -0
- package/src/webex-core.js +1 -1
- package/test/fixtures/host-catalog-v2.ts +157 -0
- package/test/integration/spec/services/services.js +23 -10
- package/test/integration/spec/services-v2/service-catalog.js +664 -0
- package/test/integration/spec/services-v2/services-v2.js +1061 -0
- package/test/unit/spec/interceptors/redirect.js +72 -0
- package/test/unit/spec/services-v2/service-catalog.ts +288 -0
- package/test/unit/spec/services-v2/service-detail.ts +147 -0
- package/test/unit/spec/services-v2/services-v2.ts +516 -0
- package/dist/lib/services/constants.js +0 -17
- package/dist/lib/services/constants.js.map +0 -1
- package/dist/lib/services/interceptors/server-error.js.map +0 -1
- package/src/lib/services/constants.js +0 -21
- /package/dist/lib/{services/interceptors → interceptors}/hostmap.js +0 -0
- /package/dist/lib/{services/interceptors → interceptors}/hostmap.js.map +0 -0
- /package/dist/lib/{services/interceptors → interceptors}/service.js +0 -0
- /package/dist/lib/{services/interceptors → interceptors}/service.js.map +0 -0
- /package/dist/lib/{services/metrics.js → metrics.js} +0 -0
- /package/dist/lib/{services/metrics.js.map → metrics.js.map} +0 -0
- /package/src/lib/{services/interceptors → interceptors}/hostmap.js +0 -0
- /package/src/lib/{services/interceptors → interceptors}/service.js +0 -0
- /package/src/lib/{services/metrics.js → metrics.js} +0 -0
|
@@ -0,0 +1,347 @@
|
|
|
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 {ServiceGroup} 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 {ServiceGroup} [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 {ServiceGroup} 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 {ServiceGroup} 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 {ServiceGroup} [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. Return undefined
|
|
234
|
+
* if the service is not found.
|
|
235
|
+
* @param {string} clusterId
|
|
236
|
+
* @param {ServiceGroup} serviceGroup
|
|
237
|
+
* @returns {string | undefined}
|
|
238
|
+
*/
|
|
239
|
+
get: function get(clusterId, serviceGroup) {
|
|
240
|
+
var serviceDetail = this._getServiceDetail(clusterId, serviceGroup);
|
|
241
|
+
return serviceDetail ? serviceDetail.get() : undefined;
|
|
242
|
+
},
|
|
243
|
+
/**
|
|
244
|
+
* Get the current allowed domains list.
|
|
245
|
+
*
|
|
246
|
+
* @returns {Array<string>} - the current allowed domains list.
|
|
247
|
+
*/
|
|
248
|
+
getAllowedDomains: function getAllowedDomains() {
|
|
249
|
+
return (0, _toConsumableArray2.default)(this.allowedDomains);
|
|
250
|
+
},
|
|
251
|
+
/**
|
|
252
|
+
* Mark a priority host service url as failed.
|
|
253
|
+
* This will mark the host associated with the
|
|
254
|
+
* `ServiceDetail` to be removed from the its
|
|
255
|
+
* respective host array, and then return the next
|
|
256
|
+
* viable host from the `ServiceDetail` host array,
|
|
257
|
+
* or the `ServiceDetail` default url if no other priority
|
|
258
|
+
* hosts are available, or if `noPriorityHosts` is set to
|
|
259
|
+
* `true`.
|
|
260
|
+
* @param {string} url
|
|
261
|
+
* @returns {string}
|
|
262
|
+
*/
|
|
263
|
+
markFailedServiceUrl: function markFailedServiceUrl(url) {
|
|
264
|
+
var serviceDetails = this._getAllServiceDetails();
|
|
265
|
+
var serviceDetailWithFailedHost = serviceDetails.find(function (serviceDetail) {
|
|
266
|
+
return serviceDetail.failHost(url);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// if we couldn't find the url we wanted to fail, return undefined
|
|
270
|
+
if (!serviceDetailWithFailedHost) {
|
|
271
|
+
return undefined;
|
|
272
|
+
}
|
|
273
|
+
return serviceDetailWithFailedHost.get();
|
|
274
|
+
},
|
|
275
|
+
/**
|
|
276
|
+
* Set the allowed domains for the catalog.
|
|
277
|
+
*
|
|
278
|
+
* @param {Array<string>} allowedDomains - allowed domains to be assigned.
|
|
279
|
+
* @returns {void}
|
|
280
|
+
*/
|
|
281
|
+
setAllowedDomains: function setAllowedDomains(allowedDomains) {
|
|
282
|
+
this.allowedDomains = (0, _toConsumableArray2.default)(allowedDomains);
|
|
283
|
+
},
|
|
284
|
+
/**
|
|
285
|
+
*
|
|
286
|
+
* @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains
|
|
287
|
+
* @returns {void}
|
|
288
|
+
*/
|
|
289
|
+
addAllowedDomains: function addAllowedDomains(newAllowedDomains) {
|
|
290
|
+
this.allowedDomains = (0, _lodash.union)(this.allowedDomains, newAllowedDomains);
|
|
291
|
+
},
|
|
292
|
+
/**
|
|
293
|
+
* Update the current list of `ServiceDetail`s against a provided
|
|
294
|
+
* service hostmap.
|
|
295
|
+
* @emits ServiceCatalog#preauthorized
|
|
296
|
+
* @emits ServiceCatalog#postauthorized
|
|
297
|
+
* @param {ServiceGroup} serviceGroup
|
|
298
|
+
* @param {Array<IServiceDetail>} serviceDetails
|
|
299
|
+
* @returns {void}
|
|
300
|
+
*/
|
|
301
|
+
updateServiceGroups: function updateServiceGroups(serviceGroup, serviceDetails) {
|
|
302
|
+
var _this3 = this;
|
|
303
|
+
var currentServiceDetails = this.serviceGroups[serviceGroup];
|
|
304
|
+
var unusedServicesDetails = currentServiceDetails.filter(function (serviceDetail) {
|
|
305
|
+
return serviceDetails.every(function (_ref4) {
|
|
306
|
+
var id = _ref4.id;
|
|
307
|
+
return id !== serviceDetail.id;
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
this._unloadServiceDetails(serviceGroup, unusedServicesDetails);
|
|
311
|
+
serviceDetails.forEach(function (serviceObj) {
|
|
312
|
+
var serviceDetail = _this3._getServiceDetail(serviceObj.id, serviceGroup);
|
|
313
|
+
if (serviceDetail) {
|
|
314
|
+
serviceDetail.serviceUrls = serviceObj.serviceUrls || [];
|
|
315
|
+
} else {
|
|
316
|
+
_this3._loadServiceDetails(serviceGroup, [new _serviceDetail.default(serviceObj)]);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
this.status[serviceGroup].ready = true;
|
|
320
|
+
this.trigger(serviceGroup);
|
|
321
|
+
},
|
|
322
|
+
/**
|
|
323
|
+
* Wait until the service catalog is available,
|
|
324
|
+
* or reject after a timeout of 60 seconds.
|
|
325
|
+
* @param {ServiceGroup} serviceGroup
|
|
326
|
+
* @param {number} [timeout] - in seconds
|
|
327
|
+
* @returns {Promise<void>}
|
|
328
|
+
*/
|
|
329
|
+
waitForCatalog: function waitForCatalog(serviceGroup, timeout) {
|
|
330
|
+
var _this4 = this;
|
|
331
|
+
return new _promise.default(function (resolve, reject) {
|
|
332
|
+
if (_this4.status[serviceGroup].ready) {
|
|
333
|
+
resolve();
|
|
334
|
+
}
|
|
335
|
+
var validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;
|
|
336
|
+
var timeoutTimer = setTimeout(function () {
|
|
337
|
+
return reject(new Error("services: timeout occured while waiting for '".concat(serviceGroup, "' catalog to populate")));
|
|
338
|
+
}, validatedTimeout * 1000);
|
|
339
|
+
_this4.once(serviceGroup, function () {
|
|
340
|
+
clearTimeout(timeoutTimer);
|
|
341
|
+
resolve();
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
var _default = exports.default = ServiceCatalog;
|
|
347
|
+
//# 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, ServiceGroup} from './types';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (url.startsWith(serviceUrl.baseUrl)) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n\n return this.allowedDomains.find((allowedDomain) => urlObj.host.includes(allowedDomain));\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = [...allowedDomains];\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, newAllowedDomains);\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @returns {void}\n */\n updateServiceGroups(serviceGroup: ServiceGroup, 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 {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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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
5
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _ampersandState = _interopRequireDefault(require("ampersand-state"));
|
|
10
|
+
/**
|
|
11
|
+
* @class
|
|
12
|
+
*/
|
|
13
|
+
var ServiceDetail = _ampersandState.default.extend({
|
|
14
|
+
namespace: 'ServiceDetail',
|
|
15
|
+
props: {
|
|
16
|
+
serviceUrls: ['array', false, function () {
|
|
17
|
+
return [];
|
|
18
|
+
}],
|
|
19
|
+
serviceName: ['string', true, undefined],
|
|
20
|
+
id: ['string', true, undefined]
|
|
21
|
+
},
|
|
22
|
+
/**
|
|
23
|
+
* Generate a host url based on the host
|
|
24
|
+
* uri provided.
|
|
25
|
+
* @param {ServiceUrl} serviceUrl
|
|
26
|
+
* @returns {string}
|
|
27
|
+
*/
|
|
28
|
+
_generateHostUrl: function _generateHostUrl(serviceUrl) {
|
|
29
|
+
var url = new URL(serviceUrl.baseUrl);
|
|
30
|
+
|
|
31
|
+
// setting url.hostname will not apply during Url.format(), set host via
|
|
32
|
+
// a string literal instead.
|
|
33
|
+
url.host = "".concat(serviceUrl.host).concat(url.port ? ":".concat(url.port) : '');
|
|
34
|
+
return url.href;
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Get the current host url with the highest priority. This will only return a URL with a filtered host that has the
|
|
38
|
+
* `homeCluster` value set to `true`.
|
|
39
|
+
* @returns {string} - The priority host url.
|
|
40
|
+
*/
|
|
41
|
+
_getPriorityHostUrl: function _getPriorityHostUrl() {
|
|
42
|
+
// format of catalog ensures that array is sorted by highest priority
|
|
43
|
+
var priorityServiceUrl = this._searchForValidPriorityHost();
|
|
44
|
+
if (!priorityServiceUrl) {
|
|
45
|
+
this.serviceUrls = this.serviceUrls.map(function (serviceUrl) {
|
|
46
|
+
serviceUrl.failed = false;
|
|
47
|
+
return serviceUrl;
|
|
48
|
+
});
|
|
49
|
+
priorityServiceUrl = this._searchForValidPriorityHost();
|
|
50
|
+
}
|
|
51
|
+
return priorityServiceUrl ? this._generateHostUrl(priorityServiceUrl) : '';
|
|
52
|
+
},
|
|
53
|
+
/**
|
|
54
|
+
* Searches for a valid service URL with a priority greater than 0 that has not failed.
|
|
55
|
+
* @returns {ServiceUrl | undefined} - The first valid service URL found, or undefined if none exist.
|
|
56
|
+
*/
|
|
57
|
+
_searchForValidPriorityHost: function _searchForValidPriorityHost() {
|
|
58
|
+
return this.serviceUrls.find(function (serviceUrl) {
|
|
59
|
+
return serviceUrl.priority > 0 && !serviceUrl.failed;
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
/**
|
|
63
|
+
* Attempt to mark a host from this `ServiceDetail` as failed and return true
|
|
64
|
+
* if the provided url has a host that could be successfully marked as failed.
|
|
65
|
+
*
|
|
66
|
+
* @param {string} url
|
|
67
|
+
* @returns {boolean}
|
|
68
|
+
*/
|
|
69
|
+
failHost: function failHost(url) {
|
|
70
|
+
var failedUrl = new URL(url);
|
|
71
|
+
var foundHost = this.serviceUrls.find(function (serviceUrl) {
|
|
72
|
+
return serviceUrl.host === failedUrl.host;
|
|
73
|
+
});
|
|
74
|
+
if (foundHost) {
|
|
75
|
+
foundHost.failed = true;
|
|
76
|
+
}
|
|
77
|
+
return foundHost !== undefined;
|
|
78
|
+
},
|
|
79
|
+
/**
|
|
80
|
+
* Generate a url using the host with the
|
|
81
|
+
* highest priority via host rendering.
|
|
82
|
+
*
|
|
83
|
+
* @returns {string} - The full service url.
|
|
84
|
+
*/
|
|
85
|
+
get: function get() {
|
|
86
|
+
// return empty string to indicate that no service url is available
|
|
87
|
+
if (!this.serviceUrls || this.serviceUrls.length === 0) {
|
|
88
|
+
return '';
|
|
89
|
+
}
|
|
90
|
+
return this._getPriorityHostUrl();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
var _default = exports.default = ServiceDetail;
|
|
94
|
+
//# sourceMappingURL=service-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ampersandState","_interopRequireDefault","require","ServiceDetail","AmpState","extend","namespace","props","serviceUrls","serviceName","undefined","id","_generateHostUrl","serviceUrl","url","URL","baseUrl","host","concat","port","href","_getPriorityHostUrl","priorityServiceUrl","_searchForValidPriorityHost","map","failed","find","priority","failHost","failedUrl","foundHost","get","length","_default","exports","default"],"sources":["service-detail.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\nimport {ServiceUrl} from './types';\n\n/**\n * @class\n */\nconst ServiceDetail = AmpState.extend({\n namespace: 'ServiceDetail',\n\n props: {\n serviceUrls: ['array', false, () => []],\n serviceName: ['string', true, undefined],\n id: ['string', true, undefined],\n },\n\n /**\n * Generate a host url based on the host\n * uri provided.\n * @param {ServiceUrl} serviceUrl\n * @returns {string}\n */\n _generateHostUrl(serviceUrl: ServiceUrl): string {\n const url = new URL(serviceUrl.baseUrl);\n\n // setting url.hostname will not apply during Url.format(), set host via\n // a string literal instead.\n url.host = `${serviceUrl.host}${url.port ? `:${url.port}` : ''}`;\n\n return url.href;\n },\n\n /**\n * Get the current host url with the highest priority. This will only return a URL with a filtered host that has the\n * `homeCluster` value set to `true`.\n * @returns {string} - The priority host url.\n */\n _getPriorityHostUrl(): string {\n // format of catalog ensures that array is sorted by highest priority\n let priorityServiceUrl = this._searchForValidPriorityHost();\n\n if (!priorityServiceUrl) {\n this.serviceUrls = this.serviceUrls.map((serviceUrl) => {\n serviceUrl.failed = false;\n\n return serviceUrl;\n });\n\n priorityServiceUrl = this._searchForValidPriorityHost();\n }\n\n return priorityServiceUrl ? this._generateHostUrl(priorityServiceUrl) : '';\n },\n\n /**\n * Searches for a valid service URL with a priority greater than 0 that has not failed.\n * @returns {ServiceUrl | undefined} - The first valid service URL found, or undefined if none exist.\n */\n _searchForValidPriorityHost(): ServiceUrl | undefined {\n return this.serviceUrls.find((serviceUrl) => serviceUrl.priority > 0 && !serviceUrl.failed);\n },\n\n /**\n * Attempt to mark a host from this `ServiceDetail` as failed and return true\n * if the provided url has a host that could be successfully marked as failed.\n *\n * @param {string} url\n * @returns {boolean}\n */\n failHost(url: string): boolean {\n const failedUrl = new URL(url);\n\n const foundHost = this.serviceUrls.find((serviceUrl) => serviceUrl.host === failedUrl.host);\n\n if (foundHost) {\n foundHost.failed = true;\n }\n\n return foundHost !== undefined;\n },\n\n /**\n * Generate a url using the host with the\n * highest priority via host rendering.\n *\n * @returns {string} - The full service url.\n */\n get(): string {\n // return empty string to indicate that no service url is available\n if (!this.serviceUrls || this.serviceUrls.length === 0) {\n return '';\n }\n\n return this._getPriorityHostUrl();\n },\n});\n\nexport default ServiceDetail;\n"],"mappings":";;;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA;AACA;AACA;AACA,IAAMC,aAAa,GAAGC,uBAAQ,CAACC,MAAM,CAAC;EACpCC,SAAS,EAAE,eAAe;EAE1BC,KAAK,EAAE;IACLC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE;MAAA,OAAM,EAAE;IAAA,EAAC;IACvCC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAEC,SAAS,CAAC;IACxCC,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAED,SAAS;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEE,gBAAgB,WAAAA,iBAACC,UAAsB,EAAU;IAC/C,IAAMC,GAAG,GAAG,IAAIC,GAAG,CAACF,UAAU,CAACG,OAAO,CAAC;;IAEvC;IACA;IACAF,GAAG,CAACG,IAAI,MAAAC,MAAA,CAAML,UAAU,CAACI,IAAI,EAAAC,MAAA,CAAGJ,GAAG,CAACK,IAAI,OAAAD,MAAA,CAAOJ,GAAG,CAACK,IAAI,IAAK,EAAE,CAAE;IAEhE,OAAOL,GAAG,CAACM,IAAI;EACjB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,mBAAmB,WAAAA,oBAAA,EAAW;IAC5B;IACA,IAAIC,kBAAkB,GAAG,IAAI,CAACC,2BAA2B,CAAC,CAAC;IAE3D,IAAI,CAACD,kBAAkB,EAAE;MACvB,IAAI,CAACd,WAAW,GAAG,IAAI,CAACA,WAAW,CAACgB,GAAG,CAAC,UAACX,UAAU,EAAK;QACtDA,UAAU,CAACY,MAAM,GAAG,KAAK;QAEzB,OAAOZ,UAAU;MACnB,CAAC,CAAC;MAEFS,kBAAkB,GAAG,IAAI,CAACC,2BAA2B,CAAC,CAAC;IACzD;IAEA,OAAOD,kBAAkB,GAAG,IAAI,CAACV,gBAAgB,CAACU,kBAAkB,CAAC,GAAG,EAAE;EAC5E,CAAC;EAED;AACF;AACA;AACA;EACEC,2BAA2B,WAAAA,4BAAA,EAA2B;IACpD,OAAO,IAAI,CAACf,WAAW,CAACkB,IAAI,CAAC,UAACb,UAAU;MAAA,OAAKA,UAAU,CAACc,QAAQ,GAAG,CAAC,IAAI,CAACd,UAAU,CAACY,MAAM;IAAA,EAAC;EAC7F,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,QAAQ,WAAAA,SAACd,GAAW,EAAW;IAC7B,IAAMe,SAAS,GAAG,IAAId,GAAG,CAACD,GAAG,CAAC;IAE9B,IAAMgB,SAAS,GAAG,IAAI,CAACtB,WAAW,CAACkB,IAAI,CAAC,UAACb,UAAU;MAAA,OAAKA,UAAU,CAACI,IAAI,KAAKY,SAAS,CAACZ,IAAI;IAAA,EAAC;IAE3F,IAAIa,SAAS,EAAE;MACbA,SAAS,CAACL,MAAM,GAAG,IAAI;IACzB;IAEA,OAAOK,SAAS,KAAKpB,SAAS;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEqB,GAAG,WAAAA,IAAA,EAAW;IACZ;IACA,IAAI,CAAC,IAAI,CAACvB,WAAW,IAAI,IAAI,CAACA,WAAW,CAACwB,MAAM,KAAK,CAAC,EAAE;MACtD,OAAO,EAAE;IACX;IAEA,OAAO,IAAI,CAACX,mBAAmB,CAAC,CAAC;EACnC;AACF,CAAC,CAAC;AAAC,IAAAY,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEYhC,aAAa"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
var _default = exports.default = {
|
|
9
|
+
hydra: 'https://api-usgov.webex.com/v1',
|
|
10
|
+
u2c: 'https://u2c.gov.ciscospark.com/u2c/api/v1',
|
|
11
|
+
sqdiscovery: 'https://ds.ciscospark.com/v1/region' // TODO: fedramp load balanced URL? this has been here for years as of now but now explicitly done
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=service-fed-ramp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["hydra","u2c","sqdiscovery"],"sources":["service-fed-ramp.ts"],"sourcesContent":["export default {\n hydra: 'https://api-usgov.webex.com/v1',\n u2c: 'https://u2c.gov.ciscospark.com/u2c/api/v1',\n sqdiscovery: 'https://ds.ciscospark.com/v1/region', // TODO: fedramp load balanced URL? this has been here for years as of now but now explicitly done\n};\n"],"mappings":";;;;;;;iCAAe;EACbA,KAAK,EAAE,gCAAgC;EACvCC,GAAG,EAAE,2CAA2C;EAChDC,WAAW,EAAE,qCAAqC,CAAE;AACtD,CAAC"}
|