mirror of
				https://github.com/therootcompany/request.js.git
				synced 2024-11-16 17:28:58 +00:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "v1.9.0-1" and "master" have entirely different histories.
		
	
	
		
	
		
| @ -1,14 +0,0 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| my_typedefs="$( | ||||
|     grep typedef ./types.js | cut -d ' ' -f5 | ||||
| )" | ||||
| 
 | ||||
| rm -f ./local-types.js | ||||
| { | ||||
|     echo '/**' | ||||
|     for my_type in $my_typedefs; do | ||||
|         echo " * @typedef {import('./types.js').${my_type}} ${my_type}" | ||||
|     done | ||||
|     echo ' */' | ||||
| } >> ./local-types.js | ||||
							
								
								
									
										198
									
								
								browser.js
									
									
									
									
									
								
							
							
						
						
									
										198
									
								
								browser.js
									
									
									
									
									
								
							| @ -1,198 +0,0 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| // `fetch` will be available for node and browsers as a global
 | ||||
| //var fetch = window.fetch;
 | ||||
| 
 | ||||
| // https://developer.mozilla.org/en-US/docs/Web/API/fetch
 | ||||
| // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
 | ||||
| let _fetchDefaults = { | ||||
|     method: 'GET', // *GET, POST, PATCH, PUT, DELETE, etc
 | ||||
|     headers: {}, | ||||
|     body: undefined, // String, ArrayBuffer, FormData, etc
 | ||||
|     mode: 'cors', // no-cors, *cors, same-origin
 | ||||
|     credentials: 'same-origin', // omit, *same-origin, include
 | ||||
|     cache: 'default', // *default, no-store, reload, no-cache, force-cache, only-if-cached
 | ||||
|     redirect: 'follow', // *follow, error, manual,
 | ||||
|     referrer: undefined, | ||||
|     referrerPolicy: 'no-referrer-when-downgrade', // no-referrer, *no-referrer-when-downgrade, same-origin, origin, strict-origin, origin-when-cross-origin, strict-origin-when-cross-origin, unsafe-url
 | ||||
|     integrity: '', | ||||
|     keepalive: false, | ||||
|     signal: null //
 | ||||
| }; | ||||
| 
 | ||||
| let _optionKeys = Object.keys(_fetchDefaults).concat([ | ||||
|     //'encoding', // N/A
 | ||||
|     //'stream', // TODO via getReader
 | ||||
|     //'json' // handled manually
 | ||||
|     //'form', // TODO
 | ||||
|     //'auth' // handled manually
 | ||||
|     //'formData', // TODO
 | ||||
|     //'FormData', // TODO
 | ||||
|     //'userAgent' // not allowed, non-standard for request.js
 | ||||
| ]); | ||||
| 
 | ||||
| function setDefaults(_defs) { | ||||
|     return async function request(opts) { | ||||
|         let reqOpts = { headers: {} }; | ||||
| 
 | ||||
|         if ( | ||||
|             opts.body || | ||||
|             (opts.json && true !== opts.json) || | ||||
|             opts.form || | ||||
|             opts.formData | ||||
|         ) { | ||||
|             // TODO this is probably a deviation from request's API
 | ||||
|             // need to check and probably eliminate it
 | ||||
|             reqOpts.method = (reqOpts.method || 'POST').toUpperCase(); | ||||
|         } else { | ||||
|             reqOpts.method = (reqOpts.method || 'GET').toUpperCase(); | ||||
|         } | ||||
| 
 | ||||
|         _optionKeys.forEach(function (key) { | ||||
|             if (key in opts) { | ||||
|                 if ('undefined' !== typeof opts[key]) { | ||||
|                     reqOpts[key] = opts[key]; | ||||
|                 } | ||||
|             } else if (key in _defs) { | ||||
|                 reqOpts[key] = _defs[key]; | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         if (opts.auth) { | ||||
|             // if opts.uri specifies auth it will be parsed by url.parse and passed directly to the http module
 | ||||
|             if ('string' !== typeof opts.auth) { | ||||
|                 let u = opts.auth.user || opts.auth.username || ''; | ||||
|                 let p = opts.auth.pass || opts.auth.password || ''; | ||||
|                 reqOpts.headers.Authorization = encodeBasicAuth(`${u}:${p}`); | ||||
|             } else if ('string' === typeof opts.auth) { | ||||
|                 reqOpts.headers.Authorization = encodeBasicAuth(`${opts.auth}`); | ||||
|             } | ||||
| 
 | ||||
|             // [request-compat]
 | ||||
|             if (opts.auth.bearer) { | ||||
|                 // having a shortcut for base64 encoding makes sense,
 | ||||
|                 // but this? Eh, whatevs...
 | ||||
|                 reqOpts.header.Authorization = `Bearer ${opts.auth.bearer}`; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let body; | ||||
|         if (opts.json && true !== opts.json) { | ||||
|             if (!opts.headers['content-type']) { | ||||
|                 opts.headers['content-type'] = 'application/json'; | ||||
|             } | ||||
|             body = JSON.stringify(opts.json); | ||||
|             if (!opts.method) { | ||||
|                 opts.method = 'POST'; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // The node version will send HTTP Auth by default, but not Cookies.
 | ||||
|         // We don't have an equivalent option for `fetch`. Furthermore,
 | ||||
|         // `fetch` caches HTTP Auth Basic across browser refreshes,
 | ||||
|         // which is not analogous to the node behavior.
 | ||||
|         //
 | ||||
|         // "In the face of ambiguity, refuse the temptation to guess"
 | ||||
|         //
 | ||||
|         //if (!('credentials' in opts)) {
 | ||||
|         //    opts.credentials = 'include';
 | ||||
|         //}
 | ||||
| 
 | ||||
|         if (!('mode' in opts)) { | ||||
|             reqOpts.mode = 'cors'; | ||||
|         } | ||||
|         if (!('body' in opts)) { | ||||
|             if (body) { | ||||
|                 reqOpts.body = body; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let resp = await fetch(opts.url, reqOpts); | ||||
| 
 | ||||
|         let result = { | ||||
|             ok: resp.ok, | ||||
|             headers: headersToObj(resp.headers), | ||||
|             body: undefined, | ||||
|             // swapped to match request.js
 | ||||
|             statusCode: resp.status, | ||||
|             status: resp.statusText, | ||||
|             request: reqOpts, | ||||
|             response: resp | ||||
|         }; | ||||
|         result.toJSON = function () { | ||||
|             return { | ||||
|                 ok: result.ok, | ||||
|                 headers: result.headers, | ||||
|                 body: result.body, | ||||
|                 statusCode: result.statusCode, | ||||
|                 status: result.status | ||||
|             }; | ||||
|         }; | ||||
| 
 | ||||
|         // return early if there's no body
 | ||||
|         if (!result.headers['content-type']) { | ||||
|             return result; | ||||
|         } | ||||
| 
 | ||||
|         // TODO blob, formData ?
 | ||||
|         if (null === opts.encoding) { | ||||
|             return await resp.arrayBuffer(); | ||||
|         } | ||||
| 
 | ||||
|         if (!opts.json) { | ||||
|             result.body = await resp.text(); | ||||
|         } else { | ||||
|             result.body = await resp.json().catch(async function () { | ||||
|                 return await resp.text(); | ||||
|             }); | ||||
|         } | ||||
|         return result; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {Iterable.<*>} rheaders | ||||
|  * @returns {Object.<String, String>} | ||||
|  */ | ||||
| function headersToObj(rheaders) { | ||||
|     /* | ||||
|     Array.from(resp.headers.entries()).forEach(function (h) { | ||||
|         headers[h[0]] = h[1]; | ||||
|     }); | ||||
|     */ | ||||
|     let headerNames = Array.from(rheaders.keys()); | ||||
|     let resHeaders = {}; | ||||
|     headerNames.forEach(function (k) { | ||||
|         resHeaders[k] = rheaders.get(k); | ||||
|     }); | ||||
|     return resHeaders; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {String} utf8 | ||||
|  * @returns {String} | ||||
|  */ | ||||
| function encodeBasicAuth(utf8) { | ||||
|     let b64 = unicodeToBase64(utf8); | ||||
|     return `Basic ${b64}`; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {String} utf8 | ||||
|  * @returns {String} | ||||
|  */ | ||||
| function unicodeToBase64(utf8) { | ||||
|     let str = ''; | ||||
|     let uint8 = new TextEncoder().encode(utf8); | ||||
|     uint8.forEach(function (b) { | ||||
|         str += String.fromCharCode(b); | ||||
|     }); | ||||
|     let b64 = btoa(str); | ||||
|     return b64; | ||||
| } | ||||
| 
 | ||||
| let defaultRequest = setDefaults({ mode: 'cors' }); | ||||
| exports.request = defaultRequest; | ||||
| exports.defaults = setDefaults; | ||||
| module.exports = defaultRequest; | ||||
| module.exports.defaults = setDefaults; | ||||
							
								
								
									
										73
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								index.js
									
									
									
									
									
								
							| @ -7,35 +7,6 @@ var os = require('os'); | ||||
| var pkg = require('./package.json'); | ||||
| var fs = require('fs'); // only for streams
 | ||||
| 
 | ||||
| var _defaults = { | ||||
|     sendImmediately: true, | ||||
|     method: '', | ||||
|     headers: {}, | ||||
|     useQuerystring: false, | ||||
|     followRedirect: true, | ||||
|     followAllRedirects: false, | ||||
|     followOriginalHttpMethod: false, | ||||
|     maxRedirects: 10, | ||||
|     removeRefererHeader: false, | ||||
|     // encoding: undefined,
 | ||||
|     // stream: false, // TODO allow a stream?
 | ||||
|     gzip: false | ||||
|     //, body: undefined
 | ||||
|     //, json: undefined
 | ||||
| }; | ||||
| 
 | ||||
| var _keys = Object.keys(_defaults).concat([ | ||||
|     'encoding', | ||||
|     'stream', | ||||
|     'body', | ||||
|     'json', | ||||
|     'form', | ||||
|     'auth', | ||||
|     'formData', | ||||
|     'FormData', | ||||
|     'userAgent' // non-standard for request.js
 | ||||
| ]); | ||||
| 
 | ||||
| function debug() { | ||||
|     if (module.exports.debug) { | ||||
|         console.log.apply(console, arguments); | ||||
| @ -149,9 +120,6 @@ function handleResponse(resp, opts, cb) { | ||||
|         resp.body = ''; | ||||
|     } | ||||
|     resp._bodyLength = 0; | ||||
|     resp.once('error', function (err) { | ||||
|         cb(err, resp, resp.body); | ||||
|     }); | ||||
|     resp.on('readable', function () { | ||||
|         var chunk; | ||||
|         while ((chunk = resp.read())) { | ||||
| @ -194,16 +162,10 @@ function handleResponse(resp, opts, cb) { | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {any} defs - TODO enumerate defaults | ||||
|  * @returns {Request} | ||||
|  */ | ||||
| function setDefaults(defs) { | ||||
|     defs = defs || {}; | ||||
| 
 | ||||
|     /** @type {Request} */ | ||||
|     function urequestHelper(opts, cb) { | ||||
|         //jshint maxcomplexity:42
 | ||||
|         debug('\n[urequest] processed options:'); | ||||
|         debug(opts); | ||||
| 
 | ||||
| @ -557,7 +519,7 @@ function setDefaults(defs) { | ||||
|             opts = { url: opts }; | ||||
|         } | ||||
| 
 | ||||
|         _keys.forEach(function (key) { | ||||
|         module.exports._keys.forEach(function (key) { | ||||
|             if (key in opts && 'undefined' !== typeof opts[key]) { | ||||
|                 reqOpts[key] = opts[key]; | ||||
|             } else if (key in defs) { | ||||
| @ -688,12 +650,35 @@ function getUserAgent(additional) { | ||||
|     return ua; | ||||
| } | ||||
| 
 | ||||
| exports.request = setDefaults(_defaults); | ||||
| exports._keys = _keys; | ||||
| 
 | ||||
| module.exports = exports.request; | ||||
| module.exports._keys = _keys; | ||||
| var _defaults = { | ||||
|     sendImmediately: true, | ||||
|     method: '', | ||||
|     headers: {}, | ||||
|     useQuerystring: false, | ||||
|     followRedirect: true, | ||||
|     followAllRedirects: false, | ||||
|     followOriginalHttpMethod: false, | ||||
|     maxRedirects: 10, | ||||
|     removeRefererHeader: false, | ||||
|     // encoding: undefined,
 | ||||
|     // stream: false, // TODO allow a stream?
 | ||||
|     gzip: false | ||||
|     //, body: undefined
 | ||||
|     //, json: undefined
 | ||||
| }; | ||||
| module.exports = setDefaults(_defaults); | ||||
| 
 | ||||
| module.exports._keys = Object.keys(_defaults).concat([ | ||||
|     'encoding', | ||||
|     'stream', | ||||
|     'body', | ||||
|     'json', | ||||
|     'form', | ||||
|     'auth', | ||||
|     'formData', | ||||
|     'FormData', | ||||
|     'userAgent' // non-standard for request.js
 | ||||
| ]); | ||||
| module.exports.debug = | ||||
|     -1 !== (process.env.NODE_DEBUG || '').split(/\s+/g).indexOf('urequest'); | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +0,0 @@ | ||||
| /** | ||||
|  * @typedef {import('./types.js').Response} Response | ||||
|  * @typedef {import('./types.js').Headers} Headers | ||||
|  */ | ||||
							
								
								
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -1,5 +1,5 @@ | ||||
| { | ||||
|     "name": "@root/request", | ||||
|     "version": "1.9.0-1", | ||||
|     "version": "1.8.2", | ||||
|     "lockfileVersion": 1 | ||||
| } | ||||
|  | ||||
							
								
								
									
										13
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								package.json
									
									
									
									
									
								
							| @ -1,23 +1,16 @@ | ||||
| { | ||||
|     "name": "@root/request", | ||||
|     "version": "1.9.0-1", | ||||
|     "version": "1.8.2", | ||||
|     "description": "A lightweight, zero-dependency drop-in replacement for request", | ||||
|     "main": "index.js", | ||||
|     "browser": { | ||||
|         "index.js": "browser.js" | ||||
|     }, | ||||
|     "files": [ | ||||
|         "browser.js", | ||||
|         "lib", | ||||
|         "local-types.js", | ||||
|         "types.js" | ||||
|         "lib" | ||||
|     ], | ||||
|     "directories": { | ||||
|         "example": "examples" | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "test": "echo \"Error: no test specified\" && exit 1", | ||||
|         "prepublish": "./bin/localize-types" | ||||
|         "test": "echo \"Error: no test specified\" && exit 1" | ||||
|     }, | ||||
|     "repository": { | ||||
|         "type": "git", | ||||
|  | ||||
							
								
								
									
										30
									
								
								types.js
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								types.js
									
									
									
									
									
								
							| @ -1,30 +0,0 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| module.exports._typesOnly = true; | ||||
| 
 | ||||
| /** | ||||
|  * @callback Request | ||||
|  * @param {Object} opts | ||||
|  * @param {String} [opts.body] | ||||
|  * @param {Object.<String,any>} [opts.form] | ||||
|  * @param {Headers} opts.headers | ||||
|  * @param {Boolean | String} [opts.json] | ||||
|  * @param {String} [opts.method] | ||||
|  * @param {String} opts.url | ||||
|  * @returns {Response} | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object} Response | ||||
|  * @prop {any} body | ||||
|  * @prop {Headers} headers | ||||
|  * @prop {Boolean} ok | ||||
|  * @prop {any} [response] - TODO (browser only) | ||||
|  * @prop {any} request - TODO | ||||
|  * @prop {String} status | ||||
|  * @prop {Number} statusCode | ||||
|  */ | ||||
| 
 | ||||
| /** | ||||
|  * @typedef {Object.<String,String|Array<String>>} Headers | ||||
|  */ | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user