2014年1月31日金曜日

msgpack-javascript

javascript,ruby間でwebsocket+msgpack使って通信 というのをやってみた。

Ruby とブラウザ (SVG) の組み合わせで、グラフを動的に表示するツールを作っている。そこで構造化データをブラウザ - Ruby 間でやり取りする必要がでてきたが、WebSocket と msgpack を扱った上記ページがとても参考になった。そのこと自体を忘れないようにこうしてメモするとともに、自分のミスにより2つほどひっかかった点も備忘録として書き留めておく。

Ruby サイド

普通に gem install em-websocket で EM::WebSocket を入れる。以前はバイナリが送れなかったようだが、今は gem で入れたものでもsend-binary できる。あと Ruby 用の msgpack も gem でインスト。

Javascript サイド

参考ページのサンプルをちゃんと見ずにやっていたので、以下の行を入れ忘れていた:

      ws.binaryType = 'arraybuffer';

Ruby サイドは構造化データを msgpack でシリアライズして send-binary でブラウザに送る。ブラウザ側はそのバイナリデータを受け取るが、binaryType を指定しないと受けたデータはBlob になってしまい、msgpack で unpack できない。

そして msgpack / msgpack-javascript だが、https://github.com/roncli/msgpack-javascript にあるものを使った。はじめ本家を利用してみたが、ハッシュキーに数値を使ったものを受けるとデコードに失敗した。これが msgpack の仕様の問題ではなく、msgpack-javascript の実装固有の問題だというところまでは確認ができたが、 Javascript をさくっと直せるほどのスキルもない。ハッシュキーに使っている数値を一旦文字列にして、受け手で再度数値に戻す、とかもやりたくない。悶々と fork を探していたら上記が見つかった。

その後( 2014/11/9 追記)

これまで em-websocket 0.5.0 を使っていたが、 0.5.1 にして急にバイナリの受信ができなくなった。 em-websocket の Changelogを見ると、
  • new features:
    • Support for receiving binary messages
となっていた。バイナリが送られてきた場合は onmessage ではなく、 onbinary で拾うことになったようだ。

0 件のコメント:

コメントを投稿