diff --git a/utils/jsffi/dyld.mjs b/utils/jsffi/dyld.mjs
index 3dea4474115dcdbf7ea854a176718257eb31e5cf..a602becee25aa5fa623e13fa9c5ab46e95ace0f2 100755
--- a/utils/jsffi/dyld.mjs
+++ b/utils/jsffi/dyld.mjs
@@ -91,7 +91,7 @@ import fs from "node:fs";
 import path from "node:path";
 import stream from "node:stream";
 import { WASI } from "node:wasi";
-import { JSValManager } from "./prelude.mjs";
+import { JSValManager, setImmediate } from "./prelude.mjs";
 import { parseRecord, parseSections } from "./post-link.mjs";
 
 // Make a consumer callback from a buffer. See Parser class
diff --git a/utils/jsffi/prelude.mjs b/utils/jsffi/prelude.mjs
index 91015283caa7562bdb574e78ced468fde57bf4c9..7af91e52adde0bc1db3ba364a2ee38c4da366712 100644
--- a/utils/jsffi/prelude.mjs
+++ b/utils/jsffi/prelude.mjs
@@ -39,7 +39,7 @@ export class JSValManager {
 // To benchmark different setImmediate() implementations in the
 // browser, use https://github.com/jphpsf/setImmediate-shim-demo as a
 // starting point.
-const setImmediate = await (async () => {
+export const setImmediate = await (async () => {
   // node, bun, or other scripts might have set this up in the browser
   if (globalThis.setImmediate) {
     return globalThis.setImmediate;