Files
zopu-code/repos/effect/packages/platform-node-shared/src/NodeRuntime.ts
T

60 lines
1.5 KiB
TypeScript

/**
* Node-compatible process runner for Effect programs.
*
* This module provides the shared `runMain` implementation used by
* Node-compatible platform packages. It runs one Effect as the main process
* fiber, interrupts that fiber on `SIGINT` or `SIGTERM`, and delegates final
* exit-code handling to the configured teardown.
*
* @since 4.0.0
*/
import type { Effect } from "effect/Effect"
import * as Runtime from "effect/Runtime"
/**
* Runs an Effect as the Node process main program, interrupting the fiber on
* `SIGINT` or `SIGTERM` and invoking the configured teardown to determine the
* process exit code.
*
* @category running
* @since 4.0.0
*/
export const runMain: {
(
options?: {
readonly disableErrorReporting?: boolean | undefined
readonly teardown?: Runtime.Teardown | undefined
}
): <E, A>(effect: Effect<A, E>) => void
<E, A>(
effect: Effect<A, E>,
options?: {
readonly disableErrorReporting?: boolean | undefined
readonly teardown?: Runtime.Teardown | undefined
}
): void
} = Runtime.makeRunMain(({
fiber,
teardown
}) => {
let receivedSignal = false
fiber.addObserver((exit) => {
process.removeListener("SIGINT", onSigint)
process.removeListener("SIGTERM", onSigint)
teardown(exit, (code) => {
if (receivedSignal || code !== 0) {
process.exit(code)
}
})
})
function onSigint() {
receivedSignal = true
fiber.interruptUnsafe(fiber.id)
}
process.on("SIGINT", onSigint)
process.on("SIGTERM", onSigint)
})