var LibraryWebSockets = {
$webSocketInstances: [],

SocketCreate: function(url, protocols)
{
    var str = UTF8ToString(url);
    var prot = UTF8ToString(protocols);
    var socket = {
        socket: new WebSocket(str, [prot]),
        buffer: new Uint8Array(0),
        error: null,
        messages: []
    }
    socket.socket.binaryType = 'arraybuffer';
    socket.socket.onmessage = function (e) {
//		if (e.data instanceof Blob)
//		{
//			var reader = new FileReader();
//			reader.addEventListener("loadend", function() {
//				var array = new Uint8Array(reader.result);
//				socket.messages.push(array);
//			});
//			reader.readAsArrayBuffer(e.data);
//		}
        if (e.data instanceof ArrayBuffer)
        {
            var array = new Uint8Array(e.data);
            socket.messages.push(array);
        }
    };
    socket.socket.onclose = function (e) {
        if (e.code != 1000)
        {
            if (e.reason != null && e.reason.length > 0)
                socket.error = e.reason;
            else
            {
                switch (e.code)
                {
                    case 1001:
                        socket.error = "Endpoint going away.";
                        break;
                    case 1002:
                        socket.error = "Protocol error.";
                        break;
                    case 1003:
                        socket.error = "Unsupported message.";
                        break;
                    case 1005:
                        socket.error = "No status.";
                        break;
                    case 1006:
                        socket.error = "Abnormal disconnection.";
                        break;
                    case 1009:
                        socket.error = "Data frame too large.";
                        break;
                    default:
                        socket.error = "Error "+e.code;
                }
            }
        }
    }
    var instance = webSocketInstances.push(socket) - 1;
    return instance;
},

SocketState: function (socketInstance)
{
    var socket = webSocketInstances[socketInstance];
    return socket.socket.readyState;
},

SocketError: function (socketInstance, ptr, bufsize)
{
 	var socket = webSocketInstances[socketInstance];
 	if (socket.error == null)
 		return 0;
    var str = socket.error.slice(0, Math.max(0, bufsize - 1));
    writeStringToMemory(str, ptr, false);
    return 1;
},

SocketSend: function (socketInstance, ptr, length)
{
    var socket = webSocketInstances[socketInstance];
    socket.socket.send (HEAPU8.buffer.slice(ptr, ptr+length));
},

SocketRecvLength: function(socketInstance)
{
    var socket = webSocketInstances[socketInstance];
    if (socket.messages.length == 0)
        return 0;
    return socket.messages[0].length;
},

SocketRecv: function (socketInstance, ptr, length)
{
    var socket = webSocketInstances[socketInstance];
    if (socket.messages.length == 0)
        return 0;
    if (socket.messages[0].length > length)
        return 0;
    HEAPU8.set(socket.messages[0], ptr);
    socket.messages = socket.messages.slice(1);
},

SocketClose: function (socketInstance)
{
    var socket = webSocketInstances[socketInstance];
    socket.socket.close();
}
};

autoAddDeps(LibraryWebSockets, '$webSocketInstances');
mergeInto(LibraryManager.library, LibraryWebSockets);