From 93ddbaa6b1f33c46ce9ec3f78fc31e5945a12c14 Mon Sep 17 00:00:00 2001 From: Andy Waller <76787794+AndyW22@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:56:55 +0000 Subject: [PATCH] add name + snapshotOnShutdown params --- .../src/api-client/api-client.ts | 6 +++++- packages/vercel-sandbox/src/sandbox.ts | 21 ++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/vercel-sandbox/src/api-client/api-client.ts b/packages/vercel-sandbox/src/api-client/api-client.ts index 700ddbd..21c343c 100644 --- a/packages/vercel-sandbox/src/api-client/api-client.ts +++ b/packages/vercel-sandbox/src/api-client/api-client.ts @@ -148,6 +148,7 @@ export class APIClient extends BaseClient { async createSandbox( params: WithPrivate<{ + name?: string; ports?: number[]; projectId: string; source?: @@ -163,6 +164,7 @@ export class APIClient extends BaseClient { | { type: "snapshot"; snapshotId: string }; timeout?: number; resources?: { vcpus: number }; + snapshotOnShutdown?: boolean; runtime?: RUNTIMES | (string & {}); networkPolicy?: NetworkPolicy; signal?: AbortSignal; @@ -171,7 +173,7 @@ export class APIClient extends BaseClient { const privateParams = getPrivateParams(params); return parseOrThrow( SandboxAndRoutesResponse, - await this.request("/v1/sandboxes", { + await this.request("/v1/sandboxes/named", { method: "POST", body: JSON.stringify({ projectId: params.projectId, @@ -180,6 +182,8 @@ export class APIClient extends BaseClient { timeout: params.timeout, resources: params.resources, runtime: params.runtime, + name: params.name, + snapshotOnShutdown: params.snapshotOnShutdown, networkPolicy: params.networkPolicy ? toAPINetworkPolicy(params.networkPolicy) : undefined, diff --git a/packages/vercel-sandbox/src/sandbox.ts b/packages/vercel-sandbox/src/sandbox.ts index 75e31a8..4b8f215 100644 --- a/packages/vercel-sandbox/src/sandbox.ts +++ b/packages/vercel-sandbox/src/sandbox.ts @@ -13,9 +13,9 @@ import { RUNTIMES } from "./constants"; import { Snapshot } from "./snapshot"; import { consumeReadable } from "./utils/consume-readable"; import { - type NetworkPolicy, - type NetworkPolicyRule, - type NetworkTransformer, + type NetworkPolicy, + type NetworkPolicyRule, + type NetworkTransformer, } from "./network-policy"; import { convertSandbox, type ConvertedSandbox } from "./utils/convert-sandbox"; @@ -23,6 +23,10 @@ export type { NetworkPolicy, NetworkPolicyRule, NetworkTransformer }; /** @inline */ export interface BaseCreateSandboxParams { + /** + * The name of the sandbox. If omitted, a random name will be generated. + */ + name?: string; /** * The source of the sandbox. * @@ -81,6 +85,11 @@ export interface BaseCreateSandboxParams { * An AbortSignal to cancel sandbox creation. */ signal?: AbortSignal; + + /** + * Whether to enable snapshots on shutdown. Defaults to true. + */ + snapshotOnShutdown?: boolean; } export type CreateSandboxParams = @@ -265,6 +274,8 @@ export class Sandbox { runtime: params && "runtime" in params ? params?.runtime : undefined, networkPolicy: params?.networkPolicy, signal: params?.signal, + name: params?.name, + snapshotOnShutdown: params?.snapshotOnShutdown, ...privateParams, }); @@ -423,7 +434,7 @@ export class Sandbox { } })(); } - } + }; if (wait) { const commandStream = await this.client.runCommand({ @@ -589,7 +600,7 @@ export class Sandbox { }); return dstPath; } finally { - stream.destroy() + stream.destroy(); } }