Skip to main content

Example on GitHub

Runnable example for filesystem backends.
secure-exec supports three filesystem backends. The system driver controls which backend sandboxed code uses.

Runnable example

import {
  NodeRuntime,
  allowAllFs,
  createInMemoryFileSystem,
  createNodeDriver,
  createNodeRuntimeDriverFactory,
} from "../../../packages/secure-exec/src/index.ts";

const filesystem = createInMemoryFileSystem();
const runtime = new NodeRuntime({
  systemDriver: createNodeDriver({
    filesystem,
    permissions: { ...allowAllFs },
  }),
  runtimeDriverFactory: createNodeRuntimeDriverFactory(),
});

try {
  const result = await runtime.exec(`
    const fs = require("node:fs");
    fs.mkdirSync("/workspace", { recursive: true });
    fs.writeFileSync("/workspace/hello.txt", "hello from the sandbox");
  `);

  if (result.code !== 0) {
    throw new Error(`Unexpected execution result: ${JSON.stringify(result)}`);
  }

  const message = await filesystem.readTextFile("/workspace/hello.txt");

  console.log(
    JSON.stringify({
      ok: message === "hello from the sandbox",
      message,
      summary: "sandbox wrote to the in-memory filesystem",
    }),
  );
} finally {
  runtime.dispose();
}
Source: examples/features/src/filesystem.ts

OPFS (browser)

Persistent filesystem using the Origin Private File System API. This is the default for createBrowserDriver().
import { createBrowserDriver } from "secure-exec/browser";

// OPFS (default)
const driver = await createBrowserDriver({ filesystem: "opfs" });

// In-memory fallback
const memDriver = await createBrowserDriver({ filesystem: "memory" });
OPFS does not support atomic rename operations.

Node filesystem

Thin wrapper around Node.js fs/promises. Provides real host filesystem access (gated by permissions).
import { NodeFileSystem } from "secure-exec";

const fs = new NodeFileSystem();

VirtualFileSystem interface

All backends implement this interface:
MethodReturnsDescription
readFile(path)Promise<Uint8Array>Read file as bytes
readTextFile(path)Promise<string>Read file as text
readDir(path)Promise<string[]>List directory entries
readDirWithTypes(path)Promise<DirEntry[]>List entries with type info
writeFile(path, content)Promise<void>Write file
createDir(path)Promise<void>Create directory
mkdir(path)Promise<void>Create directory (alias)
exists(path)Promise<boolean>Check if path exists
stat(path)Promise<StatInfo>Get file metadata
removeFile(path)Promise<void>Delete a file
removeDir(path)Promise<void>Delete a directory
rename(old, new)Promise<void>Rename a file or directory