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.
Files changed (110) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/components/InngestStepTools.cjs +22 -1
  3. package/components/InngestStepTools.cjs.map +1 -1
  4. package/components/InngestStepTools.d.cts.map +1 -1
  5. package/components/InngestStepTools.d.ts.map +1 -1
  6. package/components/InngestStepTools.js +22 -2
  7. package/components/InngestStepTools.js.map +1 -1
  8. package/components/execution/als.cjs.map +1 -1
  9. package/components/execution/als.d.cts +6 -0
  10. package/components/execution/als.d.cts.map +1 -1
  11. package/components/execution/als.d.ts +6 -0
  12. package/components/execution/als.d.ts.map +1 -1
  13. package/components/execution/als.js.map +1 -1
  14. package/components/execution/engine.cjs +36 -16
  15. package/components/execution/engine.cjs.map +1 -1
  16. package/components/execution/engine.d.cts.map +1 -1
  17. package/components/execution/engine.d.ts.map +1 -1
  18. package/components/execution/engine.js +36 -16
  19. package/components/execution/engine.js.map +1 -1
  20. package/components/execution/otel/middleware.d.cts +7 -7
  21. package/components/execution/otel/middleware.d.ts +7 -7
  22. package/components/realtime/types.d.cts +4 -4
  23. package/components/realtime/types.d.cts.map +1 -1
  24. package/components/realtime/types.d.ts +4 -4
  25. package/components/realtime/types.d.ts.map +1 -1
  26. package/components/sandbox/durable.cjs +111 -27
  27. package/components/sandbox/durable.cjs.map +1 -1
  28. package/components/sandbox/durable.js +109 -27
  29. package/components/sandbox/durable.js.map +1 -1
  30. package/components/sandbox/group.cjs +61 -27
  31. package/components/sandbox/group.cjs.map +1 -1
  32. package/components/sandbox/group.d.cts.map +1 -1
  33. package/components/sandbox/group.d.ts.map +1 -1
  34. package/components/sandbox/group.js +59 -28
  35. package/components/sandbox/group.js.map +1 -1
  36. package/components/sandbox/image.cjs +25 -0
  37. package/components/sandbox/image.cjs.map +1 -0
  38. package/components/sandbox/image.d.cts +32 -0
  39. package/components/sandbox/image.d.cts.map +1 -0
  40. package/components/sandbox/image.d.ts +32 -0
  41. package/components/sandbox/image.d.ts.map +1 -0
  42. package/components/sandbox/image.js +23 -0
  43. package/components/sandbox/image.js.map +1 -0
  44. package/components/sandbox/middleware.cjs +90 -38
  45. package/components/sandbox/middleware.cjs.map +1 -1
  46. package/components/sandbox/middleware.d.cts +5 -1
  47. package/components/sandbox/middleware.d.cts.map +1 -1
  48. package/components/sandbox/middleware.d.ts +5 -1
  49. package/components/sandbox/middleware.d.ts.map +1 -1
  50. package/components/sandbox/middleware.js +90 -38
  51. package/components/sandbox/middleware.js.map +1 -1
  52. package/components/sandbox/protocol.cjs +27 -0
  53. package/components/sandbox/protocol.cjs.map +1 -1
  54. package/components/sandbox/protocol.d.cts.map +1 -1
  55. package/components/sandbox/protocol.d.ts.map +1 -1
  56. package/components/sandbox/protocol.js +28 -1
  57. package/components/sandbox/protocol.js.map +1 -1
  58. package/components/sandbox/runnerScripts.cjs +214 -0
  59. package/components/sandbox/runnerScripts.cjs.map +1 -0
  60. package/components/sandbox/runnerScripts.js +213 -0
  61. package/components/sandbox/runnerScripts.js.map +1 -0
  62. package/components/sandbox/runners.cjs +113 -0
  63. package/components/sandbox/runners.cjs.map +1 -0
  64. package/components/sandbox/runners.d.cts +45 -0
  65. package/components/sandbox/runners.d.cts.map +1 -0
  66. package/components/sandbox/runners.d.ts +45 -0
  67. package/components/sandbox/runners.d.ts.map +1 -0
  68. package/components/sandbox/runners.js +113 -0
  69. package/components/sandbox/runners.js.map +1 -0
  70. package/components/sandbox/toolRunner.cjs +321 -0
  71. package/components/sandbox/toolRunner.cjs.map +1 -0
  72. package/components/sandbox/toolRunner.js +319 -0
  73. package/components/sandbox/toolRunner.js.map +1 -0
  74. package/components/sandbox/toolStubs.cjs +187 -0
  75. package/components/sandbox/toolStubs.cjs.map +1 -0
  76. package/components/sandbox/toolStubs.js +185 -0
  77. package/components/sandbox/toolStubs.js.map +1 -0
  78. package/components/sandbox/tools.cjs +173 -0
  79. package/components/sandbox/tools.cjs.map +1 -0
  80. package/components/sandbox/tools.d.cts +142 -0
  81. package/components/sandbox/tools.d.cts.map +1 -0
  82. package/components/sandbox/tools.d.ts +142 -0
  83. package/components/sandbox/tools.d.ts.map +1 -0
  84. package/components/sandbox/tools.js +166 -0
  85. package/components/sandbox/tools.js.map +1 -0
  86. package/components/sandbox/trace.cjs +7 -0
  87. package/components/sandbox/trace.cjs.map +1 -1
  88. package/components/sandbox/trace.js +7 -1
  89. package/components/sandbox/trace.js.map +1 -1
  90. package/components/sandbox/types.cjs.map +1 -1
  91. package/components/sandbox/types.d.cts +37 -2
  92. package/components/sandbox/types.d.cts.map +1 -1
  93. package/components/sandbox/types.d.ts +37 -2
  94. package/components/sandbox/types.d.ts.map +1 -1
  95. package/components/sandbox/types.js.map +1 -1
  96. package/components/sandbox/validation.cjs +21 -1
  97. package/components/sandbox/validation.cjs.map +1 -1
  98. package/components/sandbox/validation.js +19 -2
  99. package/components/sandbox/validation.js.map +1 -1
  100. package/experimental.cjs +5 -1
  101. package/experimental.d.cts +4 -1
  102. package/experimental.d.ts +4 -1
  103. package/experimental.js +3 -1
  104. package/package.json +2 -1
  105. package/version.cjs +1 -1
  106. package/version.cjs.map +1 -1
  107. package/version.d.cts +1 -1
  108. package/version.d.ts +1 -1
  109. package/version.js +1 -1
  110. package/version.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"durable.js","names":["facade: DurableSandboxSnapshot","facade: DurableSandboxProcess","createSnapshot: DurableSandbox[\"snapshot\"]","snapshot: DurableSandbox[\"snapshot\"]","facade: DurableSandbox"],"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.js","names":["facade: DurableSandboxSnapshot","facade: DurableSandboxProcess","createSnapshot: DurableSandbox[\"snapshot\"]","snapshot: DurableSandbox[\"snapshot\"]","facade: DurableSandbox"],"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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"}
@@ -4,11 +4,6 @@ const require_InngestStepTools = require('../InngestStepTools.cjs');
4
4
  const require_StepError = require('../StepError.cjs');
5
5
 
6
6
  //#region src/components/sandbox/group.ts
7
- /**
8
- * @module
9
- * `group.sandbox()`: a sandbox that lives for the length of a callback, shown
10
- * as one `sandbox` group in the trace.
11
- */
12
7
  const retriesRemain = () => {
13
8
  const ctx = require_als.getAsyncCtxSync()?.execution?.ctx;
14
9
  return !ctx?.maxAttempts || ctx.attempt < ctx.maxAttempts - 1;
@@ -22,35 +17,74 @@ const isFinal = (error) => {
22
17
  return error instanceof require_StepError.StepError || error instanceof require_NonRetriableError.NonRetriableError || !retriesRemain();
23
18
  };
24
19
  /**
20
+ * Destroy a sandbox in a step. A destroy that failed for good is on the trace
21
+ * as a warning, and must not change the outcome of the run.
22
+ */
23
+ const destroyQuietly = async (sandbox, idOrOptions) => {
24
+ try {
25
+ await sandbox.destroy(idOrOptions);
26
+ } catch (error) {
27
+ if (!(error instanceof require_StepError.StepError)) throw error;
28
+ }
29
+ };
30
+ /**
31
+ * The options of a sandbox created from just an ID. Each run's sandboxes need
32
+ * names that no other run shares.
33
+ */
34
+ const sandboxDefaults = (id) => {
35
+ return {
36
+ id,
37
+ name: `${require_als.getAsyncCtxSync()?.execution?.ctx.runId}-${id}`,
38
+ vcpu: 2,
39
+ memoryMb: 2048
40
+ };
41
+ };
42
+ /**
43
+ * Run `callback` with a new sandbox inside a span of the given kind, and
44
+ * destroy the sandbox when it ends. The span is named `name`, or else for its
45
+ * ID, after `title` if there is one. `steps` adds options, such as a name, to the create and
46
+ * destroy steps.
47
+ */
48
+ const withSandbox = (tools, span, idOrOptions, callback, steps = {}) => {
49
+ const { id, ...options } = typeof idOrOptions === "string" ? sandboxDefaults(idOrOptions) : idOrOptions;
50
+ return require_InngestStepTools.withSpan({
51
+ id,
52
+ name: span.name ?? (span.title ? `${span.title} ${id}` : id),
53
+ kind: span.kind
54
+ }, async () => {
55
+ const sandbox = await tools.create({
56
+ ...steps.create,
57
+ id
58
+ }, options);
59
+ let failure;
60
+ try {
61
+ return await callback(sandbox);
62
+ } catch (error) {
63
+ failure = { error };
64
+ throw error;
65
+ } finally {
66
+ if (!failure || isFinal(failure.error)) await destroyQuietly(sandbox, {
67
+ ...steps.destroy,
68
+ id: `${id}:destroy`
69
+ });
70
+ }
71
+ });
72
+ };
73
+ /**
25
74
  * Build `group.sandbox()` on top of `step.sandbox.create()`.
26
75
  */
27
76
  const createGroupSandbox = (tools) => {
28
77
  return (idOrOptions, callback) => {
29
- const { id, ...options } = typeof idOrOptions === "string" ? {
30
- id: idOrOptions,
31
- name: `${require_als.getAsyncCtxSync()?.execution?.ctx.runId}-${idOrOptions}`,
32
- vcpu: 2,
33
- memoryMb: 2048
34
- } : idOrOptions;
35
- return require_InngestStepTools.withSpan({
36
- id,
37
- name: `Sandbox ${id}`,
38
- kind: "sandbox"
39
- }, async () => {
40
- const sandbox = await tools.create(id, options);
41
- let failure;
42
- try {
43
- return await callback(sandbox);
44
- } catch (error) {
45
- failure = { error };
46
- throw error;
47
- } finally {
48
- if (!failure || isFinal(failure.error)) await sandbox[Symbol.asyncDispose]();
49
- }
50
- });
78
+ return withSandbox(tools, {
79
+ kind: "sandbox",
80
+ title: "Sandbox"
81
+ }, idOrOptions, callback);
51
82
  };
52
83
  };
53
84
 
54
85
  //#endregion
55
86
  exports.createGroupSandbox = createGroupSandbox;
87
+ exports.destroyQuietly = destroyQuietly;
88
+ exports.sandboxDefaults = sandboxDefaults;
89
+ exports.withSandbox = withSandbox;
56
90
  //# sourceMappingURL=group.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"group.cjs","names":["getAsyncCtxSync","StepError","NonRetriableError","withSpan","failure: { error: unknown } | undefined"],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":["/**\n * @module\n * `group.sandbox()`: a sandbox that lives for the length of a callback, shown\n * as one `sandbox` group in the trace.\n */\n\nimport { getAsyncCtxSync } from \"../execution/als.ts\";\nimport { withSpan } from \"../InngestStepTools.ts\";\nimport { NonRetriableError } from \"../NonRetriableError.ts\";\nimport { StepError } from \"../StepError.ts\";\nimport type {\n DurableSandbox,\n DurableSandboxTools,\n SandboxCreateOptions,\n} from \"./types.ts\";\n\n/**\n * The options of `step.sandbox.create()`, plus the ID of the group and of its\n * create step.\n */\nexport type GroupSandboxOptions = SandboxCreateOptions & { id: string };\n\nexport type GroupSandboxOptionsOrId = string | GroupSandboxOptions;\n\nexport type GroupSandbox = <T>(\n idOrOptions: GroupSandboxOptionsOrId,\n callback: (sandbox: DurableSandbox) => Promise<T>,\n) => Promise<T>;\n\nconst retriesRemain = (): boolean => {\n const ctx = getAsyncCtxSync()?.execution?.ctx;\n\n return !ctx?.maxAttempts || ctx.attempt < ctx.maxAttempts - 1;\n};\n\n/**\n * Whether an error ends the sandbox. A final error, or any error on the last\n * attempt, does. Any other error is about to be retried, and the retry replays\n * the memoized creation, so the sandbox must stay alive for it.\n */\nconst isFinal = (error: unknown): boolean => {\n return (\n error instanceof StepError ||\n error instanceof NonRetriableError ||\n !retriesRemain()\n );\n};\n\n/**\n * Build `group.sandbox()` on top of `step.sandbox.create()`.\n */\nexport const createGroupSandbox = (\n tools: DurableSandboxTools,\n): GroupSandbox => {\n return (idOrOptions, callback) => {\n const { id, ...options } =\n typeof idOrOptions === \"string\"\n ? {\n id: idOrOptions,\n // A run's sandboxes need names that no other run shares\n name: `${getAsyncCtxSync()?.execution?.ctx.runId}-${idOrOptions}`,\n vcpu: 2,\n memoryMb: 2048,\n }\n : idOrOptions;\n\n return withSpan(\n { id, name: `Sandbox ${id}`, kind: \"sandbox\" },\n async () => {\n const sandbox = await tools.create(id, options);\n let failure: { error: unknown } | undefined;\n\n try {\n return await callback(sandbox);\n } catch (error) {\n failure = { error };\n\n throw error;\n } finally {\n if (!failure || isFinal(failure.error)) {\n await sandbox[Symbol.asyncDispose]();\n }\n }\n },\n );\n };\n};\n"],"mappings":";;;;;;;;;;;AA6BA,MAAM,sBAA+B;CACnC,MAAM,MAAMA,6BAAiB,EAAE,WAAW;AAE1C,QAAO,CAAC,KAAK,eAAe,IAAI,UAAU,IAAI,cAAc;;;;;;;AAQ9D,MAAM,WAAW,UAA4B;AAC3C,QACE,iBAAiBC,+BACjB,iBAAiBC,+CACjB,CAAC,eAAe;;;;;AAOpB,MAAa,sBACX,UACiB;AACjB,SAAQ,aAAa,aAAa;EAChC,MAAM,EAAE,IAAI,GAAG,YACb,OAAO,gBAAgB,WACnB;GACE,IAAI;GAEJ,MAAM,GAAGF,6BAAiB,EAAE,WAAW,IAAI,MAAM,GAAG;GACpD,MAAM;GACN,UAAU;GACX,GACD;AAEN,SAAOG,kCACL;GAAE;GAAI,MAAM,WAAW;GAAM,MAAM;GAAW,EAC9C,YAAY;GACV,MAAM,UAAU,MAAM,MAAM,OAAO,IAAI,QAAQ;GAC/C,IAAIC;AAEJ,OAAI;AACF,WAAO,MAAM,SAAS,QAAQ;YACvB,OAAO;AACd,cAAU,EAAE,OAAO;AAEnB,UAAM;aACE;AACR,QAAI,CAAC,WAAW,QAAQ,QAAQ,MAAM,CACpC,OAAM,QAAQ,OAAO,eAAe;;IAI3C"}
1
+ {"version":3,"file":"group.cjs","names":["getAsyncCtxSync","StepError","NonRetriableError","withSpan","failure: { error: unknown } | undefined"],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":["/**\n * @module\n * `group.sandbox()`: a sandbox that lives for the length of a callback, shown\n * as one `sandbox` group in the trace.\n */\n\nimport type { StepOptions, StepOptionsOrId } from \"../../types.ts\";\nimport { getAsyncCtxSync } from \"../execution/als.ts\";\nimport { withSpan } from \"../InngestStepTools.ts\";\nimport { NonRetriableError } from \"../NonRetriableError.ts\";\nimport { StepError } from \"../StepError.ts\";\nimport type {\n DurableSandbox,\n DurableSandboxTools,\n SandboxCreateOptions,\n} from \"./types.ts\";\n\n/**\n * The options of `step.sandbox.create()`, plus the ID of the group and of its\n * create step.\n */\nexport type GroupSandboxOptions = SandboxCreateOptions & { id: string };\n\nexport type GroupSandboxOptionsOrId = string | GroupSandboxOptions;\n\nexport type GroupSandbox = <T>(\n idOrOptions: GroupSandboxOptionsOrId,\n callback: (sandbox: DurableSandbox) => Promise<T>,\n) => Promise<T>;\n\nconst retriesRemain = (): boolean => {\n const ctx = getAsyncCtxSync()?.execution?.ctx;\n\n return !ctx?.maxAttempts || ctx.attempt < ctx.maxAttempts - 1;\n};\n\n/**\n * Whether an error ends the sandbox. A final error, or any error on the last\n * attempt, does. Any other error is about to be retried, and the retry replays\n * the memoized creation, so the sandbox must stay alive for it.\n */\nconst isFinal = (error: unknown): boolean => {\n return (\n error instanceof StepError ||\n error instanceof NonRetriableError ||\n !retriesRemain()\n );\n};\n\n/**\n * Destroy a sandbox in a step. A destroy that failed for good is on the trace\n * as a warning, and must not change the outcome of the run.\n */\nexport const destroyQuietly = async (\n sandbox: DurableSandbox,\n idOrOptions: StepOptionsOrId,\n): Promise<void> => {\n try {\n await sandbox.destroy(idOrOptions);\n } catch (error) {\n if (!(error instanceof StepError)) {\n throw error;\n }\n }\n};\n\n/**\n * The options of a sandbox created from just an ID. Each run's sandboxes need\n * names that no other run shares.\n */\nexport const sandboxDefaults = (id: string) => {\n return {\n id,\n name: `${getAsyncCtxSync()?.execution?.ctx.runId}-${id}`,\n vcpu: 2,\n memoryMb: 2048,\n };\n};\n\n/**\n * Run `callback` with a new sandbox inside a span of the given kind, and\n * destroy the sandbox when it ends. The span is named `name`, or else for its\n * ID, after `title` if there is one. `steps` adds options, such as a name, to the create and\n * destroy steps.\n */\nexport const withSandbox = <T>(\n tools: DurableSandboxTools,\n span: { kind: string; title?: string; name?: string },\n idOrOptions: GroupSandboxOptionsOrId,\n callback: (sandbox: DurableSandbox) => Promise<T>,\n steps: {\n create?: Omit<StepOptions, \"id\">;\n destroy?: Omit<StepOptions, \"id\">;\n } = {},\n): Promise<T> => {\n const { id, ...options } =\n typeof idOrOptions === \"string\"\n ? sandboxDefaults(idOrOptions)\n : idOrOptions;\n\n return withSpan(\n {\n id,\n name: span.name ?? (span.title ? `${span.title} ${id}` : id),\n kind: span.kind,\n },\n async () => {\n const sandbox = await tools.create({ ...steps.create, id }, options);\n let failure: { error: unknown } | undefined;\n\n try {\n return await callback(sandbox);\n } catch (error) {\n failure = { error };\n\n throw error;\n } finally {\n if (!failure || isFinal(failure.error)) {\n await destroyQuietly(sandbox, {\n ...steps.destroy,\n id: `${id}:destroy`,\n });\n }\n }\n },\n );\n};\n\n/**\n * Build `group.sandbox()` on top of `step.sandbox.create()`.\n */\nexport const createGroupSandbox = (\n tools: DurableSandboxTools,\n): GroupSandbox => {\n return (idOrOptions, callback) => {\n return withSandbox(\n tools,\n { kind: \"sandbox\", title: \"Sandbox\" },\n idOrOptions,\n callback,\n );\n };\n};\n"],"mappings":";;;;;;AA8BA,MAAM,sBAA+B;CACnC,MAAM,MAAMA,6BAAiB,EAAE,WAAW;AAE1C,QAAO,CAAC,KAAK,eAAe,IAAI,UAAU,IAAI,cAAc;;;;;;;AAQ9D,MAAM,WAAW,UAA4B;AAC3C,QACE,iBAAiBC,+BACjB,iBAAiBC,+CACjB,CAAC,eAAe;;;;;;AAQpB,MAAa,iBAAiB,OAC5B,SACA,gBACkB;AAClB,KAAI;AACF,QAAM,QAAQ,QAAQ,YAAY;UAC3B,OAAO;AACd,MAAI,EAAE,iBAAiBD,6BACrB,OAAM;;;;;;;AASZ,MAAa,mBAAmB,OAAe;AAC7C,QAAO;EACL;EACA,MAAM,GAAGD,6BAAiB,EAAE,WAAW,IAAI,MAAM,GAAG;EACpD,MAAM;EACN,UAAU;EACX;;;;;;;;AASH,MAAa,eACX,OACA,MACA,aACA,UACA,QAGI,EAAE,KACS;CACf,MAAM,EAAE,IAAI,GAAG,YACb,OAAO,gBAAgB,WACnB,gBAAgB,YAAY,GAC5B;AAEN,QAAOG,kCACL;EACE;EACA,MAAM,KAAK,SAAS,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,OAAO;EACzD,MAAM,KAAK;EACZ,EACD,YAAY;EACV,MAAM,UAAU,MAAM,MAAM,OAAO;GAAE,GAAG,MAAM;GAAQ;GAAI,EAAE,QAAQ;EACpE,IAAIC;AAEJ,MAAI;AACF,UAAO,MAAM,SAAS,QAAQ;WACvB,OAAO;AACd,aAAU,EAAE,OAAO;AAEnB,SAAM;YACE;AACR,OAAI,CAAC,WAAW,QAAQ,QAAQ,MAAM,CACpC,OAAM,eAAe,SAAS;IAC5B,GAAG,MAAM;IACT,IAAI,GAAG,GAAG;IACX,CAAC;;GAIT;;;;;AAMH,MAAa,sBACX,UACiB;AACjB,SAAQ,aAAa,aAAa;AAChC,SAAO,YACL,OACA;GAAE,MAAM;GAAW,OAAO;GAAW,EACrC,aACA,SACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.cts","names":[],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA0ByC,KAN7B,mBAAA,GAAsB,oBAMO,GAAA;MAC5B,MAAA;;AAAD,KALA,uBAAA,GAKA,MAAA,GALmC,mBAKnC;KAHA,YAAA,oBACG,6CACO,mBAAmB,QAAQ,OAC5C,QAAQ"}
1
+ {"version":3,"file":"group.d.cts","names":[],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA4Ba,KAPD,mBAAA,GAAsB,oBAOrB,GAAA;MAAR,MAAA;CAAO;KALA,uBAAA,YAAmC;KAEnC,YAAA,oBACG,6CACO,mBAAmB,QAAQ,OAC5C,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.ts","names":[],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA0ByC,KAN7B,mBAAA,GAAsB,oBAMO,GAAA;MAC5B,MAAA;;AAAD,KALA,uBAAA,GAKA,MAAA,GALmC,mBAKnC;KAHA,YAAA,oBACG,6CACO,mBAAmB,QAAQ,OAC5C,QAAQ"}
1
+ {"version":3,"file":"group.d.ts","names":[],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA4Ba,KAPD,mBAAA,GAAsB,oBAOrB,GAAA;MAAR,MAAA;CAAO;KALA,uBAAA,YAAmC;KAEnC,YAAA,oBACG,6CACO,mBAAmB,QAAQ,OAC5C,QAAQ"}
@@ -4,11 +4,6 @@ import { withSpan } from "../InngestStepTools.js";
4
4
  import { StepError } from "../StepError.js";
5
5
 
6
6
  //#region src/components/sandbox/group.ts
7
- /**
8
- * @module
9
- * `group.sandbox()`: a sandbox that lives for the length of a callback, shown
10
- * as one `sandbox` group in the trace.
11
- */
12
7
  const retriesRemain = () => {
13
8
  const ctx = getAsyncCtxSync()?.execution?.ctx;
14
9
  return !ctx?.maxAttempts || ctx.attempt < ctx.maxAttempts - 1;
@@ -22,35 +17,71 @@ const isFinal = (error) => {
22
17
  return error instanceof StepError || error instanceof NonRetriableError || !retriesRemain();
23
18
  };
24
19
  /**
20
+ * Destroy a sandbox in a step. A destroy that failed for good is on the trace
21
+ * as a warning, and must not change the outcome of the run.
22
+ */
23
+ const destroyQuietly = async (sandbox, idOrOptions) => {
24
+ try {
25
+ await sandbox.destroy(idOrOptions);
26
+ } catch (error) {
27
+ if (!(error instanceof StepError)) throw error;
28
+ }
29
+ };
30
+ /**
31
+ * The options of a sandbox created from just an ID. Each run's sandboxes need
32
+ * names that no other run shares.
33
+ */
34
+ const sandboxDefaults = (id) => {
35
+ return {
36
+ id,
37
+ name: `${getAsyncCtxSync()?.execution?.ctx.runId}-${id}`,
38
+ vcpu: 2,
39
+ memoryMb: 2048
40
+ };
41
+ };
42
+ /**
43
+ * Run `callback` with a new sandbox inside a span of the given kind, and
44
+ * destroy the sandbox when it ends. The span is named `name`, or else for its
45
+ * ID, after `title` if there is one. `steps` adds options, such as a name, to the create and
46
+ * destroy steps.
47
+ */
48
+ const withSandbox = (tools, span, idOrOptions, callback, steps = {}) => {
49
+ const { id, ...options } = typeof idOrOptions === "string" ? sandboxDefaults(idOrOptions) : idOrOptions;
50
+ return withSpan({
51
+ id,
52
+ name: span.name ?? (span.title ? `${span.title} ${id}` : id),
53
+ kind: span.kind
54
+ }, async () => {
55
+ const sandbox = await tools.create({
56
+ ...steps.create,
57
+ id
58
+ }, options);
59
+ let failure;
60
+ try {
61
+ return await callback(sandbox);
62
+ } catch (error) {
63
+ failure = { error };
64
+ throw error;
65
+ } finally {
66
+ if (!failure || isFinal(failure.error)) await destroyQuietly(sandbox, {
67
+ ...steps.destroy,
68
+ id: `${id}:destroy`
69
+ });
70
+ }
71
+ });
72
+ };
73
+ /**
25
74
  * Build `group.sandbox()` on top of `step.sandbox.create()`.
26
75
  */
27
76
  const createGroupSandbox = (tools) => {
28
77
  return (idOrOptions, callback) => {
29
- const { id, ...options } = typeof idOrOptions === "string" ? {
30
- id: idOrOptions,
31
- name: `${getAsyncCtxSync()?.execution?.ctx.runId}-${idOrOptions}`,
32
- vcpu: 2,
33
- memoryMb: 2048
34
- } : idOrOptions;
35
- return withSpan({
36
- id,
37
- name: `Sandbox ${id}`,
38
- kind: "sandbox"
39
- }, async () => {
40
- const sandbox = await tools.create(id, options);
41
- let failure;
42
- try {
43
- return await callback(sandbox);
44
- } catch (error) {
45
- failure = { error };
46
- throw error;
47
- } finally {
48
- if (!failure || isFinal(failure.error)) await sandbox[Symbol.asyncDispose]();
49
- }
50
- });
78
+ return withSandbox(tools, {
79
+ kind: "sandbox",
80
+ title: "Sandbox"
81
+ }, idOrOptions, callback);
51
82
  };
52
83
  };
53
84
 
54
85
  //#endregion
55
- export { createGroupSandbox };
86
+ export { createGroupSandbox, destroyQuietly, sandboxDefaults, withSandbox };
56
87
  //# sourceMappingURL=group.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"group.js","names":["failure: { error: unknown } | undefined"],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":["/**\n * @module\n * `group.sandbox()`: a sandbox that lives for the length of a callback, shown\n * as one `sandbox` group in the trace.\n */\n\nimport { getAsyncCtxSync } from \"../execution/als.ts\";\nimport { withSpan } from \"../InngestStepTools.ts\";\nimport { NonRetriableError } from \"../NonRetriableError.ts\";\nimport { StepError } from \"../StepError.ts\";\nimport type {\n DurableSandbox,\n DurableSandboxTools,\n SandboxCreateOptions,\n} from \"./types.ts\";\n\n/**\n * The options of `step.sandbox.create()`, plus the ID of the group and of its\n * create step.\n */\nexport type GroupSandboxOptions = SandboxCreateOptions & { id: string };\n\nexport type GroupSandboxOptionsOrId = string | GroupSandboxOptions;\n\nexport type GroupSandbox = <T>(\n idOrOptions: GroupSandboxOptionsOrId,\n callback: (sandbox: DurableSandbox) => Promise<T>,\n) => Promise<T>;\n\nconst retriesRemain = (): boolean => {\n const ctx = getAsyncCtxSync()?.execution?.ctx;\n\n return !ctx?.maxAttempts || ctx.attempt < ctx.maxAttempts - 1;\n};\n\n/**\n * Whether an error ends the sandbox. A final error, or any error on the last\n * attempt, does. Any other error is about to be retried, and the retry replays\n * the memoized creation, so the sandbox must stay alive for it.\n */\nconst isFinal = (error: unknown): boolean => {\n return (\n error instanceof StepError ||\n error instanceof NonRetriableError ||\n !retriesRemain()\n );\n};\n\n/**\n * Build `group.sandbox()` on top of `step.sandbox.create()`.\n */\nexport const createGroupSandbox = (\n tools: DurableSandboxTools,\n): GroupSandbox => {\n return (idOrOptions, callback) => {\n const { id, ...options } =\n typeof idOrOptions === \"string\"\n ? {\n id: idOrOptions,\n // A run's sandboxes need names that no other run shares\n name: `${getAsyncCtxSync()?.execution?.ctx.runId}-${idOrOptions}`,\n vcpu: 2,\n memoryMb: 2048,\n }\n : idOrOptions;\n\n return withSpan(\n { id, name: `Sandbox ${id}`, kind: \"sandbox\" },\n async () => {\n const sandbox = await tools.create(id, options);\n let failure: { error: unknown } | undefined;\n\n try {\n return await callback(sandbox);\n } catch (error) {\n failure = { error };\n\n throw error;\n } finally {\n if (!failure || isFinal(failure.error)) {\n await sandbox[Symbol.asyncDispose]();\n }\n }\n },\n );\n };\n};\n"],"mappings":";;;;;;;;;;;AA6BA,MAAM,sBAA+B;CACnC,MAAM,MAAM,iBAAiB,EAAE,WAAW;AAE1C,QAAO,CAAC,KAAK,eAAe,IAAI,UAAU,IAAI,cAAc;;;;;;;AAQ9D,MAAM,WAAW,UAA4B;AAC3C,QACE,iBAAiB,aACjB,iBAAiB,qBACjB,CAAC,eAAe;;;;;AAOpB,MAAa,sBACX,UACiB;AACjB,SAAQ,aAAa,aAAa;EAChC,MAAM,EAAE,IAAI,GAAG,YACb,OAAO,gBAAgB,WACnB;GACE,IAAI;GAEJ,MAAM,GAAG,iBAAiB,EAAE,WAAW,IAAI,MAAM,GAAG;GACpD,MAAM;GACN,UAAU;GACX,GACD;AAEN,SAAO,SACL;GAAE;GAAI,MAAM,WAAW;GAAM,MAAM;GAAW,EAC9C,YAAY;GACV,MAAM,UAAU,MAAM,MAAM,OAAO,IAAI,QAAQ;GAC/C,IAAIA;AAEJ,OAAI;AACF,WAAO,MAAM,SAAS,QAAQ;YACvB,OAAO;AACd,cAAU,EAAE,OAAO;AAEnB,UAAM;aACE;AACR,QAAI,CAAC,WAAW,QAAQ,QAAQ,MAAM,CACpC,OAAM,QAAQ,OAAO,eAAe;;IAI3C"}
1
+ {"version":3,"file":"group.js","names":["failure: { error: unknown } | undefined"],"sources":["../../../src/components/sandbox/group.ts"],"sourcesContent":["/**\n * @module\n * `group.sandbox()`: a sandbox that lives for the length of a callback, shown\n * as one `sandbox` group in the trace.\n */\n\nimport type { StepOptions, StepOptionsOrId } from \"../../types.ts\";\nimport { getAsyncCtxSync } from \"../execution/als.ts\";\nimport { withSpan } from \"../InngestStepTools.ts\";\nimport { NonRetriableError } from \"../NonRetriableError.ts\";\nimport { StepError } from \"../StepError.ts\";\nimport type {\n DurableSandbox,\n DurableSandboxTools,\n SandboxCreateOptions,\n} from \"./types.ts\";\n\n/**\n * The options of `step.sandbox.create()`, plus the ID of the group and of its\n * create step.\n */\nexport type GroupSandboxOptions = SandboxCreateOptions & { id: string };\n\nexport type GroupSandboxOptionsOrId = string | GroupSandboxOptions;\n\nexport type GroupSandbox = <T>(\n idOrOptions: GroupSandboxOptionsOrId,\n callback: (sandbox: DurableSandbox) => Promise<T>,\n) => Promise<T>;\n\nconst retriesRemain = (): boolean => {\n const ctx = getAsyncCtxSync()?.execution?.ctx;\n\n return !ctx?.maxAttempts || ctx.attempt < ctx.maxAttempts - 1;\n};\n\n/**\n * Whether an error ends the sandbox. A final error, or any error on the last\n * attempt, does. Any other error is about to be retried, and the retry replays\n * the memoized creation, so the sandbox must stay alive for it.\n */\nconst isFinal = (error: unknown): boolean => {\n return (\n error instanceof StepError ||\n error instanceof NonRetriableError ||\n !retriesRemain()\n );\n};\n\n/**\n * Destroy a sandbox in a step. A destroy that failed for good is on the trace\n * as a warning, and must not change the outcome of the run.\n */\nexport const destroyQuietly = async (\n sandbox: DurableSandbox,\n idOrOptions: StepOptionsOrId,\n): Promise<void> => {\n try {\n await sandbox.destroy(idOrOptions);\n } catch (error) {\n if (!(error instanceof StepError)) {\n throw error;\n }\n }\n};\n\n/**\n * The options of a sandbox created from just an ID. Each run's sandboxes need\n * names that no other run shares.\n */\nexport const sandboxDefaults = (id: string) => {\n return {\n id,\n name: `${getAsyncCtxSync()?.execution?.ctx.runId}-${id}`,\n vcpu: 2,\n memoryMb: 2048,\n };\n};\n\n/**\n * Run `callback` with a new sandbox inside a span of the given kind, and\n * destroy the sandbox when it ends. The span is named `name`, or else for its\n * ID, after `title` if there is one. `steps` adds options, such as a name, to the create and\n * destroy steps.\n */\nexport const withSandbox = <T>(\n tools: DurableSandboxTools,\n span: { kind: string; title?: string; name?: string },\n idOrOptions: GroupSandboxOptionsOrId,\n callback: (sandbox: DurableSandbox) => Promise<T>,\n steps: {\n create?: Omit<StepOptions, \"id\">;\n destroy?: Omit<StepOptions, \"id\">;\n } = {},\n): Promise<T> => {\n const { id, ...options } =\n typeof idOrOptions === \"string\"\n ? sandboxDefaults(idOrOptions)\n : idOrOptions;\n\n return withSpan(\n {\n id,\n name: span.name ?? (span.title ? `${span.title} ${id}` : id),\n kind: span.kind,\n },\n async () => {\n const sandbox = await tools.create({ ...steps.create, id }, options);\n let failure: { error: unknown } | undefined;\n\n try {\n return await callback(sandbox);\n } catch (error) {\n failure = { error };\n\n throw error;\n } finally {\n if (!failure || isFinal(failure.error)) {\n await destroyQuietly(sandbox, {\n ...steps.destroy,\n id: `${id}:destroy`,\n });\n }\n }\n },\n );\n};\n\n/**\n * Build `group.sandbox()` on top of `step.sandbox.create()`.\n */\nexport const createGroupSandbox = (\n tools: DurableSandboxTools,\n): GroupSandbox => {\n return (idOrOptions, callback) => {\n return withSandbox(\n tools,\n { kind: \"sandbox\", title: \"Sandbox\" },\n idOrOptions,\n callback,\n );\n };\n};\n"],"mappings":";;;;;;AA8BA,MAAM,sBAA+B;CACnC,MAAM,MAAM,iBAAiB,EAAE,WAAW;AAE1C,QAAO,CAAC,KAAK,eAAe,IAAI,UAAU,IAAI,cAAc;;;;;;;AAQ9D,MAAM,WAAW,UAA4B;AAC3C,QACE,iBAAiB,aACjB,iBAAiB,qBACjB,CAAC,eAAe;;;;;;AAQpB,MAAa,iBAAiB,OAC5B,SACA,gBACkB;AAClB,KAAI;AACF,QAAM,QAAQ,QAAQ,YAAY;UAC3B,OAAO;AACd,MAAI,EAAE,iBAAiB,WACrB,OAAM;;;;;;;AASZ,MAAa,mBAAmB,OAAe;AAC7C,QAAO;EACL;EACA,MAAM,GAAG,iBAAiB,EAAE,WAAW,IAAI,MAAM,GAAG;EACpD,MAAM;EACN,UAAU;EACX;;;;;;;;AASH,MAAa,eACX,OACA,MACA,aACA,UACA,QAGI,EAAE,KACS;CACf,MAAM,EAAE,IAAI,GAAG,YACb,OAAO,gBAAgB,WACnB,gBAAgB,YAAY,GAC5B;AAEN,QAAO,SACL;EACE;EACA,MAAM,KAAK,SAAS,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,OAAO;EACzD,MAAM,KAAK;EACZ,EACD,YAAY;EACV,MAAM,UAAU,MAAM,MAAM,OAAO;GAAE,GAAG,MAAM;GAAQ;GAAI,EAAE,QAAQ;EACpE,IAAIA;AAEJ,MAAI;AACF,UAAO,MAAM,SAAS,QAAQ;WACvB,OAAO;AACd,aAAU,EAAE,OAAO;AAEnB,SAAM;YACE;AACR,OAAI,CAAC,WAAW,QAAQ,QAAQ,MAAM,CACpC,OAAM,eAAe,SAAS;IAC5B,GAAG,MAAM;IACT,IAAI,GAAG,GAAG;IACX,CAAC;;GAIT;;;;;AAMH,MAAa,sBACX,UACiB;AACjB,SAAQ,aAAa,aAAa;AAChC,SAAO,YACL,OACA;GAAE,MAAM;GAAW,OAAO;GAAW,EACrC,aACA,SACD"}
@@ -0,0 +1,25 @@
1
+
2
+ //#region src/components/sandbox/image.ts
3
+ /** Whether a value is a {@link SandboxImage}. */
4
+ const isSandboxImage = (value) => {
5
+ return value?.kind === "inngest/sandbox.image";
6
+ };
7
+ const make = (ref) => {
8
+ return Object.freeze({
9
+ kind: "inngest/sandbox.image",
10
+ ref
11
+ });
12
+ };
13
+ const image = {
14
+ inngest: (name) => {
15
+ return make(`inngest/${name}`);
16
+ },
17
+ custom: (ref) => {
18
+ return make(ref);
19
+ }
20
+ };
21
+
22
+ //#endregion
23
+ exports.image = image;
24
+ exports.isSandboxImage = isSandboxImage;
25
+ //# sourceMappingURL=image.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.cjs","names":[],"sources":["../../../src/components/sandbox/image.ts"],"sourcesContent":["/**\n * `image`: the images a Sandbox can start from, passed as `from` to\n * `sandboxes.create()` and `step.sandbox.create()`. Each helper only names an\n * image; Create resolves it to the wire `image` string and validates it.\n *\n * @module\n */\n\n/**\n * An image for a Sandbox to start from, made by `image.inngest()` or\n * `image.custom()`.\n */\nexport interface SandboxImage {\n readonly kind: \"inngest/sandbox.image\";\n /** The catalog reference sent as the Create `image`. */\n readonly ref: string;\n}\n\n/** Whether a value is a {@link SandboxImage}. */\nexport const isSandboxImage = (value: unknown): value is SandboxImage => {\n return (value as SandboxImage | undefined)?.kind === \"inngest/sandbox.image\";\n};\n\nconst make = (ref: string): SandboxImage => {\n return Object.freeze({ kind: \"inngest/sandbox.image\", ref });\n};\n\nexport const image = {\n /**\n * An image Inngest maintains, such as `image.inngest(\"base\")`. Omit `from`\n * to use the default.\n */\n inngest: (\n /** The image's name in Inngest's catalog. */\n name: string,\n ): SandboxImage => {\n return make(`inngest/${name}`);\n },\n\n /**\n * An image published to your workspace: `\"my-image\"`, `\"my-image:v1\"`, or\n * `\"my-image@sha256:<hex>\"`.\n */\n custom: (\n /** The image reference, validated when the Sandbox is created. */\n ref: string,\n ): SandboxImage => {\n return make(ref);\n },\n};\n"],"mappings":";;;AAmBA,MAAa,kBAAkB,UAA0C;AACvE,QAAQ,OAAoC,SAAS;;AAGvD,MAAM,QAAQ,QAA8B;AAC1C,QAAO,OAAO,OAAO;EAAE,MAAM;EAAyB;EAAK,CAAC;;AAG9D,MAAa,QAAQ;CAKnB,UAEE,SACiB;AACjB,SAAO,KAAK,WAAW,OAAO;;CAOhC,SAEE,QACiB;AACjB,SAAO,KAAK,IAAI;;CAEnB"}
@@ -0,0 +1,32 @@
1
+ //#region src/components/sandbox/image.d.ts
2
+ /**
3
+ * `image`: the images a Sandbox can start from, passed as `from` to
4
+ * `sandboxes.create()` and `step.sandbox.create()`. Each helper only names an
5
+ * image; Create resolves it to the wire `image` string and validates it.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * An image for a Sandbox to start from, made by `image.inngest()` or
11
+ * `image.custom()`.
12
+ */
13
+ interface SandboxImage {
14
+ readonly kind: "inngest/sandbox.image";
15
+ /** The catalog reference sent as the Create `image`. */
16
+ readonly ref: string;
17
+ }
18
+ declare const image: {
19
+ /**
20
+ * An image Inngest maintains, such as `image.inngest("base")`. Omit `from`
21
+ * to use the default.
22
+ */
23
+ inngest: (name: string) => SandboxImage;
24
+ /**
25
+ * An image published to your workspace: `"my-image"`, `"my-image:v1"`, or
26
+ * `"my-image@sha256:<hex>"`.
27
+ */
28
+ custom: (ref: string) => SandboxImage;
29
+ };
30
+ //#endregion
31
+ export { SandboxImage, image };
32
+ //# sourceMappingURL=image.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.cts","names":[],"sources":["../../../src/components/sandbox/image.ts"],"sourcesContent":[],"mappings":";;AAYA;AAeA;;;;;;;;;UAfiB,YAAA;;;;;cAeJ;;;;;6BAQR;;;;;2BAWA"}
@@ -0,0 +1,32 @@
1
+ //#region src/components/sandbox/image.d.ts
2
+ /**
3
+ * `image`: the images a Sandbox can start from, passed as `from` to
4
+ * `sandboxes.create()` and `step.sandbox.create()`. Each helper only names an
5
+ * image; Create resolves it to the wire `image` string and validates it.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * An image for a Sandbox to start from, made by `image.inngest()` or
11
+ * `image.custom()`.
12
+ */
13
+ interface SandboxImage {
14
+ readonly kind: "inngest/sandbox.image";
15
+ /** The catalog reference sent as the Create `image`. */
16
+ readonly ref: string;
17
+ }
18
+ declare const image: {
19
+ /**
20
+ * An image Inngest maintains, such as `image.inngest("base")`. Omit `from`
21
+ * to use the default.
22
+ */
23
+ inngest: (name: string) => SandboxImage;
24
+ /**
25
+ * An image published to your workspace: `"my-image"`, `"my-image:v1"`, or
26
+ * `"my-image@sha256:<hex>"`.
27
+ */
28
+ custom: (ref: string) => SandboxImage;
29
+ };
30
+ //#endregion
31
+ export { SandboxImage, image };
32
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","names":[],"sources":["../../../src/components/sandbox/image.ts"],"sourcesContent":[],"mappings":";;AAYA;AAeA;;;;;;;;;UAfiB,YAAA;;;;;cAeJ;;;;;6BAQR;;;;;2BAWA"}