WebSocket 経由で Cowboy からブラウザに MessagePack でエンコードされたメッセージを送信しようとしていますが、受信したデータは常に空または無効です。JS からカウボーイ ハンドラーにバイナリ データを送信できますが、その逆はできません。msgpack-erlang
公式アプリケーションでCowboy 1.0.4を使用しています。msgpack-lite
ブラウザ内の JavaScriptにも使用します。
例:
websocket_handler
:
websocket_handle({text, <<"return encoded">>}, Req, State) ->
%% sends encoded message to client. Client is unable to decode and fails
{reply, {binary, msgpack:pack(<<"message">>)}, Req, State};
websocket_handle({binary, Encoded}, Req, State) ->
%% Works as expected
lager:info("Received encoded message: ~p", [msgpack:unpack(Encoded)]),
{ok, Req, State};
JS:
var host = "ws://" + window.location.host + "/websocket";
window.socket = new WebSocket(host);
socket.binaryType = 'arraybuffer';
socket.onmessage = function(event) {
var message = msgpack.decode(event.data);
console.log(message);
};
ブラウザは msgpack.min.js 内でエラーを返します:
Error: Invalid type: undefined
...ion n(t){var r=i(t),e=f[r];if(!e)throw new Error("Invalid type: "+(r?"0x"+r.toSt...
生の event.data をコンソールに出力しようとすると、次のようになります。
ArrayBuffer {}
なぜか空いているようです。私はerlang
との両方が初めてmsgpack
で、何が問題なのかわかりません。ご協力いただきありがとうございます!