(function() { var id = document.currentScript.src.split("?")[1]; var state = "connecting"; let wsurl = document.currentScript.src .replace(/https?:\/\//, "") .split("/")[0] .replace("http", "ws"); let wsproto = document.currentScript.src .split("://")[0] .replace("http", "ws"); var conn = new WebSocket(wsproto + "://" + wsurl); function toString(val) { if (typeof val == "string" || typeof val == "function") return val.toString(); try { return JSON.stringify(val); } catch (err) { return val.toString(); } } var logq = []; function sendLog() { var str = ""; for (var i in arguments) { if (i != 0) str += " "; str += toString(arguments[i]); } if (state == "ready") conn.send(JSON.stringify({ type: "log", log: str })); else logq.push(str); } conn.onmessage = function(msg) { var obj; try { obj = JSON.parse(msg.data); } catch (err) { alert("Woba Consola: Failed to parse JSON '" + msg.data + "'"); return; } switch (obj.type) { case "identify-response": if (obj.err != null) { alert("Woba Consola: Error: " + obj.err); state = "error"; } else { state = "waiting-for-master"; } break; case "master-connect": state = "ready"; for (var i in logq) conn.send(JSON.stringify({ type: "log", log: logq[i] })); logq = []; break; case "master-disconnect": state = "waiting-for-master"; break; case "run-js": var res; try { res = toString(eval(obj.js)); } catch (err) { conn.send(JSON.stringify({ type: "js-result", err: err.toString(), })); return; } conn.send(JSON.stringify({ type: "js-result", result: res, })); break; case "ping": conn.send(JSON.stringify({ type: "pong" })); break; default: alert("Woba Consola: Unknown message type: " + obj.type); } }; conn.onopen = function() { state = "identifying"; conn.send(JSON.stringify({ type: "identify-target", id: id })); }; conn.onclose = function(evt) { state = "closed"; alert("Woba Consola: Connction closed (" + evt.code + ")"); }; var origCons = console; var newCons = {}; function logProxy(name) { return function() { var arr = Array.prototype.slice.call(arguments); origCons[name].apply(origCons, arr); arr.unshift(name + ":"); sendLog.apply(null, arr); } } for (var i in origCons) { if (origCons.hasOwnProperty(i)) { newCons[i] = logProxy(i); } } window.addEventListener("error", function(evt) { sendLog("error: " + evt.filename + " : " + evt.lineno + ":", evt.message); }); window.console = newCons; })();