@ricsam/quickjs-runtime 0.2.22 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -141,12 +141,45 @@ async function createRuntime(options) {
141
141
  });
142
142
  }
143
143
  const runtimeFetchHandle = {
144
- async dispatchRequest(request, _options) {
144
+ async dispatchRequest(request) {
145
145
  if (!fetchHandle) {
146
146
  throw new Error("Fetch not configured");
147
147
  }
148
148
  return fetchHandle.dispatchRequest(request);
149
149
  },
150
+ getUpgradeRequest() {
151
+ return fetchHandle?.getUpgradeRequest() ?? null;
152
+ },
153
+ dispatchWebSocketOpen(connectionId) {
154
+ if (!fetchHandle) {
155
+ throw new Error("Fetch not configured");
156
+ }
157
+ fetchHandle.dispatchWebSocketOpen(connectionId);
158
+ },
159
+ dispatchWebSocketMessage(connectionId, message) {
160
+ if (!fetchHandle) {
161
+ throw new Error("Fetch not configured");
162
+ }
163
+ fetchHandle.dispatchWebSocketMessage(connectionId, message);
164
+ },
165
+ dispatchWebSocketClose(connectionId, code, reason) {
166
+ if (!fetchHandle) {
167
+ throw new Error("Fetch not configured");
168
+ }
169
+ fetchHandle.dispatchWebSocketClose(connectionId, code, reason);
170
+ },
171
+ dispatchWebSocketError(connectionId, error) {
172
+ if (!fetchHandle) {
173
+ throw new Error("Fetch not configured");
174
+ }
175
+ fetchHandle.dispatchWebSocketError(connectionId, error);
176
+ },
177
+ onWebSocketCommand(callback) {
178
+ if (!fetchHandle) {
179
+ throw new Error("Fetch not configured");
180
+ }
181
+ return fetchHandle.onWebSocketCommand(callback);
182
+ },
150
183
  hasServeHandler() {
151
184
  return fetchHandle?.hasServeHandler() ?? false;
152
185
  },
@@ -326,4 +359,4 @@ async function createRuntime(options) {
326
359
  }
327
360
  })
328
361
 
329
- //# debugId=AFE921F6D82B637A64756E2164756E21
362
+ //# debugId=3637BBAA533553AB64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/create-runtime.ts"],
4
4
  "sourcesContent": [
5
- "import {\n getQuickJS,\n newAsyncContext,\n type QuickJSAsyncContext,\n type QuickJSAsyncRuntime,\n type QuickJSContext,\n type QuickJSRuntime,\n} from \"quickjs-emscripten\";\nimport {\n setupCore,\n createStateMap,\n cleanupUnmarshaledHandles,\n clearAllInstanceState,\n defineFunction,\n defineAsyncFunction,\n type StateMap,\n type CoreHandle,\n} from \"@ricsam/quickjs-core\";\nimport {\n setupFetch,\n type SetupFetchOptions,\n type FetchHandle,\n} from \"@ricsam/quickjs-fetch\";\nimport {\n setupFs,\n type SetupFsOptions,\n type FsHandle,\n} from \"@ricsam/quickjs-fs\";\nimport {\n setupConsole,\n type ConsoleHandle,\n type ConsoleEntry,\n type ConsoleCallbacks,\n} from \"@ricsam/quickjs-console\";\nimport {\n setupEncoding,\n type EncodingHandle,\n} from \"@ricsam/quickjs-encoding\";\nimport {\n setupTimers,\n type TimersHandle,\n} from \"@ricsam/quickjs-timers\";\nimport {\n setupCrypto,\n type CryptoHandle,\n} from \"@ricsam/quickjs-crypto\";\nimport {\n setupTestEnvironment,\n type TestEnvironmentHandle,\n type RunResults,\n type TestEvent,\n} from \"@ricsam/quickjs-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightHandle,\n type PlaywrightOptions,\n type PlaywrightEvent,\n type BrowserConsoleLogEntry,\n type NetworkRequestInfo,\n type NetworkResponseInfo,\n} from \"@ricsam/quickjs-playwright\";\n\n// Re-export types\nexport type { ConsoleEntry, ConsoleCallbacks, TestEvent, PlaywrightEvent };\n\n/**\n * Module loader callback type.\n * Called when the runtime imports a module dynamically.\n * Returns the JavaScript source code for the module.\n */\nexport type ModuleLoaderCallback = (\n moduleName: string\n) => string | Promise<string>;\n\n/**\n * A custom function that can be called from within the runtime.\n */\nexport type CustomFunction = (...args: unknown[]) => unknown | Promise<unknown>;\n\n/**\n * Custom function definition with metadata.\n * Requires explicit `async` property to be clear about function behavior.\n */\nexport interface CustomFunctionDefinition {\n /** The function implementation */\n fn: CustomFunction;\n /** Whether the function is async (returns a Promise) */\n async: boolean;\n}\n\n/**\n * Custom functions to register in the runtime.\n * Each function must be defined with explicit async property.\n *\n * @example\n * ```typescript\n * customFunctions: {\n * // Async function\n * hashPassword: {\n * fn: async (password) => bcrypt.hash(password, 10),\n * async: true,\n * },\n * // Sync function\n * getConfig: {\n * fn: () => ({ environment: \"production\" }),\n * async: false,\n * },\n * }\n * ```\n */\nexport type CustomFunctions = Record<string, CustomFunctionDefinition>;\n\n/**\n * Fetch callback type.\n */\nexport type FetchCallback = (request: Request) => Response | Promise<Response>;\n\n/**\n * Test environment options.\n */\nexport interface TestEnvironmentOptions {\n /** Event callback for test events */\n onEvent?: (event: TestEvent) => void;\n /** Default test timeout in milliseconds */\n testTimeout?: number;\n}\n\n/**\n * Options for creating a runtime.\n */\nexport interface RuntimeOptions {\n /** Memory limit in megabytes (optional) */\n memoryLimitMB?: number;\n /** Console callback handlers */\n console?: ConsoleCallbacks;\n /** Fetch callback handler */\n fetch?: FetchCallback;\n /** File system options */\n fs?: SetupFsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the runtime */\n customFunctions?: CustomFunctions;\n /** Current working directory for path operations. Defaults to \"/\" */\n cwd?: string;\n /** Test environment options. Set to true for defaults, or provide options. */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options for browser automation */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(request: Request, options?: { timeout?: number }): Promise<Response>;\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test operations.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests have been registered */\n hasTests(): boolean;\n /** Get the number of registered tests */\n getTestCount(): number;\n /** Reset test state (clear registered tests) */\n reset(): void;\n}\n\n/**\n * Collected playwright data.\n */\nexport interface CollectedData {\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Runtime playwright handle - provides access to playwright data.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser logs and network data */\n getCollectedData(): CollectedData;\n /** Clear all collected data */\n clearCollectedData(): void;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the runtime.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filename?: string): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test operations */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to browser automation data */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n/**\n * Create a fully configured QuickJS runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers.\n * Supports ES modules with custom module loader and custom host functions.\n *\n * @example\n * ```typescript\n * const runtime = await createRuntime({\n * console: { onEntry: (e) => console.log(\"[sandbox]\", e) },\n * fetch: async (request) => fetch(request),\n * moduleLoader: async (name) => {\n * if (name === \"@/utils\") {\n * return `export const add = (a, b) => a + b;`;\n * }\n * throw new Error(`Unknown module: ${name}`);\n * },\n * customFunctions: {\n * hashPassword: {\n * fn: async (pw) => Bun.password.hash(pw),\n * async: true,\n * },\n * },\n * });\n *\n * await runtime.eval(`\n * import { add } from \"@/utils\";\n * const hash = await hashPassword(\"secret\");\n * console.log(add(1, 2), hash);\n * `);\n *\n * await runtime.dispose();\n * ```\n */\nexport async function createRuntime(\n options?: RuntimeOptions\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Determine if we need async context (for async module loader)\n const needsAsync = opts.moduleLoader !== undefined;\n\n let context: QuickJSContext | QuickJSAsyncContext;\n let runtime: QuickJSRuntime | QuickJSAsyncRuntime;\n let isAsyncContext = false;\n\n if (needsAsync) {\n // Create async context for module loading support\n const asyncContext = await newAsyncContext();\n context = asyncContext;\n runtime = asyncContext.runtime;\n isAsyncContext = true;\n\n // Set up module loader\n if (opts.moduleLoader) {\n const moduleLoader = opts.moduleLoader;\n (runtime as QuickJSAsyncRuntime).setModuleLoader(async (moduleName: string) => {\n try {\n const code = await moduleLoader(moduleName);\n return code;\n } catch (error) {\n // Return error in SuccessOrFail format\n return { error: error as Error };\n }\n });\n }\n } else {\n // Create sync context\n const QuickJS = await getQuickJS();\n runtime = QuickJS.newRuntime();\n context = runtime.newContext();\n }\n\n // Set memory limit if specified\n if (opts.memoryLimitMB) {\n runtime.setMemoryLimit(opts.memoryLimitMB * 1024 * 1024);\n }\n\n // Create shared state\n const stateMap = createStateMap();\n\n // Setup core APIs\n const coreHandle = setupCore(context, { stateMap });\n\n // Setup console\n const consoleHandle = setupConsole(context, {\n ...opts.console,\n stateMap,\n coreHandle,\n });\n\n // Setup encoding (btoa/atob)\n const encodingHandle = setupEncoding(context, { stateMap, coreHandle });\n\n // Setup timers\n const timersHandle = setupTimers(context, { stateMap, coreHandle });\n\n // Setup crypto\n const cryptoHandle = setupCrypto(context, { stateMap, coreHandle });\n\n // Setup fetch if callback provided\n let fetchHandle: FetchHandle | undefined;\n if (opts.fetch) {\n const fetchCallback = opts.fetch;\n fetchHandle = setupFetch(context, {\n stateMap,\n coreHandle,\n onFetch: async (request: Request) => {\n return Promise.resolve(fetchCallback(request));\n },\n });\n } else {\n // Still setup fetch for serve() support, but without fetch() function\n fetchHandle = setupFetch(context, { stateMap, coreHandle });\n }\n\n // Setup file system if provided\n let fsHandle: FsHandle | undefined;\n if (opts.fs) {\n fsHandle = setupFs(context, {\n ...opts.fs,\n stateMap,\n coreHandle,\n });\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n for (const [name, def] of Object.entries(opts.customFunctions)) {\n if (def.async) {\n const fn = defineAsyncFunction(context, name, async (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n } else {\n const fn = defineFunction(context, name, (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n }\n }\n }\n\n // Setup test environment if enabled\n let testEnvHandle: TestEnvironmentHandle | undefined;\n if (opts.testEnvironment) {\n const testEnvOpts = typeof opts.testEnvironment === \"object\" ? opts.testEnvironment : {};\n testEnvHandle = setupTestEnvironment(context, {\n stateMap,\n coreHandle,\n onEvent: testEnvOpts.onEvent,\n });\n }\n\n // Setup playwright if provided\n let playwrightHandle: PlaywrightHandle | undefined;\n if (opts.playwright) {\n playwrightHandle = setupPlaywright(context, {\n ...opts.playwright,\n stateMap,\n coreHandle,\n consoleCallbacks: opts.playwright.console ? opts.console : undefined,\n });\n }\n\n // Create fetch handle wrapper\n const runtimeFetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(request: Request, _options?: { timeout?: number }): Promise<Response> {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n // Note: timeout option not yet implemented in underlying FetchHandle\n return fetchHandle.dispatchRequest(request);\n },\n hasServeHandler() {\n return fetchHandle?.hasServeHandler() ?? false;\n },\n hasActiveConnections() {\n return fetchHandle?.hasActiveConnections() ?? false;\n },\n };\n\n // Create timers handle wrapper\n const runtimeTimersHandle: RuntimeTimersHandle = {\n clearAll() {\n timersHandle.clearAll();\n },\n };\n\n // Create console handle wrapper\n const runtimeConsoleHandle: RuntimeConsoleHandle = {\n reset() {\n consoleHandle.reset();\n },\n getTimers() {\n return consoleHandle.getTimers();\n },\n getCounters() {\n return consoleHandle.getCounters();\n },\n getGroupDepth() {\n return consoleHandle.getGroupDepth();\n },\n };\n\n // Create test environment handle wrapper\n const runtimeTestEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!testEnvHandle) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return testEnvHandle.run();\n },\n hasTests() {\n return testEnvHandle?.hasTests() ?? false;\n },\n getTestCount() {\n return testEnvHandle?.getTestCount() ?? 0;\n },\n reset() {\n testEnvHandle?.reset();\n },\n };\n\n // Create playwright handle wrapper\n const runtimePlaywrightHandle: RuntimePlaywrightHandle = {\n getCollectedData() {\n if (!playwrightHandle) {\n return { browserConsoleLogs: [], networkRequests: [], networkResponses: [] };\n }\n return {\n browserConsoleLogs: playwrightHandle.getBrowserConsoleLogs(),\n networkRequests: playwrightHandle.getNetworkRequests(),\n networkResponses: playwrightHandle.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n playwrightHandle?.clearCollected();\n },\n };\n\n return {\n id,\n fetch: runtimeFetchHandle,\n timers: runtimeTimersHandle,\n console: runtimeConsoleHandle,\n testEnvironment: runtimeTestEnvironmentHandle,\n playwright: runtimePlaywrightHandle,\n\n async eval(code: string, filename?: string): Promise<void> {\n if (isAsyncContext) {\n // Use evalCodeAsync for async context (supports top-level await and async module loading)\n const asyncContext = context as QuickJSAsyncContext;\n const result = await asyncContext.evalCodeAsync(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle module exports (could be a promise for top-level await)\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute pending jobs\n runtime.executePendingJobs();\n } else {\n // Use evalCode for sync context\n const result = context.evalCode(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle async module result\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n // Execute pending jobs\n runtime.executePendingJobs();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute any remaining pending jobs\n runtime.executePendingJobs();\n }\n },\n\n async dispose(): Promise<void> {\n // Drain pending jobs before disposal\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Dispose handles in reverse order\n playwrightHandle?.dispose();\n testEnvHandle?.dispose();\n cryptoHandle.dispose();\n timersHandle.dispose();\n encodingHandle.dispose();\n consoleHandle.dispose();\n fsHandle?.dispose();\n fetchHandle?.dispose();\n\n // Drain pending jobs again\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Clean up handles\n cleanupUnmarshaledHandles(context);\n clearAllInstanceState();\n\n // Clear globals to help GC\n try {\n const clearGlobals = context.evalCode(`\n (function() {\n const keysToDelete = Object.keys(globalThis).filter(k =>\n k !== 'globalThis' && k !== 'undefined' && k !== 'NaN' && k !== 'Infinity'\n );\n for (const key of keysToDelete) {\n try { globalThis[key] = undefined; } catch (e) {}\n }\n for (const key of keysToDelete) {\n try { delete globalThis[key]; } catch (e) {}\n }\n return keysToDelete.length;\n })()\n `);\n if (clearGlobals.error) {\n clearGlobals.error.dispose();\n } else {\n clearGlobals.value.dispose();\n }\n } catch {\n // Ignore errors during cleanup\n }\n\n // Final drain\n for (let i = 0; i < 100; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n coreHandle.dispose();\n context.dispose();\n\n // Only dispose runtime if it was created separately (not via newAsyncContext)\n if (!isAsyncContext) {\n runtime.dispose();\n }\n },\n };\n}\n"
5
+ "import {\n getQuickJS,\n newAsyncContext,\n type QuickJSAsyncContext,\n type QuickJSAsyncRuntime,\n type QuickJSContext,\n type QuickJSRuntime,\n} from \"quickjs-emscripten\";\nimport {\n setupCore,\n createStateMap,\n cleanupUnmarshaledHandles,\n clearAllInstanceState,\n defineFunction,\n defineAsyncFunction,\n type StateMap,\n type CoreHandle,\n} from \"@ricsam/quickjs-core\";\nimport {\n setupFetch,\n type SetupFetchOptions,\n type FetchHandle,\n type UpgradeRequest,\n type WebSocketCommand,\n} from \"@ricsam/quickjs-fetch\";\nimport {\n setupFs,\n type SetupFsOptions,\n type FsHandle,\n} from \"@ricsam/quickjs-fs\";\nimport {\n setupConsole,\n type ConsoleHandle,\n type ConsoleEntry,\n type ConsoleCallbacks,\n} from \"@ricsam/quickjs-console\";\nimport {\n setupEncoding,\n type EncodingHandle,\n} from \"@ricsam/quickjs-encoding\";\nimport {\n setupTimers,\n type TimersHandle,\n} from \"@ricsam/quickjs-timers\";\nimport {\n setupCrypto,\n type CryptoHandle,\n} from \"@ricsam/quickjs-crypto\";\nimport {\n setupTestEnvironment,\n type TestEnvironmentHandle,\n type RunResults,\n type TestEvent,\n} from \"@ricsam/quickjs-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightHandle,\n type PlaywrightOptions,\n type PlaywrightEvent,\n type BrowserConsoleLogEntry,\n type NetworkRequestInfo,\n type NetworkResponseInfo,\n} from \"@ricsam/quickjs-playwright\";\n\n// Re-export types\nexport type { ConsoleEntry, ConsoleCallbacks, TestEvent, PlaywrightEvent };\n\n/**\n * Module loader callback type.\n * Called when the runtime imports a module dynamically.\n * Returns the JavaScript source code for the module.\n */\nexport type ModuleLoaderCallback = (\n moduleName: string\n) => string | Promise<string>;\n\n/**\n * A custom function that can be called from within the runtime.\n */\nexport type CustomFunction = (...args: unknown[]) => unknown | Promise<unknown>;\n\n/**\n * Custom function definition with metadata.\n * Requires explicit `async` property to be clear about function behavior.\n */\nexport interface CustomFunctionDefinition {\n /** The function implementation */\n fn: CustomFunction;\n /** Whether the function is async (returns a Promise) */\n async: boolean;\n}\n\n/**\n * Custom functions to register in the runtime.\n * Each function must be defined with explicit async property.\n *\n * @example\n * ```typescript\n * customFunctions: {\n * // Async function\n * hashPassword: {\n * fn: async (password) => bcrypt.hash(password, 10),\n * async: true,\n * },\n * // Sync function\n * getConfig: {\n * fn: () => ({ environment: \"production\" }),\n * async: false,\n * },\n * }\n * ```\n */\nexport type CustomFunctions = Record<string, CustomFunctionDefinition>;\n\n/**\n * Fetch callback type.\n */\nexport type FetchCallback = (request: Request) => Response | Promise<Response>;\n\n/**\n * Test environment options.\n */\nexport interface TestEnvironmentOptions {\n /** Event callback for test events */\n onEvent?: (event: TestEvent) => void;\n /** Default test timeout in milliseconds */\n testTimeout?: number;\n}\n\n/**\n * Options for creating a runtime.\n */\nexport interface RuntimeOptions {\n /** Memory limit in megabytes (optional) */\n memoryLimitMB?: number;\n /** Console callback handlers */\n console?: ConsoleCallbacks;\n /** Fetch callback handler */\n fetch?: FetchCallback;\n /** File system options */\n fs?: SetupFsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the runtime */\n customFunctions?: CustomFunctions;\n /** Current working directory for path operations. Defaults to \"/\" */\n cwd?: string;\n /** Test environment options. Set to true for defaults, or provide options. */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options for browser automation */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(request: Request): Promise<Response>;\n\n /**\n * Check if the last request resulted in an upgrade request\n * Must be called immediately after dispatchRequest()\n */\n getUpgradeRequest(): UpgradeRequest | null;\n\n /**\n * Dispatch WebSocket open event\n * @param connectionId The connectionId from getUpgradeRequest()\n */\n dispatchWebSocketOpen(connectionId: string): void;\n\n /**\n * Dispatch WebSocket message event\n */\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): void;\n\n /**\n * Dispatch WebSocket close event\n */\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): void;\n\n /**\n * Dispatch WebSocket error event\n */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n\n /**\n * Register a callback for outgoing WebSocket messages/commands\n * Called when QuickJS code calls ws.send() or ws.close()\n */\n onWebSocketCommand(callback: (command: WebSocketCommand) => void): () => void;\n\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test operations.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests have been registered */\n hasTests(): boolean;\n /** Get the number of registered tests */\n getTestCount(): number;\n /** Reset test state (clear registered tests) */\n reset(): void;\n}\n\n/**\n * Collected playwright data.\n */\nexport interface CollectedData {\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Runtime playwright handle - provides access to playwright data.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser logs and network data */\n getCollectedData(): CollectedData;\n /** Clear all collected data */\n clearCollectedData(): void;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the runtime.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filename?: string): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test operations */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to browser automation data */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n/**\n * Create a fully configured QuickJS runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers.\n * Supports ES modules with custom module loader and custom host functions.\n *\n * @example\n * ```typescript\n * const runtime = await createRuntime({\n * console: { onEntry: (e) => console.log(\"[sandbox]\", e) },\n * fetch: async (request) => fetch(request),\n * moduleLoader: async (name) => {\n * if (name === \"@/utils\") {\n * return `export const add = (a, b) => a + b;`;\n * }\n * throw new Error(`Unknown module: ${name}`);\n * },\n * customFunctions: {\n * hashPassword: {\n * fn: async (pw) => Bun.password.hash(pw),\n * async: true,\n * },\n * },\n * });\n *\n * await runtime.eval(`\n * import { add } from \"@/utils\";\n * const hash = await hashPassword(\"secret\");\n * console.log(add(1, 2), hash);\n * `);\n *\n * await runtime.dispose();\n * ```\n */\nexport async function createRuntime(\n options?: RuntimeOptions\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Determine if we need async context (for async module loader)\n const needsAsync = opts.moduleLoader !== undefined;\n\n let context: QuickJSContext | QuickJSAsyncContext;\n let runtime: QuickJSRuntime | QuickJSAsyncRuntime;\n let isAsyncContext = false;\n\n if (needsAsync) {\n // Create async context for module loading support\n const asyncContext = await newAsyncContext();\n context = asyncContext;\n runtime = asyncContext.runtime;\n isAsyncContext = true;\n\n // Set up module loader\n if (opts.moduleLoader) {\n const moduleLoader = opts.moduleLoader;\n (runtime as QuickJSAsyncRuntime).setModuleLoader(async (moduleName: string) => {\n try {\n const code = await moduleLoader(moduleName);\n return code;\n } catch (error) {\n // Return error in SuccessOrFail format\n return { error: error as Error };\n }\n });\n }\n } else {\n // Create sync context\n const QuickJS = await getQuickJS();\n runtime = QuickJS.newRuntime();\n context = runtime.newContext();\n }\n\n // Set memory limit if specified\n if (opts.memoryLimitMB) {\n runtime.setMemoryLimit(opts.memoryLimitMB * 1024 * 1024);\n }\n\n // Create shared state\n const stateMap = createStateMap();\n\n // Setup core APIs\n const coreHandle = setupCore(context, { stateMap });\n\n // Setup console\n const consoleHandle = setupConsole(context, {\n ...opts.console,\n stateMap,\n coreHandle,\n });\n\n // Setup encoding (btoa/atob)\n const encodingHandle = setupEncoding(context, { stateMap, coreHandle });\n\n // Setup timers\n const timersHandle = setupTimers(context, { stateMap, coreHandle });\n\n // Setup crypto\n const cryptoHandle = setupCrypto(context, { stateMap, coreHandle });\n\n // Setup fetch if callback provided\n let fetchHandle: FetchHandle | undefined;\n if (opts.fetch) {\n const fetchCallback = opts.fetch;\n fetchHandle = setupFetch(context, {\n stateMap,\n coreHandle,\n onFetch: async (request: Request) => {\n return Promise.resolve(fetchCallback(request));\n },\n });\n } else {\n // Still setup fetch for serve() support, but without fetch() function\n fetchHandle = setupFetch(context, { stateMap, coreHandle });\n }\n\n // Setup file system if provided\n let fsHandle: FsHandle | undefined;\n if (opts.fs) {\n fsHandle = setupFs(context, {\n ...opts.fs,\n stateMap,\n coreHandle,\n });\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n for (const [name, def] of Object.entries(opts.customFunctions)) {\n if (def.async) {\n const fn = defineAsyncFunction(context, name, async (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n } else {\n const fn = defineFunction(context, name, (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n }\n }\n }\n\n // Setup test environment if enabled\n let testEnvHandle: TestEnvironmentHandle | undefined;\n if (opts.testEnvironment) {\n const testEnvOpts = typeof opts.testEnvironment === \"object\" ? opts.testEnvironment : {};\n testEnvHandle = setupTestEnvironment(context, {\n stateMap,\n coreHandle,\n onEvent: testEnvOpts.onEvent,\n });\n }\n\n // Setup playwright if provided\n let playwrightHandle: PlaywrightHandle | undefined;\n if (opts.playwright) {\n playwrightHandle = setupPlaywright(context, {\n ...opts.playwright,\n stateMap,\n coreHandle,\n consoleCallbacks: opts.playwright.console ? opts.console : undefined,\n });\n }\n\n // Create fetch handle wrapper\n const runtimeFetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(request: Request): Promise<Response> {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n return fetchHandle.dispatchRequest(request);\n },\n getUpgradeRequest() {\n return fetchHandle?.getUpgradeRequest() ?? null;\n },\n dispatchWebSocketOpen(connectionId: string) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (command: WebSocketCommand) => void) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n return fetchHandle.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n return fetchHandle?.hasServeHandler() ?? false;\n },\n hasActiveConnections() {\n return fetchHandle?.hasActiveConnections() ?? false;\n },\n };\n\n // Create timers handle wrapper\n const runtimeTimersHandle: RuntimeTimersHandle = {\n clearAll() {\n timersHandle.clearAll();\n },\n };\n\n // Create console handle wrapper\n const runtimeConsoleHandle: RuntimeConsoleHandle = {\n reset() {\n consoleHandle.reset();\n },\n getTimers() {\n return consoleHandle.getTimers();\n },\n getCounters() {\n return consoleHandle.getCounters();\n },\n getGroupDepth() {\n return consoleHandle.getGroupDepth();\n },\n };\n\n // Create test environment handle wrapper\n const runtimeTestEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!testEnvHandle) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return testEnvHandle.run();\n },\n hasTests() {\n return testEnvHandle?.hasTests() ?? false;\n },\n getTestCount() {\n return testEnvHandle?.getTestCount() ?? 0;\n },\n reset() {\n testEnvHandle?.reset();\n },\n };\n\n // Create playwright handle wrapper\n const runtimePlaywrightHandle: RuntimePlaywrightHandle = {\n getCollectedData() {\n if (!playwrightHandle) {\n return { browserConsoleLogs: [], networkRequests: [], networkResponses: [] };\n }\n return {\n browserConsoleLogs: playwrightHandle.getBrowserConsoleLogs(),\n networkRequests: playwrightHandle.getNetworkRequests(),\n networkResponses: playwrightHandle.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n playwrightHandle?.clearCollected();\n },\n };\n\n return {\n id,\n fetch: runtimeFetchHandle,\n timers: runtimeTimersHandle,\n console: runtimeConsoleHandle,\n testEnvironment: runtimeTestEnvironmentHandle,\n playwright: runtimePlaywrightHandle,\n\n async eval(code: string, filename?: string): Promise<void> {\n if (isAsyncContext) {\n // Use evalCodeAsync for async context (supports top-level await and async module loading)\n const asyncContext = context as QuickJSAsyncContext;\n const result = await asyncContext.evalCodeAsync(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle module exports (could be a promise for top-level await)\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute pending jobs\n runtime.executePendingJobs();\n } else {\n // Use evalCode for sync context\n const result = context.evalCode(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle async module result\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n // Execute pending jobs\n runtime.executePendingJobs();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute any remaining pending jobs\n runtime.executePendingJobs();\n }\n },\n\n async dispose(): Promise<void> {\n // Drain pending jobs before disposal\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Dispose handles in reverse order\n playwrightHandle?.dispose();\n testEnvHandle?.dispose();\n cryptoHandle.dispose();\n timersHandle.dispose();\n encodingHandle.dispose();\n consoleHandle.dispose();\n fsHandle?.dispose();\n fetchHandle?.dispose();\n\n // Drain pending jobs again\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Clean up handles\n cleanupUnmarshaledHandles(context);\n clearAllInstanceState();\n\n // Clear globals to help GC\n try {\n const clearGlobals = context.evalCode(`\n (function() {\n const keysToDelete = Object.keys(globalThis).filter(k =>\n k !== 'globalThis' && k !== 'undefined' && k !== 'NaN' && k !== 'Infinity'\n );\n for (const key of keysToDelete) {\n try { globalThis[key] = undefined; } catch (e) {}\n }\n for (const key of keysToDelete) {\n try { delete globalThis[key]; } catch (e) {}\n }\n return keysToDelete.length;\n })()\n `);\n if (clearGlobals.error) {\n clearGlobals.error.dispose();\n } else {\n clearGlobals.value.dispose();\n }\n } catch {\n // Ignore errors during cleanup\n }\n\n // Final drain\n for (let i = 0; i < 100; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n coreHandle.dispose();\n context.dispose();\n\n // Only dispose runtime if it was created separately (not via newAsyncContext)\n if (!isAsyncContext) {\n runtime.dispose();\n }\n },\n };\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "AFE921F6D82B637A64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "3637BBAA533553AB64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-runtime",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "type": "commonjs"
5
5
  }
@@ -134,12 +134,45 @@ async function createRuntime(options) {
134
134
  });
135
135
  }
136
136
  const runtimeFetchHandle = {
137
- async dispatchRequest(request, _options) {
137
+ async dispatchRequest(request) {
138
138
  if (!fetchHandle) {
139
139
  throw new Error("Fetch not configured");
140
140
  }
141
141
  return fetchHandle.dispatchRequest(request);
142
142
  },
143
+ getUpgradeRequest() {
144
+ return fetchHandle?.getUpgradeRequest() ?? null;
145
+ },
146
+ dispatchWebSocketOpen(connectionId) {
147
+ if (!fetchHandle) {
148
+ throw new Error("Fetch not configured");
149
+ }
150
+ fetchHandle.dispatchWebSocketOpen(connectionId);
151
+ },
152
+ dispatchWebSocketMessage(connectionId, message) {
153
+ if (!fetchHandle) {
154
+ throw new Error("Fetch not configured");
155
+ }
156
+ fetchHandle.dispatchWebSocketMessage(connectionId, message);
157
+ },
158
+ dispatchWebSocketClose(connectionId, code, reason) {
159
+ if (!fetchHandle) {
160
+ throw new Error("Fetch not configured");
161
+ }
162
+ fetchHandle.dispatchWebSocketClose(connectionId, code, reason);
163
+ },
164
+ dispatchWebSocketError(connectionId, error) {
165
+ if (!fetchHandle) {
166
+ throw new Error("Fetch not configured");
167
+ }
168
+ fetchHandle.dispatchWebSocketError(connectionId, error);
169
+ },
170
+ onWebSocketCommand(callback) {
171
+ if (!fetchHandle) {
172
+ throw new Error("Fetch not configured");
173
+ }
174
+ return fetchHandle.onWebSocketCommand(callback);
175
+ },
143
176
  hasServeHandler() {
144
177
  return fetchHandle?.hasServeHandler() ?? false;
145
178
  },
@@ -321,4 +354,4 @@ export {
321
354
  createRuntime
322
355
  };
323
356
 
324
- //# debugId=85ADF3688BD4BFEF64756E2164756E21
357
+ //# debugId=714B381004852A8064756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/create-runtime.ts"],
4
4
  "sourcesContent": [
5
- "import {\n getQuickJS,\n newAsyncContext,\n type QuickJSAsyncContext,\n type QuickJSAsyncRuntime,\n type QuickJSContext,\n type QuickJSRuntime,\n} from \"quickjs-emscripten\";\nimport {\n setupCore,\n createStateMap,\n cleanupUnmarshaledHandles,\n clearAllInstanceState,\n defineFunction,\n defineAsyncFunction,\n type StateMap,\n type CoreHandle,\n} from \"@ricsam/quickjs-core\";\nimport {\n setupFetch,\n type SetupFetchOptions,\n type FetchHandle,\n} from \"@ricsam/quickjs-fetch\";\nimport {\n setupFs,\n type SetupFsOptions,\n type FsHandle,\n} from \"@ricsam/quickjs-fs\";\nimport {\n setupConsole,\n type ConsoleHandle,\n type ConsoleEntry,\n type ConsoleCallbacks,\n} from \"@ricsam/quickjs-console\";\nimport {\n setupEncoding,\n type EncodingHandle,\n} from \"@ricsam/quickjs-encoding\";\nimport {\n setupTimers,\n type TimersHandle,\n} from \"@ricsam/quickjs-timers\";\nimport {\n setupCrypto,\n type CryptoHandle,\n} from \"@ricsam/quickjs-crypto\";\nimport {\n setupTestEnvironment,\n type TestEnvironmentHandle,\n type RunResults,\n type TestEvent,\n} from \"@ricsam/quickjs-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightHandle,\n type PlaywrightOptions,\n type PlaywrightEvent,\n type BrowserConsoleLogEntry,\n type NetworkRequestInfo,\n type NetworkResponseInfo,\n} from \"@ricsam/quickjs-playwright\";\n\n// Re-export types\nexport type { ConsoleEntry, ConsoleCallbacks, TestEvent, PlaywrightEvent };\n\n/**\n * Module loader callback type.\n * Called when the runtime imports a module dynamically.\n * Returns the JavaScript source code for the module.\n */\nexport type ModuleLoaderCallback = (\n moduleName: string\n) => string | Promise<string>;\n\n/**\n * A custom function that can be called from within the runtime.\n */\nexport type CustomFunction = (...args: unknown[]) => unknown | Promise<unknown>;\n\n/**\n * Custom function definition with metadata.\n * Requires explicit `async` property to be clear about function behavior.\n */\nexport interface CustomFunctionDefinition {\n /** The function implementation */\n fn: CustomFunction;\n /** Whether the function is async (returns a Promise) */\n async: boolean;\n}\n\n/**\n * Custom functions to register in the runtime.\n * Each function must be defined with explicit async property.\n *\n * @example\n * ```typescript\n * customFunctions: {\n * // Async function\n * hashPassword: {\n * fn: async (password) => bcrypt.hash(password, 10),\n * async: true,\n * },\n * // Sync function\n * getConfig: {\n * fn: () => ({ environment: \"production\" }),\n * async: false,\n * },\n * }\n * ```\n */\nexport type CustomFunctions = Record<string, CustomFunctionDefinition>;\n\n/**\n * Fetch callback type.\n */\nexport type FetchCallback = (request: Request) => Response | Promise<Response>;\n\n/**\n * Test environment options.\n */\nexport interface TestEnvironmentOptions {\n /** Event callback for test events */\n onEvent?: (event: TestEvent) => void;\n /** Default test timeout in milliseconds */\n testTimeout?: number;\n}\n\n/**\n * Options for creating a runtime.\n */\nexport interface RuntimeOptions {\n /** Memory limit in megabytes (optional) */\n memoryLimitMB?: number;\n /** Console callback handlers */\n console?: ConsoleCallbacks;\n /** Fetch callback handler */\n fetch?: FetchCallback;\n /** File system options */\n fs?: SetupFsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the runtime */\n customFunctions?: CustomFunctions;\n /** Current working directory for path operations. Defaults to \"/\" */\n cwd?: string;\n /** Test environment options. Set to true for defaults, or provide options. */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options for browser automation */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(request: Request, options?: { timeout?: number }): Promise<Response>;\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test operations.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests have been registered */\n hasTests(): boolean;\n /** Get the number of registered tests */\n getTestCount(): number;\n /** Reset test state (clear registered tests) */\n reset(): void;\n}\n\n/**\n * Collected playwright data.\n */\nexport interface CollectedData {\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Runtime playwright handle - provides access to playwright data.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser logs and network data */\n getCollectedData(): CollectedData;\n /** Clear all collected data */\n clearCollectedData(): void;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the runtime.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filename?: string): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test operations */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to browser automation data */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n/**\n * Create a fully configured QuickJS runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers.\n * Supports ES modules with custom module loader and custom host functions.\n *\n * @example\n * ```typescript\n * const runtime = await createRuntime({\n * console: { onEntry: (e) => console.log(\"[sandbox]\", e) },\n * fetch: async (request) => fetch(request),\n * moduleLoader: async (name) => {\n * if (name === \"@/utils\") {\n * return `export const add = (a, b) => a + b;`;\n * }\n * throw new Error(`Unknown module: ${name}`);\n * },\n * customFunctions: {\n * hashPassword: {\n * fn: async (pw) => Bun.password.hash(pw),\n * async: true,\n * },\n * },\n * });\n *\n * await runtime.eval(`\n * import { add } from \"@/utils\";\n * const hash = await hashPassword(\"secret\");\n * console.log(add(1, 2), hash);\n * `);\n *\n * await runtime.dispose();\n * ```\n */\nexport async function createRuntime(\n options?: RuntimeOptions\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Determine if we need async context (for async module loader)\n const needsAsync = opts.moduleLoader !== undefined;\n\n let context: QuickJSContext | QuickJSAsyncContext;\n let runtime: QuickJSRuntime | QuickJSAsyncRuntime;\n let isAsyncContext = false;\n\n if (needsAsync) {\n // Create async context for module loading support\n const asyncContext = await newAsyncContext();\n context = asyncContext;\n runtime = asyncContext.runtime;\n isAsyncContext = true;\n\n // Set up module loader\n if (opts.moduleLoader) {\n const moduleLoader = opts.moduleLoader;\n (runtime as QuickJSAsyncRuntime).setModuleLoader(async (moduleName: string) => {\n try {\n const code = await moduleLoader(moduleName);\n return code;\n } catch (error) {\n // Return error in SuccessOrFail format\n return { error: error as Error };\n }\n });\n }\n } else {\n // Create sync context\n const QuickJS = await getQuickJS();\n runtime = QuickJS.newRuntime();\n context = runtime.newContext();\n }\n\n // Set memory limit if specified\n if (opts.memoryLimitMB) {\n runtime.setMemoryLimit(opts.memoryLimitMB * 1024 * 1024);\n }\n\n // Create shared state\n const stateMap = createStateMap();\n\n // Setup core APIs\n const coreHandle = setupCore(context, { stateMap });\n\n // Setup console\n const consoleHandle = setupConsole(context, {\n ...opts.console,\n stateMap,\n coreHandle,\n });\n\n // Setup encoding (btoa/atob)\n const encodingHandle = setupEncoding(context, { stateMap, coreHandle });\n\n // Setup timers\n const timersHandle = setupTimers(context, { stateMap, coreHandle });\n\n // Setup crypto\n const cryptoHandle = setupCrypto(context, { stateMap, coreHandle });\n\n // Setup fetch if callback provided\n let fetchHandle: FetchHandle | undefined;\n if (opts.fetch) {\n const fetchCallback = opts.fetch;\n fetchHandle = setupFetch(context, {\n stateMap,\n coreHandle,\n onFetch: async (request: Request) => {\n return Promise.resolve(fetchCallback(request));\n },\n });\n } else {\n // Still setup fetch for serve() support, but without fetch() function\n fetchHandle = setupFetch(context, { stateMap, coreHandle });\n }\n\n // Setup file system if provided\n let fsHandle: FsHandle | undefined;\n if (opts.fs) {\n fsHandle = setupFs(context, {\n ...opts.fs,\n stateMap,\n coreHandle,\n });\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n for (const [name, def] of Object.entries(opts.customFunctions)) {\n if (def.async) {\n const fn = defineAsyncFunction(context, name, async (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n } else {\n const fn = defineFunction(context, name, (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n }\n }\n }\n\n // Setup test environment if enabled\n let testEnvHandle: TestEnvironmentHandle | undefined;\n if (opts.testEnvironment) {\n const testEnvOpts = typeof opts.testEnvironment === \"object\" ? opts.testEnvironment : {};\n testEnvHandle = setupTestEnvironment(context, {\n stateMap,\n coreHandle,\n onEvent: testEnvOpts.onEvent,\n });\n }\n\n // Setup playwright if provided\n let playwrightHandle: PlaywrightHandle | undefined;\n if (opts.playwright) {\n playwrightHandle = setupPlaywright(context, {\n ...opts.playwright,\n stateMap,\n coreHandle,\n consoleCallbacks: opts.playwright.console ? opts.console : undefined,\n });\n }\n\n // Create fetch handle wrapper\n const runtimeFetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(request: Request, _options?: { timeout?: number }): Promise<Response> {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n // Note: timeout option not yet implemented in underlying FetchHandle\n return fetchHandle.dispatchRequest(request);\n },\n hasServeHandler() {\n return fetchHandle?.hasServeHandler() ?? false;\n },\n hasActiveConnections() {\n return fetchHandle?.hasActiveConnections() ?? false;\n },\n };\n\n // Create timers handle wrapper\n const runtimeTimersHandle: RuntimeTimersHandle = {\n clearAll() {\n timersHandle.clearAll();\n },\n };\n\n // Create console handle wrapper\n const runtimeConsoleHandle: RuntimeConsoleHandle = {\n reset() {\n consoleHandle.reset();\n },\n getTimers() {\n return consoleHandle.getTimers();\n },\n getCounters() {\n return consoleHandle.getCounters();\n },\n getGroupDepth() {\n return consoleHandle.getGroupDepth();\n },\n };\n\n // Create test environment handle wrapper\n const runtimeTestEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!testEnvHandle) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return testEnvHandle.run();\n },\n hasTests() {\n return testEnvHandle?.hasTests() ?? false;\n },\n getTestCount() {\n return testEnvHandle?.getTestCount() ?? 0;\n },\n reset() {\n testEnvHandle?.reset();\n },\n };\n\n // Create playwright handle wrapper\n const runtimePlaywrightHandle: RuntimePlaywrightHandle = {\n getCollectedData() {\n if (!playwrightHandle) {\n return { browserConsoleLogs: [], networkRequests: [], networkResponses: [] };\n }\n return {\n browserConsoleLogs: playwrightHandle.getBrowserConsoleLogs(),\n networkRequests: playwrightHandle.getNetworkRequests(),\n networkResponses: playwrightHandle.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n playwrightHandle?.clearCollected();\n },\n };\n\n return {\n id,\n fetch: runtimeFetchHandle,\n timers: runtimeTimersHandle,\n console: runtimeConsoleHandle,\n testEnvironment: runtimeTestEnvironmentHandle,\n playwright: runtimePlaywrightHandle,\n\n async eval(code: string, filename?: string): Promise<void> {\n if (isAsyncContext) {\n // Use evalCodeAsync for async context (supports top-level await and async module loading)\n const asyncContext = context as QuickJSAsyncContext;\n const result = await asyncContext.evalCodeAsync(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle module exports (could be a promise for top-level await)\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute pending jobs\n runtime.executePendingJobs();\n } else {\n // Use evalCode for sync context\n const result = context.evalCode(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle async module result\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n // Execute pending jobs\n runtime.executePendingJobs();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute any remaining pending jobs\n runtime.executePendingJobs();\n }\n },\n\n async dispose(): Promise<void> {\n // Drain pending jobs before disposal\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Dispose handles in reverse order\n playwrightHandle?.dispose();\n testEnvHandle?.dispose();\n cryptoHandle.dispose();\n timersHandle.dispose();\n encodingHandle.dispose();\n consoleHandle.dispose();\n fsHandle?.dispose();\n fetchHandle?.dispose();\n\n // Drain pending jobs again\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Clean up handles\n cleanupUnmarshaledHandles(context);\n clearAllInstanceState();\n\n // Clear globals to help GC\n try {\n const clearGlobals = context.evalCode(`\n (function() {\n const keysToDelete = Object.keys(globalThis).filter(k =>\n k !== 'globalThis' && k !== 'undefined' && k !== 'NaN' && k !== 'Infinity'\n );\n for (const key of keysToDelete) {\n try { globalThis[key] = undefined; } catch (e) {}\n }\n for (const key of keysToDelete) {\n try { delete globalThis[key]; } catch (e) {}\n }\n return keysToDelete.length;\n })()\n `);\n if (clearGlobals.error) {\n clearGlobals.error.dispose();\n } else {\n clearGlobals.value.dispose();\n }\n } catch {\n // Ignore errors during cleanup\n }\n\n // Final drain\n for (let i = 0; i < 100; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n coreHandle.dispose();\n context.dispose();\n\n // Only dispose runtime if it was created separately (not via newAsyncContext)\n if (!isAsyncContext) {\n runtime.dispose();\n }\n },\n };\n}\n"
5
+ "import {\n getQuickJS,\n newAsyncContext,\n type QuickJSAsyncContext,\n type QuickJSAsyncRuntime,\n type QuickJSContext,\n type QuickJSRuntime,\n} from \"quickjs-emscripten\";\nimport {\n setupCore,\n createStateMap,\n cleanupUnmarshaledHandles,\n clearAllInstanceState,\n defineFunction,\n defineAsyncFunction,\n type StateMap,\n type CoreHandle,\n} from \"@ricsam/quickjs-core\";\nimport {\n setupFetch,\n type SetupFetchOptions,\n type FetchHandle,\n type UpgradeRequest,\n type WebSocketCommand,\n} from \"@ricsam/quickjs-fetch\";\nimport {\n setupFs,\n type SetupFsOptions,\n type FsHandle,\n} from \"@ricsam/quickjs-fs\";\nimport {\n setupConsole,\n type ConsoleHandle,\n type ConsoleEntry,\n type ConsoleCallbacks,\n} from \"@ricsam/quickjs-console\";\nimport {\n setupEncoding,\n type EncodingHandle,\n} from \"@ricsam/quickjs-encoding\";\nimport {\n setupTimers,\n type TimersHandle,\n} from \"@ricsam/quickjs-timers\";\nimport {\n setupCrypto,\n type CryptoHandle,\n} from \"@ricsam/quickjs-crypto\";\nimport {\n setupTestEnvironment,\n type TestEnvironmentHandle,\n type RunResults,\n type TestEvent,\n} from \"@ricsam/quickjs-test-environment\";\nimport {\n setupPlaywright,\n type PlaywrightHandle,\n type PlaywrightOptions,\n type PlaywrightEvent,\n type BrowserConsoleLogEntry,\n type NetworkRequestInfo,\n type NetworkResponseInfo,\n} from \"@ricsam/quickjs-playwright\";\n\n// Re-export types\nexport type { ConsoleEntry, ConsoleCallbacks, TestEvent, PlaywrightEvent };\n\n/**\n * Module loader callback type.\n * Called when the runtime imports a module dynamically.\n * Returns the JavaScript source code for the module.\n */\nexport type ModuleLoaderCallback = (\n moduleName: string\n) => string | Promise<string>;\n\n/**\n * A custom function that can be called from within the runtime.\n */\nexport type CustomFunction = (...args: unknown[]) => unknown | Promise<unknown>;\n\n/**\n * Custom function definition with metadata.\n * Requires explicit `async` property to be clear about function behavior.\n */\nexport interface CustomFunctionDefinition {\n /** The function implementation */\n fn: CustomFunction;\n /** Whether the function is async (returns a Promise) */\n async: boolean;\n}\n\n/**\n * Custom functions to register in the runtime.\n * Each function must be defined with explicit async property.\n *\n * @example\n * ```typescript\n * customFunctions: {\n * // Async function\n * hashPassword: {\n * fn: async (password) => bcrypt.hash(password, 10),\n * async: true,\n * },\n * // Sync function\n * getConfig: {\n * fn: () => ({ environment: \"production\" }),\n * async: false,\n * },\n * }\n * ```\n */\nexport type CustomFunctions = Record<string, CustomFunctionDefinition>;\n\n/**\n * Fetch callback type.\n */\nexport type FetchCallback = (request: Request) => Response | Promise<Response>;\n\n/**\n * Test environment options.\n */\nexport interface TestEnvironmentOptions {\n /** Event callback for test events */\n onEvent?: (event: TestEvent) => void;\n /** Default test timeout in milliseconds */\n testTimeout?: number;\n}\n\n/**\n * Options for creating a runtime.\n */\nexport interface RuntimeOptions {\n /** Memory limit in megabytes (optional) */\n memoryLimitMB?: number;\n /** Console callback handlers */\n console?: ConsoleCallbacks;\n /** Fetch callback handler */\n fetch?: FetchCallback;\n /** File system options */\n fs?: SetupFsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the runtime */\n customFunctions?: CustomFunctions;\n /** Current working directory for path operations. Defaults to \"/\" */\n cwd?: string;\n /** Test environment options. Set to true for defaults, or provide options. */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options for browser automation */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Runtime fetch handle - provides access to fetch/serve operations.\n */\nexport interface RuntimeFetchHandle {\n /** Dispatch HTTP request to serve() handler */\n dispatchRequest(request: Request): Promise<Response>;\n\n /**\n * Check if the last request resulted in an upgrade request\n * Must be called immediately after dispatchRequest()\n */\n getUpgradeRequest(): UpgradeRequest | null;\n\n /**\n * Dispatch WebSocket open event\n * @param connectionId The connectionId from getUpgradeRequest()\n */\n dispatchWebSocketOpen(connectionId: string): void;\n\n /**\n * Dispatch WebSocket message event\n */\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): void;\n\n /**\n * Dispatch WebSocket close event\n */\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): void;\n\n /**\n * Dispatch WebSocket error event\n */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n\n /**\n * Register a callback for outgoing WebSocket messages/commands\n * Called when QuickJS code calls ws.send() or ws.close()\n */\n onWebSocketCommand(callback: (command: WebSocketCommand) => void): () => void;\n\n /** Check if serve() has been called */\n hasServeHandler(): boolean;\n\n /** Check if there are active WebSocket connections */\n hasActiveConnections(): boolean;\n}\n\n/**\n * Runtime timers handle - provides access to timer operations.\n */\nexport interface RuntimeTimersHandle {\n /** Clear all pending timers */\n clearAll(): void;\n}\n\n/**\n * Runtime console handle - provides access to console state.\n */\nexport interface RuntimeConsoleHandle {\n /** Reset all console state (timers, counters, group depth) */\n reset(): void;\n /** Get console.time() timers */\n getTimers(): Map<string, number>;\n /** Get console.count() counters */\n getCounters(): Map<string, number>;\n /** Get current console.group() nesting depth */\n getGroupDepth(): number;\n}\n\n/**\n * Runtime test environment handle - provides access to test operations.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests have been registered */\n hasTests(): boolean;\n /** Get the number of registered tests */\n getTestCount(): number;\n /** Reset test state (clear registered tests) */\n reset(): void;\n}\n\n/**\n * Collected playwright data.\n */\nexport interface CollectedData {\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Runtime playwright handle - provides access to playwright data.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser logs and network data */\n getCollectedData(): CollectedData;\n /** Clear all collected data */\n clearCollectedData(): void;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the runtime.\n */\nexport interface RuntimeHandle {\n /** Unique runtime identifier */\n readonly id: string;\n /** Execute code as ES module (supports top-level await) */\n eval(code: string, filename?: string): Promise<void>;\n /** Dispose all resources */\n dispose(): Promise<void>;\n\n /** Fetch handle - access to fetch/serve operations */\n readonly fetch: RuntimeFetchHandle;\n /** Timers handle - access to timer operations */\n readonly timers: RuntimeTimersHandle;\n /** Console handle - access to console state */\n readonly console: RuntimeConsoleHandle;\n /** Test environment handle - access to test operations */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to browser automation data */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n/**\n * Create a fully configured QuickJS runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers.\n * Supports ES modules with custom module loader and custom host functions.\n *\n * @example\n * ```typescript\n * const runtime = await createRuntime({\n * console: { onEntry: (e) => console.log(\"[sandbox]\", e) },\n * fetch: async (request) => fetch(request),\n * moduleLoader: async (name) => {\n * if (name === \"@/utils\") {\n * return `export const add = (a, b) => a + b;`;\n * }\n * throw new Error(`Unknown module: ${name}`);\n * },\n * customFunctions: {\n * hashPassword: {\n * fn: async (pw) => Bun.password.hash(pw),\n * async: true,\n * },\n * },\n * });\n *\n * await runtime.eval(`\n * import { add } from \"@/utils\";\n * const hash = await hashPassword(\"secret\");\n * console.log(add(1, 2), hash);\n * `);\n *\n * await runtime.dispose();\n * ```\n */\nexport async function createRuntime(\n options?: RuntimeOptions\n): Promise<RuntimeHandle> {\n const opts = options ?? {};\n\n // Generate unique ID\n const id = crypto.randomUUID();\n\n // Determine if we need async context (for async module loader)\n const needsAsync = opts.moduleLoader !== undefined;\n\n let context: QuickJSContext | QuickJSAsyncContext;\n let runtime: QuickJSRuntime | QuickJSAsyncRuntime;\n let isAsyncContext = false;\n\n if (needsAsync) {\n // Create async context for module loading support\n const asyncContext = await newAsyncContext();\n context = asyncContext;\n runtime = asyncContext.runtime;\n isAsyncContext = true;\n\n // Set up module loader\n if (opts.moduleLoader) {\n const moduleLoader = opts.moduleLoader;\n (runtime as QuickJSAsyncRuntime).setModuleLoader(async (moduleName: string) => {\n try {\n const code = await moduleLoader(moduleName);\n return code;\n } catch (error) {\n // Return error in SuccessOrFail format\n return { error: error as Error };\n }\n });\n }\n } else {\n // Create sync context\n const QuickJS = await getQuickJS();\n runtime = QuickJS.newRuntime();\n context = runtime.newContext();\n }\n\n // Set memory limit if specified\n if (opts.memoryLimitMB) {\n runtime.setMemoryLimit(opts.memoryLimitMB * 1024 * 1024);\n }\n\n // Create shared state\n const stateMap = createStateMap();\n\n // Setup core APIs\n const coreHandle = setupCore(context, { stateMap });\n\n // Setup console\n const consoleHandle = setupConsole(context, {\n ...opts.console,\n stateMap,\n coreHandle,\n });\n\n // Setup encoding (btoa/atob)\n const encodingHandle = setupEncoding(context, { stateMap, coreHandle });\n\n // Setup timers\n const timersHandle = setupTimers(context, { stateMap, coreHandle });\n\n // Setup crypto\n const cryptoHandle = setupCrypto(context, { stateMap, coreHandle });\n\n // Setup fetch if callback provided\n let fetchHandle: FetchHandle | undefined;\n if (opts.fetch) {\n const fetchCallback = opts.fetch;\n fetchHandle = setupFetch(context, {\n stateMap,\n coreHandle,\n onFetch: async (request: Request) => {\n return Promise.resolve(fetchCallback(request));\n },\n });\n } else {\n // Still setup fetch for serve() support, but without fetch() function\n fetchHandle = setupFetch(context, { stateMap, coreHandle });\n }\n\n // Setup file system if provided\n let fsHandle: FsHandle | undefined;\n if (opts.fs) {\n fsHandle = setupFs(context, {\n ...opts.fs,\n stateMap,\n coreHandle,\n });\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n for (const [name, def] of Object.entries(opts.customFunctions)) {\n if (def.async) {\n const fn = defineAsyncFunction(context, name, async (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n } else {\n const fn = defineFunction(context, name, (...args: unknown[]) => {\n return def.fn(...args);\n });\n context.setProp(context.global, name, fn);\n fn.dispose();\n }\n }\n }\n\n // Setup test environment if enabled\n let testEnvHandle: TestEnvironmentHandle | undefined;\n if (opts.testEnvironment) {\n const testEnvOpts = typeof opts.testEnvironment === \"object\" ? opts.testEnvironment : {};\n testEnvHandle = setupTestEnvironment(context, {\n stateMap,\n coreHandle,\n onEvent: testEnvOpts.onEvent,\n });\n }\n\n // Setup playwright if provided\n let playwrightHandle: PlaywrightHandle | undefined;\n if (opts.playwright) {\n playwrightHandle = setupPlaywright(context, {\n ...opts.playwright,\n stateMap,\n coreHandle,\n consoleCallbacks: opts.playwright.console ? opts.console : undefined,\n });\n }\n\n // Create fetch handle wrapper\n const runtimeFetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(request: Request): Promise<Response> {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n return fetchHandle.dispatchRequest(request);\n },\n getUpgradeRequest() {\n return fetchHandle?.getUpgradeRequest() ?? null;\n },\n dispatchWebSocketOpen(connectionId: string) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n fetchHandle.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (command: WebSocketCommand) => void) {\n if (!fetchHandle) {\n throw new Error(\"Fetch not configured\");\n }\n return fetchHandle.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n return fetchHandle?.hasServeHandler() ?? false;\n },\n hasActiveConnections() {\n return fetchHandle?.hasActiveConnections() ?? false;\n },\n };\n\n // Create timers handle wrapper\n const runtimeTimersHandle: RuntimeTimersHandle = {\n clearAll() {\n timersHandle.clearAll();\n },\n };\n\n // Create console handle wrapper\n const runtimeConsoleHandle: RuntimeConsoleHandle = {\n reset() {\n consoleHandle.reset();\n },\n getTimers() {\n return consoleHandle.getTimers();\n },\n getCounters() {\n return consoleHandle.getCounters();\n },\n getGroupDepth() {\n return consoleHandle.getGroupDepth();\n },\n };\n\n // Create test environment handle wrapper\n const runtimeTestEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!testEnvHandle) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return testEnvHandle.run();\n },\n hasTests() {\n return testEnvHandle?.hasTests() ?? false;\n },\n getTestCount() {\n return testEnvHandle?.getTestCount() ?? 0;\n },\n reset() {\n testEnvHandle?.reset();\n },\n };\n\n // Create playwright handle wrapper\n const runtimePlaywrightHandle: RuntimePlaywrightHandle = {\n getCollectedData() {\n if (!playwrightHandle) {\n return { browserConsoleLogs: [], networkRequests: [], networkResponses: [] };\n }\n return {\n browserConsoleLogs: playwrightHandle.getBrowserConsoleLogs(),\n networkRequests: playwrightHandle.getNetworkRequests(),\n networkResponses: playwrightHandle.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n playwrightHandle?.clearCollected();\n },\n };\n\n return {\n id,\n fetch: runtimeFetchHandle,\n timers: runtimeTimersHandle,\n console: runtimeConsoleHandle,\n testEnvironment: runtimeTestEnvironmentHandle,\n playwright: runtimePlaywrightHandle,\n\n async eval(code: string, filename?: string): Promise<void> {\n if (isAsyncContext) {\n // Use evalCodeAsync for async context (supports top-level await and async module loading)\n const asyncContext = context as QuickJSAsyncContext;\n const result = await asyncContext.evalCodeAsync(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle module exports (could be a promise for top-level await)\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute pending jobs\n runtime.executePendingJobs();\n } else {\n // Use evalCode for sync context\n const result = context.evalCode(code, filename ?? \"<eval>\", {\n type: \"module\",\n });\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Eval failed: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n\n // Handle async module result\n const promiseState = context.getPromiseState(result.value);\n if (promiseState.type === \"pending\") {\n const resolved = await context.resolvePromise(result.value);\n result.value.dispose();\n\n // Execute pending jobs\n runtime.executePendingJobs();\n\n if (resolved.error) {\n const err = context.dump(resolved.error);\n resolved.error.dispose();\n throw new Error(`Promise rejected: ${typeof err === \"string\" ? err : JSON.stringify(err)}`);\n }\n resolved.value.dispose();\n } else {\n result.value.dispose();\n }\n\n // Execute any remaining pending jobs\n runtime.executePendingJobs();\n }\n },\n\n async dispose(): Promise<void> {\n // Drain pending jobs before disposal\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Dispose handles in reverse order\n playwrightHandle?.dispose();\n testEnvHandle?.dispose();\n cryptoHandle.dispose();\n timersHandle.dispose();\n encodingHandle.dispose();\n consoleHandle.dispose();\n fsHandle?.dispose();\n fetchHandle?.dispose();\n\n // Drain pending jobs again\n for (let i = 0; i < 1000; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n // Clean up handles\n cleanupUnmarshaledHandles(context);\n clearAllInstanceState();\n\n // Clear globals to help GC\n try {\n const clearGlobals = context.evalCode(`\n (function() {\n const keysToDelete = Object.keys(globalThis).filter(k =>\n k !== 'globalThis' && k !== 'undefined' && k !== 'NaN' && k !== 'Infinity'\n );\n for (const key of keysToDelete) {\n try { globalThis[key] = undefined; } catch (e) {}\n }\n for (const key of keysToDelete) {\n try { delete globalThis[key]; } catch (e) {}\n }\n return keysToDelete.length;\n })()\n `);\n if (clearGlobals.error) {\n clearGlobals.error.dispose();\n } else {\n clearGlobals.value.dispose();\n }\n } catch {\n // Ignore errors during cleanup\n }\n\n // Final drain\n for (let i = 0; i < 100; i++) {\n if (!runtime.hasPendingJob()) break;\n const result = runtime.executePendingJobs();\n if (result.error) result.error.dispose();\n }\n\n coreHandle.dispose();\n context.dispose();\n\n // Only dispose runtime if it was created separately (not via newAsyncContext)\n if (!isAsyncContext) {\n runtime.dispose();\n }\n },\n };\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "85ADF3688BD4BFEF64756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "714B381004852A8064756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-runtime",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "type": "module"
5
5
  }
@@ -1,3 +1,4 @@
1
+ import { type UpgradeRequest, type WebSocketCommand } from "@ricsam/quickjs-fetch";
1
2
  import { type SetupFsOptions } from "@ricsam/quickjs-fs";
2
3
  import { type ConsoleEntry, type ConsoleCallbacks } from "@ricsam/quickjs-console";
3
4
  import { type RunResults, type TestEvent } from "@ricsam/quickjs-test-environment";
@@ -85,9 +86,34 @@ export interface RuntimeOptions {
85
86
  */
86
87
  export interface RuntimeFetchHandle {
87
88
  /** Dispatch HTTP request to serve() handler */
88
- dispatchRequest(request: Request, options?: {
89
- timeout?: number;
90
- }): Promise<Response>;
89
+ dispatchRequest(request: Request): Promise<Response>;
90
+ /**
91
+ * Check if the last request resulted in an upgrade request
92
+ * Must be called immediately after dispatchRequest()
93
+ */
94
+ getUpgradeRequest(): UpgradeRequest | null;
95
+ /**
96
+ * Dispatch WebSocket open event
97
+ * @param connectionId The connectionId from getUpgradeRequest()
98
+ */
99
+ dispatchWebSocketOpen(connectionId: string): void;
100
+ /**
101
+ * Dispatch WebSocket message event
102
+ */
103
+ dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): void;
104
+ /**
105
+ * Dispatch WebSocket close event
106
+ */
107
+ dispatchWebSocketClose(connectionId: string, code: number, reason: string): void;
108
+ /**
109
+ * Dispatch WebSocket error event
110
+ */
111
+ dispatchWebSocketError(connectionId: string, error: Error): void;
112
+ /**
113
+ * Register a callback for outgoing WebSocket messages/commands
114
+ * Called when QuickJS code calls ws.send() or ws.close()
115
+ */
116
+ onWebSocketCommand(callback: (command: WebSocketCommand) => void): () => void;
91
117
  /** Check if serve() has been called */
92
118
  hasServeHandler(): boolean;
93
119
  /** Check if there are active WebSocket connections */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/quickjs-runtime",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "main": "./dist/cjs/index.cjs",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {