uupaa/msgpack.js — pull request #5 by umegaya (2012-12-09 02:55:42+00:00)
Title: enable batched unpack

こんにちは。javascriptでmsgpackを処理するためにこちらのライブラリを便利に使わせていただいているものです。

私がmsgpack.jsを利用するメインのユースケースとして、
websocketを通してmsgpackでパックされたデータ(msgpackレコード）をストリーム通信するというものがあるのですが、効率良くパケットを送信したいという実装上の都合からwebsocketのonmessageで受信するデータが複数のmsgpackレコードがまとめられたバイト列であることがよくあります。

これをmsgpack.jsでunpackして処理する場合、msgpack.unpackにバイト列を渡すと、先頭のレコードを取り出すことができますが、バイト列のパース済み部分の長さ(_buf.length?)などの情報がmsgpack.js内部に格納されているため、msgpack.unpackの呼び出し側から次のmsgpackレコードを取り出せるように受信したバイト列のオフセットを調整することが難しいです。

そこで、Cのstrtok的なインターフェイスでmsgpack.unpackを呼び出すことで与えられたバイト列から次々にmsgpackレコードを取り出せるように改造してみました。

私のプロジェクトでの利用例は、
https://github.com/umegaya/yue/blob/master/test/websocket/yue.js
のDispatcher.prototype.recvという関数の実装にあります。

javascriptのデータ構造とmsgpackでエンコードされたバイト列との相互変換という、このライブラリの目的からすると、この改造は若干その範囲を外れてしまっているようにも思うので、迷ったのですが、常時接続されたコネクションの上のストリームを通じたmsgpackデータの通信の場合、私のユースケースのような実装になることが多いと思いますし、その場合msgpack.js自体を修正して上記の様な書き方ができる方が圧倒的に便利だと考えてpull requestさせていただきます。

もしかしたら、現状の実装でも私のユースケースをサポートしていて、それを私が気づいていないだけかもしれません。その場合は教えてください。また、JSの書き方による実行速度的なところも私はよくわかっていませんので、私の修正では速度や他の問題が出るかもしれませんので、その場合はよりよいやり方を教えていただけるとありがたいです。