mirror of https://github.com/Seich/Beau.git
				
				
				
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const unirest = require('unirest');
 | |
| const {httpVerbs, requestRegex, replacementRegex} = require('./shared');
 | |
| const RequestList = require('./requestList');
 | |
| const RequestCache = require('./requestCache');
 | |
| 
 | |
| class Request {
 | |
| 	constructor(req, list) {
 | |
| 		let { request, ALIAS, PAYLOAD, HOST, PARAMS, HEADERS } = req;
 | |
| 		let { verb, endpoint } = this.parseRequest(request);
 | |
| 
 | |
| 		this.$verb = verb;
 | |
| 		this.$endpoint = HOST + endpoint;
 | |
| 
 | |
| 		this.$headers = HEADERS;
 | |
| 		this.$payload = PAYLOAD;
 | |
| 		this.$params = PARAMS;
 | |
| 
 | |
| 		this.$alias = ALIAS;
 | |
| 		this.$dependencies = this.findDependencies(req);
 | |
| 
 | |
| 		this.list = list;
 | |
| 	}
 | |
| 
 | |
| 	parseRequest(request) {
 | |
| 		let parts = request.match(requestRegex);
 | |
| 
 | |
| 		return {
 | |
| 			verb: parts[1],
 | |
| 			endpoint: parts[2]
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	findDependencies(request, set = new Set()) {
 | |
| 		if (typeof request === 'object') {
 | |
| 			Object.keys(request).forEach(key => {
 | |
| 				if (key === 'ALIAS' || key.startsWith('$'))
 | |
| 					return;
 | |
| 
 | |
| 				set = this.findDependencies(request[key], set);
 | |
| 			});
 | |
| 		} else if (typeof request === 'string') {
 | |
| 			let matches = request.match(replacementRegex) || [];
 | |
| 			let deps = matches.map(m => m.split('.')[0]);
 | |
| 
 | |
| 			return new Set([...set, ...deps]);
 | |
| 		}
 | |
| 
 | |
| 		return set;
 | |
| 	}
 | |
| 
 | |
| 	exec() {
 | |
| 		let dependencies = Array.from(this.$dependencies);
 | |
| 
 | |
| 		return this.list.fetchDependencies(dependencies).then(cache => {
 | |
| 			let endpoint = cache.parse(this.$endpoint);
 | |
| 			let request = unirest(this.$verb, endpoint);
 | |
| 
 | |
| 			request.headers(cache.parse(this.$headers));
 | |
| 			request.query(cache.parse(this.$params));
 | |
| 			request.send(cache.parse(this.$payload));
 | |
| 
 | |
| 			return new Promise((resolve, reject) => {
 | |
| 				request.end(res => {
 | |
| 					let results = {
 | |
| 						request: {
 | |
| 							headers: res.request.headers,
 | |
| 							body: res.request.body,
 | |
| 							endpoint: endpoint
 | |
| 						},
 | |
| 						response: {
 | |
| 							status: res.status,
 | |
| 							headers: res.headers,
 | |
| 							body: res.body,
 | |
| 						}
 | |
| 					};
 | |
| 
 | |
| 					cache.add(this.$alias, results);
 | |
| 
 | |
| 					resolve(results);
 | |
| 				});
 | |
| 			});
 | |
| 		});
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports = Request;
 |