ahr.node
Version:
An Abstract Http Request for Node.JS (httpClient) and the Browser (XMLHttpRequeuest2)
72 lines (53 loc) • 1.45 kB
JavaScript
(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.emit('error', err);
}
function onResponseError(err) {
res.emit('error', err);
}
function onRequestDrain() {
socket.removeListener('error', onRequestError);
socket.on('error', onResponseError);
req.emit('load', {});
req.isComplete = true;
}
function onConnect() {
req.emit('progress', {});
socket.end(options.encodedBody);
socket.on('drain', onRequestDrain);
// same default timeout as http
socket.setTimeout(options.timeout || 120 * 1000, function () {
socket.destroy();
if (!req.isComplete) {
req.emit('timeout', {});
} else {
res.emit('timeout', {});
}
});
}
socket = new net.Socket({
allowHalfOpen: true
// , fd: null
// , type: null
});
socket.on('error', onRequestError);
socket.on('data', function (chunk) {
res.emit('progress', { target: { result: chunk } });
});
socket.on('end', function () {
res.status = 200;
res.emit('load', {});
});
// makes a request as a client
socket.connect(options.port, options.hostname, onConnect);
return res;
}
module.exports = create;
}());