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.

server.js 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. let http = require("http");
  2. let net = require("net");
  3. let tcpport = process.env["TCPPORT"] ? parseInt(process.env["TCPPORT"]) : 8099;
  4. let httpport = process.env["HTTPPORT"] ? parseInt(process.env["HTTPPORT"]) : 8098;
  5. let html = `
  6. <!DOCTYPE html>
  7. <html>
  8. <head>
  9. <meta charset="utf-8">
  10. <title>XRemoteView</title>
  11. </head>
  12. <body>
  13. <img id="image" src="/image" style="object-fit: contain; height: 100vh; width: 100%;">
  14. <script>
  15. let img = document.getElementById("image");
  16. let url = img.src;
  17. function refresh() {
  18. img.onload = wait;
  19. img.onerror = () => {
  20. console.error("Load error");
  21. setTimeout(refresh, 4000);
  22. };
  23. let rand = Math.floor(Math.random() * 1000000);
  24. img.src = url + "?" + rand;
  25. }
  26. function wait() {
  27. fetch("/wait").then(refresh).catch(err => {
  28. console.error("Wait error:", err);
  29. wait();
  30. });
  31. }
  32. wait();
  33. </script>
  34. </body>
  35. </html>
  36. `;
  37. let imgdata = Buffer.alloc(0);
  38. let waiters = [];
  39. net.createServer(conn => {
  40. console.log("Connection", conn.remoteAddress);
  41. received = Buffer.alloc(0);
  42. let hasLength = false;
  43. let expectedLen = 0;
  44. conn.on("data", data => {
  45. received = Buffer.concat([received, data]);
  46. while (true) {
  47. if (!hasLength && received.length >= 4) {
  48. expectedLen = received.readUInt32BE(0);
  49. received = received.slice(4);
  50. hasLength = true;
  51. }
  52. if (hasLength && received.length >= expectedLen) {
  53. imgdata = received.slice(0, expectedLen);
  54. received = received.slice(expectedLen);
  55. hasLength = false;
  56. for (let waiter of waiters) {
  57. waiter.end();
  58. }
  59. waiters = [];
  60. } else {
  61. break;
  62. }
  63. }
  64. });
  65. }).on("error", err => console.error(err)).listen(tcpport, "0.0.0.0");
  66. console.log(`TCP listening on 0.0.0.0:${tcpport}`);
  67. http.createServer((req, res) => {
  68. if (req.url.split("?")[0] == "/image") {
  69. res.writeHead(200, {
  70. "Content-Type": "image/jpeg",
  71. });
  72. res.end(imgdata);
  73. } else if (req.url.split("?")[0] == "/wait") {
  74. waiters.push(res);
  75. } else {
  76. res.writeHead(200);
  77. res.end(html);
  78. }
  79. }).listen(httpport, "0.0.0.0");
  80. console.log(`HTTP listening on 0.0.0.0:${httpport}`);