@sap-cloud-sdk/core
Version:
SAP Cloud SDK for JavaScript core
145 lines • 6.27 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getUserToken = exports.getClientCredentialsToken = exports.getSubdomainAndZoneId = void 0;
var xssec = __importStar(require("@sap/xssec"));
var opossum_1 = __importDefault(require("opossum"));
var subdomain_replacer_1 = require("./subdomain-replacer");
var jwt_1 = require("./jwt");
var resilience_options_1 = require("./resilience-options");
var environment_accessor_1 = require("./environment-accessor");
var circuitBreaker;
function executeFunction(fn) {
var parameters = [];
for (var _i = 1; _i < arguments.length; _i++) {
parameters[_i - 1] = arguments[_i];
}
return fn.apply(void 0, parameters);
}
function getCircuitBreaker() {
if (!circuitBreaker) {
circuitBreaker = new opossum_1.default(executeFunction, resilience_options_1.circuitBreakerDefaultOptions);
}
return circuitBreaker;
}
/**
* Wrap a function in a circuit breaker. IMPORTANT: This assumes that the last parameter of the function is `ResilienceOptions` and you do not pass it to the execution of this function.
* Example:
* ```
* function myFn(param: string, options: ResilienceOptions = { enableCircuitBreaker: true }) {
* if (options.enableCircuitBreaker) {
* return wrapInCircuitBreaker(getClientCredentialsToken)(service, userJwt);
* }
* ```
* @param fn - Function to wrap.
* @returns A function to be called with the original parameters, by omitting the options parameter.
*/
function wrapInCircuitBreaker(fn) {
return function () {
var _a;
var parameters = [];
for (var _i = 0; _i < arguments.length; _i++) {
parameters[_i] = arguments[_i];
}
return (_a = getCircuitBreaker()).fire.apply(_a, __spreadArray(__spreadArray([fn], parameters, false), [{
enableCircuitBreaker: false
}], false));
};
}
/**
* Get subdomain and zoneId value from a given JWT.
* @param jwt - A JWT from the current user.
* @returns subdomain and zoneId from the JWT
* @hidden
*/
function getSubdomainAndZoneId(jwt) {
var subdomain = null;
var zoneId = null;
if (jwt) {
var jwtPayload = typeof jwt === 'string' ? (0, jwt_1.decodeJwt)(jwt) : jwt;
if (jwtPayload.iss) {
subdomain = (0, subdomain_replacer_1.parseSubdomain)(jwtPayload.iss);
}
if (jwtPayload.zid) {
zoneId = jwtPayload.zid;
}
}
return { subdomain: subdomain, zoneId: zoneId };
}
exports.getSubdomainAndZoneId = getSubdomainAndZoneId;
/**
* Make a user token request against the XSUAA service.
* @param service - Service as it is defined in the environment variable.
* @param userJwt - User JWT.
* @param options - Options to influence resilience behavior (see [[ResilienceOptions]]). By default, usage of a circuit breaker is enabled.
* @returns Client credentials token.
* @hidden
*/
function getClientCredentialsToken(service, userJwt, options) {
if (options === void 0) { options = { enableCircuitBreaker: true }; }
if (options.enableCircuitBreaker) {
return wrapInCircuitBreaker(getClientCredentialsToken)(service, userJwt);
}
var serviceCredentials = (0, environment_accessor_1.resolveService)(service).credentials;
var subdomainAndZoneId = getSubdomainAndZoneId(userJwt);
return new Promise(function (resolve, reject) {
xssec.requests.requestClientCredentialsToken(subdomainAndZoneId.subdomain, serviceCredentials, null, subdomainAndZoneId.zoneId, function (err, token, tokenResponse) {
return err ? reject(err) : resolve(tokenResponse);
});
});
}
exports.getClientCredentialsToken = getClientCredentialsToken;
/**
* Make a user token request against the XSUAA service.
* @param service - Service as it is defined in the environment variable.
* @param userJwt - User JWT.
* @param options - Options to influence resilience behavior (see [[ResilienceOptions]]). By default, usage of a circuit breaker is enabled.
* @returns User token.
* @hidden
*/
function getUserToken(service, userJwt, options) {
if (options === void 0) { options = { enableCircuitBreaker: true }; }
if (options.enableCircuitBreaker) {
return wrapInCircuitBreaker(getUserToken)(service, userJwt);
}
var subdomainAndZoneId = getSubdomainAndZoneId(userJwt);
return new Promise(function (resolve, reject) {
return xssec.requests.requestUserToken(userJwt, service.credentials, null, null, subdomainAndZoneId.subdomain, subdomainAndZoneId.zoneId, function (err, token) { return (err ? reject(err) : resolve(token)); });
});
}
exports.getUserToken = getUserToken;
//# sourceMappingURL=xsuaa-service.js.map
;