2010-11-21

[Node.js] /dev/urandom を延々と出力する HTTP サーバー

Node.js の本体の API にある、http.createServer を使って、ファイルの内容 (Readable Stream) を Class: http.ServerResponse (Writable Stream) に対して随時書き込んで、/dev/urandom から湧き出てくるランダムバイナリをストリーミング出力するとても有意義なサーバーを作ってみました。

以下のコードを node hogehoge.js という感じで実行して、適当に http://localhost:10001/ みたいなアドレスに対して HTTP でアクセスすると、バイナリデータを延々と返してくれます。

ポイント
  • /dev/urandom を、ファイルの内容を Readable Stream で取れるように、fs.createReadStream で開く。
  • HTTP レスポンスオブジェクト: resに対して、res.write で書き込みしていって、送信バッファがいっぱいになった場合、書き込めるようになると発生するイベント: drain まで書き込まずに待つ。

var fs = require('fs'),
    http = require('http'),
    util = require('util'),
    PORT = 10001;

http.createServer(function (req, res) {
    res.writeHead(200, {
        'Content-Type': 'application/octed-stream',
    });

    var stream = fs.createReadStream('/dev/urandom');

    stream.on('data', function (data) {
        console.log('on data: ' + data.length);
        var flushed = res.write(data);

        if (!flushed) {
            console.log("send buffer looks full");
            stream.pause();
        }
    });

    res.on('drain', function () {
        console.log("on drain");
        stream.resume();
    });
}).listen(PORT);

続編に続く
hidekiy blog: [node.js] 続 /dev/urandom を延々と出力する HTTP サーバー

関連記事
urandom streaming on twiggy - tokuhirom's blog.