UNPKG

7.06 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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23 return new (P || (P = Promise))(function (resolve, reject) {
24 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27 step((generator = generator.apply(thisArg, _arguments || [])).next());
28 });
29};
30var __importDefault = (this && this.__importDefault) || function (mod) {
31 return (mod && mod.__esModule) ? mod : { "default": mod };
32};
33Object.defineProperty(exports, "__esModule", { value: true });
34const axios_1 = __importDefault(require("axios"));
35const common_1 = require("../common");
36const system_1 = __importStar(require("../system"));
37const Utils_1 = require("../system/Utils");
38const Consts_1 = require("./Consts");
39let lastAuthHeaders = -1;
40let cachedAuthHeaders = {};
41function getAuthHeaders(useCachedHeaders = true) {
42 return __awaiter(this, void 0, void 0, function* () {
43 if (process.env.NODE_ENV === 'test') {
44 return {};
45 }
46 const timestamp = Date.now();
47 if (useCachedHeaders) {
48 if (timestamp - lastAuthHeaders < 300000) {
49 return cachedAuthHeaders;
50 }
51 }
52 lastAuthHeaders = timestamp;
53 const auth = system_1.default.getLibModule(system_1.LibModule.AUTH);
54 const organization = yield auth.getOrganization();
55 cachedAuthHeaders = {
56 [Consts_1.X_ORGANIZATION]: organization.module_id,
57 [Consts_1.X_CLIENT_TZ]: Intl.DateTimeFormat().resolvedOptions().timeZone,
58 'Content-Type': 'application/json;charset=UTF-8',
59 };
60 return cachedAuthHeaders;
61 });
62}
63function rejectedBecauseAuth(e) {
64 return Boolean(e.response && e.response.status && (e.response.status === Consts_1.FORBIDDEN || e.response.status === Consts_1.UNAUTHORIZED));
65}
66/**
67 * Makes sure that a URI contains no leading '/' characters
68 *
69 * @param uri The URI being sanitized
70 */
71function sanitizeUri(uri) {
72 const length = uri.length;
73 let i = 0;
74 for (; i < length; i++) {
75 if (uri.charAt(i) !== '/') {
76 break;
77 }
78 }
79 if (i === 0) {
80 return uri;
81 }
82 return uri.substr(i);
83}
84function request(method, uri, data, headers, canRetryAuth = true, customBaseUrl) {
85 return __awaiter(this, void 0, void 0, function* () {
86 let authFailed = false;
87 const requestSettings = {
88 method,
89 withCredentials: true,
90 };
91 if (data) {
92 if (method === Consts_1.GET || method === Consts_1.DELETE) {
93 requestSettings.params = data;
94 }
95 else {
96 requestSettings.data = data;
97 }
98 }
99 const authHeaders = yield getAuthHeaders(canRetryAuth);
100 const impersonateHeaders = system_1.default.isProtected() ? system_1.default.getImpersonationHeaders() : {};
101 requestSettings.headers = Object.assign(Object.assign(Object.assign(Object.assign({}, authHeaders), system_1.default.getHttpHeaders()), headers), impersonateHeaders);
102 try {
103 const baseUrl = customBaseUrl || system_1.default.nexus.getUrl();
104 const url = `${baseUrl}/${sanitizeUri(uri)}`;
105 const response = (yield axios_1.default(url, requestSettings));
106 if (!response || !response.data) {
107 return null;
108 }
109 return response.data;
110 }
111 catch (e) {
112 if (rejectedBecauseAuth(e)) {
113 try {
114 yield request('get', `${system_1.default.nexus.getUrl()}/user`, undefined, undefined, false);
115 }
116 catch (e2) {
117 authFailed = rejectedBecauseAuth(e2);
118 }
119 }
120 }
121 if (authFailed && canRetryAuth) {
122 // Check if valid user
123 try {
124 // TODO: consider setting an amount of times to retry auth
125 const user = yield system_1.default.nexus.reconnect();
126 if (user) {
127 return request(method, uri, data, headers, false);
128 }
129 }
130 catch (_a) { }
131 }
132 return null;
133 });
134}
135function get(uri, params, headers, customBaseUrl) {
136 return request(Consts_1.GET, uri, params, headers, true, customBaseUrl);
137}
138function del(uri, params, headers, customBaseUrl) {
139 return request(Consts_1.DELETE, uri, params, headers, true, customBaseUrl);
140}
141function post(uri, payload, headers, customBaseUrl) {
142 return request(Consts_1.POST, uri, payload, headers, true, customBaseUrl);
143}
144function put(uri, payload, headers, customBaseUrl) {
145 return request(Consts_1.PUT, uri, payload, headers, true, customBaseUrl);
146}
147function search(domain, module, filters, options) {
148 return __awaiter(this, void 0, void 0, function* () {
149 common_1.validateDomainAndModule(domain, module);
150 const domainUri = common_1.domainToUri(domain);
151 const moduleUri = common_1.moduleToUri(module);
152 if (options === null || options === void 0 ? void 0 : options.withFormData) {
153 const response = yield request(Consts_1.PUT, `${domainUri}/${moduleUri}/search/context`, Object.assign(Object.assign({}, options), { filters }), options === null || options === void 0 ? void 0 : options.headers);
154 return response ? response.map(({ entity }) => entity) : [];
155 }
156 const response = yield request(Consts_1.PUT, `${domainUri}/${moduleUri}/search`, Object.assign(Object.assign({}, options), { filters }), options === null || options === void 0 ? void 0 : options.headers);
157 return response ? response : [];
158 });
159}
160const api = Object.freeze(Utils_1.makeCallable(request, { get, delete: del, post, put, search }));
161exports.default = system_1.default.sealModule(api);