Masteries

技術的なことや仕事に関することを書いていきます.

SocketIO::Emitterとsocket.io-redisに関する最近の状況

これは「Perl5 Advent Calendar」の23日目の記事... 記事です. まず最初に, 更新が23日の72時頃になってしまったことをお詫び致します*1. やっていけませんでした...

今日のお題

というわけで改めてやっていきたいと思います. 今日は, 以前「SocketIO::EmitterがCPANで公開されました!」という記事で, PerlのSocketIO::EmitterモジュールとNode.jsのsocket.io-redisパッケージのバージョンは気をつける必要があるというお話をしたのですが, それの続報(?)についてやっていこうと思います.

papix.hatenablog.com

ふりかえり

これまでの問題をさっくりまとめると, 以下のようになります.

  • 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を利用するようになりました.

github.com

この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のリポジトリを使うように指定してあげると良さそうです:

qiita.com

しばらくしたら, 恐らく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:引っ越しとかしていました...