1import { Effect } from "effect"
2
3export const getGc = async (): Promise<() => void> => {
4 const { setFlagsFromString } = await import("node:v8")
5 const { runInNewContext } = await import("node:vm")
6 setFlagsFromString("--expose_gc")
7 const collect = runInNewContext("gc") as () => void
8 setFlagsFromString("--no-expose_gc")
9 return collect
10}
11
12export const collectGarbage = Effect.promise(async () => {
13 const collect = await getGc()
14 // WeakRef targets remain alive until the current job ends, so collect across jobs.
15 for (let i = 0; i < 8; i++) {
16 await new Promise((resolve) => setTimeout(resolve, 0))
17 collect()
18 }
19})