~ knotless Search/
↑↓ move↵ open⇧↵ all results

johnandersen777.bsky.social/atlibs-iroh

iroh transport for atlibs hosts: com.fedfork.exec.iroh.connect in Rust (atlibs-host) and JavaScript

0
0
main
28 lines · 1.5 KB Raw History
// Test stand-in for the guest agent's shell service: node http on the unix socket argv[2], "listening" on
// stdout once up. Every answer is JSON {method, url, headers, body, n (this connection's request count),
// conns (connections so far)}. Query flags: ms=<n> answer after n ms; chunked=1 a chunked body;
// close=1 connection: close; die=<marker> drop the connection unanswered unless marker exists (creates it).
import { existsSync, rmSync, writeFileSync } from "node:fs";
import { createServer } from "node:http";

let conns = 0;
const server = createServer((req, res) => {
	const q = new URL(req.url, "http://guest").searchParams;
	const parts = [];
	req.on("data", (d) => parts.push(d));
	req.on("end", () => {
		req.socket.n = (req.socket.n ?? 0) + 1;
		if (q.get("die") && !existsSync(q.get("die"))) return writeFileSync(q.get("die"), ""), req.socket.destroy();
		const text = JSON.stringify({ method: req.method, url: req.url, headers: req.headers, body: Buffer.concat(parts).toString(), n: req.socket.n, conns });
		setTimeout(() => {
			if (q.get("close")) res.setHeader("connection", "close");
			if (!q.get("chunked")) return res.setHeader("content-type", "application/json"), res.end(text);
			res.setHeader("content-type", "text/event-stream");
			res.write(text.slice(0, 5));
			setTimeout(() => res.end(text.slice(5)), 20);
		}, Number(q.get("ms") ?? 0));
	});
});
server.on("connection", () => conns++);
rmSync(process.argv[2], { force: true });
server.listen(process.argv[2], () => console.log("listening"));