inngest 4.22.0 → 4.23.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 (108) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/components/Inngest.cjs +5 -5
  3. package/components/Inngest.cjs.map +1 -1
  4. package/components/Inngest.d.cts +4 -4
  5. package/components/Inngest.d.ts +4 -4
  6. package/components/Inngest.js +5 -5
  7. package/components/Inngest.js.map +1 -1
  8. package/components/InngestGroupTools.cjs +4 -3
  9. package/components/InngestGroupTools.cjs.map +1 -1
  10. package/components/InngestGroupTools.d.cts +27 -1
  11. package/components/InngestGroupTools.d.cts.map +1 -1
  12. package/components/InngestGroupTools.d.ts +27 -1
  13. package/components/InngestGroupTools.d.ts.map +1 -1
  14. package/components/InngestGroupTools.js +5 -4
  15. package/components/InngestGroupTools.js.map +1 -1
  16. package/components/InngestMetadata.cjs +10 -4
  17. package/components/InngestMetadata.cjs.map +1 -1
  18. package/components/InngestMetadata.d.cts +39 -8
  19. package/components/InngestMetadata.d.cts.map +1 -1
  20. package/components/InngestMetadata.d.ts +39 -8
  21. package/components/InngestMetadata.d.ts.map +1 -1
  22. package/components/InngestMetadata.js +10 -4
  23. package/components/InngestMetadata.js.map +1 -1
  24. package/components/InngestStepTools.cjs +57 -2
  25. package/components/InngestStepTools.cjs.map +1 -1
  26. package/components/InngestStepTools.d.cts.map +1 -1
  27. package/components/InngestStepTools.d.ts.map +1 -1
  28. package/components/InngestStepTools.js +58 -4
  29. package/components/InngestStepTools.js.map +1 -1
  30. package/components/execution/InngestExecution.cjs.map +1 -1
  31. package/components/execution/InngestExecution.d.cts +2 -2
  32. package/components/execution/InngestExecution.d.cts.map +1 -1
  33. package/components/execution/InngestExecution.d.ts +2 -2
  34. package/components/execution/InngestExecution.d.ts.map +1 -1
  35. package/components/execution/InngestExecution.js.map +1 -1
  36. package/components/execution/als.cjs.map +1 -1
  37. package/components/execution/als.d.cts +8 -1
  38. package/components/execution/als.d.cts.map +1 -1
  39. package/components/execution/als.d.ts +8 -1
  40. package/components/execution/als.d.ts.map +1 -1
  41. package/components/execution/als.js.map +1 -1
  42. package/components/execution/engine.cjs +11 -4
  43. package/components/execution/engine.cjs.map +1 -1
  44. package/components/execution/engine.d.cts.map +1 -1
  45. package/components/execution/engine.d.ts.map +1 -1
  46. package/components/execution/engine.js +11 -4
  47. package/components/execution/engine.js.map +1 -1
  48. package/components/execution/otel/middleware.d.cts +6 -6
  49. package/components/execution/otel/middleware.d.ts +6 -6
  50. package/components/execution/otel/processor.cjs +5 -0
  51. package/components/execution/otel/processor.cjs.map +1 -1
  52. package/components/execution/otel/processor.d.cts.map +1 -1
  53. package/components/execution/otel/processor.d.ts.map +1 -1
  54. package/components/execution/otel/processor.js +5 -0
  55. package/components/execution/otel/processor.js.map +1 -1
  56. package/components/sandbox/client.cjs +6 -4
  57. package/components/sandbox/client.cjs.map +1 -1
  58. package/components/sandbox/client.js +6 -4
  59. package/components/sandbox/client.js.map +1 -1
  60. package/components/sandbox/durable.cjs +35 -18
  61. package/components/sandbox/durable.cjs.map +1 -1
  62. package/components/sandbox/durable.js +35 -18
  63. package/components/sandbox/durable.js.map +1 -1
  64. package/components/sandbox/middleware.cjs +19 -1
  65. package/components/sandbox/middleware.cjs.map +1 -1
  66. package/components/sandbox/middleware.d.cts.map +1 -1
  67. package/components/sandbox/middleware.d.ts.map +1 -1
  68. package/components/sandbox/middleware.js +19 -1
  69. package/components/sandbox/middleware.js.map +1 -1
  70. package/components/sandbox/protocol.cjs +6 -2
  71. package/components/sandbox/protocol.cjs.map +1 -1
  72. package/components/sandbox/protocol.d.cts.map +1 -1
  73. package/components/sandbox/protocol.d.ts.map +1 -1
  74. package/components/sandbox/protocol.js +5 -4
  75. package/components/sandbox/protocol.js.map +1 -1
  76. package/components/sandbox/trace.cjs +113 -0
  77. package/components/sandbox/trace.cjs.map +1 -0
  78. package/components/sandbox/trace.js +112 -0
  79. package/components/sandbox/trace.js.map +1 -0
  80. package/components/sandbox/types.cjs.map +1 -1
  81. package/components/sandbox/types.d.cts +22 -3
  82. package/components/sandbox/types.d.cts.map +1 -1
  83. package/components/sandbox/types.d.ts +22 -3
  84. package/components/sandbox/types.d.ts.map +1 -1
  85. package/components/sandbox/types.js.map +1 -1
  86. package/components/sandbox/validation.cjs +20 -7
  87. package/components/sandbox/validation.cjs.map +1 -1
  88. package/components/sandbox/validation.js +20 -8
  89. package/components/sandbox/validation.js.map +1 -1
  90. package/experimental.cjs +1 -1
  91. package/experimental.js +1 -1
  92. package/index.cjs +1 -1
  93. package/index.js +1 -1
  94. package/package.json +1 -1
  95. package/react.d.cts +1 -1
  96. package/react.d.ts +1 -1
  97. package/types.cjs.map +1 -1
  98. package/types.d.cts +52 -2
  99. package/types.d.cts.map +1 -1
  100. package/types.d.ts +52 -2
  101. package/types.d.ts.map +1 -1
  102. package/types.js.map +1 -1
  103. package/version.cjs +1 -1
  104. package/version.cjs.map +1 -1
  105. package/version.d.cts +1 -1
  106. package/version.d.ts +1 -1
  107. package/version.js +1 -1
  108. package/version.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"validation.cjs","names":["z","SandboxValidationError","milliseconds: number | undefined","isTemporalDuration"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import ms, { type StringValue } from \"ms\";\nimport { z } from \"zod/v3\";\n\nimport { isTemporalDuration } from \"../../helpers/temporal.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ resources: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\n .superRefine((process, ctx) => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict(),\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n) => normalizeSandboxListOptions(options);\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n z.object({}).strict(),\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number | undefined;\n if (typeof duration === \"number\") {\n milliseconds = duration;\n } else if (typeof duration === \"string\") {\n milliseconds = ms(duration as StringValue);\n } else if (isTemporalDuration(duration)) {\n if (duration.years || duration.months || duration.weeks) {\n throw new SandboxValidationError(\n `${context} cannot contain calendar years, months, or weeks`,\n );\n }\n milliseconds = duration.total({ unit: \"milliseconds\" });\n }\n if (\n typeof milliseconds !== \"number\" ||\n !Number.isFinite(milliseconds) ||\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0\n ) {\n throw new SandboxValidationError(\n `${context} must be a positive, whole number of milliseconds`,\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.cjs","names":["z","SandboxValidationError","milliseconds: number | undefined","isTemporalDuration"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import ms, { type StringValue } from \"ms\";\nimport { z } from \"zod/v3\";\n\nimport { isTemporalDuration } from \"../../helpers/temporal.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema.optional(),\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ name: true, resources: true, error: true })\n .extend({\n // Unnamed snapshots may omit the name, send null, or send \"\".\n name: z.union([z.literal(\"\"), sandboxNameSchema]).nullish(),\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\n .superRefine((process, ctx) => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { name, error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(name && { name }),\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst sandboxListOptionsSchema = z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict();\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n sandboxListOptionsSchema,\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const sandboxSnapshotCreateOptionsSchema = z\n .object({ name: sandboxNameSchema.optional() })\n .strict();\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n): Required<Pick<SandboxSnapshotListOptions, \"limit\">> &\n Pick<SandboxSnapshotListOptions, \"cursor\" | \"name\"> => {\n const { name, ...list } = parseWithSchema(\n sandboxListOptionsSchema\n .extend({ name: sandboxNameSchema.optional() })\n .strict(),\n options,\n \"sandbox snapshot list options\",\n );\n\n return {\n ...normalizeSandboxListOptions(list),\n ...(name !== undefined && { name }),\n };\n};\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n sandboxSnapshotCreateOptionsSchema,\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number | undefined;\n if (typeof duration === \"number\") {\n milliseconds = duration;\n } else if (typeof duration === \"string\") {\n milliseconds = ms(duration as StringValue);\n } else if (isTemporalDuration(duration)) {\n if (duration.years || duration.months || duration.weeks) {\n throw new SandboxValidationError(\n `${context} cannot contain calendar years, months, or weeks`,\n );\n }\n milliseconds = duration.total({ unit: \"milliseconds\" });\n }\n if (\n typeof milliseconds !== \"number\" ||\n !Number.isFinite(milliseconds) ||\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0\n ) {\n throw new SandboxValidationError(\n `${context} must be a positive, whole number of milliseconds`,\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
@@ -132,6 +132,7 @@ const sandboxSnapshotStatusSchema = z.enum([
132
132
  ]);
133
133
  const sandboxSnapshotResourceBaseSchema = z.object({
134
134
  id: canonicalUuidSchema,
135
+ name: sandboxNameSchema.optional(),
135
136
  sourceImageId: z.string().min(1),
136
137
  status: sandboxSnapshotStatusSchema,
137
138
  compatibilityId: z.string().min(1).optional(),
@@ -158,9 +159,11 @@ const validateSandboxSnapshotResource = (snapshot, ctx) => {
158
159
  };
159
160
  const sandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema.superRefine(validateSandboxSnapshotResource);
160
161
  const wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema.omit({
162
+ name: true,
161
163
  resources: true,
162
164
  error: true
163
165
  }).extend({
166
+ name: z.union([z.literal(""), sandboxNameSchema]).nullish(),
164
167
  resources: sandboxResourcesSchema.strip(),
165
168
  memoryPackCount: wireUint32Schema,
166
169
  diskPackCount: wireUint32Schema,
@@ -271,11 +274,12 @@ const sandboxProcessRefFromResource = (sandboxId, value) => parseWithSchema(sand
271
274
  ...parseWithSchema(wireSandboxProcessResourceSchema, value, "sandbox process resource")
272
275
  }, "sandbox process reference");
273
276
  const sandboxSnapshotRefFromResource = (value) => {
274
- const { error, ...base } = parseWithSchema(wireSandboxSnapshotResourceSchema, value, "sandbox snapshot resource");
277
+ const { name, error, ...base } = parseWithSchema(wireSandboxSnapshotResourceSchema, value, "sandbox snapshot resource");
275
278
  return {
276
279
  kind: "inngest/sandbox.snapshot",
277
280
  version: 1,
278
281
  ...base,
282
+ ...name && { name },
279
283
  ...error != null && { error }
280
284
  };
281
285
  };
@@ -315,19 +319,27 @@ const normalizeSandboxCreateOptions = (options) => {
315
319
  const normalizeSandboxWaitUntilRunningOptions = (options) => {
316
320
  return { timeoutMs: normalizeDurationMs(parseWithSchema(z.object({ timeout: z.unknown() }).strict(), options, "sandbox waitUntilRunning options").timeout, maxSandboxRunningTimeoutMs, "timeout") };
317
321
  };
322
+ const sandboxListOptionsSchema = z.object({
323
+ cursor: z.string().min(1).optional(),
324
+ limit: z.number().int().min(1).max(250).optional()
325
+ }).strict();
318
326
  const normalizeSandboxListOptions = (options = {}) => {
319
- const parsed = parseWithSchema(z.object({
320
- cursor: z.string().min(1).optional(),
321
- limit: z.number().int().min(1).max(250).optional()
322
- }).strict(), options, "sandbox list options");
327
+ const parsed = parseWithSchema(sandboxListOptionsSchema, options, "sandbox list options");
323
328
  return {
324
329
  ...parsed,
325
330
  limit: parsed.limit ?? 50
326
331
  };
327
332
  };
328
333
  const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;
329
- const normalizeSandboxSnapshotListOptions = (options = {}) => normalizeSandboxListOptions(options);
330
- const normalizeSandboxSnapshotCreateOptions = (options = {}) => parseWithSchema(z.object({}).strict(), options, "sandbox snapshot create options");
334
+ const sandboxSnapshotCreateOptionsSchema = z.object({ name: sandboxNameSchema.optional() }).strict();
335
+ const normalizeSandboxSnapshotListOptions = (options = {}) => {
336
+ const { name, ...list } = parseWithSchema(sandboxListOptionsSchema.extend({ name: sandboxNameSchema.optional() }).strict(), options, "sandbox snapshot list options");
337
+ return {
338
+ ...normalizeSandboxListOptions(list),
339
+ ...name !== void 0 && { name }
340
+ };
341
+ };
342
+ const normalizeSandboxSnapshotCreateOptions = (options = {}) => parseWithSchema(sandboxSnapshotCreateOptionsSchema, options, "sandbox snapshot create options");
331
343
  const normalizeSandboxSnapshotWaitOptions = (options) => {
332
344
  return { timeoutMs: normalizeDurationMs(parseWithSchema(z.object({ timeout: z.unknown() }).strict(), options, "sandbox snapshot waitUntilReady options").timeout, maxSandboxSnapshotWaitTimeoutMs, "timeout") };
333
345
  };
@@ -455,5 +467,5 @@ const decodeOutputChunk = (value) => {
455
467
  };
456
468
 
457
469
  //#endregion
458
- export { canonicalUuidSchema, decodeBase64, decodeOutputChunk, decodeUtf8, encodeBase64, normalizeFileDownloadOptions, normalizeFileUploadOptions, normalizeSandboxCommandOptions, normalizeSandboxCreateOptions, normalizeSandboxListOptions, normalizeSandboxProcessListOptions, normalizeSandboxProcessOutputOptions, normalizeSandboxProcessSignalOptions, normalizeSandboxProcessStartOptions, normalizeSandboxProcessWaitOptions, normalizeSandboxSnapshotCreateOptions, normalizeSandboxSnapshotListOptions, normalizeSandboxSnapshotWaitOptions, normalizeSandboxWaitUntilRunningOptions, parseWithSchema, restOutputChunkSchema, sandboxNameSchema, sandboxProcessRefFromResource, sandboxProcessRefSchema, sandboxRefFromResource, sandboxRefSchema, sandboxSecretNameSchema, sandboxSnapshotRefFromResource, sandboxSnapshotRefSchema, wireOutputChunkSchema };
470
+ export { canonicalUuidSchema, decodeBase64, decodeOutputChunk, decodeUtf8, encodeBase64, normalizeFileDownloadOptions, normalizeFileUploadOptions, normalizeSandboxCommandOptions, normalizeSandboxCreateOptions, normalizeSandboxListOptions, normalizeSandboxProcessListOptions, normalizeSandboxProcessOutputOptions, normalizeSandboxProcessSignalOptions, normalizeSandboxProcessStartOptions, normalizeSandboxProcessWaitOptions, normalizeSandboxSnapshotCreateOptions, normalizeSandboxSnapshotListOptions, normalizeSandboxSnapshotWaitOptions, normalizeSandboxWaitUntilRunningOptions, parseWithSchema, restOutputChunkSchema, sandboxNameSchema, sandboxProcessRefFromResource, sandboxProcessRefSchema, sandboxRefFromResource, sandboxRefSchema, sandboxSecretNameSchema, sandboxSnapshotCreateOptionsSchema, sandboxSnapshotRefFromResource, sandboxSnapshotRefSchema, wireOutputChunkSchema };
459
471
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":["milliseconds: number | undefined"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import ms, { type StringValue } from \"ms\";\nimport { z } from \"zod/v3\";\n\nimport { isTemporalDuration } from \"../../helpers/temporal.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ resources: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\n .superRefine((process, ctx) => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict(),\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n) => normalizeSandboxListOptions(options);\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n z.object({}).strict(),\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number | undefined;\n if (typeof duration === \"number\") {\n milliseconds = duration;\n } else if (typeof duration === \"string\") {\n milliseconds = ms(duration as StringValue);\n } else if (isTemporalDuration(duration)) {\n if (duration.years || duration.months || duration.weeks) {\n throw new SandboxValidationError(\n `${context} cannot contain calendar years, months, or weeks`,\n );\n }\n milliseconds = duration.total({ unit: \"milliseconds\" });\n }\n if (\n typeof milliseconds !== \"number\" ||\n !Number.isFinite(milliseconds) ||\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0\n ) {\n throw new SandboxValidationError(\n `${context} must be a positive, whole number of milliseconds`,\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","names":["milliseconds: number | undefined"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import ms, { type StringValue } from \"ms\";\nimport { z } from \"zod/v3\";\n\nimport { isTemporalDuration } from \"../../helpers/temporal.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema.optional(),\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ name: true, resources: true, error: true })\n .extend({\n // Unnamed snapshots may omit the name, send null, or send \"\".\n name: z.union([z.literal(\"\"), sandboxNameSchema]).nullish(),\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\n .superRefine((process, ctx) => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n path: [\"exitCode\"],\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { name, error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(name && { name }),\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst sandboxListOptionsSchema = z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict();\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n sandboxListOptionsSchema,\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const sandboxSnapshotCreateOptionsSchema = z\n .object({ name: sandboxNameSchema.optional() })\n .strict();\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n): Required<Pick<SandboxSnapshotListOptions, \"limit\">> &\n Pick<SandboxSnapshotListOptions, \"cursor\" | \"name\"> => {\n const { name, ...list } = parseWithSchema(\n sandboxListOptionsSchema\n .extend({ name: sandboxNameSchema.optional() })\n .strict(),\n options,\n \"sandbox snapshot list options\",\n );\n\n return {\n ...normalizeSandboxListOptions(list),\n ...(name !== undefined && { name }),\n };\n};\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n sandboxSnapshotCreateOptionsSchema,\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number | undefined;\n if (typeof duration === \"number\") {\n milliseconds = duration;\n } else if (typeof duration === \"string\") {\n milliseconds = ms(duration as StringValue);\n } else if (isTemporalDuration(duration)) {\n if (duration.years || duration.months || duration.weeks) {\n throw new SandboxValidationError(\n `${context} cannot contain calendar years, months, or weeks`,\n );\n }\n milliseconds = duration.total({ unit: \"milliseconds\" });\n }\n if (\n typeof milliseconds !== \"number\" ||\n !Number.isFinite(milliseconds) ||\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0\n ) {\n throw new SandboxValidationError(\n `${context} must be a positive, whole number of milliseconds`,\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
package/experimental.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  const require_als = require('./components/execution/als.cjs');
2
2
  const require_InngestMetadata = require('./components/InngestMetadata.cjs');
3
3
  const require_types = require('./components/sandbox/types.cjs');
4
+ const require_InngestScore = require('./components/InngestScore.cjs');
4
5
  const require_protocol = require('./components/sandbox/protocol.cjs');
5
6
  const require_middleware = require('./components/sandbox/middleware.cjs');
6
- const require_InngestScore = require('./components/InngestScore.cjs');
7
7
  const require_DeferredFunction = require('./components/DeferredFunction.cjs');
8
8
  const require_processor = require('./components/execution/otel/processor.cjs');
9
9
  const require_middleware$1 = require('./components/execution/otel/middleware.cjs');
package/experimental.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { getAsyncCtx, runWithAsyncCtx } from "./components/execution/als.js";
2
2
  import { metadataMiddleware } from "./components/InngestMetadata.js";
3
3
  import { SandboxError, SandboxValidationError } from "./components/sandbox/types.js";
4
+ import { scoreMiddleware } from "./components/InngestScore.js";
4
5
  import { getSandboxError } from "./components/sandbox/protocol.js";
5
6
  import { sandboxMiddleware } from "./components/sandbox/middleware.js";
6
- import { scoreMiddleware } from "./components/InngestScore.js";
7
7
  import { DeferredFunction, createDefer } from "./components/DeferredFunction.js";
8
8
  import { PublicInngestSpanProcessor } from "./components/execution/otel/processor.js";
9
9
  import { extendedTracesMiddleware } from "./components/execution/otel/middleware.js";
package/index.cjs CHANGED
@@ -7,10 +7,10 @@ const require_strings = require('./helpers/strings.cjs');
7
7
  const require_logger = require('./middleware/logger.cjs');
8
8
  const require_triggers = require('./components/triggers/triggers.cjs');
9
9
  const require_middleware = require('./components/middleware/middleware.cjs');
10
- const require_StepError = require('./components/StepError.cjs');
11
10
  const require_Fetch = require('./components/Fetch.cjs');
12
11
  const require_InngestFunctionReference = require('./components/InngestFunctionReference.cjs');
13
12
  const require_InngestStepTools = require('./components/InngestStepTools.cjs');
13
+ const require_StepError = require('./components/StepError.cjs');
14
14
  const require_Inngest = require('./components/Inngest.cjs');
15
15
  const require_RetryAfterError = require('./components/RetryAfterError.cjs');
16
16
  const require_InngestCommHandler = require('./components/InngestCommHandler.cjs');
package/index.js CHANGED
@@ -7,10 +7,10 @@ import { slugify } from "./helpers/strings.js";
7
7
  import { ConsoleLogger, ProxyLogger } from "./middleware/logger.js";
8
8
  import { EventType, cron, eventType, invoke, staticSchema } from "./components/triggers/triggers.js";
9
9
  import { Middleware } from "./components/middleware/middleware.js";
10
- import { StepError } from "./components/StepError.js";
11
10
  import { fetch } from "./components/Fetch.js";
12
11
  import { referenceFunction } from "./components/InngestFunctionReference.js";
13
12
  import { group, step } from "./components/InngestStepTools.js";
13
+ import { StepError } from "./components/StepError.js";
14
14
  import { Inngest } from "./components/Inngest.js";
15
15
  import { RetryAfterError } from "./components/RetryAfterError.js";
16
16
  import { InngestCommHandler } from "./components/InngestCommHandler.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inngest",
3
- "version": "4.22.0",
3
+ "version": "4.23.0",
4
4
  "description": "Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.",
5
5
  "main": "./index.cjs",
6
6
  "module": "./index.js",
package/react.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Realtime } from "./components/realtime/types.cjs";
2
- import { Inngest } from "./components/Inngest.cjs";
3
2
  import { getClientSubscriptionToken } from "./components/realtime/subscribe/index.cjs";
3
+ import { Inngest } from "./components/Inngest.cjs";
4
4
 
5
5
  //#region src/react.d.ts
6
6
  type UseRealtimeConnectionStatus = "idle" | "connecting" | "open" | "paused" | "closed" | "error";
package/react.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Realtime } from "./components/realtime/types.js";
2
- import { Inngest } from "./components/Inngest.js";
3
2
  import { getClientSubscriptionToken } from "./components/realtime/subscribe/index.js";
3
+ import { Inngest } from "./components/Inngest.js";
4
4
 
5
5
  //#region src/react.d.ts
6
6
  type UseRealtimeConnectionStatus = "idle" | "connecting" | "open" | "paused" | "closed" | "error";