UNPKG

9.86 kBJavaScriptView Raw
1"use strict";
2var __assign = (this && this.__assign) || function () {
3 __assign = Object.assign || function(t) {
4 for (var s, i = 1, n = arguments.length; i < n; i++) {
5 s = arguments[i];
6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7 t[p] = s[p];
8 }
9 return t;
10 };
11 return __assign.apply(this, arguments);
12};
13Object.defineProperty(exports, "__esModule", { value: true });
14exports.noDestinationErrorMessage = exports.isDestinationJson = exports.isDestinationConfiguration = exports.toDestinationNameUrl = exports.parseDestination = exports.sanitizeDestination = void 0;
15var util_1 = require("@sap-cloud-sdk/util");
16var destination_service_types_1 = require("./destination-service-types");
17/**
18 * Takes an existing or a parsed destination and returns an SDK compatible destination object.
19 * @param destination - An object that adheres to the [[Destination]] interface.
20 * @returns An SDK compatible destination object.
21 */
22function sanitizeDestination(destination) {
23 validateDestinationInput(destination);
24 var destAuthToken = parseAuthTokens(destination);
25 var parsedDestination = parseCertificates(destAuthToken);
26 parsedDestination = setDefaultAuthenticationFallback(parsedDestination);
27 parsedDestination = setTrustAll(parsedDestination);
28 parsedDestination = setOriginalProperties(parsedDestination);
29 return parsedDestination;
30}
31exports.sanitizeDestination = sanitizeDestination;
32/**
33 * Takes a JSON object returned by any of the calls to the destination service and returns an SDK compatible destination object.
34 * This function only accepts destination configurations of type 'HTTP' and will error if no 'URL' is given.
35 * @param destinationJson - A JSON object returned by the destination service.
36 * @returns An SDK compatible destination object.
37 */
38function parseDestination(destinationJson) {
39 var destinationConfig = getDestinationConfig(destinationJson);
40 validateDestinationConfig(destinationConfig);
41 var destination = Object.entries(destinationConfig).reduce(function (dest, _a) {
42 var originalKey = _a[0], value = _a[1];
43 if (originalKey in configMapping) {
44 dest[configMapping[originalKey]] = value;
45 }
46 return dest;
47 }, {
48 originalProperties: destinationJson,
49 authTokens: destinationJson['authTokens'] || [],
50 certificates: destinationJson['certificates'] || []
51 });
52 var additionalHeadersAndQueryParameters = getAdditionalHeadersAndQueryParameters(destinationConfig);
53 return sanitizeDestination(__assign(__assign({}, destination), additionalHeadersAndQueryParameters));
54}
55exports.parseDestination = parseDestination;
56/**
57 * Get either additional headers or query parameters from a destination, depending on the given prefix.
58 * @param destinationConfig - Original destination config that could include additional headers or query parameters.
59 * @param originalKeyPrefix - This is what the additional header and query keys start with, when specified in the original destination config.
60 * @returns An object with either the headers or query parameters and their values, depending on the `originalKeyPrefix`.
61 */
62function getAdditionalProperties(destinationConfig, originalKeyPrefix) {
63 var relevantConfigEntries = Object.entries(destinationConfig).filter(function (_a) {
64 var key = _a[0];
65 return key.startsWith(originalKeyPrefix);
66 });
67 return relevantConfigEntries.reduce(function (additionalProperties, _a) {
68 var originalKey = _a[0], value = _a[1];
69 var headerKey = originalKey.replace(originalKeyPrefix, '');
70 additionalProperties[headerKey] = value;
71 return additionalProperties;
72 }, {});
73}
74/**
75 * Get additional headers and/or query parameters from a destination.
76 * Destinations can specify additional headers and/or query parameters, that should be added to every request against the given destination.
77 * They are specified in the following format:
78 * `URL.headers.<header-name>` or `URL.queries.<query-parameter-name>`
79 * @param destinationConfig - Original destination config that could include additional headers or query parameters.
80 * @returns An object with either the headers or query parameters and their values, depending on the `originalKeyPrefix`.
81 */
82function getAdditionalHeadersAndQueryParameters(destinationConfig) {
83 var additionalHeaders = getAdditionalProperties(destinationConfig, 'URL.headers.');
84 var additionalQueryParameters = getAdditionalProperties(destinationConfig, 'URL.queries.');
85 var additionalProperties = {};
86 if (Object.keys(additionalHeaders).length) {
87 additionalProperties['headers'] = additionalHeaders;
88 }
89 if (Object.keys(additionalQueryParameters).length) {
90 additionalProperties['queryParameters'] = additionalQueryParameters;
91 }
92 return additionalProperties;
93}
94function getDestinationConfig(destinationJson) {
95 return isDestinationJson(destinationJson)
96 ? destinationJson.destinationConfiguration
97 : destinationJson;
98}
99function validateDestinationConfig(destinationConfig) {
100 if (isHttpDestination(destinationConfig) &&
101 typeof destinationConfig.URL === 'undefined') {
102 throw Error("Property 'URL' of destination configuration must not be undefined.");
103 }
104}
105function validateDestinationInput(destinationInput) {
106 if (isHttpDestination(destinationInput) &&
107 typeof destinationInput.url === 'undefined') {
108 throw Error("Property 'url' of destination input must not be undefined.");
109 }
110}
111function isHttpDestination(destinationInput) {
112 return (destinationInput.Type === 'HTTP' ||
113 destinationInput.type === 'HTTP' ||
114 (typeof destinationInput.type === 'undefined' &&
115 typeof destinationInput.Type === 'undefined'));
116}
117/* eslint-disable-next-line valid-jsdoc */
118/**
119 * @hidden
120 */
121function toDestinationNameUrl(destination) {
122 return (0, destination_service_types_1.isDestinationNameAndJwt)(destination)
123 ? "name: ".concat(destination.destinationName)
124 : "name: ".concat(destination.name, ", url: ").concat(destination.url);
125}
126exports.toDestinationNameUrl = toDestinationNameUrl;
127function setOriginalProperties(destination) {
128 var originalProperties = destination.originalProperties
129 ? destination.originalProperties
130 : destination;
131 return (0, util_1.assoc)('originalProperties', originalProperties, destination);
132}
133function setDefaultAuthenticationFallback(destination) {
134 return destination.authentication
135 ? destination
136 : (0, util_1.assoc)('authentication', getAuthenticationType(destination), destination);
137}
138function parseCertificate(certificate) {
139 return {
140 name: certificate.Name || certificate.name,
141 content: certificate.Content || certificate.content,
142 type: certificate.Type || certificate.type
143 };
144}
145function parseCertificates(destination) {
146 var certificates = destination.certificates
147 ? destination.certificates.map(parseCertificate)
148 : [];
149 return (0, util_1.assoc)('certificates', certificates, destination);
150}
151function parseAuthToken(authToken) {
152 return {
153 type: authToken.type,
154 value: authToken.value,
155 expiresIn: authToken.expires_in,
156 error: 'error' in authToken ? authToken.error : null,
157 http_header: authToken.http_header
158 };
159}
160function parseAuthTokens(destination) {
161 var authTokens = destination.authTokens
162 ? destination.authTokens.map(parseAuthToken)
163 : [];
164 return (0, util_1.assoc)('authTokens', authTokens, destination);
165}
166function setTrustAll(destination) {
167 return (0, util_1.assoc)('isTrustingAllCertificates', parseTrustAll(destination.isTrustingAllCertificates), destination);
168}
169function parseTrustAll(isTrustingAllCertificates) {
170 if (typeof isTrustingAllCertificates === 'string') {
171 return isTrustingAllCertificates.toLowerCase() === 'true';
172 }
173 return !!isTrustingAllCertificates;
174}
175function getAuthenticationType(destination) {
176 return destination.authentication ||
177 (destination.username && destination.password)
178 ? 'BasicAuthentication'
179 : 'NoAuthentication';
180}
181/* eslint-disable-next-line valid-jsdoc */
182/**
183 * @hidden
184 */
185function isDestinationConfiguration(destination) {
186 return destination.URL !== undefined;
187}
188exports.isDestinationConfiguration = isDestinationConfiguration;
189/* eslint-disable-next-line valid-jsdoc */
190/**
191 * @hidden
192 */
193function isDestinationJson(destination) {
194 return Object.keys(destination).includes('destinationConfiguration');
195}
196exports.isDestinationJson = isDestinationJson;
197var configMapping = {
198 URL: 'url',
199 Name: 'name',
200 User: 'username',
201 Password: 'password',
202 ProxyType: 'proxyType',
203 'sap-client': 'sapClient',
204 Authentication: 'authentication',
205 TrustAll: 'isTrustingAllCertificates',
206 Type: 'type',
207 tokenServiceURL: 'tokenServiceUrl',
208 clientId: 'clientId',
209 clientSecret: 'clientSecret',
210 tokenServiceUser: 'tokenServiceUser',
211 tokenServicePassword: 'tokenServicePassword',
212 CloudConnectorLocationId: 'cloudConnectorLocationId',
213 certificates: 'certificates',
214 KeyStoreLocation: 'keyStoreName',
215 KeyStorePassword: 'keyStorePassword',
216 SystemUser: 'systemUser'
217};
218function noDestinationErrorMessage(destination) {
219 return (0, destination_service_types_1.isDestinationNameAndJwt)(destination)
220 ? "Could not find a destination with name \"".concat(destination.destinationName, "\"! Unable to execute request.")
221 : 'Could not find a destination to execute request against and no destination name has been provided (this should never happen)!';
222}
223exports.noDestinationErrorMessage = noDestinationErrorMessage;
224//# sourceMappingURL=destination.js.map
\No newline at end of file