Skip to content

Commit 3e3b922

Browse files
NathanFlurryclaude
andcommitted
feat: US-059 - Fix setupFsFacade to use getter-based delegation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b5ea9eb commit 3e3b922

2 files changed

Lines changed: 26 additions & 22 deletions

File tree

packages/secure-exec-core/isolate-runtime/src/inject/setup-fs-facade.ts

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,30 @@ import { getRuntimeExposeCustomGlobal } from "../common/global-exposure";
22

33
const __runtimeExposeCustomGlobal = getRuntimeExposeCustomGlobal();
44

5-
const __fsFacade: Record<string, unknown> = {
6-
readFile: globalThis._fsReadFile,
7-
writeFile: globalThis._fsWriteFile,
8-
readFileBinary: globalThis._fsReadFileBinary,
9-
writeFileBinary: globalThis._fsWriteFileBinary,
10-
readDir: globalThis._fsReadDir,
11-
mkdir: globalThis._fsMkdir,
12-
rmdir: globalThis._fsRmdir,
13-
exists: globalThis._fsExists,
14-
stat: globalThis._fsStat,
15-
unlink: globalThis._fsUnlink,
16-
rename: globalThis._fsRename,
17-
chmod: globalThis._fsChmod,
18-
chown: globalThis._fsChown,
19-
link: globalThis._fsLink,
20-
symlink: globalThis._fsSymlink,
21-
readlink: globalThis._fsReadlink,
22-
lstat: globalThis._fsLstat,
23-
truncate: globalThis._fsTruncate,
24-
utimes: globalThis._fsUtimes,
25-
};
5+
// Getter-based delegation: each _fs property resolves globalThis._fsXxx at
6+
// call time, not setup time. This allows snapshot-restored contexts to pick
7+
// up replaced bridge function globals after restore.
8+
const __fsFacade: Record<string, unknown> = {};
9+
Object.defineProperties(__fsFacade, {
10+
readFile: { get() { return globalThis._fsReadFile; }, enumerable: true },
11+
writeFile: { get() { return globalThis._fsWriteFile; }, enumerable: true },
12+
readFileBinary: { get() { return globalThis._fsReadFileBinary; }, enumerable: true },
13+
writeFileBinary: { get() { return globalThis._fsWriteFileBinary; }, enumerable: true },
14+
readDir: { get() { return globalThis._fsReadDir; }, enumerable: true },
15+
mkdir: { get() { return globalThis._fsMkdir; }, enumerable: true },
16+
rmdir: { get() { return globalThis._fsRmdir; }, enumerable: true },
17+
exists: { get() { return globalThis._fsExists; }, enumerable: true },
18+
stat: { get() { return globalThis._fsStat; }, enumerable: true },
19+
unlink: { get() { return globalThis._fsUnlink; }, enumerable: true },
20+
rename: { get() { return globalThis._fsRename; }, enumerable: true },
21+
chmod: { get() { return globalThis._fsChmod; }, enumerable: true },
22+
chown: { get() { return globalThis._fsChown; }, enumerable: true },
23+
link: { get() { return globalThis._fsLink; }, enumerable: true },
24+
symlink: { get() { return globalThis._fsSymlink; }, enumerable: true },
25+
readlink: { get() { return globalThis._fsReadlink; }, enumerable: true },
26+
lstat: { get() { return globalThis._fsLstat; }, enumerable: true },
27+
truncate: { get() { return globalThis._fsTruncate; }, enumerable: true },
28+
utimes: { get() { return globalThis._fsUtimes; }, enumerable: true },
29+
});
2630

2731
__runtimeExposeCustomGlobal("_fs", __fsFacade);

packages/secure-exec-core/src/generated/isolate-runtime.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const ISOLATE_RUNTIME_SOURCES = {
1515
"setCommonjsFileGlobals": "\"use strict\";\n(() => {\n // isolate-runtime/src/common/global-exposure.ts\n function defineRuntimeGlobalBinding(name, value, mutable) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: mutable,\n configurable: mutable,\n enumerable: true\n });\n }\n function createRuntimeGlobalExposer(mutable) {\n return (name, value) => {\n defineRuntimeGlobalBinding(name, value, mutable);\n };\n }\n function getRuntimeExposeMutableGlobal() {\n if (typeof globalThis.__runtimeExposeMutableGlobal === \"function\") {\n return globalThis.__runtimeExposeMutableGlobal;\n }\n return createRuntimeGlobalExposer(true);\n }\n\n // isolate-runtime/src/inject/set-commonjs-file-globals.ts\n var __runtimeExposeMutableGlobal = getRuntimeExposeMutableGlobal();\n var __commonJsFileConfig = globalThis.__runtimeCommonJsFileConfig ?? {};\n var __filePath = typeof __commonJsFileConfig.filePath === \"string\" ? __commonJsFileConfig.filePath : \"/<entry>.js\";\n var __dirname = typeof __commonJsFileConfig.dirname === \"string\" ? __commonJsFileConfig.dirname : \"/\";\n __runtimeExposeMutableGlobal(\"__filename\", __filePath);\n __runtimeExposeMutableGlobal(\"__dirname\", __dirname);\n var __currentModule = globalThis._currentModule;\n if (__currentModule) {\n __currentModule.dirname = __dirname;\n __currentModule.filename = __filePath;\n }\n})();\n",
1616
"setStdinData": "\"use strict\";\n(() => {\n // isolate-runtime/src/inject/set-stdin-data.ts\n if (typeof globalThis._stdinData !== \"undefined\") {\n globalThis._stdinData = globalThis.__runtimeStdinData;\n globalThis._stdinPosition = 0;\n globalThis._stdinEnded = false;\n globalThis._stdinFlowMode = false;\n }\n})();\n",
1717
"setupDynamicImport": "\"use strict\";\n(() => {\n // isolate-runtime/src/common/global-access.ts\n function isObjectLike(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n }\n\n // isolate-runtime/src/common/global-exposure.ts\n function defineRuntimeGlobalBinding(name, value, mutable) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: mutable,\n configurable: mutable,\n enumerable: true\n });\n }\n function createRuntimeGlobalExposer(mutable) {\n return (name, value) => {\n defineRuntimeGlobalBinding(name, value, mutable);\n };\n }\n function getRuntimeExposeCustomGlobal() {\n if (typeof globalThis.__runtimeExposeCustomGlobal === \"function\") {\n return globalThis.__runtimeExposeCustomGlobal;\n }\n return createRuntimeGlobalExposer(false);\n }\n\n // isolate-runtime/src/inject/setup-dynamic-import.ts\n var __runtimeExposeCustomGlobal = getRuntimeExposeCustomGlobal();\n var __dynamicImportConfig = globalThis.__runtimeDynamicImportConfig ?? {};\n var __fallbackReferrer = typeof __dynamicImportConfig.referrerPath === \"string\" && __dynamicImportConfig.referrerPath.length > 0 ? __dynamicImportConfig.referrerPath : \"/\";\n var __dynamicImportHandler = async function(specifier, fromPath) {\n const request = String(specifier);\n const referrer = typeof fromPath === \"string\" && fromPath.length > 0 ? fromPath : __fallbackReferrer;\n const allowRequireFallback = request.endsWith(\".cjs\") || request.endsWith(\".json\");\n const namespace = await globalThis._dynamicImport(request, referrer);\n if (namespace !== null) {\n return namespace;\n }\n if (!allowRequireFallback) {\n throw new Error(\"Cannot find module '\" + request + \"'\");\n }\n const runtimeRequire = globalThis.require;\n if (typeof runtimeRequire !== \"function\") {\n throw new Error(\"Cannot find module '\" + request + \"'\");\n }\n const mod = runtimeRequire(request);\n const namespaceFallback = { default: mod };\n if (isObjectLike(mod)) {\n for (const key of Object.keys(mod)) {\n if (!(key in namespaceFallback)) {\n namespaceFallback[key] = mod[key];\n }\n }\n }\n return namespaceFallback;\n };\n __runtimeExposeCustomGlobal(\"__dynamicImport\", __dynamicImportHandler);\n})();\n",
18-
"setupFsFacade": "\"use strict\";\n(() => {\n // isolate-runtime/src/common/global-exposure.ts\n function defineRuntimeGlobalBinding(name, value, mutable) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: mutable,\n configurable: mutable,\n enumerable: true\n });\n }\n function createRuntimeGlobalExposer(mutable) {\n return (name, value) => {\n defineRuntimeGlobalBinding(name, value, mutable);\n };\n }\n function getRuntimeExposeCustomGlobal() {\n if (typeof globalThis.__runtimeExposeCustomGlobal === \"function\") {\n return globalThis.__runtimeExposeCustomGlobal;\n }\n return createRuntimeGlobalExposer(false);\n }\n\n // isolate-runtime/src/inject/setup-fs-facade.ts\n var __runtimeExposeCustomGlobal = getRuntimeExposeCustomGlobal();\n var __fsFacade = {\n readFile: globalThis._fsReadFile,\n writeFile: globalThis._fsWriteFile,\n readFileBinary: globalThis._fsReadFileBinary,\n writeFileBinary: globalThis._fsWriteFileBinary,\n readDir: globalThis._fsReadDir,\n mkdir: globalThis._fsMkdir,\n rmdir: globalThis._fsRmdir,\n exists: globalThis._fsExists,\n stat: globalThis._fsStat,\n unlink: globalThis._fsUnlink,\n rename: globalThis._fsRename,\n chmod: globalThis._fsChmod,\n chown: globalThis._fsChown,\n link: globalThis._fsLink,\n symlink: globalThis._fsSymlink,\n readlink: globalThis._fsReadlink,\n lstat: globalThis._fsLstat,\n truncate: globalThis._fsTruncate,\n utimes: globalThis._fsUtimes\n };\n __runtimeExposeCustomGlobal(\"_fs\", __fsFacade);\n})();\n",
18+
"setupFsFacade": "\"use strict\";\n(() => {\n // isolate-runtime/src/common/global-exposure.ts\n function defineRuntimeGlobalBinding(name, value, mutable) {\n Object.defineProperty(globalThis, name, {\n value,\n writable: mutable,\n configurable: mutable,\n enumerable: true\n });\n }\n function createRuntimeGlobalExposer(mutable) {\n return (name, value) => {\n defineRuntimeGlobalBinding(name, value, mutable);\n };\n }\n function getRuntimeExposeCustomGlobal() {\n if (typeof globalThis.__runtimeExposeCustomGlobal === \"function\") {\n return globalThis.__runtimeExposeCustomGlobal;\n }\n return createRuntimeGlobalExposer(false);\n }\n\n // isolate-runtime/src/inject/setup-fs-facade.ts\n var __runtimeExposeCustomGlobal = getRuntimeExposeCustomGlobal();\n var __fsFacade = {};\n Object.defineProperties(__fsFacade, {\n readFile: { get() {\n return globalThis._fsReadFile;\n }, enumerable: true },\n writeFile: { get() {\n return globalThis._fsWriteFile;\n }, enumerable: true },\n readFileBinary: { get() {\n return globalThis._fsReadFileBinary;\n }, enumerable: true },\n writeFileBinary: { get() {\n return globalThis._fsWriteFileBinary;\n }, enumerable: true },\n readDir: { get() {\n return globalThis._fsReadDir;\n }, enumerable: true },\n mkdir: { get() {\n return globalThis._fsMkdir;\n }, enumerable: true },\n rmdir: { get() {\n return globalThis._fsRmdir;\n }, enumerable: true },\n exists: { get() {\n return globalThis._fsExists;\n }, enumerable: true },\n stat: { get() {\n return globalThis._fsStat;\n }, enumerable: true },\n unlink: { get() {\n return globalThis._fsUnlink;\n }, enumerable: true },\n rename: { get() {\n return globalThis._fsRename;\n }, enumerable: true },\n chmod: { get() {\n return globalThis._fsChmod;\n }, enumerable: true },\n chown: { get() {\n return globalThis._fsChown;\n }, enumerable: true },\n link: { get() {\n return globalThis._fsLink;\n }, enumerable: true },\n symlink: { get() {\n return globalThis._fsSymlink;\n }, enumerable: true },\n readlink: { get() {\n return globalThis._fsReadlink;\n }, enumerable: true },\n lstat: { get() {\n return globalThis._fsLstat;\n }, enumerable: true },\n truncate: { get() {\n return globalThis._fsTruncate;\n }, enumerable: true },\n utimes: { get() {\n return globalThis._fsUtimes;\n }, enumerable: true }\n });\n __runtimeExposeCustomGlobal(\"_fs\", __fsFacade);\n})();\n",
1919
} as const;
2020

2121
export type IsolateRuntimeSourceId = keyof typeof ISOLATE_RUNTIME_SOURCES;

0 commit comments

Comments
 (0)