node.js向けのterminfoをwrapしたc++モジュールを作った

今日の目標地点まで実装完了。
下記のようなjavascriptで、カーソルをhjklで上下左右に動かすのに成功した。

var TERMUTIL=require('./build/default/termutil');

var term=new TERMUTIL.Term();


var keymap={
    113: // q
        function(){ process.exit(); },
    0x68: // h
        function(){ term.tcmd('cub1'); },
    0x6a: // j
        function(){ term.tcmd('cud1'); },
    0x6b: // k
        function(){ term.tcmd('cuu1'); },
    0x6c: // l
        function(){ term.tcmd('cuf1'); },
};

//var stdin = process.openStdin();
//stdin.on('data', function(chunk){ この方式だとkeyrepeat(non canonical)がかかったあたりでsegv。謎
term.on('keyinput', function(code){
    if(code in keymap){
        keymap[code]();
    }
    else{
        process.stdout.write('['+code+']');
    }
});

C++のソースはあとで整理してから載せる、多分。
要点は、

  • C++のclassとか関数登録(v8)
  • C++関数側での引数受け取り(v8)
  • libevイベント登録とコールバックからのnode.jsのEvent発動(node.js)
  • EventEmitterの継承(node.js)

といったところか。
前もってcool.io(元rev。libevのrubyバインディング)を触っていたので、libevがさくっと理解できて順調なのであった。