Provide a way to tell when event handlers are finished
This lets us actually wait for disposal before a graceful exit.
This commit is contained in:
parent
396af23842
commit
8252c372af
|
@ -1,4 +1,10 @@
|
|||
import { Callback } from "./types"
|
||||
import { logger } from "@coder/logger"
|
||||
|
||||
/**
|
||||
* Event emitter callback. Called with the emitted value and a promise that
|
||||
* resolves when all emitters have finished.
|
||||
*/
|
||||
export type Callback<T, R = void | Promise<void>> = (t: T, p: Promise<void>) => R
|
||||
|
||||
export interface Disposable {
|
||||
dispose(): void
|
||||
|
@ -32,8 +38,21 @@ export class Emitter<T> {
|
|||
/**
|
||||
* Emit an event with a value.
|
||||
*/
|
||||
public emit(value: T): void {
|
||||
this.listeners.forEach((cb) => cb(value))
|
||||
public async emit(value: T): Promise<void> {
|
||||
let resolve: () => void
|
||||
const promise = new Promise<void>((r) => (resolve = r))
|
||||
|
||||
await Promise.all(
|
||||
this.listeners.map(async (cb) => {
|
||||
try {
|
||||
await cb(value, promise)
|
||||
} catch (error) {
|
||||
logger.error(error.message)
|
||||
}
|
||||
}),
|
||||
)
|
||||
|
||||
resolve!()
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
export type Callback<T, R = void> = (t: T) => R
|
|
@ -39,13 +39,14 @@ export class IpcMain {
|
|||
process.on("SIGTERM", () => this._onDispose.emit("SIGTERM"))
|
||||
process.on("exit", () => this._onDispose.emit(undefined))
|
||||
|
||||
this.onDispose((signal) => {
|
||||
this.onDispose((signal, wait) => {
|
||||
// Remove listeners to avoid possibly triggering disposal again.
|
||||
process.removeAllListeners()
|
||||
|
||||
// Let any other handlers run first then exit.
|
||||
// Try waiting for other handlers run first then exit.
|
||||
logger.debug(`${parentPid ? "inner process" : "wrapper"} ${process.pid} disposing`, field("code", signal))
|
||||
setTimeout(() => this.exit(0), 0)
|
||||
wait.then(() => this.exit(0))
|
||||
setTimeout(() => this.exit(0), 5000)
|
||||
})
|
||||
|
||||
// Kill the inner process if the parent dies. This is for the case where the
|
||||
|
|
Loading…
Reference in New Issue