Remote web console.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

target.js 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. (function() {
  2. var id = document.currentScript.src.split("?")[1];
  3. var state = "connecting";
  4. let wsurl = document.currentScript.src
  5. .replace(/https?:\/\//, "")
  6. .split("/")[0]
  7. .replace("http", "ws");
  8. let wsproto = document.currentScript.src
  9. .split("://")[0]
  10. .replace("http", "ws");
  11. var conn = new WebSocket(wsproto + "://" + wsurl);
  12. function toString(val) {
  13. if (typeof val == "string" || typeof val == "function")
  14. return val.toString();
  15. try {
  16. return JSON.stringify(val);
  17. } catch (err) {
  18. return val.toString();
  19. }
  20. }
  21. var logq = [];
  22. function sendLog() {
  23. var str = "";
  24. for (var i in arguments) {
  25. if (i != 0)
  26. str += " ";
  27. str += toString(arguments[i]);
  28. }
  29. if (state == "ready")
  30. conn.send(JSON.stringify({ type: "log", log: str }));
  31. else
  32. logq.push(str);
  33. }
  34. conn.onmessage = function(msg) {
  35. var obj;
  36. try {
  37. obj = JSON.parse(msg.data);
  38. } catch (err) {
  39. alert("Woba Consola: Failed to parse JSON '" + msg.data + "'");
  40. return;
  41. }
  42. switch (obj.type) {
  43. case "identify-response":
  44. if (obj.err != null) {
  45. alert("Woba Consola: Error: " + obj.err);
  46. state = "error";
  47. } else {
  48. state = "waiting-for-master";
  49. }
  50. break;
  51. case "master-connect":
  52. state = "ready";
  53. for (var i in logq)
  54. conn.send(JSON.stringify({ type: "log", log: logq[i] }));
  55. logq = [];
  56. break;
  57. case "master-disconnect":
  58. state = "waiting-for-master";
  59. break;
  60. case "run-js":
  61. var res;
  62. try {
  63. res = toString(eval(obj.js));
  64. } catch (err) {
  65. conn.send(JSON.stringify({
  66. type: "js-result",
  67. err: err.toString(),
  68. }));
  69. return;
  70. }
  71. conn.send(JSON.stringify({
  72. type: "js-result",
  73. result: res,
  74. }));
  75. break;
  76. case "ping":
  77. conn.send(JSON.stringify({ type: "pong" }));
  78. break;
  79. default:
  80. alert("Woba Consola: Unknown message type: " + obj.type);
  81. }
  82. };
  83. conn.onopen = function() {
  84. state = "identifying";
  85. conn.send(JSON.stringify({ type: "identify-target", id: id }));
  86. };
  87. conn.onclose = function(evt) {
  88. state = "closed";
  89. alert("Woba Consola: Connction closed (" + evt.code + ")");
  90. };
  91. var origCons = console;
  92. var newCons = {};
  93. function logProxy(name) {
  94. return function() {
  95. var arr = Array.prototype.slice.call(arguments);
  96. origCons[name].apply(origCons, arr);
  97. arr.unshift(name + ":");
  98. sendLog.apply(null, arr);
  99. }
  100. }
  101. for (var i in origCons) {
  102. if (origCons.hasOwnProperty(i)) {
  103. newCons[i] = logProxy(i);
  104. }
  105. }
  106. window.addEventListener("error", function(evt) {
  107. sendLog("error: " + evt.filename + " : " + evt.lineno + ":", evt.message);
  108. });
  109. window.console = newCons;
  110. })();