12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- let http = require("http");
- let net = require("net");
-
- let tcpport = process.env["TCPPORT"] ? parseInt(process.env["TCPPORT"]) : 8099;
- let httpport = process.env["HTTPPORT"] ? parseInt(process.env["HTTPPORT"]) : 8098;
-
- let html = `
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>XRemoteView</title>
- </head>
- <body>
- <img id="image" src="/image" style="object-fit: contain; height: 100vh; width: 100%;">
- <script>
- let img = document.getElementById("image");
- let url = img.src;
-
- function refresh() {
- img.onload = wait;
- img.onerror = () => {
- console.error("Load error");
- setTimeout(refresh, 4000);
- };
-
- let rand = Math.floor(Math.random() * 1000000);
- img.src = url + "?" + rand;
- }
-
- function wait() {
- fetch("/wait").then(refresh).catch(err => {
- console.error("Wait error:", err);
- wait();
- });
- }
-
- wait();
- </script>
- </body>
- </html>
- `;
-
- let imgdata = Buffer.alloc(0);
- let waiters = [];
-
- net.createServer(conn => {
- console.log("Connection", conn.remoteAddress);
-
- received = Buffer.alloc(0);
- let hasLength = false;
- let expectedLen = 0;
- conn.on("data", data => {
- received = Buffer.concat([received, data]);
-
- while (true) {
- if (!hasLength && received.length >= 4) {
- expectedLen = received.readUInt32BE(0);
- received = received.slice(4);
- hasLength = true;
- }
-
- if (hasLength && received.length >= expectedLen) {
- imgdata = received.slice(0, expectedLen);
- received = received.slice(expectedLen);
- hasLength = false;
-
- for (let waiter of waiters) {
- waiter.end();
- }
-
- waiters = [];
- } else {
- break;
- }
- }
- });
- }).on("error", err => console.error(err)).listen(tcpport, "0.0.0.0");
- console.log(`TCP listening on 0.0.0.0:${tcpport}`);
-
- http.createServer((req, res) => {
- if (req.url.split("?")[0] == "/image") {
- res.writeHead(200, {
- "Content-Type": "image/jpeg",
- });
- res.end(imgdata);
- } else if (req.url.split("?")[0] == "/wait") {
- waiters.push(res);
- } else {
- res.writeHead(200);
- res.end(html);
- }
- }).listen(httpport, "0.0.0.0");
- console.log(`HTTP listening on 0.0.0.0:${httpport}`);
|