diff --git a/cc-tweaked/host.ts b/cc-tweaked/host.ts index 18e659e..4f146ca 100755 --- a/cc-tweaked/host.ts +++ b/cc-tweaked/host.ts @@ -1,30 +1,38 @@ #!/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.serve({ port }, (request) => handle(request)); - await server.finished; + const server = Deno.listen({ port }); + console.log("listening on port", port); + for await (const connection of server) handle(connection, program_path); } -async function handle(request: Request) { - const script = await open_requested_script(request); - if (script instanceof Response) return script; - console.log("Serving", script.path); - return new Response(script.content.readable); +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)); } -async function open_requested_script(request: Request) { - const requested_path = new URL(request.url).pathname.slice(1); - const invalid = () => new Response("Invalid script.", { status: 400 }); - if (requested_path.includes("/")) return invalid(); - if (requested_path.includes(".")) return invalid(); +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 { - const path = "./scripts/" + requested_path + ".lua"; - const content = await Deno.open(path, { read: true }); - return { path, content }; - } catch (_) { - return new Response("Unknown script.", { status: 400 }); + 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(); diff --git a/cc-tweaked/scripts/cat.lua b/cc-tweaked/scripts/cat.lua index b3e0820..d92e5af 100644 --- a/cc-tweaked/scripts/cat.lua +++ b/cc-tweaked/scripts/cat.lua @@ -1,17 +1,8 @@ -local path = ... +local arg1, arg2, arg3 = ... local function main() - if path == nil then - print("Usage: cat ") - return - end - local file = fs.open(path, "r") - if file == nil then - print("No such file:", path) - return - end - local content = file.readAll() - print(content) + print("arg1", arg1, "arg2", arg2, "arg3", arg3) + local file = fs.open() end main()