var msg = 0; var ws; var utf8 = {}; //WebSocket = undefined; // test XHR fallback function addStatus(text){ var date = new Date(); if (document.getElementById('n2ostatus')) { document.getElementById('n2ostatus').innerHTML = document.getElementById('n2ostatus').innerHTML + "E> " + text + "
"; } } utf8.toByteArray = function(str) { var byteArray = []; if (str !== undefined && str !== null) for (var i = 0; i < str.length; i++) if (str.charCodeAt(i) <= 0x7F) byteArray.push(str.charCodeAt(i)); else { var h = encodeURIComponent(str.charAt(i)).substr(1).split('%'); for (var j = 0; j < h.length; j++) byteArray.push(parseInt(h[j], 16)); } return byteArray; }; function byteArray8toString (byteArray, separator) { if (typeof byteArray == 'undefined' || byteArray.byteLength == 0) { return "" }; separator = typeof separator !== 'undefined' ? separator : ','; var dataView = new DataView(byteArray); var s = dataView.getUint8(0).toString(); for (var i = 1; i < byteArray.byteLength; i++) s = s + separator + dataView.getUint8(i).toString(); return s; } function WebSocketsInit(){ if ("MozWebSocket" in window) { WebSocket = MozWebSocket; } if ("WebSocket" in window) { ws = new bullet("ws://"+ (null == transition.host ? window.location.hostname : transition.host) + ":"+ (null == transition.port ? window.location.port : transition.port) + "/ws" + window.location.pathname + window.location.search); initialized = false; ws.onmessage = function (evt) { try { // try to parse JSON envelop {eval:"",data:""} msg = JSON.parse(evt.data); if (typeof handle_web_socket == 'function' && msg.data) { // Data // addStatus("Received: " + bert.decodebuf(msg.data)); handle_web_socket(msg.data); } if (msg.eval) { // Eval // addStatus("Evaluate: " + msg.eval); try{eval(msg.eval);}catch(e){console.log(e); console.log(msg.eval);}; } } catch (ex) { // try to parse known binary formats var HEAD_SIZE = 36; // console.log("JSON parsing failed: " + ex); // console.log("MessageEvent: "); // console.log(evt.data); var header_reader = new FileReader(); header_reader.addEventListener("loadend", function() { if(header_reader.result.byteLength > 0) { var header_view = new DataView(header_reader.result); var head_char = header_view.getUint8(0); try { // BERT encoding if (head_char !== 131) { throw ("Not a valid BERT header."); } else { var bert_reader = new FileReader(); bert_reader.addEventListener("loadend", function() { var erlang = dec(bert_reader.result); if (typeof handle_web_socket == 'function') handle_web_socket(erlang); else console.log("Raw BERT Received: " + erlang); }); bert_reader.readAsArrayBuffer(evt.data); } } catch (x) { // Binaries if (head_char == 132 && header_reader.result.byteLength == HEAD_SIZE) { // Headered Binaries // [132, HEADER, META, DATA] var id = header_view.getUint32(1); var type = header_view.getUint8(5); var app = header_view.getUint8(6); var version = header_view.getUint8(7); var from = header_view.getUint32(8); var to = header_view.getUint32(12); var user1 = header_view.getFloat64(16); var user2 = header_view.getFloat64(24); var data_offset = HEAD_SIZE + header_view.getUint32(32); var meta_reader = new FileReader(); meta_reader.addEventListener("loadend", function() { if (typeof handle_web_socket_blob_with_header == 'function') handle_web_socket_blob_with_header(id, type, app, version, from, to, user1, user2, meta_reader.result, evt.data.slice(data_offset)); else { console.log("Raw Binary With Header Received: Header [" + byteArray8toString(header_reader.result) + "] Meta [" + byteArray8toString(meta_reader.result) + "] Data lehgth: " + (evt.data.size - data_offset)); console.log("Header fields { id: " + id + ", type: " + type + ", app: " + app + ", version: " + version + ", from: " + from + ", to: " + to + ", user1: " + user1 + ", user2: " + user2 + " }"); } }); meta_reader.readAsArrayBuffer(evt.data.slice(HEAD_SIZE, data_offset)); } else { // Unknown Binaries if (typeof handle_web_socket_blob == 'function') handle_web_socket_blob(evt.data); else { var reader = new FileReader(); reader.addEventListener("loadend", function() { if (reader.result.byteLength > 0) { var dataView = new DataView(reader.result); var s = dataView.getUint8(0).toString(); for (var i=1;i