UNPKG

ahr2

Version:

An Abstract Http Request for Node.JS (http/https) and the Browser (XMLHttpRequeuest2). For `npm install ahr2` for Node and `pakmanager build` for Ender / Pakmanager. It should be required as `var request = require('ahr2')`

84 lines (67 loc) 1.84 kB
/*jshint strict:true node:true es5:true onevar:true laxcomma:true laxbreak:true eqeqeq:true immed:true latedef:true*/ (function () { "use strict"; var net = require('net'); // TODO AHR2 style options parsing function create(req, res) { var options = req.userOptions , socket ; function onRequestError(err) { req.isComplete = true; req.emit('error', err); socket.destroy(); } function onResponseError(err) { req.isComplete = true; res.emit('error', err); socket.destroy(); } function onRequestDrain() { socket.removeListener('error', onRequestError); socket.on('error', onResponseError); req.isComplete = true; req.emit('load', {}); } function onConnect() { req.emit('progress', {}); socket.end(options.encodedBody); socket.on('drain', onRequestDrain); } socket = new net.Socket({ allowHalfOpen: false // , fd: null // , type: null }); socket.on('error', onRequestError); socket.on('data', function (chunk) { res.emit('progress', { target: { result: chunk } }); }); socket.on('close', function () { res.status = 200; if (!res.isComplete) { res.isComplete = true; res.emit('load', {}); } }); socket.on('end', function () { res.status = 200; if (!res.isComplete) { res.isComplete = true; res.emit('load', {}); } }); // makes a request as a client socket.setTimeout(10 * 1000, function () { if (!req.isComplete) { req.emit('timeout', {}); } else { res.emit('timeout', {}); } socket.destroy(); }); socket.connect(options.port, options.hostname, onConnect); return res; } module.exports = create; }());