UNPKG

@sap-cloud-sdk/core

Version:
145 lines • 6.27 kB
"use strict"; 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