fix(core): update
This commit is contained in:
		
							
								
								
									
										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/tsbuild": "^2.1.63", | ||||||
|     "@gitzone/tsbundle": "^2.0.4", |     "@gitzone/tsbundle": "^2.0.4", | ||||||
|     "@gitzone/tstest": "^1.0.71", |     "@gitzone/tstest": "^1.0.71", | ||||||
|     "@pushrocks/smartexpress": "^4.0.4", |     "@pushrocks/smartexpress": "^4.0.5", | ||||||
|     "@pushrocks/tapbundle": "^5.0.3", |     "@pushrocks/tapbundle": "^5.0.3", | ||||||
|     "@types/node": "^17.0.35", |     "@types/node": "^17.0.36", | ||||||
|     "tslint": "^6.1.3", |     "tslint": "^6.1.3", | ||||||
|     "tslint-config-prettier": "^1.18.0" |     "tslint-config-prettier": "^1.18.0" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@pushrocks/smartdelay": "^2.0.13", |     "@pushrocks/smartdelay": "^2.0.13", | ||||||
|     "@pushrocks/smartenv": "^5.0.1", |     "@pushrocks/smartenv": "^5.0.2", | ||||||
|     "@pushrocks/smartjson": "^4.0.6", |     "@pushrocks/smartjson": "^4.0.6", | ||||||
|     "@pushrocks/smartpromise": "^3.1.7", |     "@pushrocks/smartpromise": "^3.1.7", | ||||||
|  |     "@pushrocks/webstore": "^2.0.3", | ||||||
|     "node-fetch": "^3.2.4" |     "node-fetch": "^3.2.4" | ||||||
|   }, |   }, | ||||||
|   "files": [ |   "files": [ | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| import { expect, tap } from '@pushrocks/tapbundle'; | import { expect, tap } from '@pushrocks/tapbundle'; | ||||||
| import * as webrequest from '../ts/index.js'; | 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 done = tools.defer(); | ||||||
|   const response = await new webrequest.WebRequest() |   const response = await new webrequest.WebRequest() | ||||||
|     .request(['https://lossless.com'], { |     .requestMultiEndpoint(['https://lossless.com'], { | ||||||
|       method: 'GET', |       method: 'GET', | ||||||
|     }) |     }) | ||||||
|     .catch((e) => { |     .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) => { | 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/apiroute1', | ||||||
|     'http://localhost:2345/apiroute2', |     'http://localhost:2345/apiroute2', | ||||||
|     'http://localhost:2345/apiroute4', |     'http://localhost:2345/apiroute4', | ||||||
|     'http://localhost:2345/apiroute3', |     'http://localhost:2345/apiroute3', | ||||||
|   ]); |   ], { | ||||||
|  |     method: 'GET' | ||||||
|  |   })).json(); | ||||||
|  |  | ||||||
|   const response2 = await new webrequest.WebRequest().getJson('http://localhost:2345/apiroute3'); |   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'); |   expect(response2).toHaveProperty('hithere'); //.to.equal('hi'); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('tear down server', async () => { | tap.test('should cache response', async () => { | ||||||
|   testServer.stop(); |   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(); | tap.start(); | ||||||
|   | |||||||
| @@ -3,6 +3,6 @@ | |||||||
|  */ |  */ | ||||||
| export const commitinfo = { | export const commitinfo = { | ||||||
|   name: '@pushrocks/webrequest', |   name: '@pushrocks/webrequest', | ||||||
|   version: '3.0.4', |   version: '3.0.5', | ||||||
|   description: 'securely request from browsers' |   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(); |     const smartenv = new plugins.smartenv.Smartenv(); | ||||||
|     if (!smartenv.isBrowser) { |     if (!smartenv.isBrowser) { | ||||||
|       this.polyfillStatusEvaluated = true; |       this.polyfillStatusEvaluated = true; | ||||||
|       const fetch = await smartenv.getSafeNodeModule('node-fetch'); |       const fetchMod = await smartenv.getSafeNodeModule('node-fetch'); | ||||||
|       globalThis.fetch = fetch.default; |       globalThis.Response = fetchMod.Response; | ||||||
|  |       globalThis.fetch = fetchMod.default; | ||||||
|     } |     } | ||||||
|     this.neededPolyfillsLoadedDeferred.resolve(); |     this.neededPolyfillsLoadedDeferred.resolve(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   public cacheStore = new plugins.webstore.WebStore({ | ||||||
|  |     dbName: 'webrequest', | ||||||
|  |     storeName: 'webrequest', | ||||||
|  |   }); | ||||||
|  |  | ||||||
|   constructor() { |   constructor() { | ||||||
|     WebRequest.loadNeededPolyfills(); |     WebRequest.loadNeededPolyfills(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public async getJson(urlArg: string | string[]) { |   public async getJson(urlArg: string, useCacheArg: boolean = false) { | ||||||
|     await WebRequest.neededPolyfillsLoadedDeferred.promise; |     await WebRequest.neededPolyfillsLoadedDeferred.promise; | ||||||
|     const response: Response = await this.request(urlArg, { |     const response: Response = await this.request(urlArg, { | ||||||
|       method: 'GET', |       method: 'GET', | ||||||
|  |       useCache: useCacheArg, | ||||||
|     }); |     }); | ||||||
|     const responseText = await response.text(); |     const responseText = await response.text(); | ||||||
|     const responseResult = plugins.smartjson.parse(responseText); |     const responseResult = plugins.smartjson.parse(responseText); | ||||||
| @@ -37,7 +44,7 @@ export class WebRequest { | |||||||
|   /** |   /** | ||||||
|    * postJson |    * postJson | ||||||
|    */ |    */ | ||||||
|   public async postJson(urlArg: string, requestBody?: any) { |   public async postJson(urlArg: string, requestBody?: any, useStoreAsFallback: boolean = false) { | ||||||
|     await WebRequest.neededPolyfillsLoadedDeferred.promise; |     await WebRequest.neededPolyfillsLoadedDeferred.promise; | ||||||
|     const response: Response = await this.request(urlArg, { |     const response: Response = await this.request(urlArg, { | ||||||
|       body: plugins.smartjson.stringify(requestBody), |       body: plugins.smartjson.stringify(requestBody), | ||||||
| @@ -51,7 +58,7 @@ export class WebRequest { | |||||||
|   /** |   /** | ||||||
|    * put js |    * put js | ||||||
|    */ |    */ | ||||||
|   public async putJson(urlArg: string, requestBody?: any) { |   public async putJson(urlArg: string, requestBody?: any, useStoreAsFallback: boolean = false) { | ||||||
|     await WebRequest.neededPolyfillsLoadedDeferred.promise; |     await WebRequest.neededPolyfillsLoadedDeferred.promise; | ||||||
|     const response: Response = await this.request(urlArg, { |     const response: Response = await this.request(urlArg, { | ||||||
|       body: plugins.smartjson.stringify(requestBody), |       body: plugins.smartjson.stringify(requestBody), | ||||||
| @@ -65,7 +72,7 @@ export class WebRequest { | |||||||
|   /** |   /** | ||||||
|    * put js |    * put js | ||||||
|    */ |    */ | ||||||
|   public async deleteJson(urlArg: string) { |   public async deleteJson(urlArg: string, useStoreAsFallback: boolean = false) { | ||||||
|     await WebRequest.neededPolyfillsLoadedDeferred.promise; |     await WebRequest.neededPolyfillsLoadedDeferred.promise; | ||||||
|     const response: Response = await this.request(urlArg, { |     const response: Response = await this.request(urlArg, { | ||||||
|       method: 'GET', |       method: 'GET', | ||||||
| @@ -75,10 +82,60 @@ export class WebRequest { | |||||||
|     return responseResult; |     return responseResult; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |  | ||||||
|    * a fault tolerant request |  | ||||||
|    */ |  | ||||||
|   public async 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[], |     urlArg: string | string[], | ||||||
|     optionsArg: { |     optionsArg: { | ||||||
|       method: 'GET' | 'POST' | 'PUT' | 'DELETE'; |       method: 'GET' | 'POST' | 'PUT' | 'DELETE'; | ||||||
|   | |||||||
| @@ -2,5 +2,6 @@ import * as smartdelay from '@pushrocks/smartdelay'; | |||||||
| import * as smartenv from '@pushrocks/smartenv'; | import * as smartenv from '@pushrocks/smartenv'; | ||||||
| import * as smartjson from '@pushrocks/smartjson'; | import * as smartjson from '@pushrocks/smartjson'; | ||||||
| import * as smartpromise from '@pushrocks/smartpromise'; | import * as smartpromise from '@pushrocks/smartpromise'; | ||||||
|  | import * as webstore from '@pushrocks/webstore'; | ||||||
|  |  | ||||||
| export { smartdelay, smartenv, smartjson, smartpromise }; | export { smartdelay, smartenv, smartjson, smartpromise, webstore }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user