1/**
2 * Deno helper for running a root Effect program.
3 *
4 * @since 4.0.0
5 */
6
7import type { Effect } from "effect/Effect"
8import * as Runtime from "effect/Runtime"
9
10/**
11 * Run an Effect as the entrypoint to a Deno application.
12 *
13 * @category running
14 * @since 4.0.0
15 */
16
17export const runMain: {
18 (
19 options?: {
20 readonly disableErrorReporting?: boolean | undefined
21 readonly teardown?: Runtime.Teardown | undefined
22 }
23 ): <E, A>(effect: Effect<A, E>) => void
24 <E, A>(
25 effect: Effect<A, E>,
26 options?: {
27 readonly disableErrorReporting?: boolean | undefined
28 readonly teardown?: Runtime.Teardown | undefined
29 }
30 ): void
31} = Runtime.makeRunMain(({
32 fiber,
33 teardown
34}) => {
35 let receivedSignal = false
36
37 fiber.addObserver((exit) => {
38 if (!receivedSignal) {
39 Deno.removeSignalListener("SIGINT", onSigint)
40 Deno.removeSignalListener("SIGTERM", onSigint)
41 }
42
43 teardown(exit, (code) => {
44 if (receivedSignal || code !== 0) {
45 Deno.exit(code)
46 }
47 })
48 })
49
50 function onSigint(): void {
51 receivedSignal = true
52 Deno.removeSignalListener("SIGINT", onSigint)
53 Deno.removeSignalListener("SIGTERM", onSigint)
54 fiber.interruptUnsafe(fiber.id)
55 }
56
57 Deno.addSignalListener("SIGINT", onSigint)
58 Deno.addSignalListener("SIGTERM", onSigint)
59})