add graceful violent interupt
This commit is contained in:
parent
54c4e91af8
commit
a1963cf491
2 changed files with 29 additions and 16 deletions
|
@ -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<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 });
|
||||
|
||||
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");
|
||||
|
|
|
@ -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<typeof generator> & { server: typeof server };
|
||||
result.server = server;
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function daemon_send(sock_path: string, command: Cmd) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue