inngest 4.24.0 → 4.25.0
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/CHANGELOG.md +176 -0
- package/components/InngestStepTools.cjs +22 -1
- package/components/InngestStepTools.cjs.map +1 -1
- package/components/InngestStepTools.d.cts.map +1 -1
- package/components/InngestStepTools.d.ts.map +1 -1
- package/components/InngestStepTools.js +22 -2
- package/components/InngestStepTools.js.map +1 -1
- package/components/execution/als.cjs.map +1 -1
- package/components/execution/als.d.cts +6 -0
- package/components/execution/als.d.cts.map +1 -1
- package/components/execution/als.d.ts +6 -0
- package/components/execution/als.d.ts.map +1 -1
- package/components/execution/als.js.map +1 -1
- package/components/execution/engine.cjs +36 -16
- package/components/execution/engine.cjs.map +1 -1
- package/components/execution/engine.d.cts.map +1 -1
- package/components/execution/engine.d.ts.map +1 -1
- package/components/execution/engine.js +36 -16
- package/components/execution/engine.js.map +1 -1
- package/components/execution/otel/middleware.d.cts +7 -7
- package/components/execution/otel/middleware.d.ts +7 -7
- package/components/realtime/types.d.cts +4 -4
- package/components/realtime/types.d.cts.map +1 -1
- package/components/realtime/types.d.ts +4 -4
- package/components/realtime/types.d.ts.map +1 -1
- package/components/sandbox/durable.cjs +111 -27
- package/components/sandbox/durable.cjs.map +1 -1
- package/components/sandbox/durable.js +109 -27
- package/components/sandbox/durable.js.map +1 -1
- package/components/sandbox/group.cjs +61 -27
- package/components/sandbox/group.cjs.map +1 -1
- package/components/sandbox/group.d.cts.map +1 -1
- package/components/sandbox/group.d.ts.map +1 -1
- package/components/sandbox/group.js +59 -28
- package/components/sandbox/group.js.map +1 -1
- package/components/sandbox/image.cjs +25 -0
- package/components/sandbox/image.cjs.map +1 -0
- package/components/sandbox/image.d.cts +32 -0
- package/components/sandbox/image.d.cts.map +1 -0
- package/components/sandbox/image.d.ts +32 -0
- package/components/sandbox/image.d.ts.map +1 -0
- package/components/sandbox/image.js +23 -0
- package/components/sandbox/image.js.map +1 -0
- package/components/sandbox/middleware.cjs +90 -38
- package/components/sandbox/middleware.cjs.map +1 -1
- package/components/sandbox/middleware.d.cts +5 -1
- package/components/sandbox/middleware.d.cts.map +1 -1
- package/components/sandbox/middleware.d.ts +5 -1
- package/components/sandbox/middleware.d.ts.map +1 -1
- package/components/sandbox/middleware.js +90 -38
- package/components/sandbox/middleware.js.map +1 -1
- package/components/sandbox/protocol.cjs +27 -0
- package/components/sandbox/protocol.cjs.map +1 -1
- package/components/sandbox/protocol.d.cts.map +1 -1
- package/components/sandbox/protocol.d.ts.map +1 -1
- package/components/sandbox/protocol.js +28 -1
- package/components/sandbox/protocol.js.map +1 -1
- package/components/sandbox/runnerScripts.cjs +214 -0
- package/components/sandbox/runnerScripts.cjs.map +1 -0
- package/components/sandbox/runnerScripts.js +213 -0
- package/components/sandbox/runnerScripts.js.map +1 -0
- package/components/sandbox/runners.cjs +113 -0
- package/components/sandbox/runners.cjs.map +1 -0
- package/components/sandbox/runners.d.cts +45 -0
- package/components/sandbox/runners.d.cts.map +1 -0
- package/components/sandbox/runners.d.ts +45 -0
- package/components/sandbox/runners.d.ts.map +1 -0
- package/components/sandbox/runners.js +113 -0
- package/components/sandbox/runners.js.map +1 -0
- package/components/sandbox/toolRunner.cjs +321 -0
- package/components/sandbox/toolRunner.cjs.map +1 -0
- package/components/sandbox/toolRunner.js +319 -0
- package/components/sandbox/toolRunner.js.map +1 -0
- package/components/sandbox/toolStubs.cjs +187 -0
- package/components/sandbox/toolStubs.cjs.map +1 -0
- package/components/sandbox/toolStubs.js +185 -0
- package/components/sandbox/toolStubs.js.map +1 -0
- package/components/sandbox/tools.cjs +173 -0
- package/components/sandbox/tools.cjs.map +1 -0
- package/components/sandbox/tools.d.cts +142 -0
- package/components/sandbox/tools.d.cts.map +1 -0
- package/components/sandbox/tools.d.ts +142 -0
- package/components/sandbox/tools.d.ts.map +1 -0
- package/components/sandbox/tools.js +166 -0
- package/components/sandbox/tools.js.map +1 -0
- package/components/sandbox/trace.cjs +7 -0
- package/components/sandbox/trace.cjs.map +1 -1
- package/components/sandbox/trace.js +7 -1
- package/components/sandbox/trace.js.map +1 -1
- package/components/sandbox/types.cjs.map +1 -1
- package/components/sandbox/types.d.cts +37 -2
- package/components/sandbox/types.d.cts.map +1 -1
- package/components/sandbox/types.d.ts +37 -2
- package/components/sandbox/types.d.ts.map +1 -1
- package/components/sandbox/types.js.map +1 -1
- package/components/sandbox/validation.cjs +21 -1
- package/components/sandbox/validation.cjs.map +1 -1
- package/components/sandbox/validation.js +19 -2
- package/components/sandbox/validation.js.map +1 -1
- package/experimental.cjs +5 -1
- package/experimental.d.cts +4 -1
- package/experimental.d.ts +4 -1
- package/experimental.js +3 -1
- package/package.json +2 -1
- package/version.cjs +1 -1
- package/version.cjs.map +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable.cjs","names":["maxDurableSandboxExecOutputBytes","encodeBase64","parseSandboxOperation","createSandboxForOperation","sandboxProtocolVersion","sandboxForOperation","runSandboxCommandForOperation","SandboxError","sandboxProcessForOperation","createSandboxSnapshotForOperation","listSandboxSnapshotsForOperation","getSandboxSnapshotForOperation","waitUntilSandboxSnapshotReadyForOperation","deleteSandboxSnapshotForOperation","validateSandboxResult","SandboxValidationError","findSandboxErrorOptions","StepError","findSandboxValidationError","version","parseWithSchema","sandboxSnapshotRefSchema","facade: DurableSandboxSnapshot","parseSandboxOperationForAction","normalizeSandboxSnapshotWaitOptions","normalizeSandboxCreateOptions","sandboxProcessRefSchema","facade: DurableSandboxProcess","normalizeSandboxProcessSignalOptions","normalizeSandboxProcessWaitOptions","normalizeSandboxProcessOutputOptions","decodeOutputChunk","sandboxRefSchema","createSnapshot: DurableSandbox[\"snapshot\"]","normalizeSandboxSnapshotCreateOptions","getStepOptions","snapshot: DurableSandbox[\"snapshot\"]","withSpan","facade: DurableSandbox","normalizeSandboxCommandOptions","decodeUtf8","decodeBase64","normalizeSandboxProcessStartOptions","normalizeSandboxProcessListOptions","canonicalUuidSchema","normalizeSandboxWaitUntilRunningOptions","normalizeSandboxListOptions","normalizeSandboxSnapshotListOptions"],"sources":["../../../src/components/sandbox/durable.ts"],"sourcesContent":["import type { StepOptionsOrId } from \"../../types.ts\";\nimport { version } from \"../../version.ts\";\nimport { getStepOptions, withSpan } from \"../InngestStepTools.ts\";\nimport { StepError } from \"../StepError.ts\";\nimport {\n createSandboxForOperation,\n createSandboxSnapshotForOperation,\n deleteSandboxSnapshotForOperation,\n getSandboxSnapshotForOperation,\n listSandboxSnapshotsForOperation,\n runSandboxCommandForOperation,\n sandboxForOperation,\n sandboxProcessForOperation,\n waitUntilSandboxSnapshotReadyForOperation,\n} from \"./client.ts\";\nimport {\n findSandboxErrorOptions,\n findSandboxValidationError,\n maxDurableSandboxExecOutputBytes,\n parseSandboxOperation,\n parseSandboxOperationForAction,\n type SandboxOperationForAction,\n type SandboxOperationResultV1,\n type SandboxOperationV1,\n type SandboxRawToolResolver,\n type SandboxResultForAction,\n validateSandboxResult,\n} from \"./protocol.ts\";\nimport {\n type DurableSandbox,\n type DurableSandboxProcess,\n type DurableSandboxSnapshot,\n type DurableSandboxTools,\n type Sandbox,\n type SandboxAction,\n type SandboxClient,\n type SandboxCommandOutputMetadata,\n type SandboxDestroyResult,\n SandboxError,\n type SandboxOutputChunk,\n type SandboxProcess,\n type SandboxProcessRef,\n type SandboxRef,\n type SandboxSnapshotRef,\n SandboxValidationError,\n sandboxProtocolVersion,\n} from \"./types.ts\";\nimport {\n canonicalUuidSchema,\n decodeBase64,\n decodeOutputChunk,\n decodeUtf8,\n encodeBase64,\n normalizeSandboxCommandOptions,\n normalizeSandboxCreateOptions,\n normalizeSandboxListOptions,\n normalizeSandboxProcessListOptions,\n normalizeSandboxProcessOutputOptions,\n normalizeSandboxProcessSignalOptions,\n normalizeSandboxProcessStartOptions,\n normalizeSandboxProcessWaitOptions,\n normalizeSandboxSnapshotCreateOptions,\n normalizeSandboxSnapshotListOptions,\n normalizeSandboxSnapshotWaitOptions,\n normalizeSandboxWaitUntilRunningOptions,\n parseWithSchema,\n sandboxProcessRefSchema,\n sandboxRefSchema,\n sandboxSnapshotRefSchema,\n} from \"./validation.ts\";\n\nconst fitDurableSandboxExecOutput = (\n stdout: Uint8Array,\n stderr: Uint8Array,\n): {\n stdout: Uint8Array;\n stderr: Uint8Array;\n output: SandboxCommandOutputMetadata;\n} => {\n const originalBytes = {\n stdout: stdout.byteLength,\n stderr: stderr.byteLength,\n };\n if (\n originalBytes.stdout + originalBytes.stderr <=\n maxDurableSandboxExecOutputBytes\n ) {\n return { stdout, stderr, output: { truncated: false } };\n }\n\n // This bound intentionally lives in the `step.sandbox.exec` wrapper rather\n // than the direct client. `step.run` persists at most 4 MiB of serialized\n // output, and base64 expands captured bytes. Reserve half of the safe raw\n // budget for each stream, donate unused capacity to the other stream, and\n // retain tails because command failures generally appear at the end.\n const streamShare = Math.floor(maxDurableSandboxExecOutputBytes / 2);\n let retainedStdoutBytes = Math.min(originalBytes.stdout, streamShare);\n let retainedStderrBytes = Math.min(originalBytes.stderr, streamShare);\n let remainingBytes =\n maxDurableSandboxExecOutputBytes -\n retainedStdoutBytes -\n retainedStderrBytes;\n\n const extraStdoutBytes = Math.min(\n originalBytes.stdout - retainedStdoutBytes,\n remainingBytes,\n );\n retainedStdoutBytes += extraStdoutBytes;\n remainingBytes -= extraStdoutBytes;\n retainedStderrBytes += Math.min(\n originalBytes.stderr - retainedStderrBytes,\n remainingBytes,\n );\n\n const retainedBytes = {\n stdout: retainedStdoutBytes,\n stderr: retainedStderrBytes,\n };\n return {\n stdout: stdout.subarray(originalBytes.stdout - retainedBytes.stdout),\n stderr: stderr.subarray(originalBytes.stderr - retainedBytes.stderr),\n output: {\n truncated: true,\n strategy: \"tail\",\n originalBytes,\n retainedBytes,\n },\n };\n};\n\nconst encodeOutputChunk = (\n chunk: SandboxOutputChunk,\n): {\n stream: \"STDOUT\" | \"STDERR\";\n data: string;\n encoding: \"base64\";\n at?: string;\n} => ({\n stream: chunk.stream,\n data: encodeBase64(chunk.data),\n encoding: \"base64\",\n ...(chunk.at !== undefined && { at: chunk.at }),\n});\n\nconst sandboxRefForWire = (sandbox: Sandbox): SandboxRef => ({\n kind: sandbox.kind,\n version: sandbox.version,\n id: sandbox.id,\n name: sandbox.name,\n status: sandbox.status,\n vpcId: sandbox.vpcId,\n imageRef: sandbox.imageRef,\n resources: { ...sandbox.resources },\n createdAt: sandbox.createdAt,\n ...(sandbox.startedAt !== undefined && { startedAt: sandbox.startedAt }),\n ...(sandbox.endedAt !== undefined && { endedAt: sandbox.endedAt }),\n ...(sandbox.error !== undefined && { error: sandbox.error }),\n});\n\nconst processRefForWire = (process: SandboxProcess) => ({\n kind: process.kind,\n version: process.version,\n sandboxId: process.sandboxId,\n id: process.id,\n command: [...process.command],\n ...(process.pid !== undefined && { pid: process.pid }),\n state: process.state,\n ...(process.exitCode !== undefined && { exitCode: process.exitCode }),\n ...(process.terminationSignal !== undefined && {\n terminationSignal: process.terminationSignal,\n }),\n ...(process.startedAt !== undefined && { startedAt: process.startedAt }),\n ...(process.endedAt !== undefined && { endedAt: process.endedAt }),\n});\n\nconst snapshotRefForWire = (snapshot: SandboxSnapshotRef) => ({\n ...snapshot,\n resources: { ...snapshot.resources },\n});\n\n/**\n * Execute a durable sandbox operation through the public REST client and\n * reduce its result to JSON-safe data suitable for normal step memoization.\n */\nexport const executeSandboxOperation = async (\n client: SandboxClient,\n rawOperation: unknown,\n): Promise<SandboxOperationResultV1> => {\n const operation = parseSandboxOperation(rawOperation);\n\n switch (operation.action) {\n case \"create\": {\n const { runningTimeoutMs, ...options } = operation.input[0];\n const sandbox = await createSandboxForOperation(client, {\n ...options,\n ...(runningTimeoutMs !== undefined && {\n runningTimeout: runningTimeoutMs,\n }),\n });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandboxRefForWire(sandbox),\n };\n }\n case \"list\": {\n const result = await client.list(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandboxes: result.items.map(sandboxRefForWire),\n page: result.page,\n fetchedAt: result.fetchedAt,\n };\n }\n case \"get\": {\n const sandbox = await client.get(operation.input[0].sandboxId);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandbox ? sandboxRefForWire(sandbox) : null,\n };\n }\n case \"waitUntilRunning\": {\n const sandbox = await sandboxForOperation(\n client,\n operation.target.sandbox,\n ).waitUntilRunning({\n timeout: operation.input[0].timeoutMs,\n });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandboxRefForWire(sandbox),\n };\n }\n case \"exec\": {\n const { command, timeoutMs, ...options } = operation.input[0];\n const sandbox = sandboxForOperation(client, operation.target.sandbox);\n const result = await runSandboxCommandForOperation(sandbox, command, {\n ...options,\n timeout: timeoutMs,\n });\n const output = fitDurableSandboxExecOutput(result.stdout, result.stderr);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: {\n stdout: encodeBase64(output.stdout),\n stderr: encodeBase64(output.stderr),\n encoding: \"base64\",\n exitCode: result.exitCode,\n output: output.output,\n },\n };\n }\n case \"destroy\": {\n // A destroy that already happened, such as one retried after a lost\n // response, has the outcome the caller wanted.\n const result = await sandboxForOperation(client, operation.target.sandbox)\n .destroy()\n .catch((error: unknown): SandboxDestroyResult => {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_not_found\"\n ) {\n return { status: \"TERMINATED\", sandbox: null };\n }\n\n throw error;\n });\n\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result,\n };\n }\n case \"pause\":\n case \"resume\": {\n const sandbox = await sandboxForOperation(\n client,\n operation.target.sandbox,\n )[operation.action]({ timeout: operation.input[0].timeoutMs });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandboxRefForWire(sandbox),\n };\n }\n case \"process.start\": {\n const sandbox = sandboxForOperation(client, operation.target.sandbox);\n const process = await sandbox.processes.start(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n process: processRefForWire(process),\n };\n }\n case \"process.list\": {\n const result = await sandboxForOperation(\n client,\n operation.target.sandbox,\n ).processes.list(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n processes: result.items.map(processRefForWire),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n }\n case \"process.get\": {\n const sandbox = sandboxForOperation(client, operation.target.sandbox);\n const process = await sandbox.processes.get(operation.target.processId);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n process: process ? processRefForWire(process) : null,\n };\n }\n case \"process.signal\": {\n await sandboxProcessForOperation(client, operation.target.process).signal(\n operation.input[0],\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: null,\n };\n }\n case \"process.wait\": {\n const process = await sandboxProcessForOperation(\n client,\n operation.target.process,\n ).wait({ timeout: operation.input[0].timeoutMs });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n process: {\n kind: process.kind,\n version: process.version,\n sandboxId: process.sandboxId,\n id: process.id,\n state: process.state as \"EXITED\" | \"KILLED\" | \"FAILED\" | \"LOST\",\n ...(process.exitCode !== undefined && {\n exitCode: process.exitCode,\n }),\n ...(process.terminationSignal !== undefined && {\n terminationSignal: process.terminationSignal,\n }),\n },\n };\n }\n case \"process.output\": {\n const result = await sandboxProcessForOperation(\n client,\n operation.target.process,\n ).getOutput(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: { chunks: result.chunks.map(encodeOutputChunk) },\n };\n }\n case \"snapshot.create\": {\n const snapshot = await createSandboxSnapshotForOperation(\n client,\n operation.target.sandbox.id,\n operation.input[0],\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshot: snapshotRefForWire(snapshot),\n };\n }\n case \"snapshot.list\": {\n const result = await listSandboxSnapshotsForOperation(\n client,\n operation.input[0],\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshots: result.items.map(snapshotRefForWire),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n }\n case \"snapshot.get\": {\n const snapshot = await getSandboxSnapshotForOperation(\n client,\n operation.target.snapshotId,\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshot: snapshot ? snapshotRefForWire(snapshot) : null,\n };\n }\n case \"snapshot.waitUntilReady\": {\n const snapshot = await waitUntilSandboxSnapshotReadyForOperation(\n client,\n operation.target.snapshot,\n operation.input[0].timeoutMs,\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshot: snapshotRefForWire(snapshot),\n };\n }\n case \"snapshot.delete\": {\n await deleteSandboxSnapshotForOperation(\n client,\n operation.target.snapshot.id,\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: null,\n };\n }\n }\n};\n\nconst callRawTool = async <A extends SandboxAction>(\n rawToolResolver: SandboxRawToolResolver,\n idOrOptions: StepOptionsOrId,\n operation: SandboxOperationForAction<A>,\n): Promise<SandboxResultForAction<A>> => {\n try {\n const rawTool = await rawToolResolver();\n return validateSandboxResult(\n operation,\n await rawTool(idOrOptions, operation),\n );\n } catch (error) {\n if (error instanceof SandboxValidationError) {\n throw error;\n }\n const options = findSandboxErrorOptions(error);\n if (options) {\n if (options.action !== operation.action) {\n throw new SandboxValidationError(\n `Sandbox operation returned a ${options.action} error for ${operation.action}`,\n );\n }\n // A failed step rejects with the engine's own StepError. Rethrow that\n // exact error so it behaves like any other step: left uncaught, it fails\n // the function without retrying it.\n if (error instanceof StepError) {\n throw error;\n }\n throw new SandboxError(options);\n }\n if (error instanceof StepError) {\n throw error;\n }\n const validationError = findSandboxValidationError(error);\n if (validationError) {\n throw new SandboxValidationError(validationError.message, {\n cause: error,\n });\n }\n throw error;\n }\n};\n\n/**\n * Marks the steps the SDK runs on the user's behalf, such as the create and\n * wait inside `snapshot()`. See `StepOptions[\"~origin\"]`.\n */\nconst sdkOrigin = `inngest@${version}`;\n\nconst sandboxTarget = (ref: SandboxRef) => ({ sandbox: ref });\nconst processTarget = (sandbox: SandboxRef, process: SandboxProcessRef) => ({\n sandbox,\n process,\n});\nconst snapshotTarget = (snapshot: SandboxSnapshotRef) => ({ snapshot });\n\nexport const createDurableSandboxSnapshotFacade = (\n rawRef: unknown,\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandboxSnapshot => {\n const ref = parseWithSchema(\n sandboxSnapshotRefSchema,\n rawRef,\n \"sandbox snapshot reference\",\n );\n const facade: DurableSandboxSnapshot = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n waitUntilReady: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\n \"snapshot.waitUntilReady\",\n {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.waitUntilReady\",\n target: snapshotTarget(ref),\n input: [normalizeSandboxSnapshotWaitOptions(options)],\n },\n );\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxSnapshotFacade(\n result.snapshot,\n rawToolResolver,\n );\n },\n delete: async (idOrOptions) => {\n const operation = parseSandboxOperationForAction(\"snapshot.delete\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.delete\",\n target: snapshotTarget(ref),\n input: [],\n });\n await callRawTool(rawToolResolver, idOrOptions, operation);\n },\n clone: async (idOrOptions, options, waitOptions) => {\n const operation = parseSandboxOperationForAction(\"create\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"create\",\n input: [\n normalizeSandboxCreateOptions({\n name: options.name,\n snapshotId: ref.id,\n runningTimeout: options.runningTimeout ?? waitOptions?.timeout,\n }),\n ],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n };\n return Object.freeze(facade);\n};\n\nexport const createDurableSandboxProcessFacade = (\n rawRef: unknown,\n sandboxRef: SandboxRef,\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandboxProcess => {\n const ref = parseWithSchema(\n sandboxProcessRefSchema,\n rawRef,\n \"sandbox process reference\",\n );\n if (ref.sandboxId !== sandboxRef.id) {\n throw new SandboxValidationError(\n \"Sandbox process reference belongs to another sandbox\",\n );\n }\n const facade: DurableSandboxProcess = {\n ...ref,\n command: Object.freeze([...ref.command]),\n signal: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.signal\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.signal\",\n target: processTarget(sandboxRef, ref),\n input: [normalizeSandboxProcessSignalOptions(options)],\n });\n await callRawTool(rawToolResolver, idOrOptions, operation);\n },\n wait: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.wait\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.wait\",\n target: processTarget(sandboxRef, ref),\n input: [normalizeSandboxProcessWaitOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n const {\n exitCode: _previousExitCode,\n terminationSignal: _previousTerminationSignal,\n ...baseRef\n } = ref;\n return createDurableSandboxProcessFacade(\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n ...baseRef,\n state: result.process.state,\n ...(result.process.exitCode !== undefined && {\n exitCode: result.process.exitCode,\n }),\n ...(result.process.terminationSignal !== undefined && {\n terminationSignal: result.process.terminationSignal,\n }),\n },\n \"sandbox process reference\",\n ),\n sandboxRef,\n rawToolResolver,\n );\n },\n getOutput: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.output\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.output\",\n target: processTarget(sandboxRef, ref),\n input: [normalizeSandboxProcessOutputOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return {\n chunks: result.result.chunks.map(decodeOutputChunk),\n };\n },\n };\n return Object.freeze(facade);\n};\n\nexport const createDurableSandboxFacade = (\n rawRef: unknown,\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandbox => {\n const ref = parseWithSchema(sandboxRefSchema, rawRef, \"sandbox reference\");\n const createSnapshot: DurableSandbox[\"snapshot\"] = async (\n idOrOptions,\n options,\n waitOptions,\n ) => {\n const createOptions = normalizeSandboxSnapshotCreateOptions(options);\n const wait = normalizeSandboxSnapshotWaitOptions({\n timeout: waitOptions?.timeout ?? 5 * 60_000,\n });\n const createOperation = parseSandboxOperationForAction(\"snapshot.create\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.create\",\n target: sandboxTarget(ref),\n input: [createOptions],\n });\n // The caller's name labels the span around both steps, so each step is\n // named for what it does and marked as the SDK's own work. Step IDs never\n // change, for replay.\n const stepOptions = getStepOptions(idOrOptions);\n const created = await callRawTool(\n rawToolResolver,\n { ...stepOptions, name: \"Create snapshot\", \"~origin\": sdkOrigin },\n createOperation,\n );\n const waitOperation = parseSandboxOperationForAction(\n \"snapshot.waitUntilReady\",\n {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.waitUntilReady\",\n target: snapshotTarget(created.snapshot),\n input: [wait],\n },\n );\n const ready = await callRawTool(\n rawToolResolver,\n {\n ...stepOptions,\n id: `${stepOptions.id}:wait-until-ready`,\n name: \"Wait for snapshot\",\n \"~origin\": sdkOrigin,\n },\n waitOperation,\n );\n return createDurableSandboxSnapshotFacade(ready.snapshot, rawToolResolver);\n };\n // The create and readiness wait are one statement, so they share one span\n // of kind `snapshot`. A caller that already groups the statement (such as\n // `@inngest/ci`) passes its own `\"~span\"`, which both steps carry, so the\n // statement is never grouped twice.\n const snapshot: DurableSandbox[\"snapshot\"] = (idOrOptions, ...args) => {\n const { id, name, \"~span\": callerSpan } = getStepOptions(idOrOptions);\n\n if (callerSpan) {\n return createSnapshot(idOrOptions, ...args);\n }\n\n return withSpan({ id, name, kind: \"snapshot\" }, () => {\n return createSnapshot(idOrOptions, ...args);\n });\n };\n const facade: DurableSandbox = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n commands: Object.freeze({\n run: async (idOrOptions, command, options) => {\n const normalized = normalizeSandboxCommandOptions(command, options);\n const { timeout: _timeout, ...input } = normalized;\n const operation = parseSandboxOperationForAction(\"exec\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"exec\",\n target: sandboxTarget(ref),\n input: [input],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return {\n stdout: decodeUtf8(\n decodeBase64(result.result.stdout, \"sandbox exec stdout\"),\n ),\n stderr: decodeUtf8(\n decodeBase64(result.result.stderr, \"sandbox exec stderr\"),\n ),\n exitCode: result.result.exitCode,\n output: result.result.output,\n };\n },\n }),\n processes: Object.freeze({\n start: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.start\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.start\",\n target: sandboxTarget(ref),\n input: [normalizeSandboxProcessStartOptions(options)],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return createDurableSandboxProcessFacade(\n result.process,\n ref,\n rawToolResolver,\n );\n },\n list: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.list\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.list\",\n target: sandboxTarget(ref),\n input: [normalizeSandboxProcessListOptions(options)],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return {\n items: result.processes.map((process) =>\n createDurableSandboxProcessFacade(process, ref, rawToolResolver),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (idOrOptions, processId) => {\n const parsedProcessId = parseWithSchema(\n canonicalUuidSchema,\n processId,\n \"sandbox process ID\",\n );\n const operation = parseSandboxOperationForAction(\"process.get\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.get\",\n target: { sandbox: ref, processId: parsedProcessId },\n input: [],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return result.process\n ? createDurableSandboxProcessFacade(\n result.process,\n ref,\n rawToolResolver,\n )\n : null;\n },\n }),\n snapshots: Object.freeze({\n create: snapshot,\n }),\n snapshot,\n waitUntilRunning: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"waitUntilRunning\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"waitUntilRunning\",\n target: sandboxTarget(ref),\n input: [normalizeSandboxWaitUntilRunningOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n pause: async (idOrOptions, options) => {\n const input = normalizeSandboxWaitUntilRunningOptions({\n timeout: options?.timeout ?? 5 * 60_000,\n });\n const operation = parseSandboxOperationForAction(\"pause\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"pause\",\n target: sandboxTarget(ref),\n input: [input],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n resume: async (idOrOptions, options) => {\n const input = normalizeSandboxWaitUntilRunningOptions({\n timeout: options?.timeout ?? 5 * 60_000,\n });\n const operation = parseSandboxOperationForAction(\"resume\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"resume\",\n target: sandboxTarget(ref),\n input: [input],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n destroy: async (idOrOptions): Promise<SandboxDestroyResult> => {\n const operation = parseSandboxOperationForAction(\"destroy\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"destroy\",\n target: sandboxTarget(ref),\n input: [],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return result.result;\n },\n };\n return Object.freeze(facade);\n};\n\n// Node before 20.5 lacks the symbol that `await using` looks up.\n(Symbol as { asyncDispose?: symbol }).asyncDispose ??= Symbol.for(\n \"Symbol.asyncDispose\",\n);\n\nexport const createSandboxTools = (\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandboxTools => ({\n create: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"create\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"create\",\n input: [normalizeSandboxCreateOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n const sandbox = createDurableSandboxFacade(result.sandbox, rawToolResolver);\n const { id } = getStepOptions(idOrOptions);\n\n return Object.freeze({\n ...sandbox,\n [Symbol.asyncDispose]: async () => {\n try {\n await sandbox.destroy(`${id}:destroy`);\n } catch (error) {\n // A destroy that failed for good is on the trace as a warning. It\n // must not change the outcome of the run.\n if (!(error instanceof StepError)) {\n throw error;\n }\n }\n },\n });\n },\n list: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"list\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"list\",\n input: [normalizeSandboxListOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return {\n items: result.sandboxes.map((sandbox) =>\n createDurableSandboxFacade(sandbox, rawToolResolver),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (idOrOptions, sandboxId) => {\n const parsedSandboxId = parseWithSchema(\n canonicalUuidSchema,\n sandboxId,\n \"sandbox ID\",\n );\n const operation = parseSandboxOperationForAction(\"get\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"get\",\n input: [{ sandboxId: parsedSandboxId }],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return result.sandbox\n ? createDurableSandboxFacade(result.sandbox, rawToolResolver)\n : null;\n },\n snapshots: {\n list: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"snapshot.list\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.list\",\n input: [normalizeSandboxSnapshotListOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return {\n items: result.snapshots.map((snapshot) =>\n createDurableSandboxSnapshotFacade(snapshot, rawToolResolver),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (idOrOptions, snapshotId) => {\n const parsedSnapshotId = parseWithSchema(\n canonicalUuidSchema,\n snapshotId,\n \"sandbox snapshot ID\",\n );\n const operation = parseSandboxOperationForAction(\"snapshot.get\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.get\",\n target: { snapshotId: parsedSnapshotId },\n input: [],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return result.snapshot\n ? createDurableSandboxSnapshotFacade(result.snapshot, rawToolResolver)\n : null;\n },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"durable.cjs","names":["maxDurableSandboxExecOutputBytes","encodeBase64","sandboxProtocolVersion","parseSandboxOperation","createSandboxForOperation","sandboxForOperation","runSandboxCommandForOperation","decodeBase64","SandboxValidationError","SandboxError","sandboxProcessForOperation","createSandboxSnapshotForOperation","listSandboxSnapshotsForOperation","getSandboxSnapshotForOperation","waitUntilSandboxSnapshotReadyForOperation","deleteSandboxSnapshotForOperation","validateSandboxResult","findSandboxErrorOptions","StepError","findSandboxValidationError","parseSandboxOperationForAction","parseWithSchema","sandboxSnapshotRefSchema","facade: DurableSandboxSnapshot","normalizeSandboxSnapshotWaitOptions","normalizeSandboxCreateOptions","sandboxProcessRefSchema","facade: DurableSandboxProcess","normalizeSandboxProcessSignalOptions","normalizeSandboxProcessWaitOptions","normalizeSandboxProcessOutputOptions","decodeOutputChunk","sandboxRefSchema","createSnapshot: DurableSandbox[\"snapshot\"]","normalizeSandboxSnapshotCreateOptions","getStepOptions","sdkOrigin","snapshot: DurableSandbox[\"snapshot\"]","withSpan","facade: DurableSandbox","normalizeSandboxCommandOptions","maxSandboxProcessTimeoutMs","decodeUtf8","normalizeSandboxProcessStartOptions","normalizeSandboxProcessListOptions","canonicalUuidSchema","normalizeSandboxWaitUntilRunningOptions","destroyQuietly","normalizeSandboxListOptions","normalizeSandboxSnapshotListOptions"],"sources":["../../../src/components/sandbox/durable.ts"],"sourcesContent":["import type { StepOptionsOrId } from \"../../types.ts\";\nimport { getStepOptions, withSpan } from \"../InngestStepTools.ts\";\nimport { StepError } from \"../StepError.ts\";\nimport {\n createSandboxForOperation,\n createSandboxSnapshotForOperation,\n deleteSandboxSnapshotForOperation,\n getSandboxSnapshotForOperation,\n listSandboxSnapshotsForOperation,\n runSandboxCommandForOperation,\n sandboxForOperation,\n sandboxProcessForOperation,\n waitUntilSandboxSnapshotReadyForOperation,\n} from \"./client.ts\";\nimport { destroyQuietly } from \"./group.ts\";\nimport {\n findSandboxErrorOptions,\n findSandboxValidationError,\n maxDurableSandboxExecOutputBytes,\n parseSandboxOperation,\n parseSandboxOperationForAction,\n type SandboxOperationForAction,\n type SandboxOperationResultV1,\n type SandboxOperationV1,\n type SandboxRawToolResolver,\n type SandboxResultForAction,\n validateSandboxResult,\n} from \"./protocol.ts\";\nimport type { SandboxToolsRequest } from \"./tools.ts\";\nimport { sdkOrigin } from \"./trace.ts\";\nimport {\n type DurableSandbox,\n type DurableSandboxProcess,\n type DurableSandboxSnapshot,\n type DurableSandboxTools,\n type Sandbox,\n type SandboxAction,\n type SandboxClient,\n type SandboxCommandOutputMetadata,\n type SandboxDestroyResult,\n SandboxError,\n type SandboxOutputChunk,\n type SandboxProcess,\n type SandboxProcessRef,\n type SandboxRef,\n type SandboxSnapshotRef,\n SandboxValidationError,\n sandboxProtocolVersion,\n} from \"./types.ts\";\nimport {\n canonicalUuidSchema,\n decodeBase64,\n decodeOutputChunk,\n decodeUtf8,\n encodeBase64,\n maxSandboxProcessTimeoutMs,\n normalizeSandboxCommandOptions,\n normalizeSandboxCreateOptions,\n normalizeSandboxListOptions,\n normalizeSandboxProcessListOptions,\n normalizeSandboxProcessOutputOptions,\n normalizeSandboxProcessSignalOptions,\n normalizeSandboxProcessStartOptions,\n normalizeSandboxProcessWaitOptions,\n normalizeSandboxSnapshotCreateOptions,\n normalizeSandboxSnapshotListOptions,\n normalizeSandboxSnapshotWaitOptions,\n normalizeSandboxWaitUntilRunningOptions,\n parseWithSchema,\n sandboxProcessRefSchema,\n sandboxRefSchema,\n sandboxSnapshotRefSchema,\n} from \"./validation.ts\";\n\nconst fitDurableSandboxExecOutput = (\n stdout: Uint8Array,\n stderr: Uint8Array,\n): {\n stdout: Uint8Array;\n stderr: Uint8Array;\n output: SandboxCommandOutputMetadata;\n} => {\n const originalBytes = {\n stdout: stdout.byteLength,\n stderr: stderr.byteLength,\n };\n if (\n originalBytes.stdout + originalBytes.stderr <=\n maxDurableSandboxExecOutputBytes\n ) {\n return { stdout, stderr, output: { truncated: false } };\n }\n\n // This bound intentionally lives in the `step.sandbox.exec` wrapper rather\n // than the direct client. `step.run` persists at most 4 MiB of serialized\n // output, and base64 expands captured bytes. Reserve half of the safe raw\n // budget for each stream, donate unused capacity to the other stream, and\n // retain tails because command failures generally appear at the end.\n const streamShare = Math.floor(maxDurableSandboxExecOutputBytes / 2);\n let retainedStdoutBytes = Math.min(originalBytes.stdout, streamShare);\n let retainedStderrBytes = Math.min(originalBytes.stderr, streamShare);\n let remainingBytes =\n maxDurableSandboxExecOutputBytes -\n retainedStdoutBytes -\n retainedStderrBytes;\n\n const extraStdoutBytes = Math.min(\n originalBytes.stdout - retainedStdoutBytes,\n remainingBytes,\n );\n retainedStdoutBytes += extraStdoutBytes;\n remainingBytes -= extraStdoutBytes;\n retainedStderrBytes += Math.min(\n originalBytes.stderr - retainedStderrBytes,\n remainingBytes,\n );\n\n const retainedBytes = {\n stdout: retainedStdoutBytes,\n stderr: retainedStderrBytes,\n };\n return {\n stdout: stdout.subarray(originalBytes.stdout - retainedBytes.stdout),\n stderr: stderr.subarray(originalBytes.stderr - retainedBytes.stderr),\n output: {\n truncated: true,\n strategy: \"tail\",\n originalBytes,\n retainedBytes,\n },\n };\n};\n\nconst encodeOutputChunk = (\n chunk: SandboxOutputChunk,\n): {\n stream: \"STDOUT\" | \"STDERR\";\n data: string;\n encoding: \"base64\";\n at?: string;\n} => ({\n stream: chunk.stream,\n data: encodeBase64(chunk.data),\n encoding: \"base64\",\n ...(chunk.at !== undefined && { at: chunk.at }),\n});\n\nconst sandboxRefForWire = (sandbox: Sandbox): SandboxRef => ({\n kind: sandbox.kind,\n version: sandbox.version,\n id: sandbox.id,\n name: sandbox.name,\n status: sandbox.status,\n vpcId: sandbox.vpcId,\n imageRef: sandbox.imageRef,\n ...(sandbox.imageDigest !== undefined && {\n imageDigest: sandbox.imageDigest,\n }),\n resources: { ...sandbox.resources },\n createdAt: sandbox.createdAt,\n ...(sandbox.startedAt !== undefined && { startedAt: sandbox.startedAt }),\n ...(sandbox.endedAt !== undefined && { endedAt: sandbox.endedAt }),\n ...(sandbox.error !== undefined && { error: sandbox.error }),\n});\n\nconst processRefForWire = (process: SandboxProcess) => ({\n kind: process.kind,\n version: process.version,\n sandboxId: process.sandboxId,\n id: process.id,\n command: [...process.command],\n ...(process.pid !== undefined && { pid: process.pid }),\n state: process.state,\n ...(process.exitCode !== undefined && { exitCode: process.exitCode }),\n ...(process.terminationSignal !== undefined && {\n terminationSignal: process.terminationSignal,\n }),\n ...(process.startedAt !== undefined && { startedAt: process.startedAt }),\n ...(process.endedAt !== undefined && { endedAt: process.endedAt }),\n});\n\nconst snapshotRefForWire = (snapshot: SandboxSnapshotRef) => ({\n ...snapshot,\n resources: { ...snapshot.resources },\n});\n\n/**\n * The wire result of an `exec` operation, with its output fitted to the\n * durable step's size budget.\n */\nexport const execOperationResult = (result: {\n stdout: Uint8Array;\n stderr: Uint8Array;\n exitCode: number;\n}): SandboxOperationResultV1 => {\n const output = fitDurableSandboxExecOutput(result.stdout, result.stderr);\n\n return {\n protocolVersion: sandboxProtocolVersion,\n action: \"exec\",\n result: {\n stdout: encodeBase64(output.stdout),\n stderr: encodeBase64(output.stderr),\n encoding: \"base64\",\n exitCode: result.exitCode,\n output: output.output,\n },\n };\n};\n\n/**\n * Execute a durable sandbox operation through the public REST client and\n * reduce its result to JSON-safe data suitable for normal step memoization.\n */\nexport const executeSandboxOperation = async (\n client: SandboxClient,\n rawOperation: unknown,\n): Promise<SandboxOperationResultV1> => {\n const operation = parseSandboxOperation(rawOperation);\n\n switch (operation.action) {\n case \"create\": {\n const { runningTimeoutMs, ...options } = operation.input[0];\n const sandbox = await createSandboxForOperation(client, {\n ...options,\n ...(runningTimeoutMs !== undefined && {\n runningTimeout: runningTimeoutMs,\n }),\n });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandboxRefForWire(sandbox),\n };\n }\n case \"list\": {\n const result = await client.list(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandboxes: result.items.map(sandboxRefForWire),\n page: result.page,\n fetchedAt: result.fetchedAt,\n };\n }\n case \"get\": {\n const sandbox = await client.get(operation.input[0].sandboxId);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandbox ? sandboxRefForWire(sandbox) : null,\n };\n }\n case \"waitUntilRunning\": {\n const sandbox = await sandboxForOperation(\n client,\n operation.target.sandbox,\n ).waitUntilRunning({\n timeout: operation.input[0].timeoutMs,\n });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandboxRefForWire(sandbox),\n };\n }\n case \"exec\": {\n const { command, timeoutMs, ...options } = operation.input[0];\n const sandbox = sandboxForOperation(client, operation.target.sandbox);\n const result = await runSandboxCommandForOperation(sandbox, command, {\n ...options,\n timeout: timeoutMs,\n });\n return execOperationResult(result);\n }\n case \"file.upload\": {\n const { path, data } = operation.input[0];\n await sandboxForOperation(client, operation.target.sandbox).files.upload({\n path,\n data: new Uint8Array(decodeBase64(data, \"sandbox file data\")),\n });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: null,\n };\n }\n case \"file.download\": {\n const response = await sandboxForOperation(\n client,\n operation.target.sandbox,\n ).files.download(operation.input[0]);\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.byteLength > maxDurableSandboxExecOutputBytes) {\n throw new SandboxValidationError(\n `${operation.input[0].path} is ${bytes.byteLength} bytes, over the ${maxDurableSandboxExecOutputBytes} bytes a step can return`,\n );\n }\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: { data: encodeBase64(bytes) },\n };\n }\n case \"destroy\": {\n // A destroy that already happened, such as one retried after a lost\n // response, has the outcome the caller wanted.\n const result = await sandboxForOperation(client, operation.target.sandbox)\n .destroy()\n .catch((error: unknown): SandboxDestroyResult => {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_not_found\"\n ) {\n return { status: \"TERMINATED\", sandbox: null };\n }\n\n throw error;\n });\n\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result,\n };\n }\n case \"pause\":\n case \"resume\": {\n const sandbox = await sandboxForOperation(\n client,\n operation.target.sandbox,\n )[operation.action]({ timeout: operation.input[0].timeoutMs });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n sandbox: sandboxRefForWire(sandbox),\n };\n }\n case \"process.start\": {\n const sandbox = sandboxForOperation(client, operation.target.sandbox);\n const process = await sandbox.processes.start(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n process: processRefForWire(process),\n };\n }\n case \"process.list\": {\n const result = await sandboxForOperation(\n client,\n operation.target.sandbox,\n ).processes.list(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n processes: result.items.map(processRefForWire),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n }\n case \"process.get\": {\n const sandbox = sandboxForOperation(client, operation.target.sandbox);\n const process = await sandbox.processes.get(operation.target.processId);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n process: process ? processRefForWire(process) : null,\n };\n }\n case \"process.signal\": {\n await sandboxProcessForOperation(client, operation.target.process).signal(\n operation.input[0],\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: null,\n };\n }\n case \"process.wait\": {\n const process = await sandboxProcessForOperation(\n client,\n operation.target.process,\n ).wait({ timeout: operation.input[0].timeoutMs });\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n process: {\n kind: process.kind,\n version: process.version,\n sandboxId: process.sandboxId,\n id: process.id,\n state: process.state as \"EXITED\" | \"KILLED\" | \"FAILED\" | \"LOST\",\n ...(process.exitCode !== undefined && {\n exitCode: process.exitCode,\n }),\n ...(process.terminationSignal !== undefined && {\n terminationSignal: process.terminationSignal,\n }),\n },\n };\n }\n case \"process.output\": {\n const result = await sandboxProcessForOperation(\n client,\n operation.target.process,\n ).getOutput(operation.input[0]);\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: { chunks: result.chunks.map(encodeOutputChunk) },\n };\n }\n case \"snapshot.create\": {\n const snapshot = await createSandboxSnapshotForOperation(\n client,\n operation.target.sandbox.id,\n operation.input[0],\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshot: snapshotRefForWire(snapshot),\n };\n }\n case \"snapshot.list\": {\n const result = await listSandboxSnapshotsForOperation(\n client,\n operation.input[0],\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshots: result.items.map(snapshotRefForWire),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n }\n case \"snapshot.get\": {\n const snapshot = await getSandboxSnapshotForOperation(\n client,\n operation.target.snapshotId,\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshot: snapshot ? snapshotRefForWire(snapshot) : null,\n };\n }\n case \"snapshot.waitUntilReady\": {\n const snapshot = await waitUntilSandboxSnapshotReadyForOperation(\n client,\n operation.target.snapshot,\n operation.input[0].timeoutMs,\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n snapshot: snapshotRefForWire(snapshot),\n };\n }\n case \"snapshot.delete\": {\n await deleteSandboxSnapshotForOperation(\n client,\n operation.target.snapshot.id,\n );\n return {\n protocolVersion: sandboxProtocolVersion,\n action: operation.action,\n result: null,\n };\n }\n }\n};\n\n/**\n * Run an operation as a step. With `finish`, the step also does that work and\n * its output is what `finish` returns, so a replay returns it unchanged.\n */\nconst callRawTool = async <\n A extends SandboxAction,\n T = SandboxResultForAction<A>,\n>(\n rawToolResolver: SandboxRawToolResolver,\n idOrOptions: StepOptionsOrId,\n operation: SandboxOperationForAction<A>,\n finish?: (result: SandboxResultForAction<A>) => T | Promise<T>,\n tools?: SandboxToolsRequest,\n): Promise<T> => {\n try {\n const rawTool = await rawToolResolver();\n if (tools) {\n return validateSandboxResult(\n operation,\n await rawTool(idOrOptions, operation, undefined, tools),\n ) as T;\n }\n\n if (finish) {\n return (await rawTool(idOrOptions, operation, (result) => {\n return finish(validateSandboxResult(operation, result));\n })) as T;\n }\n\n return validateSandboxResult(\n operation,\n await rawTool(idOrOptions, operation),\n ) as T;\n } catch (error) {\n if (error instanceof SandboxValidationError) {\n throw error;\n }\n const options = findSandboxErrorOptions(error);\n if (options) {\n if (options.action !== operation.action) {\n throw new SandboxValidationError(\n `Sandbox operation returned a ${options.action} error for ${operation.action}`,\n );\n }\n // A failed step rejects with the engine's own StepError. Rethrow that\n // exact error so it behaves like any other step: left uncaught, it fails\n // the function without retrying it.\n if (error instanceof StepError) {\n throw error;\n }\n throw new SandboxError(options);\n }\n if (error instanceof StepError) {\n throw error;\n }\n const validationError = findSandboxValidationError(error);\n if (validationError) {\n throw new SandboxValidationError(validationError.message, {\n cause: error,\n });\n }\n throw error;\n }\n};\n\ntype FileParser = (\n idOrOptions: StepOptionsOrId,\n path: string,\n parse: (bytes: Uint8Array) => unknown,\n) => Promise<unknown>;\nconst fileParsers = new WeakMap<DurableSandbox, FileParser>();\nconst fileParserOf = (sandbox: DurableSandbox): FileParser => {\n const parser = fileParsers.get(sandbox);\n if (!parser) {\n throw new Error(\"Cannot parse a file of a sandbox the SDK did not create\");\n }\n\n return parser;\n};\nconst sandboxTarget = (ref: SandboxRef) => ({ sandbox: ref });\nconst downloadOperation = (ref: SandboxRef, path: string) => {\n return parseSandboxOperationForAction(\"file.download\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"file.download\",\n target: sandboxTarget(ref),\n input: [{ path }],\n });\n};\nconst processTarget = (sandbox: SandboxRef, process: SandboxProcessRef) => ({\n sandbox,\n process,\n});\nconst snapshotTarget = (snapshot: SandboxSnapshotRef) => ({ snapshot });\n\nexport const createDurableSandboxSnapshotFacade = (\n rawRef: unknown,\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandboxSnapshot => {\n const ref = parseWithSchema(\n sandboxSnapshotRefSchema,\n rawRef,\n \"sandbox snapshot reference\",\n );\n const facade: DurableSandboxSnapshot = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n waitUntilReady: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\n \"snapshot.waitUntilReady\",\n {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.waitUntilReady\",\n target: snapshotTarget(ref),\n input: [normalizeSandboxSnapshotWaitOptions(options)],\n },\n );\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxSnapshotFacade(\n result.snapshot,\n rawToolResolver,\n );\n },\n delete: async (idOrOptions) => {\n const operation = parseSandboxOperationForAction(\"snapshot.delete\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.delete\",\n target: snapshotTarget(ref),\n input: [],\n });\n await callRawTool(rawToolResolver, idOrOptions, operation);\n },\n clone: async (idOrOptions, options, waitOptions) => {\n const operation = parseSandboxOperationForAction(\"create\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"create\",\n input: [\n normalizeSandboxCreateOptions({\n name: options.name,\n snapshotId: ref.id,\n runningTimeout: options.runningTimeout ?? waitOptions?.timeout,\n }),\n ],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n };\n return Object.freeze(facade);\n};\n\nexport const createDurableSandboxProcessFacade = (\n rawRef: unknown,\n sandboxRef: SandboxRef,\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandboxProcess => {\n const ref = parseWithSchema(\n sandboxProcessRefSchema,\n rawRef,\n \"sandbox process reference\",\n );\n if (ref.sandboxId !== sandboxRef.id) {\n throw new SandboxValidationError(\n \"Sandbox process reference belongs to another sandbox\",\n );\n }\n const facade: DurableSandboxProcess = {\n ...ref,\n command: Object.freeze([...ref.command]),\n signal: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.signal\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.signal\",\n target: processTarget(sandboxRef, ref),\n input: [normalizeSandboxProcessSignalOptions(options)],\n });\n await callRawTool(rawToolResolver, idOrOptions, operation);\n },\n wait: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.wait\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.wait\",\n target: processTarget(sandboxRef, ref),\n input: [normalizeSandboxProcessWaitOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n const {\n exitCode: _previousExitCode,\n terminationSignal: _previousTerminationSignal,\n ...baseRef\n } = ref;\n return createDurableSandboxProcessFacade(\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n ...baseRef,\n state: result.process.state,\n ...(result.process.exitCode !== undefined && {\n exitCode: result.process.exitCode,\n }),\n ...(result.process.terminationSignal !== undefined && {\n terminationSignal: result.process.terminationSignal,\n }),\n },\n \"sandbox process reference\",\n ),\n sandboxRef,\n rawToolResolver,\n );\n },\n getOutput: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.output\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.output\",\n target: processTarget(sandboxRef, ref),\n input: [normalizeSandboxProcessOutputOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return {\n chunks: result.result.chunks.map(decodeOutputChunk),\n };\n },\n };\n return Object.freeze(facade);\n};\n\nexport const createDurableSandboxFacade = (\n rawRef: unknown,\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandbox => {\n const ref = parseWithSchema(sandboxRefSchema, rawRef, \"sandbox reference\");\n const createSnapshot: DurableSandbox[\"snapshot\"] = async (\n idOrOptions,\n options,\n waitOptions,\n ) => {\n const createOptions = normalizeSandboxSnapshotCreateOptions(options);\n const wait = normalizeSandboxSnapshotWaitOptions({\n timeout: waitOptions?.timeout ?? 5 * 60_000,\n });\n const createOperation = parseSandboxOperationForAction(\"snapshot.create\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.create\",\n target: sandboxTarget(ref),\n input: [createOptions],\n });\n // The caller's name labels the span around both steps, so each step is\n // named for what it does and marked as the SDK's own work. Step IDs never\n // change, for replay.\n const stepOptions = getStepOptions(idOrOptions);\n const created = await callRawTool(\n rawToolResolver,\n { ...stepOptions, name: \"Create snapshot\", \"~origin\": sdkOrigin },\n createOperation,\n );\n const waitOperation = parseSandboxOperationForAction(\n \"snapshot.waitUntilReady\",\n {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.waitUntilReady\",\n target: snapshotTarget(created.snapshot),\n input: [wait],\n },\n );\n const ready = await callRawTool(\n rawToolResolver,\n {\n ...stepOptions,\n id: `${stepOptions.id}:wait-until-ready`,\n name: \"Wait for snapshot\",\n \"~origin\": sdkOrigin,\n },\n waitOperation,\n );\n return createDurableSandboxSnapshotFacade(ready.snapshot, rawToolResolver);\n };\n // The create and readiness wait are one statement, so they share one span\n // of kind `snapshot`. A caller that already groups the statement (such as\n // `@inngest/ci`) passes its own `\"~span\"`, which both steps carry, so the\n // statement is never grouped twice.\n const snapshot: DurableSandbox[\"snapshot\"] = (idOrOptions, ...args) => {\n const { id, name, \"~span\": callerSpan } = getStepOptions(idOrOptions);\n\n if (callerSpan) {\n return createSnapshot(idOrOptions, ...args);\n }\n\n return withSpan({ id, name, kind: \"snapshot\" }, () => {\n return createSnapshot(idOrOptions, ...args);\n });\n };\n const facade: DurableSandbox = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n commands: Object.freeze({\n run: async (idOrOptions, command, options) => {\n const { tools, toolOptions, ...commandOptions } = options ?? {};\n const normalized = normalizeSandboxCommandOptions(command, {\n ...commandOptions,\n ...(tools && {\n timeout: commandOptions.timeout ?? maxSandboxProcessTimeoutMs,\n }),\n });\n const { timeout: _timeout, ...input } = normalized;\n const operation = parseSandboxOperationForAction(\"exec\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"exec\",\n target: sandboxTarget(ref),\n input: [input],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n undefined,\n tools && { tools, toolOptions },\n );\n return {\n stdout: decodeUtf8(\n decodeBase64(result.result.stdout, \"sandbox exec stdout\"),\n ),\n stderr: decodeUtf8(\n decodeBase64(result.result.stderr, \"sandbox exec stderr\"),\n ),\n exitCode: result.result.exitCode,\n output: result.result.output,\n };\n },\n }),\n files: Object.freeze({\n write: async (idOrOptions, { path, data }) => {\n const operation = parseSandboxOperationForAction(\"file.upload\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"file.upload\",\n target: sandboxTarget(ref),\n input: [\n {\n path,\n data: encodeBase64(\n typeof data === \"string\"\n ? new TextEncoder().encode(data)\n : data,\n ),\n },\n ],\n });\n await callRawTool(rawToolResolver, idOrOptions, operation);\n },\n read: async (idOrOptions, path) => {\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n downloadOperation(ref, path),\n );\n return decodeBase64(result.result.data, \"sandbox file data\");\n },\n }),\n processes: Object.freeze({\n start: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.start\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.start\",\n target: sandboxTarget(ref),\n input: [normalizeSandboxProcessStartOptions(options)],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return createDurableSandboxProcessFacade(\n result.process,\n ref,\n rawToolResolver,\n );\n },\n list: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"process.list\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.list\",\n target: sandboxTarget(ref),\n input: [normalizeSandboxProcessListOptions(options)],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return {\n items: result.processes.map((process) =>\n createDurableSandboxProcessFacade(process, ref, rawToolResolver),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (idOrOptions, processId) => {\n const parsedProcessId = parseWithSchema(\n canonicalUuidSchema,\n processId,\n \"sandbox process ID\",\n );\n const operation = parseSandboxOperationForAction(\"process.get\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"process.get\",\n target: { sandbox: ref, processId: parsedProcessId },\n input: [],\n });\n const result = await callRawTool(\n rawToolResolver,\n idOrOptions,\n operation,\n );\n return result.process\n ? createDurableSandboxProcessFacade(\n result.process,\n ref,\n rawToolResolver,\n )\n : null;\n },\n }),\n snapshots: Object.freeze({\n create: snapshot,\n }),\n snapshot,\n waitUntilRunning: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"waitUntilRunning\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"waitUntilRunning\",\n target: sandboxTarget(ref),\n input: [normalizeSandboxWaitUntilRunningOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n pause: async (idOrOptions, options) => {\n const input = normalizeSandboxWaitUntilRunningOptions({\n timeout: options?.timeout ?? 5 * 60_000,\n });\n const operation = parseSandboxOperationForAction(\"pause\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"pause\",\n target: sandboxTarget(ref),\n input: [input],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n resume: async (idOrOptions, options) => {\n const input = normalizeSandboxWaitUntilRunningOptions({\n timeout: options?.timeout ?? 5 * 60_000,\n });\n const operation = parseSandboxOperationForAction(\"resume\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"resume\",\n target: sandboxTarget(ref),\n input: [input],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return createDurableSandboxFacade(result.sandbox, rawToolResolver);\n },\n destroy: async (idOrOptions): Promise<SandboxDestroyResult> => {\n const operation = parseSandboxOperationForAction(\"destroy\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"destroy\",\n target: sandboxTarget(ref),\n input: [],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return result.result;\n },\n };\n fileParsers.set(facade, (idOrOptions, path, parse) => {\n return callRawTool(\n rawToolResolver,\n idOrOptions,\n downloadOperation(ref, path),\n (result) => {\n return parse(decodeBase64(result.result.data, \"sandbox file data\"));\n },\n );\n });\n\n return Object.freeze(facade);\n};\n\n/**\n * Read a file in the sandbox and parse it inside the same step, so the step's\n * output is what `parse` returns instead of the file. Internal: the public\n * `files.read` always returns the bytes.\n */\nexport const readParsedFile = <T>(\n sandbox: DurableSandbox,\n idOrOptions: StepOptionsOrId,\n path: string,\n parse: (bytes: Uint8Array) => T | Promise<T>,\n): Promise<T> => {\n return fileParserOf(sandbox)(idOrOptions, path, parse) as Promise<T>;\n};\n\n// Node before 20.5 lacks the symbol that `await using` looks up.\n(Symbol as { asyncDispose?: symbol }).asyncDispose ??= Symbol.for(\n \"Symbol.asyncDispose\",\n);\n\nexport const createSandboxTools = (\n rawToolResolver: SandboxRawToolResolver,\n): DurableSandboxTools => ({\n create: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"create\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"create\",\n input: [normalizeSandboxCreateOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n const sandbox = createDurableSandboxFacade(result.sandbox, rawToolResolver);\n const { id } = getStepOptions(idOrOptions);\n\n const disposable = Object.freeze({\n ...sandbox,\n [Symbol.asyncDispose]: async () => {\n await destroyQuietly(sandbox, `${id}:destroy`);\n },\n });\n fileParsers.set(disposable, fileParserOf(sandbox));\n\n return disposable;\n },\n list: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"list\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"list\",\n input: [normalizeSandboxListOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return {\n items: result.sandboxes.map((sandbox) =>\n createDurableSandboxFacade(sandbox, rawToolResolver),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (idOrOptions, sandboxId) => {\n const parsedSandboxId = parseWithSchema(\n canonicalUuidSchema,\n sandboxId,\n \"sandbox ID\",\n );\n const operation = parseSandboxOperationForAction(\"get\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"get\",\n input: [{ sandboxId: parsedSandboxId }],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return result.sandbox\n ? createDurableSandboxFacade(result.sandbox, rawToolResolver)\n : null;\n },\n snapshots: {\n list: async (idOrOptions, options) => {\n const operation = parseSandboxOperationForAction(\"snapshot.list\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.list\",\n input: [normalizeSandboxSnapshotListOptions(options)],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return {\n items: result.snapshots.map((snapshot) =>\n createDurableSandboxSnapshotFacade(snapshot, rawToolResolver),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (idOrOptions, snapshotId) => {\n const parsedSnapshotId = parseWithSchema(\n canonicalUuidSchema,\n snapshotId,\n \"sandbox snapshot ID\",\n );\n const operation = parseSandboxOperationForAction(\"snapshot.get\", {\n protocolVersion: sandboxProtocolVersion,\n action: \"snapshot.get\",\n target: { snapshotId: parsedSnapshotId },\n input: [],\n });\n const result = await callRawTool(rawToolResolver, idOrOptions, operation);\n return result.snapshot\n ? createDurableSandboxSnapshotFacade(result.snapshot, rawToolResolver)\n : null;\n },\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { version } from "../../version.js";
|
|
2
1
|
import { SandboxError, SandboxValidationError, sandboxProtocolVersion } from "./types.js";
|
|
3
|
-
import { canonicalUuidSchema, decodeBase64, decodeOutputChunk, decodeUtf8, encodeBase64, normalizeSandboxCommandOptions, normalizeSandboxCreateOptions, normalizeSandboxListOptions, normalizeSandboxProcessListOptions, normalizeSandboxProcessOutputOptions, normalizeSandboxProcessSignalOptions, normalizeSandboxProcessStartOptions, normalizeSandboxProcessWaitOptions, normalizeSandboxSnapshotCreateOptions, normalizeSandboxSnapshotListOptions, normalizeSandboxSnapshotWaitOptions, normalizeSandboxWaitUntilRunningOptions, parseWithSchema, sandboxProcessRefSchema, sandboxRefSchema, sandboxSnapshotRefSchema } from "./validation.js";
|
|
2
|
+
import { canonicalUuidSchema, decodeBase64, decodeOutputChunk, decodeUtf8, encodeBase64, maxSandboxProcessTimeoutMs, normalizeSandboxCommandOptions, normalizeSandboxCreateOptions, normalizeSandboxListOptions, normalizeSandboxProcessListOptions, normalizeSandboxProcessOutputOptions, normalizeSandboxProcessSignalOptions, normalizeSandboxProcessStartOptions, normalizeSandboxProcessWaitOptions, normalizeSandboxSnapshotCreateOptions, normalizeSandboxSnapshotListOptions, normalizeSandboxSnapshotWaitOptions, normalizeSandboxWaitUntilRunningOptions, parseWithSchema, sandboxProcessRefSchema, sandboxRefSchema, sandboxSnapshotRefSchema } from "./validation.js";
|
|
4
3
|
import { createSandboxForOperation, createSandboxSnapshotForOperation, deleteSandboxSnapshotForOperation, getSandboxSnapshotForOperation, listSandboxSnapshotsForOperation, runSandboxCommandForOperation, sandboxForOperation, sandboxProcessForOperation, waitUntilSandboxSnapshotReadyForOperation } from "./client.js";
|
|
5
4
|
import { getStepOptions, withSpan } from "../InngestStepTools.js";
|
|
6
5
|
import { StepError } from "../StepError.js";
|
|
6
|
+
import { destroyQuietly } from "./group.js";
|
|
7
7
|
import { findSandboxErrorOptions, findSandboxValidationError, maxDurableSandboxExecOutputBytes, parseSandboxOperation, parseSandboxOperationForAction, validateSandboxResult } from "./protocol.js";
|
|
8
|
+
import { sdkOrigin } from "./trace.js";
|
|
8
9
|
|
|
9
10
|
//#region src/components/sandbox/durable.ts
|
|
10
11
|
const fitDurableSandboxExecOutput = (stdout, stderr) => {
|
|
@@ -54,6 +55,7 @@ const sandboxRefForWire = (sandbox) => ({
|
|
|
54
55
|
status: sandbox.status,
|
|
55
56
|
vpcId: sandbox.vpcId,
|
|
56
57
|
imageRef: sandbox.imageRef,
|
|
58
|
+
...sandbox.imageDigest !== void 0 && { imageDigest: sandbox.imageDigest },
|
|
57
59
|
resources: { ...sandbox.resources },
|
|
58
60
|
createdAt: sandbox.createdAt,
|
|
59
61
|
...sandbox.startedAt !== void 0 && { startedAt: sandbox.startedAt },
|
|
@@ -78,6 +80,24 @@ const snapshotRefForWire = (snapshot) => ({
|
|
|
78
80
|
resources: { ...snapshot.resources }
|
|
79
81
|
});
|
|
80
82
|
/**
|
|
83
|
+
* The wire result of an `exec` operation, with its output fitted to the
|
|
84
|
+
* durable step's size budget.
|
|
85
|
+
*/
|
|
86
|
+
const execOperationResult = (result) => {
|
|
87
|
+
const output = fitDurableSandboxExecOutput(result.stdout, result.stderr);
|
|
88
|
+
return {
|
|
89
|
+
protocolVersion: sandboxProtocolVersion,
|
|
90
|
+
action: "exec",
|
|
91
|
+
result: {
|
|
92
|
+
stdout: encodeBase64(output.stdout),
|
|
93
|
+
stderr: encodeBase64(output.stderr),
|
|
94
|
+
encoding: "base64",
|
|
95
|
+
exitCode: result.exitCode,
|
|
96
|
+
output: output.output
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
81
101
|
* Execute a durable sandbox operation through the public REST client and
|
|
82
102
|
* reduce its result to JSON-safe data suitable for normal step memoization.
|
|
83
103
|
*/
|
|
@@ -124,21 +144,31 @@ const executeSandboxOperation = async (client, rawOperation) => {
|
|
|
124
144
|
}
|
|
125
145
|
case "exec": {
|
|
126
146
|
const { command, timeoutMs, ...options } = operation.input[0];
|
|
127
|
-
|
|
147
|
+
return execOperationResult(await runSandboxCommandForOperation(sandboxForOperation(client, operation.target.sandbox), command, {
|
|
128
148
|
...options,
|
|
129
149
|
timeout: timeoutMs
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
case "file.upload": {
|
|
153
|
+
const { path, data } = operation.input[0];
|
|
154
|
+
await sandboxForOperation(client, operation.target.sandbox).files.upload({
|
|
155
|
+
path,
|
|
156
|
+
data: new Uint8Array(decodeBase64(data, "sandbox file data"))
|
|
130
157
|
});
|
|
131
|
-
const output = fitDurableSandboxExecOutput(result.stdout, result.stderr);
|
|
132
158
|
return {
|
|
133
159
|
protocolVersion: sandboxProtocolVersion,
|
|
134
160
|
action: operation.action,
|
|
135
|
-
result:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
161
|
+
result: null
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
case "file.download": {
|
|
165
|
+
const response = await sandboxForOperation(client, operation.target.sandbox).files.download(operation.input[0]);
|
|
166
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
167
|
+
if (bytes.byteLength > maxDurableSandboxExecOutputBytes) throw new SandboxValidationError(`${operation.input[0].path} is ${bytes.byteLength} bytes, over the ${maxDurableSandboxExecOutputBytes} bytes a step can return`);
|
|
168
|
+
return {
|
|
169
|
+
protocolVersion: sandboxProtocolVersion,
|
|
170
|
+
action: operation.action,
|
|
171
|
+
result: { data: encodeBase64(bytes) }
|
|
142
172
|
};
|
|
143
173
|
}
|
|
144
174
|
case "destroy": {
|
|
@@ -264,9 +294,18 @@ const executeSandboxOperation = async (client, rawOperation) => {
|
|
|
264
294
|
};
|
|
265
295
|
}
|
|
266
296
|
};
|
|
267
|
-
|
|
297
|
+
/**
|
|
298
|
+
* Run an operation as a step. With `finish`, the step also does that work and
|
|
299
|
+
* its output is what `finish` returns, so a replay returns it unchanged.
|
|
300
|
+
*/
|
|
301
|
+
const callRawTool = async (rawToolResolver, idOrOptions, operation, finish, tools) => {
|
|
268
302
|
try {
|
|
269
|
-
|
|
303
|
+
const rawTool = await rawToolResolver();
|
|
304
|
+
if (tools) return validateSandboxResult(operation, await rawTool(idOrOptions, operation, void 0, tools));
|
|
305
|
+
if (finish) return await rawTool(idOrOptions, operation, (result) => {
|
|
306
|
+
return finish(validateSandboxResult(operation, result));
|
|
307
|
+
});
|
|
308
|
+
return validateSandboxResult(operation, await rawTool(idOrOptions, operation));
|
|
270
309
|
} catch (error) {
|
|
271
310
|
if (error instanceof SandboxValidationError) throw error;
|
|
272
311
|
const options = findSandboxErrorOptions(error);
|
|
@@ -281,12 +320,21 @@ const callRawTool = async (rawToolResolver, idOrOptions, operation) => {
|
|
|
281
320
|
throw error;
|
|
282
321
|
}
|
|
283
322
|
};
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
323
|
+
const fileParsers = /* @__PURE__ */ new WeakMap();
|
|
324
|
+
const fileParserOf = (sandbox) => {
|
|
325
|
+
const parser = fileParsers.get(sandbox);
|
|
326
|
+
if (!parser) throw new Error("Cannot parse a file of a sandbox the SDK did not create");
|
|
327
|
+
return parser;
|
|
328
|
+
};
|
|
289
329
|
const sandboxTarget = (ref) => ({ sandbox: ref });
|
|
330
|
+
const downloadOperation = (ref, path) => {
|
|
331
|
+
return parseSandboxOperationForAction("file.download", {
|
|
332
|
+
protocolVersion: sandboxProtocolVersion,
|
|
333
|
+
action: "file.download",
|
|
334
|
+
target: sandboxTarget(ref),
|
|
335
|
+
input: [{ path }]
|
|
336
|
+
});
|
|
337
|
+
};
|
|
290
338
|
const processTarget = (sandbox, process) => ({
|
|
291
339
|
sandbox,
|
|
292
340
|
process
|
|
@@ -411,13 +459,20 @@ const createDurableSandboxFacade = (rawRef, rawToolResolver) => {
|
|
|
411
459
|
...ref,
|
|
412
460
|
resources: Object.freeze({ ...ref.resources }),
|
|
413
461
|
commands: Object.freeze({ run: async (idOrOptions, command, options) => {
|
|
414
|
-
const {
|
|
462
|
+
const { tools, toolOptions, ...commandOptions } = options ?? {};
|
|
463
|
+
const { timeout: _timeout, ...input } = normalizeSandboxCommandOptions(command, {
|
|
464
|
+
...commandOptions,
|
|
465
|
+
...tools && { timeout: commandOptions.timeout ?? maxSandboxProcessTimeoutMs }
|
|
466
|
+
});
|
|
415
467
|
const result = await callRawTool(rawToolResolver, idOrOptions, parseSandboxOperationForAction("exec", {
|
|
416
468
|
protocolVersion: sandboxProtocolVersion,
|
|
417
469
|
action: "exec",
|
|
418
470
|
target: sandboxTarget(ref),
|
|
419
471
|
input: [input]
|
|
420
|
-
})
|
|
472
|
+
}), void 0, tools && {
|
|
473
|
+
tools,
|
|
474
|
+
toolOptions
|
|
475
|
+
});
|
|
421
476
|
return {
|
|
422
477
|
stdout: decodeUtf8(decodeBase64(result.result.stdout, "sandbox exec stdout")),
|
|
423
478
|
stderr: decodeUtf8(decodeBase64(result.result.stderr, "sandbox exec stderr")),
|
|
@@ -425,6 +480,22 @@ const createDurableSandboxFacade = (rawRef, rawToolResolver) => {
|
|
|
425
480
|
output: result.result.output
|
|
426
481
|
};
|
|
427
482
|
} }),
|
|
483
|
+
files: Object.freeze({
|
|
484
|
+
write: async (idOrOptions, { path, data }) => {
|
|
485
|
+
await callRawTool(rawToolResolver, idOrOptions, parseSandboxOperationForAction("file.upload", {
|
|
486
|
+
protocolVersion: sandboxProtocolVersion,
|
|
487
|
+
action: "file.upload",
|
|
488
|
+
target: sandboxTarget(ref),
|
|
489
|
+
input: [{
|
|
490
|
+
path,
|
|
491
|
+
data: encodeBase64(typeof data === "string" ? new TextEncoder().encode(data) : data)
|
|
492
|
+
}]
|
|
493
|
+
}));
|
|
494
|
+
},
|
|
495
|
+
read: async (idOrOptions, path) => {
|
|
496
|
+
return decodeBase64((await callRawTool(rawToolResolver, idOrOptions, downloadOperation(ref, path))).result.data, "sandbox file data");
|
|
497
|
+
}
|
|
498
|
+
}),
|
|
428
499
|
processes: Object.freeze({
|
|
429
500
|
start: async (idOrOptions, options) => {
|
|
430
501
|
return createDurableSandboxProcessFacade((await callRawTool(rawToolResolver, idOrOptions, parseSandboxOperationForAction("process.start", {
|
|
@@ -497,8 +568,21 @@ const createDurableSandboxFacade = (rawRef, rawToolResolver) => {
|
|
|
497
568
|
}))).result;
|
|
498
569
|
}
|
|
499
570
|
};
|
|
571
|
+
fileParsers.set(facade, (idOrOptions, path, parse) => {
|
|
572
|
+
return callRawTool(rawToolResolver, idOrOptions, downloadOperation(ref, path), (result) => {
|
|
573
|
+
return parse(decodeBase64(result.result.data, "sandbox file data"));
|
|
574
|
+
});
|
|
575
|
+
});
|
|
500
576
|
return Object.freeze(facade);
|
|
501
577
|
};
|
|
578
|
+
/**
|
|
579
|
+
* Read a file in the sandbox and parse it inside the same step, so the step's
|
|
580
|
+
* output is what `parse` returns instead of the file. Internal: the public
|
|
581
|
+
* `files.read` always returns the bytes.
|
|
582
|
+
*/
|
|
583
|
+
const readParsedFile = (sandbox, idOrOptions, path, parse) => {
|
|
584
|
+
return fileParserOf(sandbox)(idOrOptions, path, parse);
|
|
585
|
+
};
|
|
502
586
|
Symbol.asyncDispose ??= Symbol.for("Symbol.asyncDispose");
|
|
503
587
|
const createSandboxTools = (rawToolResolver) => ({
|
|
504
588
|
create: async (idOrOptions, options) => {
|
|
@@ -508,16 +592,14 @@ const createSandboxTools = (rawToolResolver) => ({
|
|
|
508
592
|
input: [normalizeSandboxCreateOptions(options)]
|
|
509
593
|
}))).sandbox, rawToolResolver);
|
|
510
594
|
const { id } = getStepOptions(idOrOptions);
|
|
511
|
-
|
|
595
|
+
const disposable = Object.freeze({
|
|
512
596
|
...sandbox,
|
|
513
597
|
[Symbol.asyncDispose]: async () => {
|
|
514
|
-
|
|
515
|
-
await sandbox.destroy(`${id}:destroy`);
|
|
516
|
-
} catch (error) {
|
|
517
|
-
if (!(error instanceof StepError)) throw error;
|
|
518
|
-
}
|
|
598
|
+
await destroyQuietly(sandbox, `${id}:destroy`);
|
|
519
599
|
}
|
|
520
600
|
});
|
|
601
|
+
fileParsers.set(disposable, fileParserOf(sandbox));
|
|
602
|
+
return disposable;
|
|
521
603
|
},
|
|
522
604
|
list: async (idOrOptions, options) => {
|
|
523
605
|
const result = await callRawTool(rawToolResolver, idOrOptions, parseSandboxOperationForAction("list", {
|
|
@@ -565,5 +647,5 @@ const createSandboxTools = (rawToolResolver) => ({
|
|
|
565
647
|
});
|
|
566
648
|
|
|
567
649
|
//#endregion
|
|
568
|
-
export { createSandboxTools, executeSandboxOperation };
|
|
650
|
+
export { createSandboxTools, execOperationResult, executeSandboxOperation, readParsedFile };
|
|
569
651
|
//# sourceMappingURL=durable.js.map
|