@ricsam/isolate-runtime 0.1.8 → 0.1.10
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.
- package/dist/cjs/index.cjs +33 -12
- package/dist/cjs/index.cjs.map +3 -3
- package/dist/cjs/internal.cjs +2 -4
- package/dist/cjs/internal.cjs.map +2 -2
- package/dist/cjs/package.json +1 -1
- package/dist/mjs/index.mjs +44 -12
- package/dist/mjs/index.mjs.map +3 -3
- package/dist/mjs/internal.mjs +1 -2
- package/dist/mjs/internal.mjs.map +2 -2
- package/dist/mjs/package.json +1 -1
- package/dist/types/index.d.ts +8 -7
- package/package.json +1 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
(function(exports, require, module, __filename, __dirname) {var __create = Object.create;
|
|
1
|
+
var __create = Object.create;
|
|
3
2
|
var __getProtoOf = Object.getPrototypeOf;
|
|
4
3
|
var __defProp = Object.defineProperty;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -60,7 +59,7 @@ var __export = (target, all) => {
|
|
|
60
59
|
// packages/runtime/src/index.ts
|
|
61
60
|
var exports_src = {};
|
|
62
61
|
__export(exports_src, {
|
|
63
|
-
simpleConsoleHandler: () =>
|
|
62
|
+
simpleConsoleHandler: () => import_utils.simpleConsoleHandler,
|
|
64
63
|
setupTimers: () => import_isolate_timers2.setupTimers,
|
|
65
64
|
setupTestEnvironment: () => import_isolate_test_environment2.setupTestEnvironment,
|
|
66
65
|
setupPlaywright: () => import_isolate_playwright2.setupPlaywright,
|
|
@@ -92,6 +91,7 @@ var import_isolate_test_environment = require("@ricsam/isolate-test-environment"
|
|
|
92
91
|
var import_isolate_playwright = require("@ricsam/isolate-playwright");
|
|
93
92
|
var import_isolate_core2 = require("@ricsam/isolate-core");
|
|
94
93
|
var import_isolate_console2 = require("@ricsam/isolate-console");
|
|
94
|
+
var import_utils = require("@ricsam/isolate-console/utils");
|
|
95
95
|
var import_isolate_crypto2 = require("@ricsam/isolate-crypto");
|
|
96
96
|
var import_isolate_encoding2 = require("@ricsam/isolate-encoding");
|
|
97
97
|
var import_isolate_fetch2 = require("@ricsam/isolate-fetch");
|
|
@@ -110,7 +110,10 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
110
110
|
if (!def) {
|
|
111
111
|
return JSON.stringify({
|
|
112
112
|
ok: false,
|
|
113
|
-
error: {
|
|
113
|
+
error: {
|
|
114
|
+
message: `Custom function '${name}' not found`,
|
|
115
|
+
name: "Error"
|
|
116
|
+
}
|
|
114
117
|
});
|
|
115
118
|
}
|
|
116
119
|
const args = JSON.parse(argsJson);
|
|
@@ -131,7 +134,10 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
131
134
|
if (!def || def.type !== "asyncIterator") {
|
|
132
135
|
return JSON.stringify({
|
|
133
136
|
ok: false,
|
|
134
|
-
error: {
|
|
137
|
+
error: {
|
|
138
|
+
message: `Async iterator function '${name}' not found`,
|
|
139
|
+
name: "Error"
|
|
140
|
+
}
|
|
135
141
|
});
|
|
136
142
|
}
|
|
137
143
|
try {
|
|
@@ -155,7 +161,10 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
155
161
|
if (!session) {
|
|
156
162
|
return JSON.stringify({
|
|
157
163
|
ok: false,
|
|
158
|
-
error: {
|
|
164
|
+
error: {
|
|
165
|
+
message: `Iterator session ${iteratorId} not found`,
|
|
166
|
+
name: "Error"
|
|
167
|
+
}
|
|
159
168
|
});
|
|
160
169
|
}
|
|
161
170
|
try {
|
|
@@ -163,7 +172,11 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
163
172
|
if (result.done) {
|
|
164
173
|
iteratorSessions.delete(iteratorId);
|
|
165
174
|
}
|
|
166
|
-
return JSON.stringify({
|
|
175
|
+
return JSON.stringify({
|
|
176
|
+
ok: true,
|
|
177
|
+
done: result.done,
|
|
178
|
+
value: result.value
|
|
179
|
+
});
|
|
167
180
|
} catch (error) {
|
|
168
181
|
const err = error;
|
|
169
182
|
iteratorSessions.delete(iteratorId);
|
|
@@ -199,15 +212,24 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
199
212
|
if (!session) {
|
|
200
213
|
return JSON.stringify({
|
|
201
214
|
ok: false,
|
|
202
|
-
error: {
|
|
215
|
+
error: {
|
|
216
|
+
message: `Iterator session ${iteratorId} not found`,
|
|
217
|
+
name: "Error"
|
|
218
|
+
}
|
|
203
219
|
});
|
|
204
220
|
}
|
|
205
221
|
try {
|
|
206
222
|
const errorData = JSON.parse(errorJson);
|
|
207
|
-
const error = Object.assign(new Error(errorData.message), {
|
|
223
|
+
const error = Object.assign(new Error(errorData.message), {
|
|
224
|
+
name: errorData.name
|
|
225
|
+
});
|
|
208
226
|
const result = await session.iterator.throw?.(error);
|
|
209
227
|
iteratorSessions.delete(iteratorId);
|
|
210
|
-
return JSON.stringify({
|
|
228
|
+
return JSON.stringify({
|
|
229
|
+
ok: true,
|
|
230
|
+
done: result?.done ?? true,
|
|
231
|
+
value: result?.value
|
|
232
|
+
});
|
|
211
233
|
} catch (error) {
|
|
212
234
|
const err = error;
|
|
213
235
|
iteratorSessions.delete(iteratorId);
|
|
@@ -525,6 +547,5 @@ async function createRuntime(options) {
|
|
|
525
547
|
}
|
|
526
548
|
};
|
|
527
549
|
}
|
|
528
|
-
})
|
|
529
550
|
|
|
530
|
-
//# debugId=
|
|
551
|
+
//# debugId=6D096DCA13F6758764756E2164756E21
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import ivm from \"isolated-vm\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport { setupPlaywright } from \"@ricsam/isolate-playwright\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type { FetchOptions, FetchHandle, DispatchRequestOptions, UpgradeRequest, WebSocketCommand } from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"@ricsam/isolate-test-environment\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightEvent,\n} from \"@ricsam/isolate-playwright\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\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 /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the isolate */\n customFunctions?: CustomFunctions;\n /** Current working directory for path.resolve(). Defaults to \"/\" */\n cwd?: string;\n /** Enable test environment (describe, it, expect, etc.) */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options - user provides page object */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Options for playwright in local runtime.\n */\nexport interface PlaywrightOptions {\n /** Playwright Page object - user launches browser and creates page */\n page: import(\"playwright\").Page;\n /** Default timeout for operations (default: 30000ms) */\n timeout?: number;\n /** Base URL for relative navigation */\n baseUrl?: string;\n /** If true, browser console logs are routed through console handler (or printed to stdout if no handler) */\n console?: boolean;\n /** Unified event callback for all playwright events */\n onEvent?: (event: PlaywrightEvent) => void;\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?: DispatchRequestOptions): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\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 * Timers fire automatically based on real time.\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 execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Options for eval() method.\n */\nexport interface EvalOptions {\n /** Filename for stack traces */\n filename?: string;\n /** Maximum execution time in milliseconds. If exceeded, throws a timeout error. */\n maxExecutionMs?: number;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\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, filenameOrOptions?: string | EvalOptions): 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 execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result\n const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: { message: `Custom function '${name}' not found`, name: \"Error\" },\n });\n }\n const args = JSON.parse(argsJson) as unknown[];\n try {\n const result = def.type === 'async' ? await def.fn(...args) : def.fn(...args);\n return JSON.stringify({ ok: true, value: result });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Iterator start: creates iterator, stores in session, returns iteratorId\n const iterStartRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def || def.type !== 'asyncIterator') {\n return JSON.stringify({\n ok: false,\n error: { message: `Async iterator function '${name}' not found`, name: \"Error\" },\n });\n }\n try {\n const args = JSON.parse(argsJson) as unknown[];\n const fn = def.fn as CustomAsyncGeneratorFunction;\n const iterator = fn(...args);\n const iteratorId = nextIteratorId++;\n iteratorSessions.set(iteratorId, { iterator });\n return JSON.stringify({ ok: true, iteratorId });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_start\", iterStartRef);\n\n // Iterator next: calls iterator.next(), returns {done, value}\n const iterNextRef = new ivm.Reference(\n async (iteratorId: number): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: { message: `Iterator session ${iteratorId} not found`, name: \"Error\" },\n });\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n iteratorSessions.delete(iteratorId);\n }\n return JSON.stringify({ ok: true, done: result.done, value: result.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_next\", iterNextRef);\n\n // Iterator return: calls iterator.return(), cleans up session\n const iterReturnRef = new ivm.Reference(\n async (iteratorId: number, valueJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({ ok: true, done: true, value: undefined });\n }\n try {\n const value = valueJson ? JSON.parse(valueJson) : undefined;\n const result = await session.iterator.return?.(value);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({ ok: true, done: true, value: result?.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_return\", iterReturnRef);\n\n // Iterator throw: calls iterator.throw(), cleans up session\n const iterThrowRef = new ivm.Reference(\n async (iteratorId: number, errorJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: { message: `Iterator session ${iteratorId} not found`, name: \"Error\" },\n });\n }\n try {\n const errorData = JSON.parse(errorJson) as { message: string; name: string };\n const error = Object.assign(new Error(errorData.message), { name: errorData.name });\n const result = await session.iterator.throw?.(error);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({ ok: true, done: result?.done ?? true, value: result?.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_throw\", iterThrowRef);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === 'async') {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === 'sync') {\n // Sync function: use applySyncPromise (to await the host) but wrap in regular function\n // The function blocks until the host responds, but returns the value directly (not a Promise)\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === 'asyncIterator') {\n // Async iterator function: returns an async iterable object\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const startResult = JSON.parse(__iter_start.applySyncPromise(undefined, [\"${name}\", JSON.stringify(args)]));\n if (!startResult.ok) {\n throw Object.assign(new Error(startResult.error.message), { name: startResult.error.name });\n }\n const iteratorId = startResult.iteratorId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const result = JSON.parse(__iter_next.applySyncPromise(undefined, [iteratorId]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n },\n async return(v) {\n const result = JSON.parse(__iter_return.applySyncPromise(undefined, [iteratorId, JSON.stringify(v)]));\n return { done: true, value: result.value };\n },\n async throw(e) {\n const result = JSON.parse(__iter_throw.applySyncPromise(undefined, [iteratorId, JSON.stringify({ message: e.message, name: e.name })]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n _referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Check cache first\n const cached = state.moduleCache.get(specifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(`No module loader registered. Cannot import: ${specifier}`);\n }\n\n // Invoke module loader to get source code\n const code = await state.moduleLoader(specifier);\n\n // Compile the module\n const mod = await state.isolate.compileModule(code, {\n filename: specifier,\n });\n\n // Cache before instantiation (for circular dependencies)\n state.moduleCache.set(specifier, mod);\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n return mod;\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\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 // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob)\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\" ? opts.testEnvironment : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(context, testEnvOptions);\n }\n\n // Setup playwright (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n args: event.args,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\n timeout: opts.playwright.timeout,\n baseUrl: opts.playwright.baseUrl,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n });\n }\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(request: Request, options?: DispatchRequestOptions): Promise<Response> {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n state.handles.console?.reset();\n },\n getTimers() {\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!state.handles.testEnvironment) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\n },\n hasTests(): boolean {\n if (!state.handles.testEnvironment) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n if (!state.handles.testEnvironment) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n if (!state.handles.playwright) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(code: string, filenameOrOptions?: string | EvalOptions): Promise<void> {\n // Parse options\n const options = typeof filenameOrOptions === 'string'\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(code, {\n filename: options?.filename ?? \"<eval>\",\n });\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n // Evaluate the module with optional timeout\n await mod.evaluate(options?.maxExecutionMs ? { timeout: options.maxExecutionMs } : undefined);\n },\n\n async dispose(): Promise<void> {\n // Dispose custom function reference\n if (state.customFnInvokeRef) {\n state.customFnInvokeRef.release();\n }\n\n // Dispose all handles (in reverse order of setup)\n state.handles.playwright?.dispose();\n state.handles.testEnvironment?.dispose();\n state.handles.fs?.dispose();\n state.handles.fetch?.dispose();\n state.handles.crypto?.dispose();\n state.handles.path?.dispose();\n state.handles.timers?.dispose();\n state.handles.encoding?.dispose();\n state.handles.console?.dispose();\n state.handles.core?.dispose();\n\n // Clear module cache\n state.moduleCache.clear();\n\n // Release context and dispose isolate\n state.context.release();\n state.isolate.dispose();\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"@ricsam/isolate-core\";\nexport type { CoreHandle, SetupCoreOptions } from \"@ricsam/isolate-core\";\n\nexport { setupConsole, simpleConsoleHandler } from \"@ricsam/isolate-console\";\nexport type { ConsoleHandle, ConsoleOptions, ConsoleEntry as ConsoleEntryFromConsole, SimpleConsoleCallbacks } from \"@ricsam/isolate-console\";\n\nexport { setupCrypto } from \"@ricsam/isolate-crypto\";\nexport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\nexport { setupEncoding } from \"@ricsam/isolate-encoding\";\nexport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\n\nexport { setupFetch } from \"@ricsam/isolate-fetch\";\nexport type { FetchHandle, FetchOptions, WebSocketCommand, UpgradeRequest } from \"@ricsam/isolate-fetch\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"@ricsam/isolate-fs\";\nexport type { FsHandle, FsOptions, FileSystemHandler, NodeFileSystemHandlerOptions } from \"@ricsam/isolate-fs\";\n\nexport { setupPath } from \"@ricsam/isolate-path\";\nexport type { PathHandle, PathOptions } from \"@ricsam/isolate-path\";\n\nexport { setupTimers } from \"@ricsam/isolate-timers\";\nexport type { TimersHandle } from \"@ricsam/isolate-timers\";\n\nexport { setupTestEnvironment, runTests, hasTests, getTestCount } from \"@ricsam/isolate-test-environment\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"@ricsam/isolate-test-environment\";\n\nexport { setupPlaywright, createPlaywrightHandler } from \"@ricsam/isolate-playwright\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n} from \"@ricsam/isolate-playwright\";\n\nexport * from './internal.cjs';"
|
|
5
|
+
"import ivm from \"isolated-vm\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport { setupPlaywright } from \"@ricsam/isolate-playwright\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n} from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"@ricsam/isolate-test-environment\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightEvent,\n} from \"@ricsam/isolate-playwright\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\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 /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the isolate */\n customFunctions?: CustomFunctions;\n /** Current working directory for path.resolve(). Defaults to \"/\" */\n cwd?: string;\n /** Enable test environment (describe, it, expect, etc.) */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options - user provides page object */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Options for playwright in local runtime.\n */\nexport interface PlaywrightOptions {\n /** Playwright Page object - user launches browser and creates page */\n page: import(\"playwright\").Page;\n /** Default timeout for operations (default: 30000ms) */\n timeout?: number;\n /** Base URL for relative navigation */\n baseUrl?: string;\n /** If true, browser console logs are routed through console handler (or printed to stdout if no handler) */\n console?: boolean;\n /** Unified event callback for all playwright events */\n onEvent?: (event: PlaywrightEvent) => void;\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(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(\n connectionId: string,\n code: number,\n reason: string\n ): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\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 * Timers fire automatically based on real time.\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 execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Options for eval() method.\n */\nexport interface EvalOptions {\n /** Filename for stack traces */\n filename?: string;\n /** Maximum execution time in milliseconds. If exceeded, throws a timeout error. */\n maxExecutionMs?: number;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\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, filenameOrOptions?: string | EvalOptions): 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 execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result\n const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n const args = JSON.parse(argsJson) as unknown[];\n try {\n const result =\n def.type === \"async\" ? await def.fn(...args) : def.fn(...args);\n return JSON.stringify({ ok: true, value: result });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Iterator start: creates iterator, stores in session, returns iteratorId\n const iterStartRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def || def.type !== \"asyncIterator\") {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Async iterator function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const args = JSON.parse(argsJson) as unknown[];\n const fn = def.fn as CustomAsyncGeneratorFunction;\n const iterator = fn(...args);\n const iteratorId = nextIteratorId++;\n iteratorSessions.set(iteratorId, { iterator });\n return JSON.stringify({ ok: true, iteratorId });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_start\", iterStartRef);\n\n // Iterator next: calls iterator.next(), returns {done, value}\n const iterNextRef = new ivm.Reference(\n async (iteratorId: number): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n iteratorSessions.delete(iteratorId);\n }\n return JSON.stringify({\n ok: true,\n done: result.done,\n value: result.value,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_next\", iterNextRef);\n\n // Iterator return: calls iterator.return(), cleans up session\n const iterReturnRef = new ivm.Reference(\n async (iteratorId: number, valueJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({ ok: true, done: true, value: undefined });\n }\n try {\n const value = valueJson ? JSON.parse(valueJson) : undefined;\n const result = await session.iterator.return?.(value);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({ ok: true, done: true, value: result?.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_return\", iterReturnRef);\n\n // Iterator throw: calls iterator.throw(), cleans up session\n const iterThrowRef = new ivm.Reference(\n async (iteratorId: number, errorJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const errorData = JSON.parse(errorJson) as {\n message: string;\n name: string;\n };\n const error = Object.assign(new Error(errorData.message), {\n name: errorData.name,\n });\n const result = await session.iterator.throw?.(error);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: true,\n done: result?.done ?? true,\n value: result?.value,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_throw\", iterThrowRef);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"sync\") {\n // Sync function: use applySyncPromise (to await the host) but wrap in regular function\n // The function blocks until the host responds, but returns the value directly (not a Promise)\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n // Async iterator function: returns an async iterable object\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const startResult = JSON.parse(__iter_start.applySyncPromise(undefined, [\"${name}\", JSON.stringify(args)]));\n if (!startResult.ok) {\n throw Object.assign(new Error(startResult.error.message), { name: startResult.error.name });\n }\n const iteratorId = startResult.iteratorId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const result = JSON.parse(__iter_next.applySyncPromise(undefined, [iteratorId]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n },\n async return(v) {\n const result = JSON.parse(__iter_return.applySyncPromise(undefined, [iteratorId, JSON.stringify(v)]));\n return { done: true, value: result.value };\n },\n async throw(e) {\n const result = JSON.parse(__iter_throw.applySyncPromise(undefined, [iteratorId, JSON.stringify({ message: e.message, name: e.name })]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n _referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Check cache first\n const cached = state.moduleCache.get(specifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n }\n\n // Invoke module loader to get source code\n const code = await state.moduleLoader(specifier);\n\n // Compile the module\n const mod = await state.isolate.compileModule(code, {\n filename: specifier,\n });\n\n // Cache before instantiation (for circular dependencies)\n state.moduleCache.set(specifier, mod);\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n return mod;\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\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 // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob)\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n args: event.args,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\n timeout: opts.playwright.timeout,\n baseUrl: opts.playwright.baseUrl,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n });\n }\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n state.handles.console?.reset();\n },\n getTimers() {\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\n },\n hasTests(): boolean {\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n if (!state.handles.playwright) {\n throw new Error(\n \"Playwright not configured. Provide playwright.page in createRuntime options.\"\n );\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> {\n // Parse options\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(code, {\n filename: options?.filename ?? \"<eval>\",\n });\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n // Evaluate the module with optional timeout\n await mod.evaluate(\n options?.maxExecutionMs\n ? { timeout: options.maxExecutionMs }\n : undefined\n );\n },\n\n async dispose(): Promise<void> {\n // Dispose custom function reference\n if (state.customFnInvokeRef) {\n state.customFnInvokeRef.release();\n }\n\n // Dispose all handles (in reverse order of setup)\n state.handles.playwright?.dispose();\n state.handles.testEnvironment?.dispose();\n state.handles.fs?.dispose();\n state.handles.fetch?.dispose();\n state.handles.crypto?.dispose();\n state.handles.path?.dispose();\n state.handles.timers?.dispose();\n state.handles.encoding?.dispose();\n state.handles.console?.dispose();\n state.handles.core?.dispose();\n\n // Clear module cache\n state.moduleCache.clear();\n\n // Release context and dispose isolate\n state.context.release();\n state.isolate.dispose();\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"@ricsam/isolate-core\";\nexport type { CoreHandle, SetupCoreOptions } from \"@ricsam/isolate-core\";\n\nexport { setupConsole } from \"@ricsam/isolate-console\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"@ricsam/isolate-console/utils\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"@ricsam/isolate-console\";\n\nexport { setupCrypto } from \"@ricsam/isolate-crypto\";\nexport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\nexport { setupEncoding } from \"@ricsam/isolate-encoding\";\nexport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\n\nexport { setupFetch } from \"@ricsam/isolate-fetch\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n} from \"@ricsam/isolate-fetch\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"@ricsam/isolate-fs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"@ricsam/isolate-fs\";\n\nexport { setupPath } from \"@ricsam/isolate-path\";\nexport type { PathHandle, PathOptions } from \"@ricsam/isolate-path\";\n\nexport { setupTimers } from \"@ricsam/isolate-timers\";\nexport type { TimersHandle } from \"@ricsam/isolate-timers\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"@ricsam/isolate-test-environment\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"@ricsam/isolate-test-environment\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n} from \"@ricsam/isolate-playwright\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n} from \"@ricsam/isolate-playwright\";\n\nexport * from \"./internal.cjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "6D096DCA13F6758764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/internal.cjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
(function(exports, require, module, __filename, __dirname) {var __create = Object.create;
|
|
1
|
+
var __create = Object.create;
|
|
3
2
|
var __getProtoOf = Object.getPrototypeOf;
|
|
4
3
|
var __defProp = Object.defineProperty;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -92,6 +91,5 @@ async function createInternalRuntime(options) {
|
|
|
92
91
|
}
|
|
93
92
|
};
|
|
94
93
|
}
|
|
95
|
-
})
|
|
96
94
|
|
|
97
|
-
//# debugId=
|
|
95
|
+
//# debugId=1A70A496790401D664756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Internal APIs for @ricsam/isolate-runtime\n *\n * These are not part of the public API and may change without notice.\n * Only used by @ricsam/isolate-daemon internally.\n */\n\nimport ivm from \"isolated-vm\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type { FetchOptions, FetchHandle } from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\n/**\n * @internal Options for creating a legacy runtime.\n */\nexport interface InternalRuntimeOptions {\n memoryLimitMB?: number;\n console?: ConsoleOptions;\n fetch?: FetchOptions;\n fs?: FsOptions;\n /** Current working directory for path.resolve(). Defaults to \"/\" */\n cwd?: string;\n}\n\n/**\n * @internal Runtime handle with direct isolate/context access.\n * Used by isolate-daemon for low-level operations.\n */\nexport interface InternalRuntimeHandle {\n readonly isolate: ivm.Isolate;\n readonly context: ivm.Context;\n readonly fetch: FetchHandle;\n readonly timers: TimersHandle;\n readonly console: ConsoleHandle;\n dispose(): void;\n}\n\n/**\n * @internal Create a runtime with direct access to isolate and context.\n * This is for internal use by @ricsam/isolate-daemon only.\n */\nexport async function createInternalRuntime(\n options?: InternalRuntimeOptions\n): Promise<InternalRuntimeHandle> {\n const opts = options ?? {};\n\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n\n const context = await isolate.createContext();\n\n // Setup all APIs\n const handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n } = {};\n\n handles.core = await setupCore(context);\n handles.console = await setupConsole(context, opts.console);\n handles.encoding = await setupEncoding(context);\n handles.timers = await setupTimers(context);\n handles.path = await setupPath(context, { cwd: opts.cwd });\n handles.crypto = await setupCrypto(context);\n handles.fetch = await setupFetch(context, opts.fetch);\n\n if (opts.fs) {\n handles.fs = await setupFs(context, opts.fs);\n }\n\n return {\n isolate,\n context,\n fetch: handles.fetch,\n timers: handles.timers!,\n console: handles.console!,\n dispose() {\n handles.fs?.dispose();\n handles.fetch?.dispose();\n handles.crypto?.dispose();\n handles.path?.dispose();\n handles.timers?.dispose();\n handles.encoding?.dispose();\n handles.console?.dispose();\n handles.core?.dispose();\n context.release();\n isolate.dispose();\n },\n };\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOgB,IAAhB;AAC0B,IAA1B;AAC6B,IAA7B;AAC8B,IAA9B;AAC4B,IAA5B;AAC0B,IAA1B;AAC4B,IAA5B;AAC2B,IAA3B;AACwB,IAAxB;AAwCA,eAAsB,qBAAqB,CACzC,SACgC;AAAA,EAChC,MAAM,OAAO,WAAW,CAAC;AAAA,EAEzB,MAAM,UAAU,IAAI,2BAAI,QAAQ;AAAA,IAC9B,aAAa,KAAK;AAAA,EACpB,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,EAG5C,MAAM,UASF,CAAC;AAAA,EAEL,QAAQ,OAAO,MAAM,8BAAU,OAAO;AAAA,EACtC,QAAQ,UAAU,MAAM,oCAAa,SAAS,KAAK,OAAO;AAAA,EAC1D,QAAQ,WAAW,MAAM,sCAAc,OAAO;AAAA,EAC9C,QAAQ,SAAS,MAAM,kCAAY,OAAO;AAAA,EAC1C,QAAQ,OAAO,MAAM,8BAAU,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,EACzD,QAAQ,SAAS,MAAM,kCAAY,OAAO;AAAA,EAC1C,QAAQ,QAAQ,MAAM,gCAAW,SAAS,KAAK,KAAK;AAAA,EAEpD,IAAI,KAAK,IAAI;AAAA,IACX,QAAQ,KAAK,MAAM,0BAAQ,SAAS,KAAK,EAAE;AAAA,EAC7C;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,OAAO,GAAG;AAAA,MACR,QAAQ,IAAI,QAAQ;AAAA,MACpB,QAAQ,OAAO,QAAQ;AAAA,MACvB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,MAAM,QAAQ;AAAA,MACtB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,UAAU,QAAQ;AAAA,MAC1B,QAAQ,SAAS,QAAQ;AAAA,MACzB,QAAQ,MAAM,QAAQ;AAAA,MACtB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA;AAAA,EAEpB;AAAA;",
|
|
8
|
+
"debugId": "1A70A496790401D664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/cjs/package.json
CHANGED
package/dist/mjs/index.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @bun
|
|
2
1
|
// packages/runtime/src/index.ts
|
|
3
2
|
import ivm from "isolated-vm";
|
|
4
3
|
import { setupCore } from "@ricsam/isolate-core";
|
|
@@ -17,15 +16,26 @@ import {
|
|
|
17
16
|
} from "@ricsam/isolate-test-environment";
|
|
18
17
|
import { setupPlaywright } from "@ricsam/isolate-playwright";
|
|
19
18
|
import { setupCore as setupCore2 } from "@ricsam/isolate-core";
|
|
20
|
-
import { setupConsole as setupConsole2
|
|
19
|
+
import { setupConsole as setupConsole2 } from "@ricsam/isolate-console";
|
|
20
|
+
import {
|
|
21
|
+
simpleConsoleHandler
|
|
22
|
+
} from "@ricsam/isolate-console/utils";
|
|
21
23
|
import { setupCrypto as setupCrypto2 } from "@ricsam/isolate-crypto";
|
|
22
24
|
import { setupEncoding as setupEncoding2 } from "@ricsam/isolate-encoding";
|
|
23
25
|
import { setupFetch as setupFetch2 } from "@ricsam/isolate-fetch";
|
|
24
26
|
import { setupFs as setupFs2, createNodeFileSystemHandler } from "@ricsam/isolate-fs";
|
|
25
27
|
import { setupPath as setupPath2 } from "@ricsam/isolate-path";
|
|
26
28
|
import { setupTimers as setupTimers2 } from "@ricsam/isolate-timers";
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
+
import {
|
|
30
|
+
setupTestEnvironment as setupTestEnvironment2,
|
|
31
|
+
runTests,
|
|
32
|
+
hasTests,
|
|
33
|
+
getTestCount
|
|
34
|
+
} from "@ricsam/isolate-test-environment";
|
|
35
|
+
import {
|
|
36
|
+
setupPlaywright as setupPlaywright2,
|
|
37
|
+
createPlaywrightHandler
|
|
38
|
+
} from "@ricsam/isolate-playwright";
|
|
29
39
|
|
|
30
40
|
export * from "./internal.mjs";
|
|
31
41
|
var iteratorSessions = new Map;
|
|
@@ -37,7 +47,10 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
37
47
|
if (!def) {
|
|
38
48
|
return JSON.stringify({
|
|
39
49
|
ok: false,
|
|
40
|
-
error: {
|
|
50
|
+
error: {
|
|
51
|
+
message: `Custom function '${name}' not found`,
|
|
52
|
+
name: "Error"
|
|
53
|
+
}
|
|
41
54
|
});
|
|
42
55
|
}
|
|
43
56
|
const args = JSON.parse(argsJson);
|
|
@@ -58,7 +71,10 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
58
71
|
if (!def || def.type !== "asyncIterator") {
|
|
59
72
|
return JSON.stringify({
|
|
60
73
|
ok: false,
|
|
61
|
-
error: {
|
|
74
|
+
error: {
|
|
75
|
+
message: `Async iterator function '${name}' not found`,
|
|
76
|
+
name: "Error"
|
|
77
|
+
}
|
|
62
78
|
});
|
|
63
79
|
}
|
|
64
80
|
try {
|
|
@@ -82,7 +98,10 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
82
98
|
if (!session) {
|
|
83
99
|
return JSON.stringify({
|
|
84
100
|
ok: false,
|
|
85
|
-
error: {
|
|
101
|
+
error: {
|
|
102
|
+
message: `Iterator session ${iteratorId} not found`,
|
|
103
|
+
name: "Error"
|
|
104
|
+
}
|
|
86
105
|
});
|
|
87
106
|
}
|
|
88
107
|
try {
|
|
@@ -90,7 +109,11 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
90
109
|
if (result.done) {
|
|
91
110
|
iteratorSessions.delete(iteratorId);
|
|
92
111
|
}
|
|
93
|
-
return JSON.stringify({
|
|
112
|
+
return JSON.stringify({
|
|
113
|
+
ok: true,
|
|
114
|
+
done: result.done,
|
|
115
|
+
value: result.value
|
|
116
|
+
});
|
|
94
117
|
} catch (error) {
|
|
95
118
|
const err = error;
|
|
96
119
|
iteratorSessions.delete(iteratorId);
|
|
@@ -126,15 +149,24 @@ async function setupCustomFunctions(context, customFunctions) {
|
|
|
126
149
|
if (!session) {
|
|
127
150
|
return JSON.stringify({
|
|
128
151
|
ok: false,
|
|
129
|
-
error: {
|
|
152
|
+
error: {
|
|
153
|
+
message: `Iterator session ${iteratorId} not found`,
|
|
154
|
+
name: "Error"
|
|
155
|
+
}
|
|
130
156
|
});
|
|
131
157
|
}
|
|
132
158
|
try {
|
|
133
159
|
const errorData = JSON.parse(errorJson);
|
|
134
|
-
const error = Object.assign(new Error(errorData.message), {
|
|
160
|
+
const error = Object.assign(new Error(errorData.message), {
|
|
161
|
+
name: errorData.name
|
|
162
|
+
});
|
|
135
163
|
const result = await session.iterator.throw?.(error);
|
|
136
164
|
iteratorSessions.delete(iteratorId);
|
|
137
|
-
return JSON.stringify({
|
|
165
|
+
return JSON.stringify({
|
|
166
|
+
ok: true,
|
|
167
|
+
done: result?.done ?? true,
|
|
168
|
+
value: result?.value
|
|
169
|
+
});
|
|
138
170
|
} catch (error) {
|
|
139
171
|
const err = error;
|
|
140
172
|
iteratorSessions.delete(iteratorId);
|
|
@@ -472,4 +504,4 @@ export {
|
|
|
472
504
|
createNodeFileSystemHandler
|
|
473
505
|
};
|
|
474
506
|
|
|
475
|
-
//# debugId=
|
|
507
|
+
//# debugId=3FC0A0103170CB8F64756E2164756E21
|
package/dist/mjs/index.mjs.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import ivm from \"isolated-vm\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport { setupPlaywright } from \"@ricsam/isolate-playwright\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type { FetchOptions, FetchHandle, DispatchRequestOptions, UpgradeRequest, WebSocketCommand } from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"@ricsam/isolate-test-environment\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightEvent,\n} from \"@ricsam/isolate-playwright\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\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 /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the isolate */\n customFunctions?: CustomFunctions;\n /** Current working directory for path.resolve(). Defaults to \"/\" */\n cwd?: string;\n /** Enable test environment (describe, it, expect, etc.) */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options - user provides page object */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Options for playwright in local runtime.\n */\nexport interface PlaywrightOptions {\n /** Playwright Page object - user launches browser and creates page */\n page: import(\"playwright\").Page;\n /** Default timeout for operations (default: 30000ms) */\n timeout?: number;\n /** Base URL for relative navigation */\n baseUrl?: string;\n /** If true, browser console logs are routed through console handler (or printed to stdout if no handler) */\n console?: boolean;\n /** Unified event callback for all playwright events */\n onEvent?: (event: PlaywrightEvent) => void;\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?: DispatchRequestOptions): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(connectionId: string, code: number, reason: string): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\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 * Timers fire automatically based on real time.\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 execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Options for eval() method.\n */\nexport interface EvalOptions {\n /** Filename for stack traces */\n filename?: string;\n /** Maximum execution time in milliseconds. If exceeded, throws a timeout error. */\n maxExecutionMs?: number;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\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, filenameOrOptions?: string | EvalOptions): 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 execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result\n const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: { message: `Custom function '${name}' not found`, name: \"Error\" },\n });\n }\n const args = JSON.parse(argsJson) as unknown[];\n try {\n const result = def.type === 'async' ? await def.fn(...args) : def.fn(...args);\n return JSON.stringify({ ok: true, value: result });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Iterator start: creates iterator, stores in session, returns iteratorId\n const iterStartRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def || def.type !== 'asyncIterator') {\n return JSON.stringify({\n ok: false,\n error: { message: `Async iterator function '${name}' not found`, name: \"Error\" },\n });\n }\n try {\n const args = JSON.parse(argsJson) as unknown[];\n const fn = def.fn as CustomAsyncGeneratorFunction;\n const iterator = fn(...args);\n const iteratorId = nextIteratorId++;\n iteratorSessions.set(iteratorId, { iterator });\n return JSON.stringify({ ok: true, iteratorId });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_start\", iterStartRef);\n\n // Iterator next: calls iterator.next(), returns {done, value}\n const iterNextRef = new ivm.Reference(\n async (iteratorId: number): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: { message: `Iterator session ${iteratorId} not found`, name: \"Error\" },\n });\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n iteratorSessions.delete(iteratorId);\n }\n return JSON.stringify({ ok: true, done: result.done, value: result.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_next\", iterNextRef);\n\n // Iterator return: calls iterator.return(), cleans up session\n const iterReturnRef = new ivm.Reference(\n async (iteratorId: number, valueJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({ ok: true, done: true, value: undefined });\n }\n try {\n const value = valueJson ? JSON.parse(valueJson) : undefined;\n const result = await session.iterator.return?.(value);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({ ok: true, done: true, value: result?.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_return\", iterReturnRef);\n\n // Iterator throw: calls iterator.throw(), cleans up session\n const iterThrowRef = new ivm.Reference(\n async (iteratorId: number, errorJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: { message: `Iterator session ${iteratorId} not found`, name: \"Error\" },\n });\n }\n try {\n const errorData = JSON.parse(errorJson) as { message: string; name: string };\n const error = Object.assign(new Error(errorData.message), { name: errorData.name });\n const result = await session.iterator.throw?.(error);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({ ok: true, done: result?.done ?? true, value: result?.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_throw\", iterThrowRef);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === 'async') {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === 'sync') {\n // Sync function: use applySyncPromise (to await the host) but wrap in regular function\n // The function blocks until the host responds, but returns the value directly (not a Promise)\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === 'asyncIterator') {\n // Async iterator function: returns an async iterable object\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const startResult = JSON.parse(__iter_start.applySyncPromise(undefined, [\"${name}\", JSON.stringify(args)]));\n if (!startResult.ok) {\n throw Object.assign(new Error(startResult.error.message), { name: startResult.error.name });\n }\n const iteratorId = startResult.iteratorId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const result = JSON.parse(__iter_next.applySyncPromise(undefined, [iteratorId]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n },\n async return(v) {\n const result = JSON.parse(__iter_return.applySyncPromise(undefined, [iteratorId, JSON.stringify(v)]));\n return { done: true, value: result.value };\n },\n async throw(e) {\n const result = JSON.parse(__iter_throw.applySyncPromise(undefined, [iteratorId, JSON.stringify({ message: e.message, name: e.name })]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n _referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Check cache first\n const cached = state.moduleCache.get(specifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(`No module loader registered. Cannot import: ${specifier}`);\n }\n\n // Invoke module loader to get source code\n const code = await state.moduleLoader(specifier);\n\n // Compile the module\n const mod = await state.isolate.compileModule(code, {\n filename: specifier,\n });\n\n // Cache before instantiation (for circular dependencies)\n state.moduleCache.set(specifier, mod);\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n return mod;\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\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 // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob)\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\" ? opts.testEnvironment : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(context, testEnvOptions);\n }\n\n // Setup playwright (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n args: event.args,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\n timeout: opts.playwright.timeout,\n baseUrl: opts.playwright.baseUrl,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n });\n }\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(request: Request, options?: DispatchRequestOptions): Promise<Response> {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(connectionId: string, message: string | ArrayBuffer) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n state.handles.console?.reset();\n },\n getTimers() {\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!state.handles.testEnvironment) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\n },\n hasTests(): boolean {\n if (!state.handles.testEnvironment) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n if (!state.handles.testEnvironment) {\n throw new Error(\"Test environment not enabled. Set testEnvironment: true in createRuntime options.\");\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n if (!state.handles.playwright) {\n throw new Error(\"Playwright not configured. Provide playwright.page in createRuntime options.\");\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(code: string, filenameOrOptions?: string | EvalOptions): Promise<void> {\n // Parse options\n const options = typeof filenameOrOptions === 'string'\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(code, {\n filename: options?.filename ?? \"<eval>\",\n });\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n // Evaluate the module with optional timeout\n await mod.evaluate(options?.maxExecutionMs ? { timeout: options.maxExecutionMs } : undefined);\n },\n\n async dispose(): Promise<void> {\n // Dispose custom function reference\n if (state.customFnInvokeRef) {\n state.customFnInvokeRef.release();\n }\n\n // Dispose all handles (in reverse order of setup)\n state.handles.playwright?.dispose();\n state.handles.testEnvironment?.dispose();\n state.handles.fs?.dispose();\n state.handles.fetch?.dispose();\n state.handles.crypto?.dispose();\n state.handles.path?.dispose();\n state.handles.timers?.dispose();\n state.handles.encoding?.dispose();\n state.handles.console?.dispose();\n state.handles.core?.dispose();\n\n // Clear module cache\n state.moduleCache.clear();\n\n // Release context and dispose isolate\n state.context.release();\n state.isolate.dispose();\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"@ricsam/isolate-core\";\nexport type { CoreHandle, SetupCoreOptions } from \"@ricsam/isolate-core\";\n\nexport { setupConsole, simpleConsoleHandler } from \"@ricsam/isolate-console\";\nexport type { ConsoleHandle, ConsoleOptions, ConsoleEntry as ConsoleEntryFromConsole, SimpleConsoleCallbacks } from \"@ricsam/isolate-console\";\n\nexport { setupCrypto } from \"@ricsam/isolate-crypto\";\nexport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\nexport { setupEncoding } from \"@ricsam/isolate-encoding\";\nexport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\n\nexport { setupFetch } from \"@ricsam/isolate-fetch\";\nexport type { FetchHandle, FetchOptions, WebSocketCommand, UpgradeRequest } from \"@ricsam/isolate-fetch\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"@ricsam/isolate-fs\";\nexport type { FsHandle, FsOptions, FileSystemHandler, NodeFileSystemHandlerOptions } from \"@ricsam/isolate-fs\";\n\nexport { setupPath } from \"@ricsam/isolate-path\";\nexport type { PathHandle, PathOptions } from \"@ricsam/isolate-path\";\n\nexport { setupTimers } from \"@ricsam/isolate-timers\";\nexport type { TimersHandle } from \"@ricsam/isolate-timers\";\n\nexport { setupTestEnvironment, runTests, hasTests, getTestCount } from \"@ricsam/isolate-test-environment\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"@ricsam/isolate-test-environment\";\n\nexport { setupPlaywright, createPlaywrightHandler } from \"@ricsam/isolate-playwright\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n} from \"@ricsam/isolate-playwright\";\n\nexport * from './internal.mjs';"
|
|
5
|
+
"import ivm from \"isolated-vm\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\nimport {\n setupTestEnvironment,\n runTests as runTestsInContext,\n hasTests as hasTestsInContext,\n getTestCount as getTestCountInContext,\n} from \"@ricsam/isolate-test-environment\";\nimport { setupPlaywright } from \"@ricsam/isolate-playwright\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type {\n FetchOptions,\n FetchHandle,\n DispatchRequestOptions,\n UpgradeRequest,\n WebSocketCommand,\n} from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\nimport type {\n TestEnvironmentHandle,\n RunResults,\n TestEnvironmentOptions,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n TestInfo,\n TestResult,\n TestError,\n} from \"@ricsam/isolate-test-environment\";\nimport type {\n PlaywrightHandle,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PlaywrightEvent,\n} from \"@ricsam/isolate-playwright\";\nimport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunctionDefinition,\n CustomFunctions,\n CustomAsyncGeneratorFunction,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\n\n// Re-export shared types from protocol\nexport type {\n ConsoleCallbacks,\n ConsoleEntry,\n FetchCallback,\n ModuleLoaderCallback,\n CustomFunction,\n CustomFunctionDefinition,\n CustomFunctions,\n DispatchOptions,\n} from \"@ricsam/isolate-protocol\";\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 /**\n * File system options.\n * Note: For local runtime, this uses FsOptions with getDirectory returning a FileSystemHandler.\n * For remote runtime (isolate-client), use FileSystemCallbacks instead.\n */\n fs?: FsOptions;\n /** Module loader callback for resolving dynamic imports */\n moduleLoader?: ModuleLoaderCallback;\n /** Custom functions callable from within the isolate */\n customFunctions?: CustomFunctions;\n /** Current working directory for path.resolve(). Defaults to \"/\" */\n cwd?: string;\n /** Enable test environment (describe, it, expect, etc.) */\n testEnvironment?: boolean | TestEnvironmentOptions;\n /** Playwright options - user provides page object */\n playwright?: PlaywrightOptions;\n}\n\n/**\n * Options for playwright in local runtime.\n */\nexport interface PlaywrightOptions {\n /** Playwright Page object - user launches browser and creates page */\n page: import(\"playwright\").Page;\n /** Default timeout for operations (default: 30000ms) */\n timeout?: number;\n /** Base URL for relative navigation */\n baseUrl?: string;\n /** If true, browser console logs are routed through console handler (or printed to stdout if no handler) */\n console?: boolean;\n /** Unified event callback for all playwright events */\n onEvent?: (event: PlaywrightEvent) => void;\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(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response>;\n /** Check if isolate requested WebSocket upgrade */\n getUpgradeRequest(): UpgradeRequest | null;\n /** Dispatch WebSocket open event to isolate */\n dispatchWebSocketOpen(connectionId: string): void;\n /** Dispatch WebSocket message event to isolate */\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ): void;\n /** Dispatch WebSocket close event to isolate */\n dispatchWebSocketClose(\n connectionId: string,\n code: number,\n reason: string\n ): void;\n /** Dispatch WebSocket error event to isolate */\n dispatchWebSocketError(connectionId: string, error: Error): void;\n /** Register callback for WebSocket commands from isolate */\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void): () => void;\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 * Timers fire automatically based on real time.\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 execution.\n */\nexport interface RuntimeTestEnvironmentHandle {\n /** Run all registered tests */\n runTests(timeout?: number): Promise<RunResults>;\n /** Check if any tests are registered */\n hasTests(): boolean;\n /** Get count of registered tests */\n getTestCount(): number;\n /** Reset test state */\n reset(): void;\n}\n\n/**\n * Runtime playwright handle - provides access to browser data collection.\n */\nexport interface RuntimePlaywrightHandle {\n /** Get collected browser data (console logs, network requests/responses) */\n getCollectedData(): CollectedData;\n /** Clear collected browser data */\n clearCollectedData(): void;\n}\n\n/**\n * Collected browser data from playwright.\n */\nexport interface CollectedData {\n /** Browser console logs (from the page, not sandbox) */\n browserConsoleLogs: BrowserConsoleLogEntry[];\n networkRequests: NetworkRequestInfo[];\n networkResponses: NetworkResponseInfo[];\n}\n\n/**\n * Options for eval() method.\n */\nexport interface EvalOptions {\n /** Filename for stack traces */\n filename?: string;\n /** Maximum execution time in milliseconds. If exceeded, throws a timeout error. */\n maxExecutionMs?: number;\n}\n\n/**\n * Runtime handle - the main interface for interacting with the isolate.\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, filenameOrOptions?: string | EvalOptions): 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 execution (throws if not enabled) */\n readonly testEnvironment: RuntimeTestEnvironmentHandle;\n /** Playwright handle - access to playwright operations (throws if not configured) */\n readonly playwright: RuntimePlaywrightHandle;\n}\n\n// Internal state for runtime\ninterface RuntimeState {\n isolate: ivm.Isolate;\n context: ivm.Context;\n handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n testEnvironment?: TestEnvironmentHandle;\n playwright?: PlaywrightHandle;\n };\n moduleCache: Map<string, ivm.Module>;\n moduleLoader?: ModuleLoaderCallback;\n customFunctions?: CustomFunctions;\n customFnInvokeRef?: ivm.Reference<\n (name: string, argsJson: string) => Promise<string>\n >;\n}\n\n// Iterator session tracking for async iterator custom functions\ninterface IteratorSession {\n iterator: AsyncGenerator<unknown, unknown, unknown>;\n}\n\nconst iteratorSessions = new Map<number, IteratorSession>();\nlet nextIteratorId = 1;\n\n/**\n * Setup custom functions as globals in the isolate context.\n * Each function directly calls the host callback when invoked.\n */\nasync function setupCustomFunctions(\n context: ivm.Context,\n customFunctions: CustomFunctions\n): Promise<ivm.Reference<(name: string, argsJson: string) => Promise<string>>> {\n const global = context.global;\n\n // Reference that invokes the callback and returns the result\n const invokeCallbackRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Custom function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n const args = JSON.parse(argsJson) as unknown[];\n try {\n const result =\n def.type === \"async\" ? await def.fn(...args) : def.fn(...args);\n return JSON.stringify({ ok: true, value: result });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__customFn_invoke\", invokeCallbackRef);\n\n // Iterator start: creates iterator, stores in session, returns iteratorId\n const iterStartRef = new ivm.Reference(\n async (name: string, argsJson: string): Promise<string> => {\n const def = customFunctions[name];\n if (!def || def.type !== \"asyncIterator\") {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Async iterator function '${name}' not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const args = JSON.parse(argsJson) as unknown[];\n const fn = def.fn as CustomAsyncGeneratorFunction;\n const iterator = fn(...args);\n const iteratorId = nextIteratorId++;\n iteratorSessions.set(iteratorId, { iterator });\n return JSON.stringify({ ok: true, iteratorId });\n } catch (error: unknown) {\n const err = error as Error;\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_start\", iterStartRef);\n\n // Iterator next: calls iterator.next(), returns {done, value}\n const iterNextRef = new ivm.Reference(\n async (iteratorId: number): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const result = await session.iterator.next();\n if (result.done) {\n iteratorSessions.delete(iteratorId);\n }\n return JSON.stringify({\n ok: true,\n done: result.done,\n value: result.value,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_next\", iterNextRef);\n\n // Iterator return: calls iterator.return(), cleans up session\n const iterReturnRef = new ivm.Reference(\n async (iteratorId: number, valueJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({ ok: true, done: true, value: undefined });\n }\n try {\n const value = valueJson ? JSON.parse(valueJson) : undefined;\n const result = await session.iterator.return?.(value);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({ ok: true, done: true, value: result?.value });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_return\", iterReturnRef);\n\n // Iterator throw: calls iterator.throw(), cleans up session\n const iterThrowRef = new ivm.Reference(\n async (iteratorId: number, errorJson: string): Promise<string> => {\n const session = iteratorSessions.get(iteratorId);\n if (!session) {\n return JSON.stringify({\n ok: false,\n error: {\n message: `Iterator session ${iteratorId} not found`,\n name: \"Error\",\n },\n });\n }\n try {\n const errorData = JSON.parse(errorJson) as {\n message: string;\n name: string;\n };\n const error = Object.assign(new Error(errorData.message), {\n name: errorData.name,\n });\n const result = await session.iterator.throw?.(error);\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: true,\n done: result?.done ?? true,\n value: result?.value,\n });\n } catch (error: unknown) {\n const err = error as Error;\n iteratorSessions.delete(iteratorId);\n return JSON.stringify({\n ok: false,\n error: { message: err.message, name: err.name },\n });\n }\n }\n );\n\n global.setSync(\"__iter_throw\", iterThrowRef);\n\n // Create wrapper functions for each custom function\n for (const name of Object.keys(customFunctions)) {\n const def = customFunctions[name]!;\n\n if (def.type === \"async\") {\n // Async function: use applySyncPromise and async function wrapper\n context.evalSync(`\n globalThis.${name} = async function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"sync\") {\n // Sync function: use applySyncPromise (to await the host) but wrap in regular function\n // The function blocks until the host responds, but returns the value directly (not a Promise)\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const resultJson = __customFn_invoke.applySyncPromise(\n undefined,\n [\"${name}\", JSON.stringify(args)]\n );\n const result = JSON.parse(resultJson);\n if (result.ok) {\n return result.value;\n } else {\n const error = new Error(result.error.message);\n error.name = result.error.name;\n throw error;\n }\n };\n `);\n } else if (def.type === \"asyncIterator\") {\n // Async iterator function: returns an async iterable object\n context.evalSync(`\n globalThis.${name} = function(...args) {\n const startResult = JSON.parse(__iter_start.applySyncPromise(undefined, [\"${name}\", JSON.stringify(args)]));\n if (!startResult.ok) {\n throw Object.assign(new Error(startResult.error.message), { name: startResult.error.name });\n }\n const iteratorId = startResult.iteratorId;\n return {\n [Symbol.asyncIterator]() { return this; },\n async next() {\n const result = JSON.parse(__iter_next.applySyncPromise(undefined, [iteratorId]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n },\n async return(v) {\n const result = JSON.parse(__iter_return.applySyncPromise(undefined, [iteratorId, JSON.stringify(v)]));\n return { done: true, value: result.value };\n },\n async throw(e) {\n const result = JSON.parse(__iter_throw.applySyncPromise(undefined, [iteratorId, JSON.stringify({ message: e.message, name: e.name })]));\n if (!result.ok) {\n throw Object.assign(new Error(result.error.message), { name: result.error.name });\n }\n return { done: result.done, value: result.value };\n }\n };\n };\n `);\n }\n }\n\n return invokeCallbackRef;\n}\n\n/**\n * Create a module resolver function for local execution.\n */\nfunction createModuleResolver(\n state: RuntimeState\n): (specifier: string, referrer: ivm.Module) => Promise<ivm.Module> {\n return async (\n specifier: string,\n _referrer: ivm.Module\n ): Promise<ivm.Module> => {\n // Check cache first\n const cached = state.moduleCache.get(specifier);\n if (cached) return cached;\n\n if (!state.moduleLoader) {\n throw new Error(\n `No module loader registered. Cannot import: ${specifier}`\n );\n }\n\n // Invoke module loader to get source code\n const code = await state.moduleLoader(specifier);\n\n // Compile the module\n const mod = await state.isolate.compileModule(code, {\n filename: specifier,\n });\n\n // Cache before instantiation (for circular dependencies)\n state.moduleCache.set(specifier, mod);\n\n // Instantiate with recursive resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n return mod;\n };\n}\n\n/**\n * Convert FetchCallback to FetchOptions\n */\nfunction convertFetchCallback(callback?: FetchCallback): FetchOptions {\n if (!callback) {\n return {};\n }\n return {\n onFetch: async (request: Request): Promise<Response> => {\n // Wrap the result in a Promise to handle both sync and async callbacks\n return Promise.resolve(callback(request));\n },\n };\n}\n\n/**\n * Create a fully configured isolated-vm runtime\n *\n * Sets up all WHATWG APIs: fetch, fs, console, crypto, encoding, timers\n *\n * @example\n * const runtime = await createRuntime({\n * console: { log: (...args) => console.log(\"[isolate]\", ...args) },\n * fetch: async (request) => fetch(request),\n * });\n *\n * await runtime.eval(`\n * console.log(\"Hello from sandbox!\");\n * const response = await fetch(\"https://example.com\");\n * `);\n *\n * await runtime.dispose();\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 // Create isolate with optional memory limit\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n const context = await isolate.createContext();\n\n // Initialize state\n const state: RuntimeState = {\n isolate,\n context,\n handles: {},\n moduleCache: new Map(),\n moduleLoader: opts.moduleLoader,\n customFunctions: opts.customFunctions,\n };\n\n // Setup all APIs in order\n // Core must be first as it provides Blob, File, streams, URL, etc.\n state.handles.core = await setupCore(context);\n\n // Console\n state.handles.console = await setupConsole(context, opts.console);\n\n // Encoding (btoa/atob)\n state.handles.encoding = await setupEncoding(context);\n\n // Timers (setTimeout, setInterval)\n state.handles.timers = await setupTimers(context);\n\n // Path module\n state.handles.path = await setupPath(context, { cwd: opts.cwd });\n\n // Crypto (randomUUID, getRandomValues)\n state.handles.crypto = await setupCrypto(context);\n\n // Fetch API - convert callback to options\n state.handles.fetch = await setupFetch(\n context,\n convertFetchCallback(opts.fetch)\n );\n\n // File system (only if handler provided)\n if (opts.fs) {\n state.handles.fs = await setupFs(context, opts.fs);\n }\n\n // Setup custom functions\n if (opts.customFunctions) {\n state.customFnInvokeRef = await setupCustomFunctions(\n context,\n opts.customFunctions\n );\n }\n\n // Setup test environment (if enabled)\n if (opts.testEnvironment) {\n const testEnvOptions: TestEnvironmentOptions | undefined =\n typeof opts.testEnvironment === \"object\"\n ? opts.testEnvironment\n : undefined;\n state.handles.testEnvironment = await setupTestEnvironment(\n context,\n testEnvOptions\n );\n }\n\n // Setup playwright (if page provided) - AFTER test environment so expect can be extended\n if (opts.playwright) {\n // Determine event handler\n // If console: true and we have a console handler, wrap onEvent to route browser logs\n let eventCallback = opts.playwright.onEvent;\n\n if (opts.playwright.console && opts.console?.onEntry) {\n const originalCallback = eventCallback;\n const consoleHandler = opts.console.onEntry;\n eventCallback = (event) => {\n // Call original callback if provided\n if (originalCallback) {\n originalCallback(event);\n }\n // Route browser console logs through console handler as browserOutput entry\n if (event.type === \"browserConsoleLog\") {\n consoleHandler({\n type: \"browserOutput\",\n level: event.level,\n args: event.args,\n timestamp: event.timestamp,\n });\n }\n };\n }\n\n state.handles.playwright = await setupPlaywright(context, {\n page: opts.playwright.page,\n timeout: opts.playwright.timeout,\n baseUrl: opts.playwright.baseUrl,\n // Don't print directly if routing through console handler\n console: opts.playwright.console && !opts.console?.onEntry,\n onEvent: eventCallback,\n });\n }\n\n // Create fetch handle wrapper\n const fetchHandle: RuntimeFetchHandle = {\n async dispatchRequest(\n request: Request,\n options?: DispatchRequestOptions\n ): Promise<Response> {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.dispatchRequest(request, options);\n },\n getUpgradeRequest() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.getUpgradeRequest();\n },\n dispatchWebSocketOpen(connectionId: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketOpen(connectionId);\n },\n dispatchWebSocketMessage(\n connectionId: string,\n message: string | ArrayBuffer\n ) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketMessage(connectionId, message);\n },\n dispatchWebSocketClose(connectionId: string, code: number, reason: string) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketClose(connectionId, code, reason);\n },\n dispatchWebSocketError(connectionId: string, error: Error) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n state.handles.fetch.dispatchWebSocketError(connectionId, error);\n },\n onWebSocketCommand(callback: (cmd: WebSocketCommand) => void) {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.onWebSocketCommand(callback);\n },\n hasServeHandler() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasServeHandler();\n },\n hasActiveConnections() {\n if (!state.handles.fetch) {\n throw new Error(\"Fetch handle not available\");\n }\n return state.handles.fetch.hasActiveConnections();\n },\n };\n\n // Create timers handle wrapper\n const timersHandle: RuntimeTimersHandle = {\n clearAll() {\n state.handles.timers?.clearAll();\n },\n };\n\n // Create console handle wrapper\n const consoleHandle: RuntimeConsoleHandle = {\n reset() {\n state.handles.console?.reset();\n },\n getTimers() {\n return state.handles.console?.getTimers() ?? new Map();\n },\n getCounters() {\n return state.handles.console?.getCounters() ?? new Map();\n },\n getGroupDepth() {\n return state.handles.console?.getGroupDepth() ?? 0;\n },\n };\n\n // Create test environment handle wrapper\n const testEnvironmentHandle: RuntimeTestEnvironmentHandle = {\n async runTests(_timeout?: number): Promise<RunResults> {\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n // Note: timeout parameter reserved for future use\n return runTestsInContext(state.context);\n },\n hasTests(): boolean {\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return hasTestsInContext(state.context);\n },\n getTestCount(): number {\n if (!state.handles.testEnvironment) {\n throw new Error(\n \"Test environment not enabled. Set testEnvironment: true in createRuntime options.\"\n );\n }\n return getTestCountInContext(state.context);\n },\n reset() {\n state.handles.testEnvironment?.dispose();\n },\n };\n\n // Create playwright handle wrapper\n const playwrightHandle: RuntimePlaywrightHandle = {\n getCollectedData(): CollectedData {\n if (!state.handles.playwright) {\n throw new Error(\n \"Playwright not configured. Provide playwright.page in createRuntime options.\"\n );\n }\n return {\n browserConsoleLogs: state.handles.playwright.getBrowserConsoleLogs(),\n networkRequests: state.handles.playwright.getNetworkRequests(),\n networkResponses: state.handles.playwright.getNetworkResponses(),\n };\n },\n clearCollectedData() {\n state.handles.playwright?.clearCollected();\n },\n };\n\n return {\n id,\n\n // Module handles\n fetch: fetchHandle,\n timers: timersHandle,\n console: consoleHandle,\n testEnvironment: testEnvironmentHandle,\n playwright: playwrightHandle,\n\n async eval(\n code: string,\n filenameOrOptions?: string | EvalOptions\n ): Promise<void> {\n // Parse options\n const options =\n typeof filenameOrOptions === \"string\"\n ? { filename: filenameOrOptions }\n : filenameOrOptions;\n\n // Compile as ES module\n const mod = await state.isolate.compileModule(code, {\n filename: options?.filename ?? \"<eval>\",\n });\n\n // Instantiate with module resolver\n const resolver = createModuleResolver(state);\n await mod.instantiate(state.context, resolver);\n\n // Evaluate the module with optional timeout\n await mod.evaluate(\n options?.maxExecutionMs\n ? { timeout: options.maxExecutionMs }\n : undefined\n );\n },\n\n async dispose(): Promise<void> {\n // Dispose custom function reference\n if (state.customFnInvokeRef) {\n state.customFnInvokeRef.release();\n }\n\n // Dispose all handles (in reverse order of setup)\n state.handles.playwright?.dispose();\n state.handles.testEnvironment?.dispose();\n state.handles.fs?.dispose();\n state.handles.fetch?.dispose();\n state.handles.crypto?.dispose();\n state.handles.path?.dispose();\n state.handles.timers?.dispose();\n state.handles.encoding?.dispose();\n state.handles.console?.dispose();\n state.handles.core?.dispose();\n\n // Clear module cache\n state.moduleCache.clear();\n\n // Release context and dispose isolate\n state.context.release();\n state.isolate.dispose();\n },\n };\n}\n\n// Re-export all package types and functions\nexport { setupCore } from \"@ricsam/isolate-core\";\nexport type { CoreHandle, SetupCoreOptions } from \"@ricsam/isolate-core\";\n\nexport { setupConsole } from \"@ricsam/isolate-console\";\nexport {\n simpleConsoleHandler,\n type SimpleConsoleCallbacks,\n} from \"@ricsam/isolate-console/utils\";\nexport type {\n ConsoleHandle,\n ConsoleOptions,\n ConsoleEntry as ConsoleEntryFromConsole,\n} from \"@ricsam/isolate-console\";\n\nexport { setupCrypto } from \"@ricsam/isolate-crypto\";\nexport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\nexport { setupEncoding } from \"@ricsam/isolate-encoding\";\nexport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\n\nexport { setupFetch } from \"@ricsam/isolate-fetch\";\nexport type {\n FetchHandle,\n FetchOptions,\n WebSocketCommand,\n UpgradeRequest,\n} from \"@ricsam/isolate-fetch\";\n\nexport { setupFs, createNodeFileSystemHandler } from \"@ricsam/isolate-fs\";\nexport type {\n FsHandle,\n FsOptions,\n FileSystemHandler,\n NodeFileSystemHandlerOptions,\n} from \"@ricsam/isolate-fs\";\n\nexport { setupPath } from \"@ricsam/isolate-path\";\nexport type { PathHandle, PathOptions } from \"@ricsam/isolate-path\";\n\nexport { setupTimers } from \"@ricsam/isolate-timers\";\nexport type { TimersHandle } from \"@ricsam/isolate-timers\";\n\nexport {\n setupTestEnvironment,\n runTests,\n hasTests,\n getTestCount,\n} from \"@ricsam/isolate-test-environment\";\nexport type {\n TestEnvironmentHandle,\n TestEnvironmentOptions,\n RunResults,\n TestResult,\n TestInfo,\n TestError,\n TestEvent,\n SuiteInfo,\n SuiteResult,\n} from \"@ricsam/isolate-test-environment\";\n\nexport {\n setupPlaywright,\n createPlaywrightHandler,\n} from \"@ricsam/isolate-playwright\";\nexport type {\n PlaywrightHandle,\n PlaywrightSetupOptions,\n PlaywrightCallback,\n PlaywrightEvent,\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n} from \"@ricsam/isolate-playwright\";\n\nexport * from \"./internal.mjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "3FC0A0103170CB8F64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/internal.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @bun
|
|
2
1
|
// packages/runtime/src/internal.ts
|
|
3
2
|
import ivm from "isolated-vm";
|
|
4
3
|
import { setupCore } from "@ricsam/isolate-core";
|
|
@@ -50,4 +49,4 @@ export {
|
|
|
50
49
|
createInternalRuntime
|
|
51
50
|
};
|
|
52
51
|
|
|
53
|
-
//# debugId=
|
|
52
|
+
//# debugId=FB0D9A4AF0B7DEC464756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Internal APIs for @ricsam/isolate-runtime\n *\n * These are not part of the public API and may change without notice.\n * Only used by @ricsam/isolate-daemon internally.\n */\n\nimport ivm from \"isolated-vm\";\nimport { setupCore } from \"@ricsam/isolate-core\";\nimport { setupConsole } from \"@ricsam/isolate-console\";\nimport { setupEncoding } from \"@ricsam/isolate-encoding\";\nimport { setupTimers } from \"@ricsam/isolate-timers\";\nimport { setupPath } from \"@ricsam/isolate-path\";\nimport { setupCrypto } from \"@ricsam/isolate-crypto\";\nimport { setupFetch } from \"@ricsam/isolate-fetch\";\nimport { setupFs } from \"@ricsam/isolate-fs\";\n\nimport type { ConsoleOptions, ConsoleHandle } from \"@ricsam/isolate-console\";\nimport type { FetchOptions, FetchHandle } from \"@ricsam/isolate-fetch\";\nimport type { FsOptions, FsHandle } from \"@ricsam/isolate-fs\";\nimport type { CoreHandle } from \"@ricsam/isolate-core\";\nimport type { EncodingHandle } from \"@ricsam/isolate-encoding\";\nimport type { TimersHandle } from \"@ricsam/isolate-timers\";\nimport type { PathHandle } from \"@ricsam/isolate-path\";\nimport type { CryptoHandle } from \"@ricsam/isolate-crypto\";\n\n/**\n * @internal Options for creating a legacy runtime.\n */\nexport interface InternalRuntimeOptions {\n memoryLimitMB?: number;\n console?: ConsoleOptions;\n fetch?: FetchOptions;\n fs?: FsOptions;\n /** Current working directory for path.resolve(). Defaults to \"/\" */\n cwd?: string;\n}\n\n/**\n * @internal Runtime handle with direct isolate/context access.\n * Used by isolate-daemon for low-level operations.\n */\nexport interface InternalRuntimeHandle {\n readonly isolate: ivm.Isolate;\n readonly context: ivm.Context;\n readonly fetch: FetchHandle;\n readonly timers: TimersHandle;\n readonly console: ConsoleHandle;\n dispose(): void;\n}\n\n/**\n * @internal Create a runtime with direct access to isolate and context.\n * This is for internal use by @ricsam/isolate-daemon only.\n */\nexport async function createInternalRuntime(\n options?: InternalRuntimeOptions\n): Promise<InternalRuntimeHandle> {\n const opts = options ?? {};\n\n const isolate = new ivm.Isolate({\n memoryLimit: opts.memoryLimitMB,\n });\n\n const context = await isolate.createContext();\n\n // Setup all APIs\n const handles: {\n core?: CoreHandle;\n console?: ConsoleHandle;\n encoding?: EncodingHandle;\n timers?: TimersHandle;\n path?: PathHandle;\n crypto?: CryptoHandle;\n fetch?: FetchHandle;\n fs?: FsHandle;\n } = {};\n\n handles.core = await setupCore(context);\n handles.console = await setupConsole(context, opts.console);\n handles.encoding = await setupEncoding(context);\n handles.timers = await setupTimers(context);\n handles.path = await setupPath(context, { cwd: opts.cwd });\n handles.crypto = await setupCrypto(context);\n handles.fetch = await setupFetch(context, opts.fetch);\n\n if (opts.fs) {\n handles.fs = await setupFs(context, opts.fs);\n }\n\n return {\n isolate,\n context,\n fetch: handles.fetch,\n timers: handles.timers!,\n console: handles.console!,\n dispose() {\n handles.fs?.dispose();\n handles.fetch?.dispose();\n handles.crypto?.dispose();\n handles.path?.dispose();\n handles.timers?.dispose();\n handles.encoding?.dispose();\n handles.console?.dispose();\n handles.core?.dispose();\n context.release();\n isolate.dispose();\n },\n };\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAwCA,eAAsB,qBAAqB,CACzC,SACgC;AAAA,EAChC,MAAM,OAAO,WAAW,CAAC;AAAA,EAEzB,MAAM,UAAU,IAAI,IAAI,QAAQ;AAAA,IAC9B,aAAa,KAAK;AAAA,EACpB,CAAC;AAAA,EAED,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,EAG5C,MAAM,UASF,CAAC;AAAA,EAEL,QAAQ,OAAO,MAAM,UAAU,OAAO;AAAA,EACtC,QAAQ,UAAU,MAAM,aAAa,SAAS,KAAK,OAAO;AAAA,EAC1D,QAAQ,WAAW,MAAM,cAAc,OAAO;AAAA,EAC9C,QAAQ,SAAS,MAAM,YAAY,OAAO;AAAA,EAC1C,QAAQ,OAAO,MAAM,UAAU,SAAS,EAAE,KAAK,KAAK,IAAI,CAAC;AAAA,EACzD,QAAQ,SAAS,MAAM,YAAY,OAAO;AAAA,EAC1C,QAAQ,QAAQ,MAAM,WAAW,SAAS,KAAK,KAAK;AAAA,EAEpD,IAAI,KAAK,IAAI;AAAA,IACX,QAAQ,KAAK,MAAM,QAAQ,SAAS,KAAK,EAAE;AAAA,EAC7C;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,OAAO,GAAG;AAAA,MACR,QAAQ,IAAI,QAAQ;AAAA,MACpB,QAAQ,OAAO,QAAQ;AAAA,MACvB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,MAAM,QAAQ;AAAA,MACtB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,UAAU,QAAQ;AAAA,MAC1B,QAAQ,SAAS,QAAQ;AAAA,MACzB,QAAQ,MAAM,QAAQ;AAAA,MACtB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA;AAAA,EAEpB;AAAA;",
|
|
8
|
+
"debugId": "FB0D9A4AF0B7DEC464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/mjs/package.json
CHANGED
package/dist/types/index.d.ts
CHANGED
|
@@ -172,22 +172,23 @@ export interface RuntimeHandle {
|
|
|
172
172
|
export declare function createRuntime(options?: RuntimeOptions): Promise<RuntimeHandle>;
|
|
173
173
|
export { setupCore } from "@ricsam/isolate-core";
|
|
174
174
|
export type { CoreHandle, SetupCoreOptions } from "@ricsam/isolate-core";
|
|
175
|
-
export { setupConsole
|
|
176
|
-
export
|
|
175
|
+
export { setupConsole } from "@ricsam/isolate-console";
|
|
176
|
+
export { simpleConsoleHandler, type SimpleConsoleCallbacks, } from "@ricsam/isolate-console/utils";
|
|
177
|
+
export type { ConsoleHandle, ConsoleOptions, ConsoleEntry as ConsoleEntryFromConsole, } from "@ricsam/isolate-console";
|
|
177
178
|
export { setupCrypto } from "@ricsam/isolate-crypto";
|
|
178
179
|
export type { CryptoHandle } from "@ricsam/isolate-crypto";
|
|
179
180
|
export { setupEncoding } from "@ricsam/isolate-encoding";
|
|
180
181
|
export type { EncodingHandle } from "@ricsam/isolate-encoding";
|
|
181
182
|
export { setupFetch } from "@ricsam/isolate-fetch";
|
|
182
|
-
export type { FetchHandle, FetchOptions, WebSocketCommand, UpgradeRequest } from "@ricsam/isolate-fetch";
|
|
183
|
+
export type { FetchHandle, FetchOptions, WebSocketCommand, UpgradeRequest, } from "@ricsam/isolate-fetch";
|
|
183
184
|
export { setupFs, createNodeFileSystemHandler } from "@ricsam/isolate-fs";
|
|
184
|
-
export type { FsHandle, FsOptions, FileSystemHandler, NodeFileSystemHandlerOptions } from "@ricsam/isolate-fs";
|
|
185
|
+
export type { FsHandle, FsOptions, FileSystemHandler, NodeFileSystemHandlerOptions, } from "@ricsam/isolate-fs";
|
|
185
186
|
export { setupPath } from "@ricsam/isolate-path";
|
|
186
187
|
export type { PathHandle, PathOptions } from "@ricsam/isolate-path";
|
|
187
188
|
export { setupTimers } from "@ricsam/isolate-timers";
|
|
188
189
|
export type { TimersHandle } from "@ricsam/isolate-timers";
|
|
189
|
-
export { setupTestEnvironment, runTests, hasTests, getTestCount } from "@ricsam/isolate-test-environment";
|
|
190
|
+
export { setupTestEnvironment, runTests, hasTests, getTestCount, } from "@ricsam/isolate-test-environment";
|
|
190
191
|
export type { TestEnvironmentHandle, TestEnvironmentOptions, RunResults, TestResult, TestInfo, TestError, TestEvent, SuiteInfo, SuiteResult, } from "@ricsam/isolate-test-environment";
|
|
191
|
-
export { setupPlaywright, createPlaywrightHandler } from "@ricsam/isolate-playwright";
|
|
192
|
+
export { setupPlaywright, createPlaywrightHandler, } from "@ricsam/isolate-playwright";
|
|
192
193
|
export type { PlaywrightHandle, PlaywrightSetupOptions, PlaywrightCallback, PlaywrightEvent, NetworkRequestInfo, NetworkResponseInfo, BrowserConsoleLogEntry, } from "@ricsam/isolate-playwright";
|
|
193
|
-
export * from
|
|
194
|
+
export * from "./internal.ts";
|