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,8 +24,9 @@ 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 });
const generator = async function* () {
for await (const request of server) { for await (const request of server) {
const respond = async (message: string) => { const respond = async (message: string) => {
try { try {
@ -39,6 +40,10 @@ export async function* daemon_listen(sock_path: string) {
} }
} catch (_) { /* ok tier */ } } catch (_) { /* ok tier */ }
} }
};
const result = generator() as ReturnType<typeof generator> & { server: typeof server };
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) {