123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- (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;
-
- })();
|