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();
|
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");
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue