add graceful violent interupt

This commit is contained in:
JOLIMAITRE Matthieu 2023-12-09 00:19:09 +01:00
parent 54c4e91af8
commit a1963cf491
2 changed files with 29 additions and 16 deletions

View file

@ -6,9 +6,18 @@ import { socket_path } from "./src/lib/paths.ts";
await main(); await main();
async function main() { async function main() {
const server = daemon_listen(socket_path());
const enabled = new Map<string, Runner>(); const enabled = new Map<string, Runner>();
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 }); console.log("received", { cmd });
if (cmd.kind === "status") { if (cmd.kind === "status") {
@ -33,8 +42,7 @@ async function main() {
if (cmd.kind === "stop") { if (cmd.kind === "stop") {
await respond(JSON.stringify("stopping, ++")); await respond(JSON.stringify("stopping, ++"));
for (const runner of enabled.values()) await runner.stop(); await finish();
Deno.exit(0);
} }
await respond("unknown"); await respond("unknown");

View file

@ -24,21 +24,26 @@ export function new_cmd_stop() {
export type Cmd = CmdStatus | CmdEnable | CmdDisable | CmdStop; 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 }); const server = Deno.listen({ transport: "unix", path: sock_path });
for await (const request of server) { const generator = async function* () {
const respond = async (message: string) => { for await (const request of server) {
const respond = async (message: string) => {
try {
await request.write(new TextEncoder().encode(message));
} catch (_) { /* bof mais bon */ }
};
try { try {
await request.write(new TextEncoder().encode(message)); for await (const line of lines(request.readable)) {
} catch (_) { /* bof mais bon */ } const cmd = JSON.parse(line) as Cmd;
}; yield { cmd, respond };
try { }
for await (const line of lines(request.readable)) { } catch (_) { /* ok tier */ }
const cmd = JSON.parse(line) as Cmd; }
yield { cmd, respond }; };
} const result = generator() as ReturnType<typeof generator> & { server: typeof server };
} catch (_) { /* ok tier */ } result.server = server;
} return result;
} }
export async function daemon_send(sock_path: string, command: Cmd) { export async function daemon_send(sock_path: string, command: Cmd) {