UNPKG

@push.rocks/webrequest

Version:

A module for making secure web requests from browsers with support for caching and fault tolerance.

185 lines 14 kB
import * as plugins from './webrequest.plugins.js'; /** * web request */ export class WebRequest { constructor(optionsArg = {}) { this.optionsArg = optionsArg; this.cacheStore = new plugins.webstore.WebStore({ dbName: 'webrequest', storeName: 'webrequest', }); this.options = { logging: true, ...optionsArg, }; } async getJson(urlArg, useCacheArg = false) { const response = await this.request(urlArg, { method: 'GET', useCache: useCacheArg, }); const responseText = await response.text(); const responseResult = plugins.smartjson.parse(responseText); return responseResult; } /** * postJson */ async postJson(urlArg, requestBody, useCacheArg = false) { const response = await this.request(urlArg, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: plugins.smartjson.stringify(requestBody), useCache: useCacheArg, }); const responseText = await response.text(); const responseResult = plugins.smartjson.parse(responseText); return responseResult; } /** * put js */ async putJson(urlArg, requestBody, useStoreAsFallback = false) { const response = await this.request(urlArg, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: plugins.smartjson.stringify(requestBody), }); const responseText = await response.text(); const responseResult = plugins.smartjson.parse(responseText); return responseResult; } /** * put js */ async deleteJson(urlArg, useStoreAsFallback = false) { const response = await this.request(urlArg, { headers: { 'Content-Type': 'application/json', }, method: 'GET', }); const responseText = await response.text(); const responseResult = plugins.smartjson.parse(responseText); return responseResult; } async request(urlArg, optionsArg) { optionsArg = { timeoutMs: 60000, useCache: false, ...optionsArg, }; let controller = new AbortController(); plugins.smartdelay.delayFor(optionsArg.timeoutMs).then(() => { controller.abort(); }); let cachedResponseDeferred = plugins.smartpromise.defer(); let cacheUsed = false; if (optionsArg.useCache && (await this.cacheStore.check(urlArg))) { const responseBuffer = await this.cacheStore.get(urlArg); cachedResponseDeferred.resolve(new Response(responseBuffer, {})); } else { cachedResponseDeferred.resolve(null); } let response = await fetch(urlArg, { signal: controller.signal, method: optionsArg.method, headers: { ...(optionsArg.headers || {}), }, body: optionsArg.body, }) .catch(async (err) => { if (optionsArg.useCache && (await cachedResponseDeferred.promise)) { cacheUsed = true; const cachedResponse = cachedResponseDeferred.promise; return cachedResponse; } else { return err; } }); if (optionsArg.useCache && (await cachedResponseDeferred.promise) && response.status === 500) { cacheUsed = true; response = await cachedResponseDeferred.promise; } if (!cacheUsed && optionsArg.useCache && response.status < 300) { const buffer = await response.clone().arrayBuffer(); await this.cacheStore.set(urlArg, buffer); } this.log(`${urlArg} answers with status: ${response.status}`); return response; } /** * a multi endpoint, fault tolerant request function */ async requestMultiEndpoint(urlArg, optionsArg) { let allUrls; let usedUrlIndex = 0; // determine what we got if (Array.isArray(urlArg)) { allUrls = urlArg; } else { allUrls = [urlArg]; } const requestHistory = []; // keep track of the request history const doHistoryCheck = async ( // check history for a historyEntryTypeArg) => { requestHistory.push(historyEntryTypeArg); if (historyEntryTypeArg === '429') { console.log('got 429, so waiting a little bit.'); await plugins.smartdelay.delayFor(Math.floor(Math.random() * (2000 - 1000 + 1)) + 1000); // wait between 1 and 10 seconds } let numOfHistoryType = 0; for (const entry of requestHistory) { if (entry === historyEntryTypeArg) numOfHistoryType++; } if (numOfHistoryType > 2 * allUrls.length * usedUrlIndex) { usedUrlIndex++; } }; // lets go recursive const doRequest = async (urlToUse) => { if (!urlToUse) { throw new Error('request failed permanently'); } this.log(`Getting ${urlToUse} with method ${optionsArg.method}`); const response = await fetch(urlToUse, { method: optionsArg.method, headers: { 'Content-Type': 'application/json', ...(optionsArg.headers || {}), }, body: optionsArg.body, }); this.log(`${urlToUse} answers with status: ${response.status}`); if (response.status >= 200 && response.status < 300) { return response; } else { // lets perform a history check to determine failed urls await doHistoryCheck(response.status.toString()); // lets fire the request const result = await doRequest(allUrls[usedUrlIndex]); return result; } }; const finalResponse = await doRequest(allUrls[usedUrlIndex]); return finalResponse; } log(logArg) { if (this.options.logging) { console.log(logArg); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBTW5EOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFTckIsWUFBbUIsYUFBMkMsRUFBRTtRQUE3QyxlQUFVLEdBQVYsVUFBVSxDQUFtQztRQVB6RCxlQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNoRCxNQUFNLEVBQUUsWUFBWTtZQUNwQixTQUFTLEVBQUUsWUFBWTtTQUN4QixDQUFDLENBQUM7UUFLRCxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsT0FBTyxFQUFFLElBQUk7WUFDYixHQUFHLFVBQVU7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBYyxFQUFFLGNBQXVCLEtBQUs7UUFDL0QsTUFBTSxRQUFRLEdBQWEsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNwRCxNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRSxXQUFXO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBYyxFQUFFLFdBQWlCLEVBQUUsY0FBdUIsS0FBSztRQUNuRixNQUFNLFFBQVEsR0FBYSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3BELE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7YUFDbkM7WUFDRCxJQUFJLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQzlDLFFBQVEsRUFBRSxXQUFXO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBYyxFQUFFLFdBQWlCLEVBQUUscUJBQThCLEtBQUs7UUFDekYsTUFBTSxRQUFRLEdBQWEsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNwRCxNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUMvQyxDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQWMsRUFBRSxxQkFBOEIsS0FBSztRQUN6RSxNQUFNLFFBQVEsR0FBYSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3BELE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FDbEIsTUFBYyxFQUNkLFVBTUM7UUFFRCxVQUFVLEdBQUc7WUFDWCxTQUFTLEVBQUUsS0FBSztZQUNoQixRQUFRLEVBQUUsS0FBSztZQUNmLEdBQUcsVUFBVTtTQUNkLENBQUM7UUFFRixJQUFJLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzFELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksc0JBQXNCLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQVksQ0FBQztRQUNwRSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxjQUFjLEdBQWdCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsc0JBQXNCLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFBTSxDQUFDO1lBQ04sc0JBQXNCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLFFBQVEsR0FBYSxNQUFNLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDekMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQ3pCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtZQUN6QixPQUFPLEVBQUU7Z0JBQ1AsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1NBQ3RCLENBQUM7YUFDRCxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ25CLElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sc0JBQXNCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDakIsTUFBTSxjQUFjLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDO2dCQUN0RCxPQUFPLGNBQWMsQ0FBQztZQUN4QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDN0YsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNqQixRQUFRLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQy9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLG9CQUFvQixDQUMvQixNQUF5QixFQUN6QixVQUlDO1FBR0QsSUFBSSxPQUFpQixDQUFDO1FBQ3RCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUVyQix3QkFBd0I7UUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUMsQ0FBQyxvQ0FBb0M7UUFFekUsTUFBTSxjQUFjLEdBQUcsS0FBSztRQUMxQixzQkFBc0I7UUFDdEIsbUJBQTJCLEVBQzNCLEVBQUU7WUFDRixjQUFjLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDekMsSUFBSSxtQkFBbUIsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO1lBQzNILENBQUM7WUFFRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLEtBQUssS0FBSyxtQkFBbUI7b0JBQUUsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQztnQkFDekQsWUFBWSxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLG9CQUFvQjtRQUNwQixNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsUUFBZ0IsRUFBZ0IsRUFBRTtZQUN6RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsUUFBUSxnQkFBZ0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0JBQ3pCLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsa0JBQWtCO29CQUNsQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7aUJBQzlCO2dCQUNELElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTthQUN0QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFaEUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sd0RBQXdEO2dCQUN4RCxNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2pELHdCQUF3QjtnQkFDeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBYSxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN2RSxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRU0sR0FBRyxDQUFDLE1BQWM7UUFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7Q0FDRiJ9