LoginSignup
14
14

More than 5 years have passed since last update.

Koa用のミドルウェアをwebsocketにも対応させたい

Last updated at Posted at 2014-04-11

はじめに

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部分のミドルェアは次のようになります。

js
var koa = require('koa');
var app = koa();

// HTTPミドルウェアの追加
app.use(function*(next){
  yield next;
});

socket.ioの部分

普段の記述方法はこんな感じです。

js
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) {

  });

});

モジュールを使ってミドルウェア風に記述するとこんな感じ。

js
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のバージョンアップしだいで、うごかなくなっちゃうかも。。。

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14