#!/bin/env -S deno run --allow-read --allow-net async function main() { const [program_path] = Deno.args; if (program_path === undefined) fail_with("Usage: host.ts "); const port = 1728; const server = Deno.listen({ port }); console.log("listening on port", port); for await (const connection of server) handle(connection, program_path); } async function handle(connection: Deno.TcpConn, program_path: string) { console.log("serving"); const file = await try_else( () => Deno.open(program_path, { read: true }), () => fail_with("Program at", program_path, "does not exists"), ); await try_(() => file.readable.pipeTo(connection.writable)); } function fail_with(...message: string[]) { console.error(...message); return Deno.exit(1); } async function try_else(operation: () => T | Promise, on_error: (error: unknown) => T | Promise) { try { return await operation(); } catch (error) { return await on_error(error); } } async function try_(operation: () => T | Promise) { return await try_else(operation, () => null); } if (import.meta.main) await main();