@solarisdk/e2b-compat 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPAT.md +88 -0
- package/LICENSE +17 -0
- package/LICENSE-E2B +9 -0
- package/NOTICE +13 -0
- package/README.md +67 -2
- package/dist/box.d.ts +28 -0
- package/dist/box.d.ts.map +1 -0
- package/dist/box.js +102 -0
- package/dist/box.js.map +1 -0
- package/dist/code-interpreter.d.ts +157 -0
- package/dist/code-interpreter.d.ts.map +1 -0
- package/dist/code-interpreter.js +357 -0
- package/dist/code-interpreter.js.map +1 -0
- package/dist/commands.d.ts +141 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +302 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +92 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +79 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +159 -0
- package/dist/errors.js.map +1 -0
- package/dist/filesystem.d.ts +99 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +245 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/sandbox.d.ts +190 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +431 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/template.d.ts +187 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +360 -0
- package/dist/template.js.map +1 -0
- package/package.json +52 -4
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type { Sandbox as CoreSandbox } from "@solarisdk/core";
|
|
2
|
+
import { Box } from "./box.js";
|
|
3
|
+
import { Commands, Pty } from "./commands.js";
|
|
4
|
+
import { type Conn, type ConnectionOpts } from "./config.js";
|
|
5
|
+
import { Filesystem } from "./filesystem.js";
|
|
6
|
+
export type SnapshotMode = "full" | "filesystem";
|
|
7
|
+
export type SandboxOnTimeout = "pause" | "kill" | {
|
|
8
|
+
action: "pause";
|
|
9
|
+
mode?: SnapshotMode;
|
|
10
|
+
keepMemory?: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
action: "kill";
|
|
13
|
+
};
|
|
14
|
+
export type SandboxLifecycle = {
|
|
15
|
+
onTimeout: SandboxOnTimeout;
|
|
16
|
+
autoResume?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type SandboxState = "running" | "paused";
|
|
19
|
+
export type SandboxOnResume = "restore" | "reboot";
|
|
20
|
+
export interface SandboxApiOpts extends ConnectionOpts {
|
|
21
|
+
}
|
|
22
|
+
export interface SandboxOpts extends ConnectionOpts {
|
|
23
|
+
template?: string;
|
|
24
|
+
metadata?: Record<string, string>;
|
|
25
|
+
envs?: Record<string, string>;
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
secure?: boolean;
|
|
28
|
+
allowInternetAccess?: boolean;
|
|
29
|
+
mcp?: unknown;
|
|
30
|
+
network?: unknown;
|
|
31
|
+
iam?: unknown;
|
|
32
|
+
/** Mount path -> volume id (`vol_…`) or volume name. */
|
|
33
|
+
volumeMounts?: Record<string, unknown>;
|
|
34
|
+
sandboxUrl?: string;
|
|
35
|
+
lifecycle?: SandboxLifecycle;
|
|
36
|
+
}
|
|
37
|
+
export type SandboxConnectOpts = ConnectionOpts & {
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
onResume?: SandboxOnResume;
|
|
40
|
+
};
|
|
41
|
+
export interface SandboxPauseOpts extends SandboxApiOpts {
|
|
42
|
+
mode?: SnapshotMode;
|
|
43
|
+
keepMemory?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface SandboxForkOpts extends ConnectionOpts {
|
|
46
|
+
count?: number;
|
|
47
|
+
timeoutMs?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface SandboxListOpts extends ConnectionOpts {
|
|
50
|
+
query?: {
|
|
51
|
+
metadata?: Record<string, string>;
|
|
52
|
+
state?: SandboxState[];
|
|
53
|
+
startedAfter?: Date;
|
|
54
|
+
template?: string;
|
|
55
|
+
};
|
|
56
|
+
order?: "asc" | "desc";
|
|
57
|
+
limit?: number;
|
|
58
|
+
nextToken?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface SandboxMetricsOpts extends SandboxApiOpts {
|
|
61
|
+
start?: Date;
|
|
62
|
+
end?: Date;
|
|
63
|
+
}
|
|
64
|
+
export interface SnapshotListOpts extends ConnectionOpts {
|
|
65
|
+
sandboxId?: string;
|
|
66
|
+
name?: string;
|
|
67
|
+
limit?: number;
|
|
68
|
+
nextToken?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface CreateSnapshotOpts extends SandboxApiOpts {
|
|
71
|
+
name?: string;
|
|
72
|
+
mode?: SnapshotMode;
|
|
73
|
+
}
|
|
74
|
+
export interface SandboxUrlOpts {
|
|
75
|
+
user?: string;
|
|
76
|
+
useSignatureExpiration?: number;
|
|
77
|
+
}
|
|
78
|
+
export interface SnapshotInfo {
|
|
79
|
+
snapshotId: string;
|
|
80
|
+
names: string[];
|
|
81
|
+
}
|
|
82
|
+
export interface SandboxInfo {
|
|
83
|
+
sandboxId: string;
|
|
84
|
+
/** Solari does not report the template of a running sandbox; empty. */
|
|
85
|
+
templateId: string;
|
|
86
|
+
name?: string;
|
|
87
|
+
metadata: Record<string, string>;
|
|
88
|
+
startedAt: Date;
|
|
89
|
+
endAt: Date;
|
|
90
|
+
state: SandboxState;
|
|
91
|
+
cpuCount: number;
|
|
92
|
+
memoryMB: number;
|
|
93
|
+
envdVersion: string;
|
|
94
|
+
allowInternetAccess?: boolean;
|
|
95
|
+
sandboxDomain?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface SandboxMetrics {
|
|
98
|
+
timestamp: Date;
|
|
99
|
+
cpuUsedPct: number;
|
|
100
|
+
cpuCount: number;
|
|
101
|
+
memUsed: number;
|
|
102
|
+
memTotal: number;
|
|
103
|
+
memCache: number;
|
|
104
|
+
diskUsed: number;
|
|
105
|
+
diskTotal: number;
|
|
106
|
+
}
|
|
107
|
+
declare abstract class Paginator<T> {
|
|
108
|
+
protected readonly limit?: number | undefined;
|
|
109
|
+
protected _hasNext: boolean;
|
|
110
|
+
protected _nextToken: string | undefined;
|
|
111
|
+
constructor(limit?: number | undefined, nextToken?: string);
|
|
112
|
+
get hasNext(): boolean;
|
|
113
|
+
get nextToken(): string | undefined;
|
|
114
|
+
abstract nextItems(opts?: SandboxApiOpts): Promise<T[]>;
|
|
115
|
+
}
|
|
116
|
+
export declare class SandboxPaginator extends Paginator<SandboxInfo> {
|
|
117
|
+
private readonly o;
|
|
118
|
+
constructor(o?: SandboxListOpts);
|
|
119
|
+
nextItems(opts?: SandboxApiOpts): Promise<SandboxInfo[]>;
|
|
120
|
+
}
|
|
121
|
+
export declare class SnapshotPaginator extends Paginator<SnapshotInfo> {
|
|
122
|
+
private readonly o;
|
|
123
|
+
constructor(o?: SnapshotListOpts);
|
|
124
|
+
nextItems(opts?: SandboxApiOpts): Promise<SnapshotInfo[]>;
|
|
125
|
+
}
|
|
126
|
+
type SandboxInit = {
|
|
127
|
+
conn: Conn;
|
|
128
|
+
id: string;
|
|
129
|
+
core?: CoreSandbox;
|
|
130
|
+
domain?: string;
|
|
131
|
+
};
|
|
132
|
+
export declare class Sandbox {
|
|
133
|
+
protected static readonly defaultTemplate: string;
|
|
134
|
+
readonly sandboxId: string;
|
|
135
|
+
readonly sandboxDomain: string;
|
|
136
|
+
readonly trafficAccessToken?: string;
|
|
137
|
+
readonly files: Filesystem;
|
|
138
|
+
readonly commands: Commands;
|
|
139
|
+
readonly pty: Pty;
|
|
140
|
+
/** E2B's git helper is deprecated upstream (use `commands.run('git …')`). */
|
|
141
|
+
readonly git: Record<string, (...a: unknown[]) => never>;
|
|
142
|
+
/** @internal */
|
|
143
|
+
readonly box: Box;
|
|
144
|
+
constructor(init: SandboxInit);
|
|
145
|
+
static create<S extends typeof Sandbox>(this: S, opts?: SandboxOpts): Promise<InstanceType<S>>;
|
|
146
|
+
static create<S extends typeof Sandbox>(this: S, template: string, opts?: SandboxOpts): Promise<InstanceType<S>>;
|
|
147
|
+
/** @internal Which Solari template id a name resolves to. Overridden by the code interpreter. */
|
|
148
|
+
protected static resolveTemplate(conn: Conn, template: string): Promise<string>;
|
|
149
|
+
static connect<S extends typeof Sandbox>(this: S, sandboxId: string, opts?: SandboxConnectOpts): Promise<InstanceType<S>>;
|
|
150
|
+
connect(opts?: SandboxConnectOpts): Promise<this>;
|
|
151
|
+
static list(opts?: SandboxListOpts): SandboxPaginator;
|
|
152
|
+
static kill(sandboxId: string, opts?: SandboxApiOpts): Promise<boolean>;
|
|
153
|
+
kill(opts?: SandboxApiOpts): Promise<boolean>;
|
|
154
|
+
static getInfo(sandboxId: string, opts?: SandboxApiOpts): Promise<SandboxInfo>;
|
|
155
|
+
static getFullInfo(sandboxId: string, opts?: SandboxApiOpts): Promise<SandboxInfo>;
|
|
156
|
+
getInfo(_opts?: Pick<SandboxOpts, "requestTimeoutMs" | "signal">): Promise<SandboxInfo>;
|
|
157
|
+
isRunning(_opts?: Pick<ConnectionOpts, "requestTimeoutMs" | "signal">): Promise<boolean>;
|
|
158
|
+
static setTimeout(sandboxId: string, timeoutMs: number, opts?: SandboxApiOpts): Promise<void>;
|
|
159
|
+
setTimeout(timeoutMs: number, _opts?: Pick<SandboxOpts, "requestTimeoutMs" | "signal">): Promise<void>;
|
|
160
|
+
static getMetrics(sandboxId: string, opts?: SandboxMetricsOpts): Promise<SandboxMetrics[]>;
|
|
161
|
+
getMetrics(opts?: SandboxMetricsOpts): Promise<SandboxMetrics[]>;
|
|
162
|
+
static pause(sandboxId: string, opts?: SandboxPauseOpts): Promise<boolean>;
|
|
163
|
+
pause(opts?: SandboxPauseOpts): Promise<boolean>;
|
|
164
|
+
betaPause(opts?: SandboxPauseOpts): Promise<boolean>;
|
|
165
|
+
static betaPause(sandboxId: string, opts?: SandboxPauseOpts): Promise<boolean>;
|
|
166
|
+
static createSnapshot(sandboxId: string, opts?: CreateSnapshotOpts): Promise<SnapshotInfo>;
|
|
167
|
+
createSnapshot(opts?: CreateSnapshotOpts): Promise<SnapshotInfo>;
|
|
168
|
+
static listSnapshots(opts?: SnapshotListOpts): SnapshotPaginator;
|
|
169
|
+
listSnapshots(opts?: Omit<SnapshotListOpts, "sandboxId">): SnapshotPaginator;
|
|
170
|
+
static deleteSnapshot(snapshotId: string, opts?: SandboxApiOpts): Promise<boolean>;
|
|
171
|
+
/** Copy a running sandbox: checkpoint it, then boot `count` new sandboxes from the checkpoint. */
|
|
172
|
+
static fork<S extends typeof Sandbox>(this: S, sandboxId: string, opts?: SandboxForkOpts): Promise<Array<InstanceType<S> | Error>>;
|
|
173
|
+
fork(opts?: SandboxForkOpts): Promise<Array<this | Error>>;
|
|
174
|
+
/** E2B returns the host synchronously; Solari mints preview URLs on the gateway. Use {@link getPreviewUrl}. */
|
|
175
|
+
getHost(_port: number): string;
|
|
176
|
+
/** Solari extension: the public URL (and access token, if the port is protected) for a port in the sandbox. */
|
|
177
|
+
getPreviewUrl(port: number): Promise<{
|
|
178
|
+
url: string;
|
|
179
|
+
token?: string;
|
|
180
|
+
}>;
|
|
181
|
+
updateNetwork(_network: unknown, _opts?: unknown): Promise<void>;
|
|
182
|
+
static updateNetwork(_sandboxId: string, _network: unknown, _opts?: unknown): Promise<void>;
|
|
183
|
+
uploadUrl(path?: string, opts?: SandboxUrlOpts): Promise<string>;
|
|
184
|
+
downloadUrl(path: string, opts?: SandboxUrlOpts): Promise<string>;
|
|
185
|
+
getMcpUrl(): string;
|
|
186
|
+
getMcpToken(): Promise<string | undefined>;
|
|
187
|
+
private connOpts;
|
|
188
|
+
}
|
|
189
|
+
export {};
|
|
190
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|
package/dist/sandbox.js
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
// E2B `Sandbox`: static create/connect/list/kill/pause/..., plus the instance surface (commands, files, pty).
|
|
2
|
+
import { Box } from "./box.js";
|
|
3
|
+
import { Commands, Pty } from "./commands.js";
|
|
4
|
+
import { resolveConn } from "./config.js";
|
|
5
|
+
import { InvalidArgumentError, SandboxError, SandboxNotFoundError, SolariCompatUnsupported, TemplateError, translateError, unsupportedNamespace, } from "./errors.js";
|
|
6
|
+
import { Filesystem } from "./filesystem.js";
|
|
7
|
+
import { resolveTemplateId } from "./template.js";
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 300_000;
|
|
9
|
+
const GIB = 1024 ** 3;
|
|
10
|
+
class Paginator {
|
|
11
|
+
limit;
|
|
12
|
+
_hasNext = true;
|
|
13
|
+
_nextToken;
|
|
14
|
+
constructor(limit, nextToken) {
|
|
15
|
+
this.limit = limit;
|
|
16
|
+
this._nextToken = nextToken;
|
|
17
|
+
}
|
|
18
|
+
get hasNext() {
|
|
19
|
+
return this._hasNext;
|
|
20
|
+
}
|
|
21
|
+
get nextToken() {
|
|
22
|
+
return this._nextToken;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class SandboxPaginator extends Paginator {
|
|
26
|
+
o;
|
|
27
|
+
constructor(o = {}) {
|
|
28
|
+
super(o.limit, o.nextToken);
|
|
29
|
+
this.o = o;
|
|
30
|
+
if (o.query?.startedAfter)
|
|
31
|
+
throw new SolariCompatUnsupported("list query.startedAfter", "Solari does not report sandbox start times to filter on");
|
|
32
|
+
if (o.query?.template)
|
|
33
|
+
throw new SolariCompatUnsupported("list query.template", "Solari does not report a sandbox's template to filter on");
|
|
34
|
+
}
|
|
35
|
+
async nextItems(opts) {
|
|
36
|
+
if (!this._hasNext)
|
|
37
|
+
throw new SandboxError("No more items to fetch");
|
|
38
|
+
const conn = resolveConn({ ...this.o, ...opts });
|
|
39
|
+
const states = this.o.query?.state;
|
|
40
|
+
const only = states && states.length === 1 ? states[0] : undefined;
|
|
41
|
+
try {
|
|
42
|
+
const page = await conn.solari.list({
|
|
43
|
+
...(this.o.query?.metadata ? { metadata: this.o.query.metadata } : {}),
|
|
44
|
+
...(only ? { state: only } : {}),
|
|
45
|
+
limit: this.limit ?? 100,
|
|
46
|
+
...(this._nextToken ? { cursor: this._nextToken } : {}),
|
|
47
|
+
});
|
|
48
|
+
this._nextToken = page.nextCursor;
|
|
49
|
+
this._hasNext = Boolean(page.nextCursor);
|
|
50
|
+
let items = page.sandboxes.map(toInfo);
|
|
51
|
+
if (states && states.length > 0)
|
|
52
|
+
items = items.filter((i) => states.includes(i.state));
|
|
53
|
+
else
|
|
54
|
+
items = items.filter((i) => i.state === "running" || i.state === "paused");
|
|
55
|
+
if (this.o.order === "asc")
|
|
56
|
+
items = items.reverse();
|
|
57
|
+
return items;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
throw translateError(e);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class SnapshotPaginator extends Paginator {
|
|
65
|
+
o;
|
|
66
|
+
constructor(o = {}) {
|
|
67
|
+
super(o.limit, o.nextToken);
|
|
68
|
+
this.o = o;
|
|
69
|
+
}
|
|
70
|
+
async nextItems(opts) {
|
|
71
|
+
if (!this._hasNext)
|
|
72
|
+
throw new SandboxError("No more items to fetch");
|
|
73
|
+
const conn = resolveConn({ ...this.o, ...opts });
|
|
74
|
+
const q = new URLSearchParams({ kind: "sandbox" });
|
|
75
|
+
if (this.o.sandboxId)
|
|
76
|
+
q.set("sandboxId", this.o.sandboxId);
|
|
77
|
+
// The gateway has no name filter, so a name lookup reads a large page and filters here.
|
|
78
|
+
q.set("limit", String(this.limit ?? (this.o.name ? 1000 : 100)));
|
|
79
|
+
try {
|
|
80
|
+
const r = await conn.http.request("GET", `/snapshots?${q}`);
|
|
81
|
+
this._hasNext = false;
|
|
82
|
+
let items = r.snapshots.map((s) => ({ snapshotId: s.id, names: s.name ? [s.name] : [] }));
|
|
83
|
+
if (this.o.name)
|
|
84
|
+
items = items.filter((s) => s.names.includes(this.o.name));
|
|
85
|
+
return items;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
throw translateError(e);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function toInfo(v) {
|
|
93
|
+
const raw = v;
|
|
94
|
+
const end = new Date(v.expiresAt);
|
|
95
|
+
const started = raw.createdAt ?? raw.startedAt;
|
|
96
|
+
return {
|
|
97
|
+
sandboxId: v.sandboxId,
|
|
98
|
+
templateId: "",
|
|
99
|
+
...(raw.name ? { name: raw.name } : {}),
|
|
100
|
+
metadata: v.metadata ?? {},
|
|
101
|
+
startedAt: started ? new Date(started) : new Date(0),
|
|
102
|
+
endAt: end,
|
|
103
|
+
state: v.state === "paused" || v.state === "stopped" ? "paused" : "running",
|
|
104
|
+
cpuCount: v.cpu,
|
|
105
|
+
memoryMB: v.memMb,
|
|
106
|
+
envdVersion: "solari",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function lifecycleOf(l) {
|
|
110
|
+
if (!l)
|
|
111
|
+
return undefined;
|
|
112
|
+
const t = l.onTimeout;
|
|
113
|
+
const action = typeof t === "string" ? t : t.action;
|
|
114
|
+
return { onTimeout: action, ...(l.autoResume !== undefined ? { autoResume: l.autoResume } : {}) };
|
|
115
|
+
}
|
|
116
|
+
export class Sandbox {
|
|
117
|
+
static defaultTemplate = "base";
|
|
118
|
+
sandboxId;
|
|
119
|
+
sandboxDomain;
|
|
120
|
+
trafficAccessToken;
|
|
121
|
+
files;
|
|
122
|
+
commands;
|
|
123
|
+
pty;
|
|
124
|
+
/** E2B's git helper is deprecated upstream (use `commands.run('git …')`). */
|
|
125
|
+
git = unsupportedNamespace("git");
|
|
126
|
+
/** @internal */
|
|
127
|
+
box;
|
|
128
|
+
constructor(init) {
|
|
129
|
+
this.sandboxId = init.id;
|
|
130
|
+
this.sandboxDomain = init.domain ?? new URL(init.conn.baseUrl).host;
|
|
131
|
+
this.box = new Box(init.conn, init.id, init.core);
|
|
132
|
+
this.files = new Filesystem(this.box);
|
|
133
|
+
this.commands = new Commands(this.box);
|
|
134
|
+
this.pty = new Pty(this.box);
|
|
135
|
+
}
|
|
136
|
+
static async create(a, b) {
|
|
137
|
+
const opts = (typeof a === "string" ? b : a) ?? {};
|
|
138
|
+
const template = typeof a === "string" ? a : (opts.template ?? this.defaultTemplate);
|
|
139
|
+
if (opts.mcp)
|
|
140
|
+
throw new SolariCompatUnsupported("mcp", "the E2B MCP gateway has no Solari equivalent");
|
|
141
|
+
if (opts.network)
|
|
142
|
+
throw new SolariCompatUnsupported("network", "egress allow/deny rules are not available");
|
|
143
|
+
if (opts.iam)
|
|
144
|
+
throw new SolariCompatUnsupported("iam");
|
|
145
|
+
if (opts.allowInternetAccess === false)
|
|
146
|
+
throw new SolariCompatUnsupported("allowInternetAccess: false", "Solari sandboxes always have internet access");
|
|
147
|
+
const conn = resolveConn(opts);
|
|
148
|
+
const volumes = opts.volumeMounts ? await resolveVolumes(conn, opts.volumeMounts) : undefined;
|
|
149
|
+
try {
|
|
150
|
+
const templateId = await this.resolveTemplate(conn, template);
|
|
151
|
+
const lifecycle = lifecycleOf(opts.lifecycle);
|
|
152
|
+
const core = await conn.solari.create({
|
|
153
|
+
template: templateId,
|
|
154
|
+
...(opts.envs ? { envs: opts.envs } : {}),
|
|
155
|
+
...(opts.metadata ? { metadata: opts.metadata } : {}),
|
|
156
|
+
// E2B's timeout is a lifetime; Solari's is a rolling idle window (COMPAT.md).
|
|
157
|
+
idleTimeoutMs: opts.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
158
|
+
...(lifecycle ? { lifecycle } : {}),
|
|
159
|
+
...(volumes ? { volumes } : {}),
|
|
160
|
+
});
|
|
161
|
+
return new this({ conn, id: core.sandboxId, core });
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
throw translateError(e);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** @internal Which Solari template id a name resolves to. Overridden by the code interpreter. */
|
|
168
|
+
static resolveTemplate(conn, template) {
|
|
169
|
+
return resolveTemplateId(conn, template);
|
|
170
|
+
}
|
|
171
|
+
static async connect(sandboxId, opts = {}) {
|
|
172
|
+
const conn = resolveConn(opts);
|
|
173
|
+
const sbx = new this({ conn, id: sandboxId });
|
|
174
|
+
await sbx.connect(opts);
|
|
175
|
+
return sbx;
|
|
176
|
+
}
|
|
177
|
+
async connect(opts = {}) {
|
|
178
|
+
if (opts.onResume === "reboot")
|
|
179
|
+
throw new SolariCompatUnsupported("connect onResume: 'reboot'", "Solari resumes a paused sandbox from its memory snapshot");
|
|
180
|
+
const { conn } = this.box;
|
|
181
|
+
try {
|
|
182
|
+
const view = await conn.solari.get(this.sandboxId);
|
|
183
|
+
const core = await this.box.handle().catch(() => undefined);
|
|
184
|
+
if (view.state === "paused") {
|
|
185
|
+
const sb = core ?? (await conn.solari.connect(this.sandboxId));
|
|
186
|
+
await sb.resume();
|
|
187
|
+
this.box.drop();
|
|
188
|
+
}
|
|
189
|
+
else if (view.state === "stopped") {
|
|
190
|
+
const sb = core ?? (await conn.solari.connect(this.sandboxId));
|
|
191
|
+
await sb.start();
|
|
192
|
+
this.box.drop();
|
|
193
|
+
}
|
|
194
|
+
await this.box.handle();
|
|
195
|
+
if (opts.timeoutMs)
|
|
196
|
+
await this.setTimeout(opts.timeoutMs);
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
throw translateError(e, "sandbox");
|
|
200
|
+
}
|
|
201
|
+
return this;
|
|
202
|
+
}
|
|
203
|
+
static list(opts) {
|
|
204
|
+
return new SandboxPaginator(opts);
|
|
205
|
+
}
|
|
206
|
+
// --- single-sandbox operations (static by id, and instance) ---------------------------------------------------
|
|
207
|
+
static async kill(sandboxId, opts = {}) {
|
|
208
|
+
const conn = resolveConn(opts);
|
|
209
|
+
try {
|
|
210
|
+
// The gateway's DELETE is idempotent; E2B reports `false` for a sandbox that is already gone.
|
|
211
|
+
await conn.solari.get(sandboxId);
|
|
212
|
+
await conn.solari.kill(sandboxId);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
const t = translateError(e, "sandbox");
|
|
217
|
+
if (t instanceof SandboxNotFoundError)
|
|
218
|
+
return false;
|
|
219
|
+
throw t;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async kill(opts = {}) {
|
|
223
|
+
await this.box.close();
|
|
224
|
+
return Sandbox.kill(this.sandboxId, { ...opts });
|
|
225
|
+
}
|
|
226
|
+
static async getInfo(sandboxId, opts = {}) {
|
|
227
|
+
try {
|
|
228
|
+
return toInfo(await resolveConn(opts).solari.get(sandboxId));
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
throw translateError(e, "sandbox");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
static getFullInfo(sandboxId, opts = {}) {
|
|
235
|
+
return Sandbox.getInfo(sandboxId, opts);
|
|
236
|
+
}
|
|
237
|
+
getInfo(_opts) {
|
|
238
|
+
return Sandbox.getInfo(this.sandboxId, this.connOpts());
|
|
239
|
+
}
|
|
240
|
+
async isRunning(_opts) {
|
|
241
|
+
try {
|
|
242
|
+
return (await this.box.conn.solari.get(this.sandboxId)).state === "running";
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
if (translateError(e, "sandbox") instanceof SandboxNotFoundError)
|
|
246
|
+
return false;
|
|
247
|
+
throw translateError(e, "sandbox");
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
static async setTimeout(sandboxId, timeoutMs, opts = {}) {
|
|
251
|
+
const box = new Box(resolveConn(opts), sandboxId);
|
|
252
|
+
try {
|
|
253
|
+
await (await box.handle()).setTimeout(timeoutMs);
|
|
254
|
+
}
|
|
255
|
+
catch (e) {
|
|
256
|
+
throw translateError(e, "sandbox");
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async setTimeout(timeoutMs, _opts) {
|
|
260
|
+
await this.box.on((sb) => sb.setTimeout(timeoutMs), "sandbox");
|
|
261
|
+
}
|
|
262
|
+
static async getMetrics(sandboxId, opts = {}) {
|
|
263
|
+
const conn = resolveConn(opts);
|
|
264
|
+
try {
|
|
265
|
+
const [view, m] = await Promise.all([conn.solari.get(sandboxId), conn.http.request("GET", `/sandboxes/${encodeURIComponent(sandboxId)}/metrics`)]);
|
|
266
|
+
return [
|
|
267
|
+
{
|
|
268
|
+
timestamp: new Date(),
|
|
269
|
+
cpuUsedPct: m.cpuPct,
|
|
270
|
+
cpuCount: view.cpu,
|
|
271
|
+
memUsed: m.memBytes,
|
|
272
|
+
memTotal: m.memTotalBytes,
|
|
273
|
+
memCache: 0,
|
|
274
|
+
diskUsed: m.diskBytes,
|
|
275
|
+
diskTotal: (view.diskGb ?? 0) * GIB,
|
|
276
|
+
},
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
throw translateError(e, "sandbox");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
getMetrics(opts) {
|
|
284
|
+
return Sandbox.getMetrics(this.sandboxId, { ...this.connOpts(), ...opts });
|
|
285
|
+
}
|
|
286
|
+
// --- pause / snapshots / fork ---------------------------------------------------------------------------------
|
|
287
|
+
static async pause(sandboxId, opts = {}) {
|
|
288
|
+
// mode 'filesystem' / keepMemory:false ask for less than a Solari pause keeps (RAM + disk); the result is a superset.
|
|
289
|
+
const conn = resolveConn(opts);
|
|
290
|
+
try {
|
|
291
|
+
const view = await conn.solari.get(sandboxId);
|
|
292
|
+
if (view.state === "paused")
|
|
293
|
+
return false;
|
|
294
|
+
const sb = await conn.solari.connect(sandboxId);
|
|
295
|
+
await sb.pause();
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
catch (e) {
|
|
299
|
+
throw translateError(e, "sandbox");
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
async pause(opts = {}) {
|
|
303
|
+
await this.box.close();
|
|
304
|
+
return Sandbox.pause(this.sandboxId, opts);
|
|
305
|
+
}
|
|
306
|
+
betaPause(opts = {}) {
|
|
307
|
+
return this.pause(opts);
|
|
308
|
+
}
|
|
309
|
+
static betaPause(sandboxId, opts = {}) {
|
|
310
|
+
return Sandbox.pause(sandboxId, opts);
|
|
311
|
+
}
|
|
312
|
+
static async createSnapshot(sandboxId, opts = {}) {
|
|
313
|
+
const conn = resolveConn(opts);
|
|
314
|
+
try {
|
|
315
|
+
const box = new Box(conn, sandboxId);
|
|
316
|
+
const id = await (await box.handle()).snapshot(opts.name);
|
|
317
|
+
return { snapshotId: id, names: opts.name ? [opts.name] : [] };
|
|
318
|
+
}
|
|
319
|
+
catch (e) {
|
|
320
|
+
throw translateError(e, "sandbox");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
createSnapshot(opts = {}) {
|
|
324
|
+
return Sandbox.createSnapshot(this.sandboxId, { ...this.connOpts(), ...opts });
|
|
325
|
+
}
|
|
326
|
+
static listSnapshots(opts) {
|
|
327
|
+
return new SnapshotPaginator(opts);
|
|
328
|
+
}
|
|
329
|
+
listSnapshots(opts) {
|
|
330
|
+
return new SnapshotPaginator({ ...opts, sandboxId: this.sandboxId });
|
|
331
|
+
}
|
|
332
|
+
static async deleteSnapshot(snapshotId, opts = {}) {
|
|
333
|
+
try {
|
|
334
|
+
await resolveConn(opts).solari.deleteSnapshot(snapshotId);
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
catch (e) {
|
|
338
|
+
throw translateError(e);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/** Copy a running sandbox: checkpoint it, then boot `count` new sandboxes from the checkpoint. */
|
|
342
|
+
static async fork(sandboxId, opts = {}) {
|
|
343
|
+
const count = opts.count ?? 1;
|
|
344
|
+
if (!Number.isInteger(count) || count < 1)
|
|
345
|
+
throw new InvalidArgumentError("count must be a positive integer");
|
|
346
|
+
const conn = resolveConn(opts);
|
|
347
|
+
let snapshotId;
|
|
348
|
+
let metadata;
|
|
349
|
+
try {
|
|
350
|
+
const view = await conn.solari.get(sandboxId);
|
|
351
|
+
metadata = view.metadata;
|
|
352
|
+
snapshotId = (await Sandbox.createSnapshot(sandboxId, opts)).snapshotId;
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
throw translateError(e, "sandbox");
|
|
356
|
+
}
|
|
357
|
+
const forks = await Promise.all(Array.from({ length: count }, async () => {
|
|
358
|
+
try {
|
|
359
|
+
const core = await conn.solari.create({ fromSnapshot: snapshotId, idleTimeoutMs: opts.timeoutMs ?? DEFAULT_TIMEOUT_MS, ...(metadata ? { metadata } : {}) });
|
|
360
|
+
return new this({ conn, id: core.sandboxId, core });
|
|
361
|
+
}
|
|
362
|
+
catch (e) {
|
|
363
|
+
const t = translateError(e);
|
|
364
|
+
return t instanceof Error ? t : new SandboxError(String(t));
|
|
365
|
+
}
|
|
366
|
+
}));
|
|
367
|
+
// The checkpoint was made for this call only: release it once the copies are up (best effort).
|
|
368
|
+
await conn.solari.deleteSnapshot(snapshotId).catch(() => undefined);
|
|
369
|
+
return forks;
|
|
370
|
+
}
|
|
371
|
+
fork(opts = {}) {
|
|
372
|
+
return this.constructor.fork(this.sandboxId, { ...this.connOpts(), ...opts });
|
|
373
|
+
}
|
|
374
|
+
// --- network / urls -------------------------------------------------------------------------------------------
|
|
375
|
+
/** E2B returns the host synchronously; Solari mints preview URLs on the gateway. Use {@link getPreviewUrl}. */
|
|
376
|
+
getHost(_port) {
|
|
377
|
+
throw new SolariCompatUnsupported("getHost", "Solari preview URLs are minted by the gateway; use `await sandbox.getPreviewUrl(port)`");
|
|
378
|
+
}
|
|
379
|
+
/** Solari extension: the public URL (and access token, if the port is protected) for a port in the sandbox. */
|
|
380
|
+
async getPreviewUrl(port) {
|
|
381
|
+
return this.box.on((sb) => sb.previewUrl(port), "sandbox");
|
|
382
|
+
}
|
|
383
|
+
async updateNetwork(_network, _opts) {
|
|
384
|
+
throw new SolariCompatUnsupported("updateNetwork", "egress allow/deny rules are not available");
|
|
385
|
+
}
|
|
386
|
+
static async updateNetwork(_sandboxId, _network, _opts) {
|
|
387
|
+
throw new SolariCompatUnsupported("updateNetwork", "egress allow/deny rules are not available");
|
|
388
|
+
}
|
|
389
|
+
async uploadUrl(path, opts) {
|
|
390
|
+
if (opts?.user)
|
|
391
|
+
throw new SolariCompatUnsupported("uploadUrl user");
|
|
392
|
+
const abs = path ? await this.box.abs(path) : undefined;
|
|
393
|
+
return (await this.box.on((sb) => sb.uploadUrl(abs), "sandbox")).url;
|
|
394
|
+
}
|
|
395
|
+
async downloadUrl(path, opts) {
|
|
396
|
+
if (opts?.user)
|
|
397
|
+
throw new SolariCompatUnsupported("downloadUrl user");
|
|
398
|
+
const abs = await this.box.abs(path);
|
|
399
|
+
return (await this.box.on((sb) => sb.downloadUrl(abs), "sandbox")).url;
|
|
400
|
+
}
|
|
401
|
+
getMcpUrl() {
|
|
402
|
+
throw new SolariCompatUnsupported("getMcpUrl", "the E2B MCP gateway has no Solari equivalent");
|
|
403
|
+
}
|
|
404
|
+
async getMcpToken() {
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
connOpts() {
|
|
408
|
+
return { apiKey: this.box.conn.apiKey, apiUrl: this.box.conn.baseUrl };
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
async function resolveVolumes(conn, mounts) {
|
|
412
|
+
const byName = new Map();
|
|
413
|
+
const out = [];
|
|
414
|
+
for (const [path, v] of Object.entries(mounts)) {
|
|
415
|
+
if (typeof v !== "string")
|
|
416
|
+
throw new SolariCompatUnsupported("volumeMounts with a Volume object", "pass a volume id (vol_…) or name");
|
|
417
|
+
let id = v;
|
|
418
|
+
if (!v.startsWith("vol_")) {
|
|
419
|
+
if (byName.size === 0)
|
|
420
|
+
for (const vol of await conn.solari.volumes.list())
|
|
421
|
+
byName.set(vol.name, vol.volumeId);
|
|
422
|
+
const found = byName.get(v);
|
|
423
|
+
if (!found)
|
|
424
|
+
throw new TemplateError(`Volume "${v}" not found`);
|
|
425
|
+
id = found;
|
|
426
|
+
}
|
|
427
|
+
out.push({ volumeId: id, path });
|
|
428
|
+
}
|
|
429
|
+
return out;
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|