fix(core): update
This commit is contained in:
		
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | .nogit/ | ||||||
|  | node_modules/ | ||||||
|  | coverage/ | ||||||
|  | public/ | ||||||
|  | pages/ | ||||||
|  | .yarn/ | ||||||
							
								
								
									
										125
									
								
								.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								.gitlab-ci.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | |||||||
|  | # gitzone standard | ||||||
|  | image: hosttoday/ht-docker-node:npmci | ||||||
|  |  | ||||||
|  | cache: | ||||||
|  |   paths: | ||||||
|  |   - .npmci_cache/ | ||||||
|  |   key: "$CI_BUILD_STAGE" | ||||||
|  |  | ||||||
|  | stages: | ||||||
|  | - security | ||||||
|  | - test | ||||||
|  | - release | ||||||
|  | - metadata | ||||||
|  |  | ||||||
|  | # ==================== | ||||||
|  | # security stage | ||||||
|  | # ==================== | ||||||
|  | mirror: | ||||||
|  |   stage: security | ||||||
|  |   script: | ||||||
|  |   - npmci git mirror | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - notpriv | ||||||
|  |  | ||||||
|  | snyk: | ||||||
|  |   stage: security | ||||||
|  |   script: | ||||||
|  |     - npmci npm prepare | ||||||
|  |     - npmci command npm install -g snyk | ||||||
|  |     - npmci command npm install --ignore-scripts | ||||||
|  |     - npmci command snyk test | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - notpriv | ||||||
|  |  | ||||||
|  | # ==================== | ||||||
|  | # test stage | ||||||
|  | # ==================== | ||||||
|  |  | ||||||
|  | testLTS: | ||||||
|  |   stage: test | ||||||
|  |   script: | ||||||
|  |   - npmci npm prepare | ||||||
|  |   - npmci node install lts | ||||||
|  |   - npmci npm install | ||||||
|  |   - npmci npm test | ||||||
|  |   coverage: /\d+.?\d+?\%\s*coverage/ | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - notpriv | ||||||
|  |      | ||||||
|  | testSTABLE: | ||||||
|  |   stage: test | ||||||
|  |   script: | ||||||
|  |   - npmci npm prepare | ||||||
|  |   - npmci node install stable | ||||||
|  |   - npmci npm install | ||||||
|  |   - npmci npm test | ||||||
|  |   coverage: /\d+.?\d+?\%\s*coverage/ | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - notpriv | ||||||
|  |  | ||||||
|  | release: | ||||||
|  |   stage: release | ||||||
|  |   script: | ||||||
|  |   - npmci node install stable | ||||||
|  |   - npmci npm publish | ||||||
|  |   only: | ||||||
|  |   - tags | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - notpriv | ||||||
|  |  | ||||||
|  | # ==================== | ||||||
|  | # metadata stage | ||||||
|  | # ==================== | ||||||
|  | codequality: | ||||||
|  |   stage: metadata | ||||||
|  |   image: docker:stable | ||||||
|  |   allow_failure: true | ||||||
|  |   services: | ||||||
|  |     - docker:stable-dind | ||||||
|  |   script: | ||||||
|  |     - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/') | ||||||
|  |     - docker run | ||||||
|  |         --env SOURCE_CODE="$PWD" | ||||||
|  |         --volume "$PWD":/code | ||||||
|  |         --volume /var/run/docker.sock:/var/run/docker.sock | ||||||
|  |         "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code | ||||||
|  |   artifacts: | ||||||
|  |     paths: [codeclimate.json] | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - priv | ||||||
|  |  | ||||||
|  | trigger: | ||||||
|  |   stage: metadata | ||||||
|  |   script: | ||||||
|  |   - npmci trigger | ||||||
|  |   only: | ||||||
|  |   - tags | ||||||
|  |   tags: | ||||||
|  |   - docker | ||||||
|  |   - notpriv | ||||||
|  |  | ||||||
|  | pages: | ||||||
|  |   image: hosttoday/ht-docker-node:npmci | ||||||
|  |   stage: metadata | ||||||
|  |   script: | ||||||
|  |     - npmci command npm install -g typedoc typescript | ||||||
|  |     - npmci npm prepare | ||||||
|  |     - npmci npm install | ||||||
|  |     - npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/ | ||||||
|  |   tags: | ||||||
|  |     - docker | ||||||
|  |     - notpriv | ||||||
|  |   only: | ||||||
|  |     - tags | ||||||
|  |   artifacts: | ||||||
|  |     expire_in: 1 week | ||||||
|  |     paths: | ||||||
|  |     - public | ||||||
|  |   allow_failure: true | ||||||
							
								
								
									
										19
									
								
								license
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								license
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | Copyright (c) 2018 Lossless GmbH (hello@lossless.com) | ||||||
|  |  | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | SOFTWARE. | ||||||
							
								
								
									
										6
									
								
								npmextra.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								npmextra.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | { | ||||||
|  |   "npmci": { | ||||||
|  |     "npmGlobalTools": [], | ||||||
|  |     "npmAccessLevel": "public" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | { | ||||||
|  |   "name": "@pushrocks/webrequest", | ||||||
|  |   "version": "1.0.1", | ||||||
|  |   "lockfileVersion": 1, | ||||||
|  |   "requires": true, | ||||||
|  |   "dependencies": { | ||||||
|  |     "@pushrocks/smartdelay": { | ||||||
|  |       "version": "2.0.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@pushrocks/smartdelay/-/smartdelay-2.0.2.tgz", | ||||||
|  |       "integrity": "sha512-4xf6tMKwZcxBynKgXrM4SQKgeASfRvx43LUmR5DkStp26ZHAsarCXUdKJS6y8QIPygEOTOCP8we97JAcCzBuMg==", | ||||||
|  |       "requires": { | ||||||
|  |         "@pushrocks/smartpromise": "^2.0.5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "@pushrocks/smartpromise": { | ||||||
|  |       "version": "2.0.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@pushrocks/smartpromise/-/smartpromise-2.0.5.tgz", | ||||||
|  |       "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | { | ||||||
|  |   "name": "@pushrocks/webrequest", | ||||||
|  |   "version": "1.0.1", | ||||||
|  |   "private": false, | ||||||
|  |   "description": "securely request from browsers", | ||||||
|  |   "main": "dist/index.js", | ||||||
|  |   "typings": "dist/index.d.ts", | ||||||
|  |   "author": "Lossless GmbH", | ||||||
|  |   "license": "MIT", | ||||||
|  |   "scripts": { | ||||||
|  |     "test": "(tstest test/)", | ||||||
|  |     "build": "(tsbuild)", | ||||||
|  |     "format": "(gitzone format)" | ||||||
|  |   }, | ||||||
|  |   "devDependencies": { | ||||||
|  |     "@gitzone/tsbuild": "^2.0.22", | ||||||
|  |     "@gitzone/tstest": "^1.0.15", | ||||||
|  |     "@pushrocks/tapbundle": "^3.0.7", | ||||||
|  |     "@types/node": "^10.11.7", | ||||||
|  |     "tslint": "^5.11.0", | ||||||
|  |     "tslint-config-prettier": "^1.15.0" | ||||||
|  |   }, | ||||||
|  |   "dependencies": { | ||||||
|  |     "@pushrocks/smartdelay": "^2.0.2" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								test/test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								test/test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | import { expect, tap } from '@pushrocks/tapbundle'; | ||||||
|  | import * as webrequest from '../ts/index' | ||||||
|  |  | ||||||
|  | tap.test('first test', async () => { | ||||||
|  |   console.log(webrequest.standardExport) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | tap.start() | ||||||
							
								
								
									
										86
									
								
								ts/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								ts/index.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | import * as plugins from './webrequest.plugins'; | ||||||
|  |  | ||||||
|  | type TRequestHistoryEntry = 'timedout' | '429' | '5xx'; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * web request | ||||||
|  |  */ | ||||||
|  | export class WebRequest { | ||||||
|  |   /** | ||||||
|  |    * gets json | ||||||
|  |    */ | ||||||
|  |   async getJson(url: string | string[]) {} | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * postJson | ||||||
|  |    */ | ||||||
|  |   postJson() {} | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * put js | ||||||
|  |    */ | ||||||
|  |   putJson() {} | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    */ | ||||||
|  |   async request( | ||||||
|  |     urlArg: string | string[], | ||||||
|  |     optionsArg: { | ||||||
|  |       method: 'GET' | 'POST' | 'PUT' | 'DELETE'; | ||||||
|  |     } | ||||||
|  |   ) { | ||||||
|  |     let allUrls: string[]; | ||||||
|  |     let usedUrlIndex = 0; | ||||||
|  |  | ||||||
|  |     // determine what we got | ||||||
|  |     if (Array.isArray(urlArg)) { | ||||||
|  |       allUrls = urlArg; | ||||||
|  |     } else { | ||||||
|  |       allUrls = [urlArg]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const requestHistory: TRequestHistoryEntry[] = []; // keep track of the request history | ||||||
|  |  | ||||||
|  |     const doHistoryCheck = async ( // check history for a  | ||||||
|  |       historyEntryTypeArg: TRequestHistoryEntry | ||||||
|  |     ) => { | ||||||
|  |       requestHistory.push(historyEntryTypeArg); | ||||||
|  |       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: string) => { | ||||||
|  |       if (!urlToUse) { | ||||||
|  |         throw new Error('request failed permanently'); | ||||||
|  |       } | ||||||
|  |       const response = await fetch(urlToUse, { | ||||||
|  |         method: optionsArg.method, | ||||||
|  |         headers: { | ||||||
|  |           'Content-Type': 'application/json' | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |       if (response.status >= 200 && response.status < 200) { | ||||||
|  |         return JSON.parse(await response.text()); | ||||||
|  |       } else if (response.status === 429) { | ||||||
|  |         await doHistoryCheck('429'); | ||||||
|  |         return await doRequest(allUrls[usedUrlIndex]); | ||||||
|  |       } else if (response.status >= 500 && response.status < 600) { | ||||||
|  |         await doHistoryCheck('5xx'); | ||||||
|  |         return await doRequest(allUrls[usedUrlIndex]); | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     const finalResponse = await doRequest(urlArg[usedUrlIndex]); | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								ts/webrequest.plugins.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								ts/webrequest.plugins.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | import * as smartdelay from '@pushrocks/smartdelay'; | ||||||
|  |  | ||||||
|  | export { | ||||||
|  |   smartdelay | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								tslint.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								tslint.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | { | ||||||
|  |   "extends": ["tslint:latest", "tslint-config-prettier"], | ||||||
|  |   "rules": { | ||||||
|  |     "semicolon": [true, "always"], | ||||||
|  |     "no-console": false, | ||||||
|  |     "ordered-imports": false, | ||||||
|  |     "object-literal-sort-keys": false, | ||||||
|  |     "member-ordering": { | ||||||
|  |       "options":{ | ||||||
|  |         "order": [ | ||||||
|  |           "static-method" | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "defaultSeverity": "warning" | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user