86 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var Hashcash = require('./hashcash.js'); | ||
|  | var _sites = {}; | ||
|  | 
 | ||
|  | module.exports = async function (opts) { | ||
|  | 	if (!opts.headers) { | ||
|  | 		opts.headers = {}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (opts.json) { | ||
|  | 		if (true === opts.json) { | ||
|  | 			opts.body = JSON.stringify(opts.body); | ||
|  | 		} else { | ||
|  | 			opts.body = JSON.stringify(opts.json); | ||
|  | 		} | ||
|  | 		if (!opts.headers['Content-Type'] && !opts.headers['content-type']) { | ||
|  | 			opts.headers['Content-Type'] = 'application/json'; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if (!opts.mode) { | ||
|  | 		opts.mode = 'cors'; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var url = new URL(opts.url); | ||
|  | 	if (!_sites[url.hostname]) { | ||
|  | 		_sites[url.hostname] = { nonces: [] }; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var site = _sites[url.hostname]; | ||
|  | 	var hc = site.hashcashChallenge; | ||
|  | 	if (hc) { | ||
|  | 		delete site.hashcashChallenge; | ||
|  | 		site.hashcash = await Hashcash.solve(hc); | ||
|  | 	} | ||
|  | 	if (site.hashcash) { | ||
|  | 		opts.headers.Hashcash = site.hashcash; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var response = await window.fetch(opts.url, opts); | ||
|  | 	var headerNames = response.headers.keys(); | ||
|  | 	var hs = {}; | ||
|  | 	var h; | ||
|  | 	while (true) { | ||
|  | 		h = headerNames.next(); | ||
|  | 		if (h.done) { | ||
|  | 			break; | ||
|  | 		} | ||
|  | 		hs[h.value] = response.headers.get(h.value); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var body; | ||
|  | 	if (hs['content-type'].includes('application/json')) { | ||
|  | 		body = await response.json(); | ||
|  | 	} else { | ||
|  | 		body = await response.text(); | ||
|  | 		try { | ||
|  | 			body = JSON.parse(body); | ||
|  | 		} catch (e) { | ||
|  | 			// ignore
 | ||
|  | 		} | ||
|  | 	} | ||
|  | 	var resp = {}; | ||
|  | 
 | ||
|  | 	resp.body = body; | ||
|  | 	resp.headers = hs; | ||
|  | 	resp.toJSON = function () { | ||
|  | 		return { | ||
|  | 			headers: hs, | ||
|  | 			body: body | ||
|  | 		}; | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	if (resp.headers['hashcash-challenge']) { | ||
|  | 		_sites[url.hostname].hashcashChallenge = | ||
|  | 			resp.headers['hashcash-challenge']; | ||
|  | 	} | ||
|  | 	if (resp.headers.nonce) { | ||
|  | 		site.nonces.push(resp.headers.nonce); | ||
|  | 	} | ||
|  | 
 | ||
|  |   console.log(resp); | ||
|  | 	return resp; | ||
|  | }; |