UNPKG

5.88 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21var __spreadArray = (this && this.__spreadArray) || function (to, from) {
22 for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
23 to[j] = from[i];
24 return to;
25};
26var __importDefault = (this && this.__importDefault) || function (mod) {
27 return (mod && mod.__esModule) ? mod : { "default": mod };
28};
29Object.defineProperty(exports, "__esModule", { value: true });
30exports.getUserToken = exports.getClientCredentialsToken = exports.getSubdomainAndZoneId = void 0;
31var xssec = __importStar(require("@sap/xssec"));
32var opossum_1 = __importDefault(require("opossum"));
33var subdomain_replacer_1 = require("./subdomain-replacer");
34var jwt_1 = require("./jwt");
35var resilience_options_1 = require("./resilience-options");
36var environment_accessor_1 = require("./environment-accessor");
37var circuitBreaker;
38function executeFunction(fn) {
39 var parameters = [];
40 for (var _i = 1; _i < arguments.length; _i++) {
41 parameters[_i - 1] = arguments[_i];
42 }
43 return fn.apply(void 0, parameters);
44}
45function getCircuitBreaker() {
46 if (!circuitBreaker) {
47 circuitBreaker = new opossum_1.default(executeFunction, resilience_options_1.circuitBreakerDefaultOptions);
48 }
49 return circuitBreaker;
50}
51/**
52 * 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.
53 * Example:
54 * ```
55 * function myFn(param: string, options: ResilienceOptions = { enableCircuitBreaker: true }) {
56 * if (options.enableCircuitBreaker) {
57 * return wrapInCircuitBreaker(getClientCredentialsToken)(service, userJwt);
58 * }
59 * ```
60 * @param fn - Function to wrap.
61 * @returns A function to be called with the original parameters, by omitting the options parameter.
62 */
63function wrapInCircuitBreaker(fn) {
64 return function () {
65 var _a;
66 var parameters = [];
67 for (var _i = 0; _i < arguments.length; _i++) {
68 parameters[_i] = arguments[_i];
69 }
70 return (_a = getCircuitBreaker()).fire.apply(_a, __spreadArray(__spreadArray([fn], parameters), [{
71 enableCircuitBreaker: false
72 }]));
73 };
74}
75/**
76 * Get subdomain and zoneId value from a given JWT.
77 * @param jwt - A JWT from the current user.
78 * @returns subdomain and zoneId from the JWT
79 * @hidden
80 */
81function getSubdomainAndZoneId(jwt) {
82 var subdomain = null;
83 var zoneId = null;
84 if (jwt) {
85 var jwtPayload = typeof jwt === 'string' ? jwt_1.decodeJwt(jwt) : jwt;
86 if (jwtPayload.iss) {
87 subdomain = subdomain_replacer_1.parseSubdomain(jwtPayload.iss);
88 }
89 if (jwtPayload.zid) {
90 zoneId = jwtPayload.zid;
91 }
92 }
93 return { subdomain: subdomain, zoneId: zoneId };
94}
95exports.getSubdomainAndZoneId = getSubdomainAndZoneId;
96/**
97 * Make a user token request against the XSUAA service.
98 * @param service - Service as it is defined in the environment variable.
99 * @param userJwt - User JWT.
100 * @param options - Options to influence resilience behavior (see [[ResilienceOptions]]). By default, usage of a circuit breaker is enabled.
101 * @returns Client credentials token.
102 * @hidden
103 */
104function getClientCredentialsToken(service, userJwt, options) {
105 if (options === void 0) { options = { enableCircuitBreaker: true }; }
106 if (options.enableCircuitBreaker) {
107 return wrapInCircuitBreaker(getClientCredentialsToken)(service, userJwt);
108 }
109 var serviceCredentials = environment_accessor_1.resolveService(service).credentials;
110 var subdomainAndZoneId = getSubdomainAndZoneId(userJwt);
111 return new Promise(function (resolve, reject) {
112 xssec.requests.requestClientCredentialsToken(subdomainAndZoneId.subdomain, serviceCredentials, null, subdomainAndZoneId.zoneId, function (err, token, tokenResponse) {
113 return err ? reject(err) : resolve(tokenResponse);
114 });
115 });
116}
117exports.getClientCredentialsToken = getClientCredentialsToken;
118/**
119 * Make a user token request against the XSUAA service.
120 * @param service - Service as it is defined in the environment variable.
121 * @param userJwt - User JWT.
122 * @param options - Options to influence resilience behavior (see [[ResilienceOptions]]). By default, usage of a circuit breaker is enabled.
123 * @returns User token.
124 * @hidden
125 */
126function getUserToken(service, userJwt, options) {
127 if (options === void 0) { options = { enableCircuitBreaker: true }; }
128 if (options.enableCircuitBreaker) {
129 return wrapInCircuitBreaker(getUserToken)(service, userJwt);
130 }
131 var subdomainAndZoneId = getSubdomainAndZoneId(userJwt);
132 return new Promise(function (resolve, reject) {
133 return xssec.requests.requestUserToken(userJwt, service.credentials, null, null, subdomainAndZoneId.subdomain, subdomainAndZoneId.zoneId, function (err, token) { return (err ? reject(err) : resolve(token)); });
134 });
135}
136exports.getUserToken = getUserToken;
137//# sourceMappingURL=xsuaa-service.js.map
\No newline at end of file