because writing is clarifying

because writing is clarifying

Subbu Allamaraju’s Journal

BigPipe Done in Node.js

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.

If you enjoyed this article, consider subscribing for future articles.