#はじめに
koaはp-baleine@githubさんの記事やLightSpeedCさんの記事で魅力を感じて触っています。
でもnode.jsといえばやっぱりsocket.ioを使った双方向通信ですね。
どうやって実現するか。
そこでググってみるとtakyamさんのブログにドンピシャな投稿がありました。
さっそくtakayamさんのコードを拝見すると、やっぱりsocket.ioの部分はごちゃごちゃしてしまうのは仕方がなさそうですね。
せっかくkoaのhttpのミドルウェア部分はすっきりしているのにと。。。
そこで今回はsocket.io部分もミドルウェアっぽく記述出来るモジュールを作成しました。
公開しているので試してみてください。
npmを使う場合はnpm install cocotte-mixin-ws
です。
Koaのミドルウェア
とっても単純に記述するとhttp部分のミドルェアは次のようになります。
var koa = require('koa');
var app = koa();
// HTTPミドルウェアの追加
app.use(function*(next){
yield next;
});
socket.ioの部分
普段の記述方法はこんな感じです。
var server = app.listen();
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
socket.on('EVENT1', function (param) {
});
socket.on('EVENT2', function (param) {
});
});
モジュールを使ってミドルウェア風に記述するとこんな感じ。
var server = app.listen();
app.ws('EVENT1', function*(next){
yield next;
});
app.ws('EVENT2', function*(next){
// ソケット
var socket = this.socket;
// ソケット変数
var values = this.values;
// イベント引数
var param = this.param;
yield next;
});
ただ記述方法が変わっただけでなく、上記の方法に比べて利点もあります
- 同じイベント名を設定するとyield nextでフロー処理が使える
- 面倒な非同期でのプッシュ通信も簡素に書く事が出来る
- httpの時と同じように処理をモジュール化する事も容易になる
詳しくはGit - READMEで。
さいごに
wsはwebsocketの略ですが、socket.ioは別にwebsocketだけの通信をするわけではないので、名称が適切でなかったかも。
まだ、Koaのapplication.jsのmixinといったバットノウハウぽい動きなっています。
数日前に出来たばかりのモジュールなので、これから充実させていきたいですね。
ただ、肝心のKoaの方が動きが速いので付いていくのが精一杯です。
Koaのバージョンアップしだいで、うごかなくなっちゃうかも。。。