fix(core): update
This commit is contained in:
parent
184bf11bd7
commit
609c3833b1
1173
package-lock.json
generated
1173
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -16,17 +16,18 @@
|
||||
"@gitzone/tsbuild": "^2.1.63",
|
||||
"@gitzone/tsbundle": "^2.0.4",
|
||||
"@gitzone/tstest": "^1.0.71",
|
||||
"@pushrocks/smartexpress": "^4.0.4",
|
||||
"@pushrocks/smartexpress": "^4.0.5",
|
||||
"@pushrocks/tapbundle": "^5.0.3",
|
||||
"@types/node": "^17.0.35",
|
||||
"@types/node": "^17.0.36",
|
||||
"tslint": "^6.1.3",
|
||||
"tslint-config-prettier": "^1.18.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@pushrocks/smartdelay": "^2.0.13",
|
||||
"@pushrocks/smartenv": "^5.0.1",
|
||||
"@pushrocks/smartenv": "^5.0.2",
|
||||
"@pushrocks/smartjson": "^4.0.6",
|
||||
"@pushrocks/smartpromise": "^3.1.7",
|
||||
"@pushrocks/webstore": "^2.0.3",
|
||||
"node-fetch": "^3.2.4"
|
||||
},
|
||||
"files": [
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { expect, tap } from '@pushrocks/tapbundle';
|
||||
import * as webrequest from '../ts/index.js';
|
||||
|
||||
tap.test('first test', async (tools) => {
|
||||
tap.test('should run multiendpoint request', async (tools) => {
|
||||
const done = tools.defer();
|
||||
const response = await new webrequest.WebRequest()
|
||||
.request(['https://lossless.com'], {
|
||||
.requestMultiEndpoint(['https://lossless.com'], {
|
||||
method: 'GET',
|
||||
})
|
||||
.catch((e) => {
|
||||
|
17
test/test.ts
17
test/test.ts
@ -43,12 +43,14 @@ tap.test('setup test server', async () => {
|
||||
});
|
||||
|
||||
tap.test('first test', async (tools) => {
|
||||
const response = await new webrequest.WebRequest().getJson([
|
||||
const response = await (await new webrequest.WebRequest().requestMultiEndpoint([
|
||||
'http://localhost:2345/apiroute1',
|
||||
'http://localhost:2345/apiroute2',
|
||||
'http://localhost:2345/apiroute4',
|
||||
'http://localhost:2345/apiroute3',
|
||||
]);
|
||||
], {
|
||||
method: 'GET'
|
||||
})).json();
|
||||
|
||||
const response2 = await new webrequest.WebRequest().getJson('http://localhost:2345/apiroute3');
|
||||
|
||||
@ -59,8 +61,13 @@ tap.test('first test', async (tools) => {
|
||||
expect(response2).toHaveProperty('hithere'); //.to.equal('hi');
|
||||
});
|
||||
|
||||
tap.test('tear down server', async () => {
|
||||
testServer.stop();
|
||||
});
|
||||
tap.test('should cache response', async () => {
|
||||
const webrequestInstance = new webrequest.WebRequest();
|
||||
const response = await webrequestInstance.getJson('http://localhost:2345/apiroute3', true);
|
||||
expect(response).toHaveProperty('hithere');
|
||||
await testServer.stop();
|
||||
const response2 = await webrequestInstance.getJson('http://localhost:2345/apiroute3', true);
|
||||
expect(response2).toHaveProperty('hithere');
|
||||
})
|
||||
|
||||
tap.start();
|
||||
|
@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@pushrocks/webrequest',
|
||||
version: '3.0.4',
|
||||
version: '3.0.5',
|
||||
description: 'securely request from browsers'
|
||||
}
|
||||
|
75
ts/index.ts
75
ts/index.ts
@ -14,20 +14,27 @@ export class WebRequest {
|
||||
const smartenv = new plugins.smartenv.Smartenv();
|
||||
if (!smartenv.isBrowser) {
|
||||
this.polyfillStatusEvaluated = true;
|
||||
const fetch = await smartenv.getSafeNodeModule('node-fetch');
|
||||
globalThis.fetch = fetch.default;
|
||||
const fetchMod = await smartenv.getSafeNodeModule('node-fetch');
|
||||
globalThis.Response = fetchMod.Response;
|
||||
globalThis.fetch = fetchMod.default;
|
||||
}
|
||||
this.neededPolyfillsLoadedDeferred.resolve();
|
||||
}
|
||||
|
||||
public cacheStore = new plugins.webstore.WebStore({
|
||||
dbName: 'webrequest',
|
||||
storeName: 'webrequest',
|
||||
});
|
||||
|
||||
constructor() {
|
||||
WebRequest.loadNeededPolyfills();
|
||||
}
|
||||
|
||||
public async getJson(urlArg: string | string[]) {
|
||||
public async getJson(urlArg: string, useCacheArg: boolean = false) {
|
||||
await WebRequest.neededPolyfillsLoadedDeferred.promise;
|
||||
const response: Response = await this.request(urlArg, {
|
||||
method: 'GET',
|
||||
useCache: useCacheArg,
|
||||
});
|
||||
const responseText = await response.text();
|
||||
const responseResult = plugins.smartjson.parse(responseText);
|
||||
@ -37,7 +44,7 @@ export class WebRequest {
|
||||
/**
|
||||
* postJson
|
||||
*/
|
||||
public async postJson(urlArg: string, requestBody?: any) {
|
||||
public async postJson(urlArg: string, requestBody?: any, useStoreAsFallback: boolean = false) {
|
||||
await WebRequest.neededPolyfillsLoadedDeferred.promise;
|
||||
const response: Response = await this.request(urlArg, {
|
||||
body: plugins.smartjson.stringify(requestBody),
|
||||
@ -51,7 +58,7 @@ export class WebRequest {
|
||||
/**
|
||||
* put js
|
||||
*/
|
||||
public async putJson(urlArg: string, requestBody?: any) {
|
||||
public async putJson(urlArg: string, requestBody?: any, useStoreAsFallback: boolean = false) {
|
||||
await WebRequest.neededPolyfillsLoadedDeferred.promise;
|
||||
const response: Response = await this.request(urlArg, {
|
||||
body: plugins.smartjson.stringify(requestBody),
|
||||
@ -65,7 +72,7 @@ export class WebRequest {
|
||||
/**
|
||||
* put js
|
||||
*/
|
||||
public async deleteJson(urlArg: string) {
|
||||
public async deleteJson(urlArg: string, useStoreAsFallback: boolean = false) {
|
||||
await WebRequest.neededPolyfillsLoadedDeferred.promise;
|
||||
const response: Response = await this.request(urlArg, {
|
||||
method: 'GET',
|
||||
@ -75,10 +82,60 @@ export class WebRequest {
|
||||
return responseResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* a fault tolerant request
|
||||
*/
|
||||
public async request(
|
||||
urlArg: string,
|
||||
optionsArg: {
|
||||
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
||||
body?: any;
|
||||
headers?: HeadersInit;
|
||||
useCache?: boolean;
|
||||
timeoutMs?: number;
|
||||
}
|
||||
) {
|
||||
await WebRequest.neededPolyfillsLoadedDeferred.promise;
|
||||
const controller = new AbortController();
|
||||
if (optionsArg.timeoutMs) {
|
||||
plugins.smartdelay.delayFor(optionsArg.timeoutMs).then(() => {
|
||||
controller.abort();
|
||||
});
|
||||
}
|
||||
let cachedResponseDeferred = plugins.smartpromise.defer<Response>();
|
||||
let cacheUsed = false;
|
||||
if (optionsArg.useCache && this.cacheStore.check(urlArg)) {
|
||||
const responseBuffer: ArrayBuffer = await this.cacheStore.get(urlArg)
|
||||
cachedResponseDeferred.resolve(new Response(responseBuffer, {}));
|
||||
} else {
|
||||
cachedResponseDeferred.resolve(null);
|
||||
}
|
||||
const response: Response = await fetch(urlArg, {
|
||||
signal: controller.signal,
|
||||
method: optionsArg.method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...(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 (!cacheUsed && optionsArg.useCache && response.status < 300) {
|
||||
const buffer = await response.clone().arrayBuffer();
|
||||
await this.cacheStore.set(urlArg, buffer);
|
||||
}
|
||||
console.log(`${urlArg} answers with status: ${response.status}`);
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* a multi endpoint, fault tolerant request function
|
||||
*/
|
||||
public async requestMultiEndpoint(
|
||||
urlArg: string | string[],
|
||||
optionsArg: {
|
||||
method: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
||||
|
@ -2,5 +2,6 @@ import * as smartdelay from '@pushrocks/smartdelay';
|
||||
import * as smartenv from '@pushrocks/smartenv';
|
||||
import * as smartjson from '@pushrocks/smartjson';
|
||||
import * as smartpromise from '@pushrocks/smartpromise';
|
||||
import * as webstore from '@pushrocks/webstore';
|
||||
|
||||
export { smartdelay, smartenv, smartjson, smartpromise };
|
||||
export { smartdelay, smartenv, smartjson, smartpromise, webstore };
|
||||
|
Loading…
Reference in New Issue
Block a user