Fix bridge SIGTERM handling

This commit is contained in:
hensm
2022-09-20 15:48:37 +01:00
parent cc7641da03
commit 72d82987f3
2 changed files with 29 additions and 12 deletions

View File

@@ -179,16 +179,19 @@ export async function startMediaServer(filePath: string, port: number) {
export function stopMediaServer() { export function stopMediaServer() {
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
if (mediaServer?.listening) { if (!mediaServer?.listening) {
mediaServer.close(err => { resolve();
if (err) { return;
reject();
} else {
resolve();
}
});
mediaServer = undefined;
} }
mediaServer.close(err => {
if (err) {
reject();
} else {
resolve();
}
});
mediaServer = undefined;
}); });
} }

View File

@@ -1,12 +1,22 @@
import http from "http"; import http from "http";
import https from "https"; import https from "https";
import { spawn } from "child_process"; import { ChildProcess, spawn } from "child_process";
import { Readable } from "stream"; import { Readable } from "stream";
import WebSocket from "ws"; import WebSocket from "ws";
import { DecodeTransform, EncodeTransform } from "./transforms.js"; import { DecodeTransform, EncodeTransform } from "./transforms.js";
const bridgeInstances = new Set<ChildProcess>();
// Ensure child processes are killed on exit
process.on("SIGTERM", async () => {
for (const bridge of bridgeInstances) {
bridge.kill();
}
process.exit(1);
});
export interface DaemonOpts { export interface DaemonOpts {
host: string; host: string;
port: number; port: number;
@@ -46,6 +56,7 @@ export function init(opts: DaemonOpts) {
* version of self in bridge mode. * version of self in bridge mode.
*/ */
const bridge = spawn(process.execPath, [process.argv[1]]); const bridge = spawn(process.execPath, [process.argv[1]]);
bridgeInstances.add(bridge);
// socket -> bridge.stdin // socket -> bridge.stdin
messageStream.pipe(new EncodeTransform()).pipe(bridge.stdin); messageStream.pipe(new EncodeTransform()).pipe(bridge.stdin);
@@ -61,7 +72,10 @@ export function init(opts: DaemonOpts) {
// Handle termination // Handle termination
socket.on("close", () => bridge.kill()); socket.on("close", () => bridge.kill());
bridge.on("exit", () => socket.close()); bridge.on("exit", () => {
socket.close();
bridgeInstances.delete(bridge);
});
}); });
/** /**