swdyh

node-kyoto-tycoon

2010-10-18 17:29:58

node-kyoto-tycoon
http://github.com/swdyh/node-kyoto-tycoon

KyotoTycoonのNode.js用ライブラリを作りました。まだだいぶ荒削りな状態で、KyotoTycoonのAPIを簡単にラップした感じのものです。APIも変わるかもしれないし、バグもたぶんあると思いますが試してみてください。

Node.jsが新しめでないとHTTPのKeep-Aliveが使えないので、古いNode.jsを使っている場合は、新しいNode.jsを入れて使ってください。(Keep-Aliveが使えなくても動きますが、カーソル関連は使えないと思います)

インストール

npmを使う

 % npm install kyoto-tycoon

ソースから

 % git clone http://github.com/swdyh/node-kyoto-tycoon.git
 % cp -r node-kyoto-tycoon ~/.node_libraries/kyoto-tycoon

使い方

    var KyotoTycoon = require('kyoto-tycoon').KyotoTycoon

    var kt = new KyotoTycoon()
    kt.set('key1', 'val1', function() {
        kt.get('key1', function(err ,data) {
            console.log(data)
            kt.end()
        })
    })

Node.jsらしく非同期なAPIしかなくて、なにをするにもコールバック関数を渡します。
ただこれだと、いくつかの処理を順にやろうとすると、コールバック関数がネストしていってつらいので、JSDeferredを使えるようにしています。ソースの中に入れてあるのでインストールする必要はありません。

    var kt3 = new KyotoTycoon({ deferred : true })
    kt3.set('key3', 'val3').next(function() {
        return kt3.get('key3')
    }).next(function(err, data) {
        console.log(data)
        return kt3.remove('key3')
    }).next(function(err, data) {
        return kt3.get('key3')
    }).next(function(err, data) {
        console.log(err)
        kt3.end()
    })

newのときにdeferredオプションを付けておくと、Deferredオブジェクトが返ってくるようになるので、nextで次の処理をつないでいけば順番に処理していけます。

実装の話

KyotoTycoonはhttpでアクセスするで、Node.jsについているhttpのライブラリをそのまま使っていています。データはTSVで返ってくるTSV-RPCという方式らしいので、TSV-RPCを処理するtsv-rpc.jsと、それを使ったkyoto-tycoon.jsのという構成にしています。
KyotoTycoonにははREST APIもあるんだけど、こっとは機能が少ないのと、REST用ライブラリだったら汎用のものがありそうで、KyotoTycoon用のライブラリとして書く意味がないという気がしたので使ってません。

JSDeferredを使えるようにしたところは、Deferred.connectというコールバックを取る関数を渡すと、Deferredを使った関数返をしてくれるという魔法みたいな関数があるので、それを呼びまくって関数を入れ替えています。

テストはVowsというので書いていて、正直あまり分かってないんだけど、非同期な関数のテストを想定してあったり、出力が綺麗だったりするので使ってみました。