n2o.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. var msg = 0;
  2. var ws;
  3. var utf8 = {};
  4. //WebSocket = undefined; // test XHR fallback
  5. function addStatus(text){
  6. var date = new Date();
  7. if (document.getElementById('n2ostatus')) {
  8. document.getElementById('n2ostatus').innerHTML =
  9. document.getElementById('n2ostatus').innerHTML + "E> " + text + "<br/>";
  10. }
  11. }
  12. utf8.toByteArray = function(str) {
  13. var byteArray = [];
  14. if (str !== undefined && str !== null)
  15. for (var i = 0; i < str.length; i++)
  16. if (str.charCodeAt(i) <= 0x7F)
  17. byteArray.push(str.charCodeAt(i));
  18. else {
  19. var h = encodeURIComponent(str.charAt(i)).substr(1).split('%');
  20. for (var j = 0; j < h.length; j++)
  21. byteArray.push(parseInt(h[j], 16));
  22. }
  23. return byteArray;
  24. };
  25. function byteArray8toString (byteArray, separator) {
  26. if (typeof byteArray == 'undefined' || byteArray.byteLength == 0) { return "" };
  27. separator = typeof separator !== 'undefined' ? separator : ',';
  28. var dataView = new DataView(byteArray);
  29. var s = dataView.getUint8(0).toString();
  30. for (var i = 1; i < byteArray.byteLength; i++)
  31. s = s + separator + dataView.getUint8(i).toString();
  32. return s;
  33. }
  34. function WebSocketsInit(){
  35. if ("MozWebSocket" in window) { WebSocket = MozWebSocket; }
  36. if ("WebSocket" in window) {
  37. ws = new bullet("ws://"+
  38. (null == transition.host ? window.location.hostname : transition.host)
  39. + ":"+ (null == transition.port ? window.location.port : transition.port)
  40. + "/ws" + window.location.pathname + window.location.search);
  41. initialized = false;
  42. ws.onmessage = function (evt) {
  43. try { // try to parse JSON envelop {eval:"",data:""}
  44. msg = JSON.parse(evt.data);
  45. if (typeof handle_web_socket == 'function' && msg.data) { // Data
  46. // addStatus("Received: " + bert.decodebuf(msg.data));
  47. handle_web_socket(msg.data);
  48. }
  49. if (msg.eval) { // Eval
  50. // addStatus("Evaluate: " + msg.eval);
  51. try{eval(msg.eval);}catch(e){console.log(e); console.log(msg.eval);};
  52. }
  53. } catch (ex) { // try to parse known binary formats
  54. var HEAD_SIZE = 36;
  55. // console.log("JSON parsing failed: " + ex);
  56. // console.log("MessageEvent: ");
  57. // console.log(evt.data);
  58. var header_reader = new FileReader();
  59. header_reader.addEventListener("loadend", function() {
  60. if(header_reader.result.byteLength > 0) {
  61. var header_view = new DataView(header_reader.result);
  62. var head_char = header_view.getUint8(0);
  63. try { // BERT encoding
  64. if (head_char !== 131) { throw ("Not a valid BERT header."); }
  65. else {
  66. var bert_reader = new FileReader();
  67. bert_reader.addEventListener("loadend", function() {
  68. var erlang = dec(bert_reader.result);
  69. if (typeof handle_web_socket == 'function')
  70. handle_web_socket(erlang);
  71. else console.log("Raw BERT Received: " + erlang);
  72. });
  73. bert_reader.readAsArrayBuffer(evt.data);
  74. }
  75. } catch (x) { // Binaries
  76. if (head_char == 132 && header_reader.result.byteLength == HEAD_SIZE) {
  77. // Headered Binaries
  78. // [132, HEADER, META, DATA]
  79. var id = header_view.getUint32(1);
  80. var type = header_view.getUint8(5);
  81. var app = header_view.getUint8(6);
  82. var version = header_view.getUint8(7);
  83. var from = header_view.getUint32(8);
  84. var to = header_view.getUint32(12);
  85. var user1 = header_view.getFloat64(16);
  86. var user2 = header_view.getFloat64(24);
  87. var data_offset = HEAD_SIZE + header_view.getUint32(32);
  88. var meta_reader = new FileReader();
  89. meta_reader.addEventListener("loadend", function() {
  90. if (typeof handle_web_socket_blob_with_header == 'function')
  91. handle_web_socket_blob_with_header(id, type, app, version, from, to, user1, user2,
  92. meta_reader.result, evt.data.slice(data_offset));
  93. else {
  94. console.log("Raw Binary With Header Received: Header [" + byteArray8toString(header_reader.result)
  95. + "] Meta [" + byteArray8toString(meta_reader.result)
  96. + "] Data lehgth: " + (evt.data.size - data_offset));
  97. console.log("Header fields { id: " + id + ", type: " + type + ", app: " + app + ", version: " + version
  98. + ", from: " + from + ", to: " + to + ", user1: " + user1 + ", user2: " + user2 + " }");
  99. }
  100. });
  101. meta_reader.readAsArrayBuffer(evt.data.slice(HEAD_SIZE, data_offset));
  102. }
  103. else { // Unknown Binaries
  104. if (typeof handle_web_socket_blob == 'function')
  105. handle_web_socket_blob(evt.data);
  106. else {
  107. var reader = new FileReader();
  108. reader.addEventListener("loadend", function() {
  109. if (reader.result.byteLength > 0) {
  110. var dataView = new DataView(reader.result);
  111. var s = dataView.getUint8(0).toString();
  112. for (var i=1;i<reader.result.byteLength;i++)
  113. s = s + "," + dataView.getUint8(i).toString();
  114. console.log("Unknown Raw Binary Received: [" + s + "]");
  115. }
  116. });
  117. reader.readAsArrayBuffer(evt.data);
  118. }
  119. }
  120. }
  121. }
  122. });
  123. header_reader.readAsArrayBuffer(evt.data.slice(0, HEAD_SIZE));
  124. }
  125. };
  126. ws.onopen = function() { if (!initialized) { ws.send(['N2O', transition.pid]); initialized = true; } };
  127. ws.onclose = function() { addStatus("websocket was closed"); };
  128. } else {
  129. addStatus("sorry, your browser does not support websockets.");
  130. }
  131. }
  132. WebSocketsInit();