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.3KB

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