@ricsam/isolate-client 0.0.1 → 0.1.1

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.
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/connection.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Connection handling for the isolate client.\n */\n\nimport { connect as netConnect, type Socket } from \"node:net\";\nimport {\n createFrameParser,\n buildFrame,\n MessageType,\n type Message,\n type ResponseOk,\n type ResponseError,\n type CreateRuntimeRequest,\n type DisposeRuntimeRequest,\n type EvalRequest,\n type DispatchRequestRequest,\n type TickRequest,\n type CallbackInvoke,\n type CallbackResponseMsg,\n type CallbackRegistration,\n type RuntimeCallbackRegistrations,\n type CreateRuntimeResult,\n type SerializedResponse,\n type SetupTestEnvRequest,\n type RunTestsRequest,\n type RunTestsResult,\n type SetupPlaywrightRequest,\n type RunPlaywrightTestsRequest,\n type ResetPlaywrightTestsRequest,\n type GetCollectedDataRequest,\n type PlaywrightTestResult,\n type CollectedData,\n type PlaywrightEvent,\n} from \"@ricsam/isolate-protocol\";\nimport type {\n ConnectOptions,\n DaemonConnection,\n RuntimeOptions,\n RemoteRuntime,\n DispatchOptions,\n ConsoleCallbacks,\n FetchCallback,\n FileSystemCallbacks,\n PlaywrightSetupOptions,\n PlaywrightEventHandler,\n} from \"./types.mjs\";\n\nconst DEFAULT_TIMEOUT = 30000;\n\ninterface PendingRequest {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\ninterface ConnectionState {\n socket: Socket;\n pendingRequests: Map<number, PendingRequest>;\n callbacks: Map<number, (...args: unknown[]) => unknown>;\n nextRequestId: number;\n nextCallbackId: number;\n connected: boolean;\n /** Playwright event handlers per isolate */\n playwrightEventHandlers: Map<string, PlaywrightEventHandler>;\n}\n\n/**\n * Connect to the isolate daemon.\n */\nexport async function connect(options: ConnectOptions = {}): Promise<DaemonConnection> {\n const socket = await createSocket(options);\n\n const state: ConnectionState = {\n socket,\n pendingRequests: new Map(),\n callbacks: new Map(),\n nextRequestId: 1,\n nextCallbackId: 1,\n connected: true,\n playwrightEventHandlers: new Map(),\n };\n\n const parser = createFrameParser();\n\n socket.on(\"data\", (data) => {\n try {\n for (const frame of parser.feed(new Uint8Array(data))) {\n handleMessage(frame.message, state);\n }\n } catch (err) {\n console.error(\"Error parsing frame:\", err);\n }\n });\n\n socket.on(\"close\", () => {\n state.connected = false;\n // Reject all pending requests\n for (const [, pending] of state.pendingRequests) {\n pending.reject(new Error(\"Connection closed\"));\n }\n state.pendingRequests.clear();\n });\n\n socket.on(\"error\", (err) => {\n console.error(\"Socket error:\", err);\n });\n\n return {\n createRuntime: (runtimeOptions) =>\n createRuntime(state, runtimeOptions),\n close: async () => {\n state.connected = false;\n socket.destroy();\n },\n isConnected: () => state.connected,\n };\n}\n\n/**\n * Create a socket connection.\n */\nfunction createSocket(options: ConnectOptions): Promise<Socket> {\n return new Promise((resolve, reject) => {\n const timeout = options.timeout ?? DEFAULT_TIMEOUT;\n\n let socket: Socket;\n\n const onError = (err: Error) => {\n reject(err);\n };\n\n const onConnect = () => {\n socket.removeListener(\"error\", onError);\n resolve(socket);\n };\n\n if (options.socket) {\n socket = netConnect(options.socket, onConnect);\n } else {\n socket = netConnect(\n options.port ?? 47891,\n options.host ?? \"127.0.0.1\",\n onConnect\n );\n }\n\n socket.on(\"error\", onError);\n\n // Connection timeout\n const timeoutId = setTimeout(() => {\n socket.destroy();\n reject(new Error(\"Connection timeout\"));\n }, timeout);\n\n socket.once(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n });\n}\n\n/**\n * Handle an incoming message from the daemon.\n */\nfunction handleMessage(message: Message, state: ConnectionState): void {\n switch (message.type) {\n case MessageType.RESPONSE_OK: {\n const response = message as ResponseOk;\n const pending = state.pendingRequests.get(response.requestId);\n if (pending) {\n state.pendingRequests.delete(response.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n pending.resolve(response.data);\n }\n break;\n }\n\n case MessageType.RESPONSE_ERROR: {\n const response = message as ResponseError;\n const pending = state.pendingRequests.get(response.requestId);\n if (pending) {\n state.pendingRequests.delete(response.requestId);\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n const error = new Error(response.message);\n if (response.details) {\n error.name = response.details.name;\n if (response.details.stack) {\n error.stack = response.details.stack;\n }\n }\n pending.reject(error);\n }\n break;\n }\n\n case MessageType.CALLBACK_INVOKE: {\n const invoke = message as CallbackInvoke;\n handleCallbackInvoke(invoke, state);\n break;\n }\n\n case MessageType.PONG:\n // Heartbeat response, ignore\n break;\n\n case MessageType.PLAYWRIGHT_EVENT: {\n const event = message as PlaywrightEvent;\n const handler = state.playwrightEventHandlers.get(event.isolateId);\n if (handler) {\n switch (event.eventType) {\n case \"consoleLog\":\n handler.onConsoleLog?.(event.payload as { level: string; args: unknown[] });\n break;\n case \"networkRequest\":\n handler.onNetworkRequest?.(event.payload as { url: string; method: string; headers: Record<string, string>; timestamp: number });\n break;\n case \"networkResponse\":\n handler.onNetworkResponse?.(event.payload as { url: string; status: number; headers: Record<string, string>; timestamp: number });\n break;\n }\n }\n break;\n }\n\n default:\n console.warn(`Unexpected message type: ${message.type}`);\n }\n}\n\n/**\n * Handle a callback invocation from the daemon.\n */\nasync function handleCallbackInvoke(\n invoke: CallbackInvoke,\n state: ConnectionState\n): Promise<void> {\n const callback = state.callbacks.get(invoke.callbackId);\n\n const response: CallbackResponseMsg = {\n type: MessageType.CALLBACK_RESPONSE,\n requestId: invoke.requestId,\n };\n\n if (!callback) {\n response.error = {\n name: \"Error\",\n message: `Unknown callback: ${invoke.callbackId}`,\n };\n } else {\n try {\n const result = await callback(...invoke.args);\n response.result = result;\n } catch (err) {\n const error = err as Error;\n response.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n }\n\n sendMessage(state.socket, response);\n}\n\n/**\n * Send a message to the daemon.\n */\nfunction sendMessage(socket: Socket, message: Message): void {\n const frame = buildFrame(message);\n socket.write(frame);\n}\n\n/**\n * Send a request and wait for response.\n */\nfunction sendRequest<T>(\n state: ConnectionState,\n message: Message,\n timeout = DEFAULT_TIMEOUT\n): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!state.connected) {\n reject(new Error(\"Not connected\"));\n return;\n }\n\n const requestId = (message as { requestId: number }).requestId;\n\n const timeoutId = setTimeout(() => {\n state.pendingRequests.delete(requestId);\n reject(new Error(\"Request timeout\"));\n }, timeout);\n\n state.pendingRequests.set(requestId, {\n resolve: resolve as (data: unknown) => void,\n reject,\n timeoutId,\n });\n\n sendMessage(state.socket, message);\n });\n}\n\n/**\n * Create a runtime in the daemon.\n */\nasync function createRuntime(\n state: ConnectionState,\n options: RuntimeOptions = {}\n): Promise<RemoteRuntime> {\n // Register callbacks\n const callbacks: RuntimeCallbackRegistrations = {};\n\n if (options.console) {\n callbacks.console = registerConsoleCallbacks(state, options.console);\n }\n\n if (options.fetch) {\n callbacks.fetch = registerFetchCallback(state, options.fetch);\n }\n\n if (options.fs) {\n callbacks.fs = registerFsCallbacks(state, options.fs);\n }\n\n const requestId = state.nextRequestId++;\n const request: CreateRuntimeRequest = {\n type: MessageType.CREATE_RUNTIME,\n requestId,\n options: {\n memoryLimit: options.memoryLimit,\n callbacks,\n },\n };\n\n const result = await sendRequest<CreateRuntimeResult>(state, request);\n const isolateId = result.isolateId;\n\n return {\n isolateId,\n\n eval: async (code: string, filename?: string) => {\n const reqId = state.nextRequestId++;\n const req: EvalRequest = {\n type: MessageType.EVAL,\n requestId: reqId,\n isolateId,\n code,\n filename,\n };\n const res = await sendRequest<{ value: unknown }>(state, req);\n return res.value;\n },\n\n dispatchRequest: async (\n request: Request,\n dispatchOptions?: DispatchOptions\n ) => {\n const reqId = state.nextRequestId++;\n const serialized = await serializeRequest(request);\n const req: DispatchRequestRequest = {\n type: MessageType.DISPATCH_REQUEST,\n requestId: reqId,\n isolateId,\n request: serialized,\n options: dispatchOptions,\n };\n const res = await sendRequest<{ response: SerializedResponse }>(\n state,\n req,\n dispatchOptions?.timeout ?? DEFAULT_TIMEOUT\n );\n return deserializeResponse(res.response);\n },\n\n tick: async (ms?: number) => {\n const reqId = state.nextRequestId++;\n const req: TickRequest = {\n type: MessageType.TICK,\n requestId: reqId,\n isolateId,\n ms,\n };\n await sendRequest(state, req);\n },\n\n setupTestEnvironment: async () => {\n const reqId = state.nextRequestId++;\n const req: SetupTestEnvRequest = {\n type: MessageType.SETUP_TEST_ENV,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n\n runTests: async (timeout?: number) => {\n const reqId = state.nextRequestId++;\n const req: RunTestsRequest = {\n type: MessageType.RUN_TESTS,\n requestId: reqId,\n isolateId,\n timeout,\n };\n return sendRequest<RunTestsResult>(state, req, timeout ?? DEFAULT_TIMEOUT);\n },\n\n setupPlaywright: async (playwrightOptions?: PlaywrightSetupOptions) => {\n const reqId = state.nextRequestId++;\n const req: SetupPlaywrightRequest = {\n type: MessageType.SETUP_PLAYWRIGHT,\n requestId: reqId,\n isolateId,\n options: {\n browserType: playwrightOptions?.browserType,\n headless: playwrightOptions?.headless,\n baseURL: playwrightOptions?.baseURL,\n },\n };\n\n // Register event handlers if provided\n if (playwrightOptions?.onConsoleLog || playwrightOptions?.onNetworkRequest || playwrightOptions?.onNetworkResponse) {\n state.playwrightEventHandlers.set(isolateId, {\n onConsoleLog: playwrightOptions.onConsoleLog,\n onNetworkRequest: playwrightOptions.onNetworkRequest,\n onNetworkResponse: playwrightOptions.onNetworkResponse,\n });\n }\n\n await sendRequest(state, req);\n },\n\n runPlaywrightTests: async (timeout?: number) => {\n const reqId = state.nextRequestId++;\n const req: RunPlaywrightTestsRequest = {\n type: MessageType.RUN_PLAYWRIGHT_TESTS,\n requestId: reqId,\n isolateId,\n timeout,\n };\n return sendRequest<PlaywrightTestResult>(state, req, timeout ?? DEFAULT_TIMEOUT);\n },\n\n resetPlaywrightTests: async () => {\n const reqId = state.nextRequestId++;\n const req: ResetPlaywrightTestsRequest = {\n type: MessageType.RESET_PLAYWRIGHT_TESTS,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n\n getCollectedData: async () => {\n const reqId = state.nextRequestId++;\n const req: GetCollectedDataRequest = {\n type: MessageType.GET_COLLECTED_DATA,\n requestId: reqId,\n isolateId,\n };\n return sendRequest<CollectedData>(state, req);\n },\n\n dispose: async () => {\n // Clean up event handlers\n state.playwrightEventHandlers.delete(isolateId);\n\n const reqId = state.nextRequestId++;\n const req: DisposeRuntimeRequest = {\n type: MessageType.DISPOSE_RUNTIME,\n requestId: reqId,\n isolateId,\n };\n await sendRequest(state, req);\n },\n };\n}\n\n/**\n * Register console callbacks.\n */\nfunction registerConsoleCallbacks(\n state: ConnectionState,\n callbacks: ConsoleCallbacks\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n const register = (name: string, fn: (...args: unknown[]) => void) => {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, (_level: unknown, ...args: unknown[]) => {\n fn(...args);\n });\n registrations[name] = { callbackId, name, async: false };\n };\n\n if (callbacks.log) register(\"log\", callbacks.log);\n if (callbacks.warn) register(\"warn\", callbacks.warn);\n if (callbacks.error) register(\"error\", callbacks.error);\n if (callbacks.info) register(\"info\", callbacks.info);\n if (callbacks.debug) register(\"debug\", callbacks.debug);\n if (callbacks.dir) register(\"dir\", callbacks.dir);\n\n return registrations;\n}\n\n/**\n * Register fetch callback.\n */\nfunction registerFetchCallback(\n state: ConnectionState,\n callback: FetchCallback\n): CallbackRegistration {\n const callbackId = state.nextCallbackId++;\n\n state.callbacks.set(callbackId, async (serialized: unknown) => {\n const request = deserializeRequest(serialized as SerializedRequestData);\n const response = await callback(request);\n return serializeResponse(response);\n });\n\n return { callbackId, name: \"fetch\", async: true };\n}\n\n/**\n * Register file system callbacks.\n */\nfunction registerFsCallbacks(\n state: ConnectionState,\n callbacks: FileSystemCallbacks\n): Record<string, CallbackRegistration> {\n const registrations: Record<string, CallbackRegistration> = {};\n\n // readFile: (path: string) => Promise<ArrayBuffer>\n if (callbacks.readFile) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n const result = await callbacks.readFile!(path as string);\n // Convert ArrayBuffer to Uint8Array for serialization\n return new Uint8Array(result);\n });\n registrations.readFile = { callbackId, name: \"readFile\", async: true };\n }\n\n // writeFile: (path: string, data: ArrayBuffer) => Promise<void>\n if (callbacks.writeFile) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown, data: unknown) => {\n // Convert Uint8Array or array back to ArrayBuffer\n let buffer: ArrayBuffer;\n if (data instanceof Uint8Array) {\n buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n } else if (Array.isArray(data)) {\n buffer = new Uint8Array(data as number[]).buffer;\n } else if (data instanceof ArrayBuffer) {\n buffer = data;\n } else {\n buffer = new ArrayBuffer(0);\n }\n await callbacks.writeFile!(path as string, buffer);\n });\n registrations.writeFile = { callbackId, name: \"writeFile\", async: true };\n }\n\n // unlink: (path: string) => Promise<void>\n if (callbacks.unlink) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n await callbacks.unlink!(path as string);\n });\n registrations.unlink = { callbackId, name: \"unlink\", async: true };\n }\n\n // readdir: (path: string) => Promise<string[]>\n if (callbacks.readdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n return callbacks.readdir!(path as string);\n });\n registrations.readdir = { callbackId, name: \"readdir\", async: true };\n }\n\n // mkdir: (path: string, options?: { recursive?: boolean }) => Promise<void>\n if (callbacks.mkdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown, options: unknown) => {\n await callbacks.mkdir!(path as string, options as { recursive?: boolean });\n });\n registrations.mkdir = { callbackId, name: \"mkdir\", async: true };\n }\n\n // rmdir: (path: string) => Promise<void>\n if (callbacks.rmdir) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n await callbacks.rmdir!(path as string);\n });\n registrations.rmdir = { callbackId, name: \"rmdir\", async: true };\n }\n\n // stat: (path: string) => Promise<{ isFile: boolean; isDirectory: boolean; size: number }>\n if (callbacks.stat) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (path: unknown) => {\n return callbacks.stat!(path as string);\n });\n registrations.stat = { callbackId, name: \"stat\", async: true };\n }\n\n // rename: (from: string, to: string) => Promise<void>\n if (callbacks.rename) {\n const callbackId = state.nextCallbackId++;\n state.callbacks.set(callbackId, async (from: unknown, to: unknown) => {\n await callbacks.rename!(from as string, to as string);\n });\n registrations.rename = { callbackId, name: \"rename\", async: true };\n }\n\n return registrations;\n}\n\n// ============================================================================\n// Request/Response Serialization\n// ============================================================================\n\ninterface SerializedRequestData {\n method: string;\n url: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\ninterface SerializedResponseData {\n status: number;\n statusText: string;\n headers: [string, string][];\n body: Uint8Array | null;\n}\n\nasync function serializeRequest(request: Request): Promise<SerializedRequestData> {\n const headers: [string, string][] = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (request.body) {\n body = new Uint8Array(await request.arrayBuffer());\n }\n\n return {\n method: request.method,\n url: request.url,\n headers,\n body,\n };\n}\n\nasync function serializeResponse(response: Response): Promise<SerializedResponseData> {\n const headers: [string, string][] = [];\n response.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n\n let body: Uint8Array | null = null;\n if (response.body) {\n body = new Uint8Array(await response.arrayBuffer());\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers,\n body,\n };\n}\n\nfunction deserializeRequest(data: SerializedRequestData): Request {\n return new Request(data.url, {\n method: data.method,\n headers: data.headers,\n body: data.body as unknown as BodyInit | null | undefined,\n });\n}\n\nfunction deserializeResponse(data: SerializedResponse): Response {\n return new Response(data.body as unknown as BodyInit | null, {\n status: data.status,\n statusText: data.statusText,\n headers: data.headers,\n });\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "944ECBC62DEB63FB64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,8 @@
1
+ // @bun
2
+ // packages/isolate-client/src/index.ts
3
+ import { connect } from "./connection.mjs";
4
+ export {
5
+ connect
6
+ };
7
+
8
+ //# debugId=330C2EADEC2FFB8D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * @ricsam/isolate-client\n *\n * Client library for connecting to the isolate daemon.\n * Works with Bun, Node.js, and other JavaScript runtimes.\n */\n\nexport { connect } from \"./connection.mjs\";\nexport type {\n ConnectOptions,\n DaemonConnection,\n RuntimeOptions,\n RemoteRuntime,\n DispatchOptions,\n ConsoleCallbacks,\n FetchCallback,\n FileSystemCallbacks,\n TestResults,\n TestResult,\n PlaywrightSetupOptions,\n PlaywrightTestResults,\n PlaywrightEventHandler,\n CollectedData,\n} from \"./types.mjs\";\n"
6
+ ],
7
+ "mappings": ";;AAOA;",
8
+ "debugId": "330C2EADEC2FFB8D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "@ricsam/isolate-client",
3
+ "version": "0.1.1",
4
+ "type": "module"
5
+ }
@@ -0,0 +1,3 @@
1
+ // @bun
2
+
3
+ //# debugId=B6D6F8F485BA0A2264756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "B6D6F8F485BA0A2264756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Connection handling for the isolate client.
3
+ */
4
+ import type { ConnectOptions, DaemonConnection } from "./types.ts";
5
+ /**
6
+ * Connect to the isolate daemon.
7
+ */
8
+ export declare function connect(options?: ConnectOptions): Promise<DaemonConnection>;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @ricsam/isolate-client
3
+ *
4
+ * Client library for connecting to the isolate daemon.
5
+ * Works with Bun, Node.js, and other JavaScript runtimes.
6
+ */
7
+ export { connect } from "./connection.ts";
8
+ export type { ConnectOptions, DaemonConnection, RuntimeOptions, RemoteRuntime, DispatchOptions, ConsoleCallbacks, FetchCallback, FileSystemCallbacks, TestResults, TestResult, PlaywrightSetupOptions, PlaywrightTestResults, PlaywrightEventHandler, CollectedData, } from "./types.ts";
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Types for the isolate client.
3
+ */
4
+ import type { RunTestsResult, TestResult as ProtocolTestResult, PlaywrightTestResult as ProtocolPlaywrightTestResult, CollectedData as ProtocolCollectedData } from "@ricsam/isolate-protocol";
5
+ export type TestResults = RunTestsResult;
6
+ export type TestResult = ProtocolTestResult;
7
+ export type PlaywrightTestResults = ProtocolPlaywrightTestResult;
8
+ export type CollectedData = ProtocolCollectedData;
9
+ /**
10
+ * Options for connecting to the daemon.
11
+ */
12
+ export interface ConnectOptions {
13
+ /** Unix socket path */
14
+ socket?: string;
15
+ /** TCP host */
16
+ host?: string;
17
+ /** TCP port */
18
+ port?: number;
19
+ /** Connection timeout in ms */
20
+ timeout?: number;
21
+ }
22
+ /**
23
+ * Connection to the daemon.
24
+ */
25
+ export interface DaemonConnection {
26
+ /** Create a new runtime in the daemon */
27
+ createRuntime(options?: RuntimeOptions): Promise<RemoteRuntime>;
28
+ /** Close the connection */
29
+ close(): Promise<void>;
30
+ /** Check if connected */
31
+ isConnected(): boolean;
32
+ }
33
+ /**
34
+ * Options for creating a runtime.
35
+ */
36
+ export interface RuntimeOptions {
37
+ /** Memory limit in MB */
38
+ memoryLimit?: number;
39
+ /** Console callback handlers */
40
+ console?: ConsoleCallbacks;
41
+ /** Fetch callback handler */
42
+ fetch?: FetchCallback;
43
+ /** File system callback handlers */
44
+ fs?: FileSystemCallbacks;
45
+ }
46
+ /**
47
+ * Console callback handlers.
48
+ */
49
+ export interface ConsoleCallbacks {
50
+ log?: (...args: unknown[]) => void;
51
+ warn?: (...args: unknown[]) => void;
52
+ error?: (...args: unknown[]) => void;
53
+ info?: (...args: unknown[]) => void;
54
+ debug?: (...args: unknown[]) => void;
55
+ dir?: (...args: unknown[]) => void;
56
+ }
57
+ /**
58
+ * Fetch callback type.
59
+ */
60
+ export type FetchCallback = (request: Request) => Response | Promise<Response>;
61
+ /**
62
+ * File system callback handlers.
63
+ */
64
+ export interface FileSystemCallbacks {
65
+ readFile?: (path: string) => Promise<ArrayBuffer>;
66
+ writeFile?: (path: string, data: ArrayBuffer) => Promise<void>;
67
+ unlink?: (path: string) => Promise<void>;
68
+ readdir?: (path: string) => Promise<string[]>;
69
+ mkdir?: (path: string, options?: {
70
+ recursive?: boolean;
71
+ }) => Promise<void>;
72
+ rmdir?: (path: string) => Promise<void>;
73
+ stat?: (path: string) => Promise<{
74
+ isFile: boolean;
75
+ isDirectory: boolean;
76
+ size: number;
77
+ }>;
78
+ rename?: (from: string, to: string) => Promise<void>;
79
+ }
80
+ /**
81
+ * Remote runtime handle.
82
+ */
83
+ export interface RemoteRuntime {
84
+ /** The isolate ID */
85
+ readonly isolateId: string;
86
+ /** Execute code in the isolate */
87
+ eval(code: string, filename?: string): Promise<unknown>;
88
+ /** Dispatch an HTTP request to the isolate's fetch handler */
89
+ dispatchRequest(request: Request, options?: DispatchOptions): Promise<Response>;
90
+ /** Advance virtual timers */
91
+ tick(ms?: number): Promise<void>;
92
+ /** Setup test environment (describe, it, expect, etc.) */
93
+ setupTestEnvironment(): Promise<void>;
94
+ /** Run all registered tests and return results */
95
+ runTests(timeout?: number): Promise<TestResults>;
96
+ /** Setup Playwright browser environment */
97
+ setupPlaywright(options?: PlaywrightSetupOptions): Promise<void>;
98
+ /** Run all registered Playwright tests */
99
+ runPlaywrightTests(timeout?: number): Promise<PlaywrightTestResults>;
100
+ /** Reset/clear all Playwright tests */
101
+ resetPlaywrightTests(): Promise<void>;
102
+ /** Get collected console logs and network data */
103
+ getCollectedData(): Promise<CollectedData>;
104
+ /** Dispose the runtime */
105
+ dispose(): Promise<void>;
106
+ }
107
+ /**
108
+ * Options for dispatching a request.
109
+ */
110
+ export interface DispatchOptions {
111
+ /** Request timeout in ms */
112
+ timeout?: number;
113
+ }
114
+ /**
115
+ * Options for setting up Playwright.
116
+ */
117
+ export interface PlaywrightSetupOptions {
118
+ /** Browser type to use */
119
+ browserType?: "chromium" | "firefox" | "webkit";
120
+ /** Run browser in headless mode */
121
+ headless?: boolean;
122
+ /** Base URL for navigation */
123
+ baseURL?: string;
124
+ /** Console log event handler */
125
+ onConsoleLog?: (log: {
126
+ level: string;
127
+ args: unknown[];
128
+ }) => void;
129
+ /** Network request event handler */
130
+ onNetworkRequest?: (request: {
131
+ url: string;
132
+ method: string;
133
+ headers: Record<string, string>;
134
+ timestamp: number;
135
+ }) => void;
136
+ /** Network response event handler */
137
+ onNetworkResponse?: (response: {
138
+ url: string;
139
+ status: number;
140
+ headers: Record<string, string>;
141
+ timestamp: number;
142
+ }) => void;
143
+ }
144
+ /**
145
+ * Handler for Playwright events streamed from daemon.
146
+ */
147
+ export interface PlaywrightEventHandler {
148
+ onConsoleLog?: (log: {
149
+ level: string;
150
+ args: unknown[];
151
+ }) => void;
152
+ onNetworkRequest?: (request: {
153
+ url: string;
154
+ method: string;
155
+ headers: Record<string, string>;
156
+ timestamp: number;
157
+ }) => void;
158
+ onNetworkResponse?: (response: {
159
+ url: string;
160
+ status: number;
161
+ headers: Record<string, string>;
162
+ timestamp: number;
163
+ }) => void;
164
+ }
package/package.json CHANGED
@@ -1,10 +1,51 @@
1
1
  {
2
2
  "name": "@ricsam/isolate-client",
3
- "version": "0.0.1",
4
- "description": "OIDC trusted publishing setup package for @ricsam/isolate-client",
3
+ "version": "0.1.1",
4
+ "main": "./dist/cjs/index.cjs",
5
+ "types": "./dist/types/index.d.ts",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/types/index.d.ts",
9
+ "require": "./dist/cjs/index.cjs",
10
+ "import": "./dist/mjs/index.mjs"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "test": "node --test --experimental-strip-types 'src/**/*.test.ts'",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "dependencies": {
19
+ "@ricsam/isolate-protocol": "*"
20
+ },
21
+ "author": "Richard Samuelsson",
22
+ "license": "MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/ricsam/isolate.git"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/ricsam/isolate/issues"
29
+ },
30
+ "homepage": "https://github.com/ricsam/isolate#readme",
5
31
  "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
32
+ "isolated-vm",
33
+ "sandbox",
34
+ "javascript",
35
+ "runtime",
36
+ "fetch",
37
+ "filesystem",
38
+ "streams",
39
+ "v8",
40
+ "isolate"
41
+ ],
42
+ "description": "Client library for connecting to the isolate daemon from any JavaScript runtime",
43
+ "module": "./dist/mjs/index.mjs",
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "README.md"
9
50
  ]
10
- }
51
+ }