BigPipe Done in Node.js
Sunday, July 25, 2010
Stephan Schmidt says
I’ve implemented a proof of concept of BigPipe in Java (should run as-is in every servlet container):
See his blog post for the Java servlet class.
Here is the same (or more?) written in Node.js.
var http = require('http');
var sys = require('sys');
var url = require("url");
http.createServer(function(request, response) {
// Write the document
response.writeHead(200, {"Content-Type" : "text/html"});
response.write("<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"" +
" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">");
response.write("<script type="text/javascript">function arrived(id,text) { var b=document.getElementById(id); b.innerHTML = text; }</script>");
response.write("</head><body><div>Progressive Loading");
for(var i = 0; i < 6; i++) {
response.write("<div id='" + i + "'>&;lt;/div>");
}
response.write("</div>");
// Now the snippets
var down = 6;
for (i = 0; i < 6; i++) {
var proxy = http.createClient(2000, "localhost");
var proxyRequest = proxy.request("GET", "/?id=" + i,
{"host" : "localhost"});
proxyRequest.addListener('response', function (proxyResponse) {
--down;
proxyResponse.addListener('data', function(chunk) {
response.write(chunk, 'binary');
});
proxyResponse.addListener('end', function() {
if(down == 0) {
response.end();
}
});
});
proxyRequest.close();
}
response.write("</body></html>");
}).listen(8080);
http.createServer(function(request, response) {
// Some delay upto upto 2 seconds
var delay = Math.round(Math.random() \* 2000);
setTimeout(function() {
var params = url.parse(request.url, true);
var id = params.query.id;
response.writeHead(200, {"Content-Type" : "text/html"});
var content = "<span>Content of Module " + id + "</span>";
response.write("<script>" +
"arrived('" + id + "', '" + content + "');" +
"</script>");
response.close();
}, delay);
}).listen(2000);
I’ve no comments on the technique itself. The basic idea may have been implemented a number of times in different languages. The mileage varies based on the language/environment used.