Sto provando a inviare un messaggio con MessagePack da Cowboy a un browser su WebSocket e i dati ricevuti sono sempre vuoti o non validi. Sono in grado di inviare dati binari da JS al mio gestore cowboy, ma non viceversa. Sto usando Cowboy 1.0.4 con l'applicazione ufficiale msgpack-erlang
. Io uso anche msgpack-lite
per il mio javascript nel browser.Invio di dati binari su websocket con cowboy e MessagePack
Esempi:
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);
};
browser restituisce un errore interno 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...
Se provo a uscita ra w event.data per console, ecco cosa sto ottenendo:
ArrayBuffer {}
Sembra essere vuoto per qualche motivo. Sono nuovo sia per erlang
e msgpack
, e non so cosa sta andando male. Grazie per l'aiuto!
Grazie, ma non aiuta. Penso che il motivo principale sia il valore vuoto di ArrayBuffer. Qualcosa non va con la configurazione, ma non so cosa :( –
@ConstantineEmeraldMaster: Hai provato e verificato la comunicazione di WebSocket come previsto? Sospetto che non si ottiene nulla sul lato JS. Basta inviare prima la stringa spacchettata. –
La comunicazione funziona in entrambe le direzioni utilizzando la modalità testo, funziona anche in 1 direzione (da client a server) in modalità binaria.JS client non è in grado di ricevere messaggi binari dal server –