diff --git a/instance/daemon.ts b/instance/daemon.ts index a9132ec..b12ac1e 100755 --- a/instance/daemon.ts +++ b/instance/daemon.ts @@ -6,9 +6,18 @@ import { socket_path } from "./src/lib/paths.ts"; await main(); async function main() { + const server = daemon_listen(socket_path()); const enabled = new Map(); + async function finish() { + server.server.close(); + await Deno.remove(socket_path()); + for (const runner of enabled.values()) await runner.stop(); + Deno.exit(0); + } + Deno.addSignalListener("SIGINT", finish); + console.log("listening to", socket_path()); - for await (const { cmd, respond } of daemon_listen(socket_path())) { + for await (const { cmd, respond } of server) { console.log("received", { cmd }); if (cmd.kind === "status") { @@ -33,8 +42,7 @@ async function main() { if (cmd.kind === "stop") { await respond(JSON.stringify("stopping, ++")); - for (const runner of enabled.values()) await runner.stop(); - Deno.exit(0); + await finish(); } await respond("unknown"); diff --git a/instance/src/lib.ts b/instance/src/lib.ts index 82bbdf6..1798f8e 100644 --- a/instance/src/lib.ts +++ b/instance/src/lib.ts @@ -24,21 +24,26 @@ export function new_cmd_stop() { export type Cmd = CmdStatus | CmdEnable | CmdDisable | CmdStop; -export async function* daemon_listen(sock_path: string) { +export function daemon_listen(sock_path: string) { const server = Deno.listen({ transport: "unix", path: sock_path }); - for await (const request of server) { - const respond = async (message: string) => { + const generator = async function* () { + for await (const request of server) { + const respond = async (message: string) => { + try { + await request.write(new TextEncoder().encode(message)); + } catch (_) { /* bof mais bon */ } + }; try { - await request.write(new TextEncoder().encode(message)); - } catch (_) { /* bof mais bon */ } - }; - try { - for await (const line of lines(request.readable)) { - const cmd = JSON.parse(line) as Cmd; - yield { cmd, respond }; - } - } catch (_) { /* ok tier */ } - } + for await (const line of lines(request.readable)) { + const cmd = JSON.parse(line) as Cmd; + yield { cmd, respond }; + } + } catch (_) { /* ok tier */ } + } + }; + const result = generator() as ReturnType & { server: typeof server }; + result.server = server; + return result; } export async function daemon_send(sock_path: string, command: Cmd) {