| 1 | import { Effect } from "effect" |
| 2 | |
| 3 | export 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 | |
| 12 | export 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 | }) |