@webex/webex-core 3.0.0-beta.32 → 3.0.0-beta.321
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/lib/batcher.js +1 -1
- package/dist/lib/constants.js +14 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/credentials/credentials.js +61 -22
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/scope.js +21 -6
- package/dist/lib/credentials/scope.js.map +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/services/interceptors/service.js +4 -2
- package/dist/lib/services/interceptors/service.js.map +1 -1
- package/dist/lib/services/service-catalog.js +2 -1
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/services.js +11 -1
- package/dist/lib/services/services.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +7 -2
- package/dist/webex-core.js.map +1 -1
- package/package.json +14 -14
- package/src/lib/constants.js +6 -0
- package/src/lib/credentials/credentials.js +82 -40
- package/src/lib/credentials/scope.js +19 -2
- package/src/lib/services/interceptors/service.js +2 -2
- package/src/lib/services/service-catalog.js +3 -1
- package/src/lib/services/services.js +12 -0
- package/src/webex-core.js +13 -1
- package/test/unit/spec/credentials/credentials.js +168 -13
- package/test/unit/spec/credentials/scope.js +55 -0
- package/test/unit/spec/interceptors/auth.js +3 -0
- package/test/unit/spec/services/interceptors/service.js +9 -3
- package/test/unit/spec/services/services.js +6 -0
- package/test/unit/spec/webex-core.js +12 -0
package/dist/lib/batcher.js
CHANGED
|
@@ -282,7 +282,7 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
282
282
|
fingerprintResponse: function fingerprintResponse(item) {
|
|
283
283
|
throw new Error('fingerprintResponse() must be implemented');
|
|
284
284
|
},
|
|
285
|
-
version: "3.0.0-beta.
|
|
285
|
+
version: "3.0.0-beta.321"
|
|
286
286
|
});
|
|
287
287
|
var _default2 = Batcher;
|
|
288
288
|
exports.default = _default2;
|
|
@@ -0,0 +1,14 @@
|
|
|
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.METRICS = void 0;
|
|
8
|
+
// Metric to do with WDM registration
|
|
9
|
+
var METRICS = {
|
|
10
|
+
JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED: 'JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED',
|
|
11
|
+
JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH: 'JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH'
|
|
12
|
+
};
|
|
13
|
+
exports.METRICS = METRICS;
|
|
14
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["METRICS","JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED","JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH"],"sources":["constants.js"],"sourcesContent":["// Metric to do with WDM registration\nexport const METRICS = {\n JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED: 'JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED',\n JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH:\n 'JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH',\n};\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,OAAO,GAAG;EACrBC,mCAAmC,EAAE,qCAAqC;EAC1EC,+CAA+C,EAC7C;AACJ,CAAC;AAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
|
|
3
4
|
var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
4
5
|
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
5
6
|
var _Object$getOwnPropertyDescriptor2 = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
6
7
|
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
7
8
|
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
|
8
9
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
10
|
+
var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
|
|
9
11
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
10
12
|
_Object$defineProperty(exports, "__esModule", {
|
|
11
13
|
value: true
|
|
@@ -31,11 +33,14 @@ var _common = require("@webex/common");
|
|
|
31
33
|
var _commonTimers = require("@webex/common-timers");
|
|
32
34
|
var _webexPlugin = _interopRequireDefault(require("../webex-plugin"));
|
|
33
35
|
var _decorators = require("../storage/decorators");
|
|
34
|
-
var _grantErrors =
|
|
36
|
+
var _grantErrors = _interopRequireWildcard(require("./grant-errors"));
|
|
35
37
|
var _scope = require("./scope");
|
|
36
38
|
var _token = _interopRequireDefault(require("./token"));
|
|
37
39
|
var _tokenCollection = _interopRequireDefault(require("./token-collection"));
|
|
40
|
+
var _constants = require("../constants");
|
|
38
41
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _obj;
|
|
42
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
43
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor2; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor2(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
39
44
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor2(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
40
45
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor2(source, key)); }); } return target; }
|
|
41
46
|
/**
|
|
@@ -68,6 +73,22 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
68
73
|
}
|
|
69
74
|
return Boolean(this.supertoken && this.supertoken.canRefresh);
|
|
70
75
|
}
|
|
76
|
+
},
|
|
77
|
+
isUnverifiedGuest: {
|
|
78
|
+
deps: ['supertoken'],
|
|
79
|
+
/**
|
|
80
|
+
* Returns true if the user is an unverified guest
|
|
81
|
+
* @returns {boolean}
|
|
82
|
+
*/
|
|
83
|
+
fn: function fn() {
|
|
84
|
+
var isGuest = false;
|
|
85
|
+
try {
|
|
86
|
+
isGuest = JSON.parse(_common.base64.decode(this.supertoken.access_token.split('.')[1])).user_type === 'guest';
|
|
87
|
+
} catch (_unused) {
|
|
88
|
+
/* the non-guest token is formatted differently so catch is expected */
|
|
89
|
+
}
|
|
90
|
+
return isGuest;
|
|
91
|
+
}
|
|
71
92
|
}
|
|
72
93
|
},
|
|
73
94
|
props: {
|
|
@@ -252,8 +273,16 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
252
273
|
downscope: function downscope(scope) {
|
|
253
274
|
var _this2 = this;
|
|
254
275
|
return this.supertoken.downscope(scope).catch(function (reason) {
|
|
255
|
-
|
|
276
|
+
var _reason$body;
|
|
277
|
+
var failReason = (_reason$body = reason === null || reason === void 0 ? void 0 : reason.body) !== null && _reason$body !== void 0 ? _reason$body : reason;
|
|
278
|
+
_this2.logger.warn("credentials: failed to downscope supertoken to \"".concat(scope, "\""), failReason);
|
|
256
279
|
_this2.logger.trace("credentials: falling back to supertoken for ".concat(scope));
|
|
280
|
+
_this2.webex.internal.metrics.submitClientMetrics(_constants.METRICS.JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED, {
|
|
281
|
+
fields: {
|
|
282
|
+
requestedScope: scope,
|
|
283
|
+
failReason: failReason
|
|
284
|
+
}
|
|
285
|
+
});
|
|
257
286
|
return _promise.default.resolve(new _token.default(_objectSpread({
|
|
258
287
|
scope: scope
|
|
259
288
|
}, _this2.supertoken.serialize())), {
|
|
@@ -325,10 +354,10 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
325
354
|
return _promise.default.reject(new Error('Current state cannot produce an access token'));
|
|
326
355
|
}
|
|
327
356
|
if (!scope) {
|
|
328
|
-
scope = (0, _scope.filterScope)('spark:kms', _this4.
|
|
357
|
+
scope = (0, _scope.filterScope)('spark:kms', _this4.supertoken.scope);
|
|
329
358
|
}
|
|
330
359
|
scope = (0, _scope.sortScope)(scope);
|
|
331
|
-
if (scope === (0, _scope.sortScope)(_this4.
|
|
360
|
+
if (scope === (0, _scope.sortScope)(_this4.supertoken.scope)) {
|
|
332
361
|
return _promise.default.resolve(_this4.supertoken);
|
|
333
362
|
}
|
|
334
363
|
var token = _this4.userTokens.get(scope);
|
|
@@ -460,15 +489,40 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
460
489
|
if (this.webex.internal.services) {
|
|
461
490
|
this.webex.internal.services.updateCredentialsConfig();
|
|
462
491
|
}
|
|
463
|
-
return supertoken.refresh().
|
|
492
|
+
return supertoken.refresh().catch(function (error) {
|
|
493
|
+
if (error instanceof _grantErrors.OAuthError) {
|
|
494
|
+
// Error: super token refresh failed with 400 status code.
|
|
495
|
+
// Hence emit an event to the client, an opportunity to logout.
|
|
496
|
+
_this6.unset('supertoken');
|
|
497
|
+
while (_this6.userTokens.models.length) {
|
|
498
|
+
try {
|
|
499
|
+
_this6.userTokens.remove(_this6.userTokens.models[0]);
|
|
500
|
+
} catch (err) {
|
|
501
|
+
_this6.logger.warn('credentials: failed to remove user token', err);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
_this6.webex.trigger('client:InvalidRequestError');
|
|
505
|
+
}
|
|
506
|
+
return _promise.default.reject(error);
|
|
507
|
+
}).then(function (st) {
|
|
464
508
|
// clear refresh timer
|
|
465
509
|
if (_this6.refreshTimer) {
|
|
466
510
|
clearTimeout(_this6.refreshTimer);
|
|
467
511
|
_this6.unset('refreshTimer');
|
|
468
512
|
}
|
|
469
513
|
_this6.supertoken = st;
|
|
514
|
+
var invalidScopes = (0, _scope.diffScopes)(_this6.config.scope, st.scope);
|
|
515
|
+
if (invalidScopes !== '') {
|
|
516
|
+
_this6.logger.warn("credentials: \"".concat(invalidScopes, "\" scope(s) are invalid because not listed in the supertoken, they will be excluded from user token requests."));
|
|
517
|
+
_this6.webex.internal.metrics.submitClientMetrics(_constants.METRICS.JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH, {
|
|
518
|
+
fields: {
|
|
519
|
+
invalidScopes: invalidScopes
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
}
|
|
470
523
|
return _promise.default.all(tokens.map(function (token) {
|
|
471
|
-
|
|
524
|
+
var tokenScope = (0, _scope.filterScope)((0, _scope.diffScopes)(token.scope, st.scope), token.scope);
|
|
525
|
+
return _this6.downscope(tokenScope)
|
|
472
526
|
// eslint-disable-next-line max-nested-callbacks
|
|
473
527
|
.then(function (t) {
|
|
474
528
|
_this6.logger.info("credentials: revoking token for ".concat(token.scope));
|
|
@@ -482,21 +536,6 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
482
536
|
}));
|
|
483
537
|
}).then(function () {
|
|
484
538
|
_this6.scheduleRefresh(_this6.supertoken.expires);
|
|
485
|
-
}).catch(function (error) {
|
|
486
|
-
var InvalidRequestError = _grantErrors.default.InvalidRequestError;
|
|
487
|
-
if (error instanceof InvalidRequestError) {
|
|
488
|
-
// Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.
|
|
489
|
-
_this6.unset('supertoken');
|
|
490
|
-
while (_this6.userTokens.models.length) {
|
|
491
|
-
try {
|
|
492
|
-
_this6.userTokens.remove(_this6.userTokens.models[0]);
|
|
493
|
-
} catch (err) {
|
|
494
|
-
_this6.logger.warn('credentials: failed to remove user token', err);
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
_this6.webex.trigger('client:InvalidRequestError');
|
|
498
|
-
}
|
|
499
|
-
return _promise.default.reject(error);
|
|
500
539
|
});
|
|
501
540
|
},
|
|
502
541
|
/**
|
|
@@ -519,7 +558,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
519
558
|
this.refresh();
|
|
520
559
|
}
|
|
521
560
|
},
|
|
522
|
-
version: "3.0.0-beta.
|
|
561
|
+
version: "3.0.0-beta.321"
|
|
523
562
|
}, ((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)));
|
|
524
563
|
var _default = Credentials;
|
|
525
564
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","base64","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","access_token","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","decode","realm","fields","split","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","filterScope","sortScope","get","tap","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","parse","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","safeSetTimeout"],"sources":["credentials.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {base64, makeStateDataType, oneFlight, tap, whileInFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection,\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType,\n },\n\n derived: {\n canAuthorize: {\n deps: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n },\n },\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop,\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean',\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean',\n },\n refreshTimer: {\n default: undefined,\n type: 'any',\n },\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n } else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info('credentials: attempting to retrieve the OrgId from token');\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n } catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n } catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor(((Math.floor(Math.random() * 4) + 6) / 10) * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope).catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex\n .request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true,\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n })\n ).then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope).then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n } else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n } catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(\n tokens.map((token) =>\n this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token\n .revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })\n )\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","isUnverifiedGuest","isGuest","JSON","parse","base64","decode","access_token","split","user_type","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","realm","fields","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","failReason","body","warn","trace","webex","internal","metrics","submitClientMetrics","METRICS","JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED","requestedScope","resolve","serialize","parent","getClientToken","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","filterScope","sortScope","get","tap","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","models","remove","refresh","tokens","requestAccessTokenFromJwt","services","updateCredentialsConfig","OAuthError","trigger","st","invalidScopes","diffScopes","JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH","all","map","tokenScope","revoke","expiresIn","timeoutLength","safeSetTimeout"],"sources":["credentials.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {base64, makeStateDataType, oneFlight, tap, whileInFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors, {OAuthError} from './grant-errors';\nimport {filterScope, diffScopes, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\nimport {METRICS} from '../constants';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection,\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType,\n },\n\n derived: {\n canAuthorize: {\n deps: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n },\n },\n isUnverifiedGuest: {\n deps: ['supertoken'],\n /**\n * Returns true if the user is an unverified guest\n * @returns {boolean}\n */\n fn() {\n let isGuest = false;\n try {\n isGuest =\n JSON.parse(base64.decode(this.supertoken.access_token.split('.')[1])).user_type ===\n 'guest';\n } catch {\n /* the non-guest token is formatted differently so catch is expected */\n }\n\n return isGuest;\n },\n },\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop,\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean',\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean',\n },\n refreshTimer: {\n default: undefined,\n type: 'any',\n },\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n } else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info('credentials: attempting to retrieve the OrgId from token');\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n } catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n } catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor(((Math.floor(Math.random() * 4) + 6) / 10) * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope).catch((reason) => {\n const failReason = reason?.body ?? reason;\n this.logger.warn(`credentials: failed to downscope supertoken to \"${scope}\"`, failReason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED, {\n fields: {\n requestedScope: scope,\n failReason,\n },\n });\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex\n .request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true,\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n })\n ).then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.supertoken.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.supertoken.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope).then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n } else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n } catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .catch((error) => {\n if (error instanceof OAuthError) {\n // Error: super token refresh failed with 400 status code.\n // Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n })\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n const invalidScopes = diffScopes(this.config.scope, st.scope);\n\n if (invalidScopes !== '') {\n this.logger.warn(\n `credentials: \"${invalidScopes}\" scope(s) are invalid because not listed in the supertoken, they will be excluded from user token requests.`\n );\n this.webex.internal.metrics.submitClientMetrics(\n METRICS.JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH,\n {fields: {invalidScopes}}\n );\n }\n\n return Promise.all(\n tokens.map((token) => {\n const tokenScope = filterScope(diffScopes(token.scope, st.scope), token.scope);\n\n return (\n this.downscope(tokenScope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token\n .revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })\n );\n })\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
4
5
|
_Object$defineProperty(exports, "__esModule", {
|
|
5
6
|
value: true
|
|
6
7
|
});
|
|
8
|
+
exports.diffScopes = diffScopes;
|
|
7
9
|
exports.filterScope = filterScope;
|
|
8
10
|
exports.sortScope = sortScope;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
|
|
11
|
+
var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
|
|
12
|
+
var _difference2 = _interopRequireDefault(require("lodash/difference"));
|
|
13
13
|
/**
|
|
14
14
|
* sorts a list of scopes
|
|
15
15
|
* @param {string} scope
|
|
@@ -24,7 +24,7 @@ function sortScope(scope) {
|
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* sorts a list of scopes and filters the specified scope
|
|
27
|
-
* @param {string} toFilter
|
|
27
|
+
* @param {string|string[]} toFilter
|
|
28
28
|
* @param {string} scope
|
|
29
29
|
* @returns {string}
|
|
30
30
|
*/
|
|
@@ -32,8 +32,23 @@ function filterScope(toFilter, scope) {
|
|
|
32
32
|
if (!scope) {
|
|
33
33
|
return '';
|
|
34
34
|
}
|
|
35
|
+
var toFilterArr = (0, _isArray.default)(toFilter) ? toFilter : [toFilter];
|
|
35
36
|
return scope.split(' ').filter(function (item) {
|
|
36
|
-
return item
|
|
37
|
+
return !toFilterArr.includes(item);
|
|
37
38
|
}).sort().join(' ');
|
|
38
39
|
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Returns a string containing all items in scopeA that are not in scopeB, or an empty string if there are none.
|
|
43
|
+
*
|
|
44
|
+
* @param {string} scopeA
|
|
45
|
+
* @param {string} scopeB
|
|
46
|
+
* @returns {string}
|
|
47
|
+
*/
|
|
48
|
+
function diffScopes(scopeA, scopeB) {
|
|
49
|
+
var _scopeA$split, _scopeB$split;
|
|
50
|
+
var a = (_scopeA$split = scopeA === null || scopeA === void 0 ? void 0 : scopeA.split(' ')) !== null && _scopeA$split !== void 0 ? _scopeA$split : [];
|
|
51
|
+
var b = (_scopeB$split = scopeB === null || scopeB === void 0 ? void 0 : scopeB.split(' ')) !== null && _scopeB$split !== void 0 ? _scopeB$split : [];
|
|
52
|
+
return (0, _difference2.default)(a, b).sort().join(' ');
|
|
53
|
+
}
|
|
39
54
|
//# sourceMappingURL=scope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["sortScope","scope","split","sort","join","filterScope","toFilter","filter","item"],"sources":["scope.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * sorts a list of scopes\n * @param {string} scope\n * @returns {string}\n */\nexport function sortScope(scope) {\n if (!scope) {\n return '';\n }\n\n return scope.split(' ').sort().join(' ');\n}\n\n/**\n * sorts a list of scopes and filters the specified scope\n * @param {string} toFilter\n * @param {string} scope\n * @returns {string}\n */\nexport function filterScope(toFilter, scope) {\n if (!scope) {\n return '';\n }\n\n return scope\n .split(' ')\n .filter((item) => item
|
|
1
|
+
{"version":3,"names":["sortScope","scope","split","sort","join","filterScope","toFilter","toFilterArr","filter","item","includes","diffScopes","scopeA","scopeB","a","b"],"sources":["scope.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {difference} from 'lodash';\n\n/**\n * sorts a list of scopes\n * @param {string} scope\n * @returns {string}\n */\nexport function sortScope(scope) {\n if (!scope) {\n return '';\n }\n\n return scope.split(' ').sort().join(' ');\n}\n\n/**\n * sorts a list of scopes and filters the specified scope\n * @param {string|string[]} toFilter\n * @param {string} scope\n * @returns {string}\n */\nexport function filterScope(toFilter, scope) {\n if (!scope) {\n return '';\n }\n const toFilterArr = Array.isArray(toFilter) ? toFilter : [toFilter];\n\n return scope\n .split(' ')\n .filter((item) => !toFilterArr.includes(item))\n .sort()\n .join(' ');\n}\n\n/**\n * Returns a string containing all items in scopeA that are not in scopeB, or an empty string if there are none.\n *\n * @param {string} scopeA\n * @param {string} scopeB\n * @returns {string}\n */\nexport function diffScopes(scopeA, scopeB) {\n const a = scopeA?.split(' ') ?? [];\n const b = scopeB?.split(' ') ?? [];\n\n return difference(a, b).sort().join(' ');\n}\n"],"mappings":";;;;;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACO,SAASA,SAAS,CAACC,KAAK,EAAE;EAC/B,IAAI,CAACA,KAAK,EAAE;IACV,OAAO,EAAE;EACX;EAEA,OAAOA,KAAK,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,IAAI,EAAE,CAACC,IAAI,CAAC,GAAG,CAAC;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,WAAW,CAACC,QAAQ,EAAEL,KAAK,EAAE;EAC3C,IAAI,CAACA,KAAK,EAAE;IACV,OAAO,EAAE;EACX;EACA,IAAMM,WAAW,GAAG,sBAAcD,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC;EAEnE,OAAOL,KAAK,CACTC,KAAK,CAAC,GAAG,CAAC,CACVM,MAAM,CAAC,UAACC,IAAI;IAAA,OAAK,CAACF,WAAW,CAACG,QAAQ,CAACD,IAAI,CAAC;EAAA,EAAC,CAC7CN,IAAI,EAAE,CACNC,IAAI,CAAC,GAAG,CAAC;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASO,UAAU,CAACC,MAAM,EAAEC,MAAM,EAAE;EAAA;EACzC,IAAMC,CAAC,oBAAGF,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEV,KAAK,CAAC,GAAG,CAAC,yDAAI,EAAE;EAClC,IAAMa,CAAC,oBAAGF,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEX,KAAK,CAAC,GAAG,CAAC,yDAAI,EAAE;EAElC,OAAO,0BAAWY,CAAC,EAAEC,CAAC,CAAC,CAACZ,IAAI,EAAE,CAACC,IAAI,CAAC,GAAG,CAAC;AAC1C"}
|
|
@@ -527,7 +527,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
527
527
|
return res.body;
|
|
528
528
|
});
|
|
529
529
|
},
|
|
530
|
-
version: "3.0.0-beta.
|
|
530
|
+
version: "3.0.0-beta.321"
|
|
531
531
|
}, ((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)));
|
|
532
532
|
var _default = Token;
|
|
533
533
|
exports.default = _default;
|
|
@@ -50,11 +50,13 @@ var ServiceInterceptor = /*#__PURE__*/function (_Interceptor) {
|
|
|
50
50
|
// Destructure commonly referenced namespaces.
|
|
51
51
|
var services = this.webex.internal.services;
|
|
52
52
|
var service = options.service,
|
|
53
|
-
resource = options.resource
|
|
53
|
+
resource = options.resource,
|
|
54
|
+
waitForServiceTimeout = options.waitForServiceTimeout;
|
|
54
55
|
|
|
55
56
|
// Attempt to collect the service url.
|
|
56
57
|
return services.waitForService({
|
|
57
|
-
name: service
|
|
58
|
+
name: service,
|
|
59
|
+
timeout: waitForServiceTimeout
|
|
58
60
|
}).then(function (serviceUrl) {
|
|
59
61
|
// Generate the combined service url and resource.
|
|
60
62
|
options.uri = _this.generateUri(serviceUrl, resource);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["trailingSlashes","ServiceInterceptor","options","uri","normalizeOptions","validateOptions","services","webex","internal","service","resource","waitForService","name","then","serviceUrl","generateUri","catch","reject","Error","formattedService","replace","formattedResource","api","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} = options;\n\n // Attempt to collect the service url.\n return services\n .waitForService({name: service})\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":";;;;;;;;;;;;;;;AAIA;AAA6C;AAAA;AAE7C,IAAMA,eAAe,GAAG,iBAAiB;;AAEzC;AACA;AACA;AAFA,IAGqBC,kBAAkB;EAAA;EAAA;EAAA;IAAA;IAAA;EAAA;EAAA;IAAA;IAAA,OASrC;IACA;AACF;AACA;AACA;AACA;IACE,mBAAUC,OAAO,EAAE;MAAA;MACjB;MACA,IAAIA,OAAO,CAACC,GAAG,EAAE;QACf,OAAOD,OAAO;MAChB;;MAEA;MACA,IAAI,CAACE,gBAAgB,CAACF,OAAO,CAAC;MAC9B,IAAI,CAACG,eAAe,CAACH,OAAO,CAAC;;MAE7B;MACA,IAAOI,QAAQ,GAAI,IAAI,CAACC,KAAK,CAACC,QAAQ,CAA/BF,QAAQ;MACf,IAAOG,OAAO,
|
|
1
|
+
{"version":3,"names":["trailingSlashes","ServiceInterceptor","options","uri","normalizeOptions","validateOptions","services","webex","internal","service","resource","waitForServiceTimeout","waitForService","name","timeout","then","serviceUrl","generateUri","catch","reject","Error","formattedService","replace","formattedResource","api","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":";;;;;;;;;;;;;;;AAIA;AAA6C;AAAA;AAE7C,IAAMA,eAAe,GAAG,iBAAiB;;AAEzC;AACA;AACA;AAFA,IAGqBC,kBAAkB;EAAA;EAAA;EAAA;IAAA;IAAA;EAAA;EAAA;IAAA;IAAA,OASrC;IACA;AACF;AACA;AACA;AACA;IACE,mBAAUC,OAAO,EAAE;MAAA;MACjB;MACA,IAAIA,OAAO,CAACC,GAAG,EAAE;QACf,OAAOD,OAAO;MAChB;;MAEA;MACA,IAAI,CAACE,gBAAgB,CAACF,OAAO,CAAC;MAC9B,IAAI,CAACG,eAAe,CAACH,OAAO,CAAC;;MAE7B;MACA,IAAOI,QAAQ,GAAI,IAAI,CAACC,KAAK,CAACC,QAAQ,CAA/BF,QAAQ;MACf,IAAOG,OAAO,GAAqCP,OAAO,CAAnDO,OAAO;QAAEC,QAAQ,GAA2BR,OAAO,CAA1CQ,QAAQ;QAAEC,qBAAqB,GAAIT,OAAO,CAAhCS,qBAAqB;;MAE/C;MACA,OAAOL,QAAQ,CACZM,cAAc,CAAC;QAACC,IAAI,EAAEJ,OAAO;QAAEK,OAAO,EAAEH;MAAqB,CAAC,CAAC,CAC/DI,IAAI,CAAC,UAACC,UAAU,EAAK;QACpB;QACAd,OAAO,CAACC,GAAG,GAAG,KAAI,CAACc,WAAW,CAACD,UAAU,EAAEN,QAAQ,CAAC;QAEpD,OAAOR,OAAO;MAChB,CAAC,CAAC,CACDgB,KAAK,CAAC;QAAA,OACL,iBAAQC,MAAM,CAAC,IAAIC,KAAK,iCAA0BX,OAAO,8BAA2B,CAAC;MAAA,EACtF;IACL;;IAEA;IACA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA;IAAA,OAOA,qBAAYO,UAAU,EAAiB;MAAA,IAAfN,QAAQ,uEAAG,EAAE;MACnC,IAAMW,gBAAgB,GAAGL,UAAU,CAACM,OAAO,CAACtB,eAAe,EAAE,EAAE,CAAC;MAChE,IAAMuB,iBAAiB,GAAGb,QAAQ,CAACY,OAAO,CAACtB,eAAe,EAAE,EAAE,CAAC;MAE/D,iBAAUqB,gBAAgB,cAAIE,iBAAiB;IACjD;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,0BAAiBrB,OAAO,EAAE;MACxB;MACA,IAAIA,OAAO,CAACsB,GAAG,EAAE;QACf;QACAtB,OAAO,CAACO,OAAO,GAAGP,OAAO,CAACO,OAAO,IAAIP,OAAO,CAACsB,GAAG;QAChD,OAAOtB,OAAO,CAACsB,GAAG;MACpB;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,yBAAgBtB,OAAO,EAAE;MACvB,IAAI,CAACA,OAAO,CAACQ,QAAQ,EAAE;QACrB,MAAM,IAAIU,KAAK,CAAC,oCAAoC,CAAC;MACvD;MAEA,IAAI,CAAClB,OAAO,CAACO,OAAO,EAAE;QACpB,MAAM,IAAIW,KAAK,CAAC,yCAAyC,CAAC;MAC5D;IACF;IACA;EAAA;IAAA;IAAA;IAvFA;AACF;AACA;IACE,kBAAgB;MACd;MACA,OAAO,IAAInB,kBAAkB,CAAC;QAACM,KAAK,EAAE;MAAI,CAAC,CAAC;IAC9C;EAAC;EAAA;AAAA,EAP6CkB,qBAAW;AAAA"}
|
|
@@ -393,9 +393,10 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
393
393
|
if (_this5.status[serviceGroup].ready) {
|
|
394
394
|
resolve();
|
|
395
395
|
}
|
|
396
|
+
var validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;
|
|
396
397
|
var timeoutTimer = setTimeout(function () {
|
|
397
398
|
return reject(new Error("services: timeout occured while waiting for '".concat(serviceGroup, "' catalog to populate")));
|
|
398
|
-
},
|
|
399
|
+
}, validatedTimeout * 1000);
|
|
399
400
|
_this5.once(serviceGroup, function () {
|
|
400
401
|
clearTimeout(timeoutTimer);
|
|
401
402
|
resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","allowedDomains","_getUrl","name","serviceGroup","serviceUrls","find","serviceUrl","_listServiceUrls","_loadServiceUrls","services","existingService","forEach","service","push","_unloadServiceUrls","splice","indexOf","clean","length","findClusterId","url","incomingUrlObj","Url","parse","serviceUrlObj","key","defaultUrl","hosts","host","hostname","id","homeCluster","undefined","findServiceFromClusterId","clusterId","priorityHost","identifiedServiceUrl","get","findServiceUrlFromUrl","findAllowedDomain","urlObj","allowedDomain","includes","getAllowedDomains","list","output","markFailedUrl","noPriorityHosts","failHost","setAllowedDomains","updateServiceUrls","serviceHostmap","currentServiceUrls","unusedUrls","filter","every","item","serviceObj","ServiceUrl","trigger","waitForCatalog","timeout","resolve","reject","timeoutTimer","setTimeout","Error","once","clearTimeout"],"sources":["service-catalog.js"],"sourcesContent":["import Url from 'url';\n\nimport AmpState from 'ampersand-state';\n\nimport ServiceUrl from './service-url';\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Search the service url array to locate a `ServiceUrl`\n * class object based on its name.\n * @param {string} name\n * @param {string} [serviceGroup]\n * @returns {ServiceUrl}\n */\n _getUrl(name, serviceGroup) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceUrls.find((serviceUrl) => serviceUrl.name === name);\n },\n\n /**\n * @private\n * Generate an array of `ServiceUrl`s that is organized from highest auth\n * level to lowest auth level.\n * @returns {Array<ServiceUrl>} - array of `ServiceUrl`s\n */\n _listServiceUrls() {\n return [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n },\n\n /**\n * @private\n * Safely load one or more `ServiceUrl`s into this `Services` instance.\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _loadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n\n return this;\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceUrl`s into this `Services` instance\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _unloadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n\n return this;\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean() {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string} - ClusterId of a given url\n */\n findClusterId(url) {\n const incomingUrlObj = Url.parse(url);\n let serviceUrlObj;\n\n for (const key of Object.keys(this.serviceGroups)) {\n for (const service of this.serviceGroups[key]) {\n serviceUrlObj = Url.parse(service.defaultUrl);\n\n for (const host of service.hosts) {\n if (incomingUrlObj.hostname === host.host && host.id) {\n return host.id;\n }\n }\n\n if (serviceUrlObj.hostname === incomingUrlObj.hostname && service.hosts.length > 0) {\n // no exact match, so try to grab the first home cluster\n for (const host of service.hosts) {\n if (host.homeCluster) {\n return host.id;\n }\n }\n\n // no match found still, so return the first entry\n return service.hosts[0].id;\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId. Currently, this method will return either a service name, or a\n * service url depending on the `value` parameter. If the `value` parameter\n * is set to `name`, it will return a service name to be utilized within the\n * Services plugin methods.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost = true] - returns priority host url if true\n * @param {string} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId({clusterId, priorityHost = true, serviceGroup} = {}) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n const identifiedServiceUrl = serviceUrls.find((serviceUrl) =>\n serviceUrl.hosts.find((host) => host.id === clusterId)\n );\n\n if (identifiedServiceUrl) {\n return {\n name: identifiedServiceUrl.name,\n url: identifiedServiceUrl.get(priorityHost, clusterId),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {serviceUrl} - ServiceUrl assocated with provided url\n */\n findServiceUrlFromUrl(url) {\n const incomingUrlObj = Url.parse(url);\n const serviceUrls = [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n return serviceUrls.find((serviceUrl) => {\n if (incomingUrlObj.hostname === Url.parse(serviceUrl.defaultUrl).hostname) {\n return true;\n }\n\n if (serviceUrl.hosts.find((host) => host.host === incomingUrlObj.hostname)) {\n return true;\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url) {\n const urlObj = Url.parse(url);\n\n if (!urlObj.host) {\n return undefined;\n }\n\n return this.allowedDomains.find((allowedDomain) => urlObj.host.includes(allowedDomain));\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} name\n * @param {boolean} priorityHost\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(name, priorityHost, serviceGroup) {\n const serviceUrl = this._getUrl(name, serviceGroup);\n\n return serviceUrl ? serviceUrl.get(priorityHost) : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains() {\n return [...this.allowedDomains];\n },\n\n /**\n * Creates an object where the keys are the service names\n * and the values are the service urls.\n * @param {boolean} priorityHost - use the highest priority if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const output = {};\n\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n if (serviceUrls) {\n serviceUrls.forEach((serviceUrl) => {\n output[serviceUrl.name] = serviceUrl.get(priorityHost);\n });\n }\n\n return output;\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceUrl` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceUrls` host array,\n * or the `ServiceUrls` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @param {boolean} noPriorityHosts\n * @returns {string}\n */\n markFailedUrl(url, noPriorityHosts) {\n const serviceUrl = this._getUrl(\n Object.keys(this.list()).find((key) => this._getUrl(key).failHost(url))\n );\n\n if (!serviceUrl) {\n return undefined;\n }\n\n return noPriorityHosts ? serviceUrl.get(false) : serviceUrl.get(true);\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains) {\n this.allowedDomains = [...allowedDomains];\n },\n\n /**\n * 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 timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n timeout ? timeout * 1000 : 60000\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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"}
|
|
1
|
+
{"version":3,"names":["ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","allowedDomains","_getUrl","name","serviceGroup","serviceUrls","find","serviceUrl","_listServiceUrls","_loadServiceUrls","services","existingService","forEach","service","push","_unloadServiceUrls","splice","indexOf","clean","length","findClusterId","url","incomingUrlObj","Url","parse","serviceUrlObj","key","defaultUrl","hosts","host","hostname","id","homeCluster","undefined","findServiceFromClusterId","clusterId","priorityHost","identifiedServiceUrl","get","findServiceUrlFromUrl","findAllowedDomain","urlObj","allowedDomain","includes","getAllowedDomains","list","output","markFailedUrl","noPriorityHosts","failHost","setAllowedDomains","updateServiceUrls","serviceHostmap","currentServiceUrls","unusedUrls","filter","every","item","serviceObj","ServiceUrl","trigger","waitForCatalog","timeout","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout"],"sources":["service-catalog.js"],"sourcesContent":["import Url from 'url';\n\nimport AmpState from 'ampersand-state';\n\nimport ServiceUrl from './service-url';\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Search the service url array to locate a `ServiceUrl`\n * class object based on its name.\n * @param {string} name\n * @param {string} [serviceGroup]\n * @returns {ServiceUrl}\n */\n _getUrl(name, serviceGroup) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceUrls.find((serviceUrl) => serviceUrl.name === name);\n },\n\n /**\n * @private\n * Generate an array of `ServiceUrl`s that is organized from highest auth\n * level to lowest auth level.\n * @returns {Array<ServiceUrl>} - array of `ServiceUrl`s\n */\n _listServiceUrls() {\n return [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n },\n\n /**\n * @private\n * Safely load one or more `ServiceUrl`s into this `Services` instance.\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _loadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n\n return this;\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceUrl`s into this `Services` instance\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _unloadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n\n return this;\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean() {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string} - ClusterId of a given url\n */\n findClusterId(url) {\n const incomingUrlObj = Url.parse(url);\n let serviceUrlObj;\n\n for (const key of Object.keys(this.serviceGroups)) {\n for (const service of this.serviceGroups[key]) {\n serviceUrlObj = Url.parse(service.defaultUrl);\n\n for (const host of service.hosts) {\n if (incomingUrlObj.hostname === host.host && host.id) {\n return host.id;\n }\n }\n\n if (serviceUrlObj.hostname === incomingUrlObj.hostname && service.hosts.length > 0) {\n // no exact match, so try to grab the first home cluster\n for (const host of service.hosts) {\n if (host.homeCluster) {\n return host.id;\n }\n }\n\n // no match found still, so return the first entry\n return service.hosts[0].id;\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId. Currently, this method will return either a service name, or a\n * service url depending on the `value` parameter. If the `value` parameter\n * is set to `name`, it will return a service name to be utilized within the\n * Services plugin methods.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost = true] - returns priority host url if true\n * @param {string} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId({clusterId, priorityHost = true, serviceGroup} = {}) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n const identifiedServiceUrl = serviceUrls.find((serviceUrl) =>\n serviceUrl.hosts.find((host) => host.id === clusterId)\n );\n\n if (identifiedServiceUrl) {\n return {\n name: identifiedServiceUrl.name,\n url: identifiedServiceUrl.get(priorityHost, clusterId),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {serviceUrl} - ServiceUrl assocated with provided url\n */\n findServiceUrlFromUrl(url) {\n const incomingUrlObj = Url.parse(url);\n const serviceUrls = [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n return serviceUrls.find((serviceUrl) => {\n if (incomingUrlObj.hostname === Url.parse(serviceUrl.defaultUrl).hostname) {\n return true;\n }\n\n if (serviceUrl.hosts.find((host) => host.host === incomingUrlObj.hostname)) {\n return true;\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url) {\n const urlObj = Url.parse(url);\n\n if (!urlObj.host) {\n return undefined;\n }\n\n return this.allowedDomains.find((allowedDomain) => urlObj.host.includes(allowedDomain));\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} name\n * @param {boolean} priorityHost\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(name, priorityHost, serviceGroup) {\n const serviceUrl = this._getUrl(name, serviceGroup);\n\n return serviceUrl ? serviceUrl.get(priorityHost) : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains() {\n return [...this.allowedDomains];\n },\n\n /**\n * Creates an object where the keys are the service names\n * and the values are the service urls.\n * @param {boolean} priorityHost - use the highest priority if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const output = {};\n\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n if (serviceUrls) {\n serviceUrls.forEach((serviceUrl) => {\n output[serviceUrl.name] = serviceUrl.get(priorityHost);\n });\n }\n\n return output;\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceUrl` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceUrls` host array,\n * or the `ServiceUrls` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @param {boolean} noPriorityHosts\n * @returns {string}\n */\n markFailedUrl(url, noPriorityHosts) {\n const serviceUrl = this._getUrl(\n Object.keys(this.list()).find((key) => this._getUrl(key).failHost(url))\n );\n\n if (!serviceUrl) {\n return undefined;\n }\n\n return noPriorityHosts ? serviceUrl.get(false) : serviceUrl.get(true);\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains) {\n this.allowedDomains = [...allowedDomains];\n },\n\n /**\n * 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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"}
|