MessagePack on socket.ioでのバイナリ転送案

前提

  • socket.io 1.3.5

socket.ioのroomかnamespaceか悩んだ末、問題はバイナリの転送だけなので、MessagePackなどを使えば良いのではないかと考えました。プロトコルも素直になるので。

MessagePack:JavaScript向けのライブラリではいずれもバイナリを文字列としてデコードする(MessagePackの仕様上は文字列とバイナリデータを区別しない)ので、バイナリを扱おうとすると処理系によってデータを変更されてしまう可能性があることがわかりました。

BSON:配列を使うとデータサイズが大きくなる(配列のインデックスを添え時にしたmapとして扱っている)という欠点があります(あとJavaScriptに依存しすぎた型も多いですが使わなければ良い)。配列バンバン使うのでまずいです。

Base64C++からJavaScriptにバイナリデータを渡すときにBase64エンコーディングをかける方法もありますが、単純にサイズが増えます。 (´・ω・`)ウ~ンMessagePackのライブラリを改造してUint8Arrayを戻す形にすれば良いかな?と調べたら改造済みのものがあるようです。

github.com

追記

などと調べていたら、socket.ioの1.0以降ではバイナリ転送(Blog, Uint8Array)を含むオブジェクトの転送が可能だそうです。

参考

Socket.IO — Introducing Socket.IO 1.0