これは「Perl5 Advent Calendar」の23日目の記事... 記事です. まず最初に, 更新が23日の72時頃になってしまったことをお詫び致します*1. やっていけませんでした...
今日のお題
というわけで改めてやっていきたいと思います. 今日は, 以前「SocketIO::EmitterがCPANで公開されました!」という記事で, PerlのSocketIO::EmitterモジュールとNode.jsのsocket.io-redisパッケージのバージョンは気をつける必要があるというお話をしたのですが, それの続報(?)についてやっていこうと思います.
ふりかえり
これまでの問題をさっくりまとめると, 以下のようになります.
- Node.jsのsocket.io-redisが利用しているMessagePackのライブラリは, 古い仕様に基づいて実装されている
- そのため, PerlのSocketIO::Emitterを利用する場合, (古い仕様に基づいて実装されている)Data::MessagePackの0.49以前を利用しなければならなかった
...という感じです. Data::MessagePackをSocket.ioのEmitのみに利用するのであれば, Data::MessagePackの0.49以前を利用するようにcpanfile
などで指定しておけば良いのですが, 言うまでもなくSocket.io以外で新しい仕様に基づいて実装されているData::MessagePackの0.50以上を使いたい! という場合に併用できない, という問題点がありました.
最近の状況
socket.io-redisは, 12月8日にmasterブランチへマージされたPull Requestで, msgpack-liteを利用するようになりました.
このNode.js用のMessagePackのパッケージは, 新しい仕様に基づいてMessagePackを処理するようになっています(ちなみに, このパッケージは古い仕様のMessagePackにも対応しているみたいです). これで, めでたくData::MessagePackの0.50以上でSocketIO::Emitterを使えるようになる... のですが, 残念ながらこのPull Requestが反映されたバージョンは, まだリリースされていません.
もし, どうしてもsocket.io-redisとSocketIO::Emitterを使いながら, Data::MessagePackの0.50以上を利用したい場合, 当面はpackage.json
でsocket.io-redisのGitHubのリポジトリを使うように指定してあげると良さそうです:
しばらくしたら, 恐らくmsgpack-liteを利用するsocket.io-redisがリリースされると思われます.
そうなると, SocketIO::Emitter + Data::MessagePack 0.49以下の環境からうまくEmitできなくなりますので, 上記で紹介したようにsocket.io-redisの最新版を利用するようにするか, 或いはsocket.io-redisのバージョンを現状の最新版である2.0.1
に固定しておいた方が良さそうです.
まとめ
SocketIO::Emitterとsocket.io-redisを利用する際の注意点について, 最新の情報をお伝えしました. SocketIO::Emitterや, Node.jsのsocket.io系のパッケージを利用すれば, 非同期双方向通信なアプリケーションが簡単に作れますので, この機会に(?)皆さんも是非試してみては如何でしょうか!
スペシャルサンクス
*1:引っ越しとかしていました...