@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
package/dist/commands.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// E2B `sandbox.commands` and `sandbox.pty`. Solari identifies a running command by a string id that lives on the
|
|
2
|
+
// creating control channel, so E2B's numeric `pid`s are process-local handles: list/connect/kill/sendStdin work for
|
|
3
|
+
// commands started by this process (see COMPAT.md).
|
|
4
|
+
import { shellArgs } from "./box.js";
|
|
5
|
+
import { CommandExitError, NotFoundError, SandboxError, SolariCompatUnsupported, TimeoutError, translateError } from "./errors.js";
|
|
6
|
+
const DEFAULT_COMMAND_TIMEOUT_MS = 60_000;
|
|
7
|
+
let nextPid = 1000;
|
|
8
|
+
const procs = new Map();
|
|
9
|
+
function procsOf(id) {
|
|
10
|
+
let m = procs.get(id);
|
|
11
|
+
if (!m)
|
|
12
|
+
procs.set(id, (m = new Map()));
|
|
13
|
+
return m;
|
|
14
|
+
}
|
|
15
|
+
/** What `commands.run({ background: true })` and `pty.create` return. */
|
|
16
|
+
export class CommandHandle {
|
|
17
|
+
backend;
|
|
18
|
+
pty;
|
|
19
|
+
pid;
|
|
20
|
+
_stdout = "";
|
|
21
|
+
_stderr = "";
|
|
22
|
+
_exit;
|
|
23
|
+
_error;
|
|
24
|
+
done;
|
|
25
|
+
finish;
|
|
26
|
+
stdoutCbs = [];
|
|
27
|
+
stderrCbs = [];
|
|
28
|
+
ptyCbs = [];
|
|
29
|
+
/** @internal */
|
|
30
|
+
constructor(pid, backend, pty) {
|
|
31
|
+
this.backend = backend;
|
|
32
|
+
this.pty = pty;
|
|
33
|
+
this.pid = pid;
|
|
34
|
+
this.done = new Promise((r) => (this.finish = r));
|
|
35
|
+
}
|
|
36
|
+
get stdout() {
|
|
37
|
+
return this._stdout;
|
|
38
|
+
}
|
|
39
|
+
get stderr() {
|
|
40
|
+
return this._stderr;
|
|
41
|
+
}
|
|
42
|
+
get exitCode() {
|
|
43
|
+
return this._exit;
|
|
44
|
+
}
|
|
45
|
+
get error() {
|
|
46
|
+
return this._error;
|
|
47
|
+
}
|
|
48
|
+
/** @internal */
|
|
49
|
+
_data(stream, data) {
|
|
50
|
+
if (stream === "stdout") {
|
|
51
|
+
this._stdout += data;
|
|
52
|
+
for (const cb of this.stdoutCbs)
|
|
53
|
+
void Promise.resolve(cb(data)).catch(() => undefined);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this._stderr += data;
|
|
57
|
+
for (const cb of this.stderrCbs)
|
|
58
|
+
void Promise.resolve(cb(data)).catch(() => undefined);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** @internal */
|
|
62
|
+
_ptyData(data) {
|
|
63
|
+
for (const cb of this.ptyCbs)
|
|
64
|
+
void Promise.resolve(cb(data)).catch(() => undefined);
|
|
65
|
+
}
|
|
66
|
+
/** @internal */
|
|
67
|
+
_onStdout(cb) {
|
|
68
|
+
if (cb)
|
|
69
|
+
this.stdoutCbs.push(cb);
|
|
70
|
+
}
|
|
71
|
+
/** @internal */
|
|
72
|
+
_onStderr(cb) {
|
|
73
|
+
if (cb)
|
|
74
|
+
this.stderrCbs.push(cb);
|
|
75
|
+
}
|
|
76
|
+
/** @internal */
|
|
77
|
+
_onPty(cb) {
|
|
78
|
+
if (cb)
|
|
79
|
+
this.ptyCbs.push(cb);
|
|
80
|
+
}
|
|
81
|
+
/** @internal */
|
|
82
|
+
_exited(code, error) {
|
|
83
|
+
if (this._exit !== undefined)
|
|
84
|
+
return;
|
|
85
|
+
this._exit = code;
|
|
86
|
+
this._error = error;
|
|
87
|
+
this.finish();
|
|
88
|
+
}
|
|
89
|
+
/** Wait for the command to end. Throws {@link CommandExitError} on a non-zero exit, as E2B does. */
|
|
90
|
+
async wait() {
|
|
91
|
+
await this.done;
|
|
92
|
+
const result = { exitCode: this._exit ?? 0, stdout: this._stdout, stderr: this._stderr, ...(this._error ? { error: this._error } : {}) };
|
|
93
|
+
if (result.exitCode !== 0)
|
|
94
|
+
throw new CommandExitError(result);
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/** Stop receiving output; the command keeps running. */
|
|
98
|
+
async disconnect() {
|
|
99
|
+
this.stdoutCbs.length = 0;
|
|
100
|
+
this.stderrCbs.length = 0;
|
|
101
|
+
this.ptyCbs.length = 0;
|
|
102
|
+
}
|
|
103
|
+
/** SIGKILL. `false` when the command already ended. */
|
|
104
|
+
async kill() {
|
|
105
|
+
if (this._exit !== undefined)
|
|
106
|
+
return false;
|
|
107
|
+
try {
|
|
108
|
+
await this.backend.kill();
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
throw translateError(e);
|
|
112
|
+
}
|
|
113
|
+
if (this.pty)
|
|
114
|
+
this._exited(137, "killed");
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
async sendStdin(data, _opts) {
|
|
118
|
+
try {
|
|
119
|
+
await this.backend.stdin(data);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
throw translateError(e);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async closeStdin(_opts) {
|
|
126
|
+
if (!this.backend.closeStdin)
|
|
127
|
+
throw new SolariCompatUnsupported("closeStdin", "Solari cannot close a command's stdin; end the program another way (for example a sentinel line)");
|
|
128
|
+
await this.backend.closeStdin();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** Ordered input stream, built over repeated writes (Solari writes are ordered per command). */
|
|
132
|
+
export class CommandInputHandle {
|
|
133
|
+
write;
|
|
134
|
+
closed = false;
|
|
135
|
+
queue = Promise.resolve();
|
|
136
|
+
constructor(write) {
|
|
137
|
+
this.write = write;
|
|
138
|
+
}
|
|
139
|
+
send(data) {
|
|
140
|
+
if (this.closed)
|
|
141
|
+
return Promise.reject(new SandboxError("The input stream is closed"));
|
|
142
|
+
this.queue = this.queue.then(() => this.write(data));
|
|
143
|
+
return this.queue;
|
|
144
|
+
}
|
|
145
|
+
async close() {
|
|
146
|
+
this.closed = true;
|
|
147
|
+
await this.queue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export class Commands {
|
|
151
|
+
box;
|
|
152
|
+
/** @internal */
|
|
153
|
+
constructor(box) {
|
|
154
|
+
this.box = box;
|
|
155
|
+
}
|
|
156
|
+
get supportsStdinClose() {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
async run(cmd, opts = {}) {
|
|
160
|
+
const handle = await this.start(cmd, opts);
|
|
161
|
+
if (opts.background)
|
|
162
|
+
return handle;
|
|
163
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS;
|
|
164
|
+
if (timeoutMs > 0) {
|
|
165
|
+
let timer;
|
|
166
|
+
const timeout = new Promise((_, rej) => {
|
|
167
|
+
timer = setTimeout(() => rej(new SandboxError(`Command timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
168
|
+
});
|
|
169
|
+
try {
|
|
170
|
+
return await Promise.race([handle.wait(), timeout]);
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
if (e instanceof SandboxError && !(e instanceof CommandExitError)) {
|
|
174
|
+
await handle.kill().catch(() => undefined);
|
|
175
|
+
throw new TimeoutError(e.message);
|
|
176
|
+
}
|
|
177
|
+
throw e;
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
clearTimeout(timer);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return handle.wait();
|
|
184
|
+
}
|
|
185
|
+
async start(cmd, opts) {
|
|
186
|
+
const native = await this.box.isNative();
|
|
187
|
+
const [program, args] = shellArgs(native, cmd);
|
|
188
|
+
// E2B runs commands from the user's home directory unless told otherwise.
|
|
189
|
+
const cwd = opts.cwd ? await this.box.abs(opts.cwd) : await this.box.home();
|
|
190
|
+
const core = await this.box.on((sb) => sb.commands.start(program, {
|
|
191
|
+
args,
|
|
192
|
+
cwd,
|
|
193
|
+
...(opts.envs ? { env: opts.envs } : {}),
|
|
194
|
+
...(opts.user ? { user: opts.user } : {}),
|
|
195
|
+
}));
|
|
196
|
+
const pid = nextPid++;
|
|
197
|
+
const handle = new CommandHandle(pid, { kill: () => core.kill(9), stdin: (d) => core.stdin(d) }, false);
|
|
198
|
+
handle._onStdout(opts.onStdout);
|
|
199
|
+
handle._onStderr(opts.onStderr);
|
|
200
|
+
core.onData((c) => handle._data(c.stream, c.data));
|
|
201
|
+
const rec = { pid, info: { pid, cmd: program, args, envs: opts.envs ?? {}, cwd }, handle, kind: "cmd", exited: false };
|
|
202
|
+
procsOf(this.box.id).set(pid, rec);
|
|
203
|
+
core.wait().then((code) => {
|
|
204
|
+
rec.exited = true;
|
|
205
|
+
handle._exited(code);
|
|
206
|
+
}, (e) => {
|
|
207
|
+
rec.exited = true;
|
|
208
|
+
handle._exited(1, e instanceof Error ? e.message : String(e));
|
|
209
|
+
});
|
|
210
|
+
return handle;
|
|
211
|
+
}
|
|
212
|
+
/** Commands and PTYs this process started on the sandbox that have not ended. */
|
|
213
|
+
async list(_opts) {
|
|
214
|
+
return [...procsOf(this.box.id).values()].filter((r) => !r.exited).map((r) => r.info);
|
|
215
|
+
}
|
|
216
|
+
async kill(pid, _opts) {
|
|
217
|
+
const rec = procsOf(this.box.id).get(pid);
|
|
218
|
+
if (!rec || rec.exited)
|
|
219
|
+
return false;
|
|
220
|
+
return rec.handle.kill();
|
|
221
|
+
}
|
|
222
|
+
async sendStdin(pid, data, opts) {
|
|
223
|
+
await this.known(pid).handle.sendStdin(data, opts);
|
|
224
|
+
}
|
|
225
|
+
streamInput(pid, _opts) {
|
|
226
|
+
const rec = this.known(pid);
|
|
227
|
+
return new CommandInputHandle((d) => rec.handle.sendStdin(d));
|
|
228
|
+
}
|
|
229
|
+
async closeStdin(pid, opts) {
|
|
230
|
+
await this.known(pid).handle.closeStdin(opts);
|
|
231
|
+
}
|
|
232
|
+
async connect(pid, opts) {
|
|
233
|
+
const rec = this.known(pid);
|
|
234
|
+
rec.handle._onStdout(opts?.onStdout);
|
|
235
|
+
rec.handle._onStderr(opts?.onStderr);
|
|
236
|
+
return rec.handle;
|
|
237
|
+
}
|
|
238
|
+
known(pid) {
|
|
239
|
+
const rec = procsOf(this.box.id).get(pid);
|
|
240
|
+
if (!rec) {
|
|
241
|
+
throw new NotFoundError(`Process ${pid} not found. Solari can only address commands started by this process (see COMPAT.md).`);
|
|
242
|
+
}
|
|
243
|
+
return rec;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
export class Pty {
|
|
247
|
+
box;
|
|
248
|
+
/** @internal */
|
|
249
|
+
constructor(box) {
|
|
250
|
+
this.box = box;
|
|
251
|
+
}
|
|
252
|
+
async create(opts) {
|
|
253
|
+
if (opts.user)
|
|
254
|
+
throw new SolariCompatUnsupported("pty.create user");
|
|
255
|
+
const core = await this.box.on((sb) => sb.pty.create({ cols: opts.cols, rows: opts.rows, ...(opts.cwd ? { cwd: opts.cwd } : {}), env: { TERM: "xterm-256color", ...(opts.envs ?? {}) } }));
|
|
256
|
+
const pid = nextPid++;
|
|
257
|
+
const handle = new CommandHandle(pid, { kill: () => core.kill(), stdin: (d) => core.write(d) }, true);
|
|
258
|
+
handle._onPty(opts.onData);
|
|
259
|
+
core.onData((d) => handle._ptyData(d));
|
|
260
|
+
procsOf(this.box.id).set(pid, { pid, info: { pid, cmd: "pty", args: [], envs: opts.envs ?? {}, ...(opts.cwd ? { cwd: opts.cwd } : {}) }, handle, kind: "pty", exited: false });
|
|
261
|
+
ptyCores.set(handle, core);
|
|
262
|
+
return handle;
|
|
263
|
+
}
|
|
264
|
+
async connect(pid, opts) {
|
|
265
|
+
const rec = procsOf(this.box.id).get(pid);
|
|
266
|
+
if (!rec || rec.kind !== "pty")
|
|
267
|
+
throw new NotFoundError(`PTY ${pid} not found. Solari can only address PTYs created by this process (see COMPAT.md).`);
|
|
268
|
+
rec.handle._onPty(opts?.onData);
|
|
269
|
+
return rec.handle;
|
|
270
|
+
}
|
|
271
|
+
async sendInput(pid, data, _opts) {
|
|
272
|
+
await this.pty(pid).handle.sendStdin(data);
|
|
273
|
+
}
|
|
274
|
+
streamInput(pid, _opts) {
|
|
275
|
+
const rec = this.pty(pid);
|
|
276
|
+
return new CommandInputHandle((d) => rec.handle.sendStdin(d));
|
|
277
|
+
}
|
|
278
|
+
async resize(pid, size, _opts) {
|
|
279
|
+
const core = ptyCores.get(this.pty(pid).handle);
|
|
280
|
+
try {
|
|
281
|
+
await core.resize(size.cols, size.rows);
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
throw translateError(e);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async kill(pid, _opts) {
|
|
288
|
+
const rec = procsOf(this.box.id).get(pid);
|
|
289
|
+
if (!rec || rec.kind !== "pty" || rec.exited)
|
|
290
|
+
return false;
|
|
291
|
+
rec.exited = true;
|
|
292
|
+
return rec.handle.kill();
|
|
293
|
+
}
|
|
294
|
+
pty(pid) {
|
|
295
|
+
const rec = procsOf(this.box.id).get(pid);
|
|
296
|
+
if (!rec || rec.kind !== "pty")
|
|
297
|
+
throw new NotFoundError(`PTY ${pid} not found. Solari can only address PTYs created by this process (see COMPAT.md).`);
|
|
298
|
+
return rec;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const ptyCores = new WeakMap();
|
|
302
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { HttpTransport } from "@solarisdk/core";
|
|
2
|
+
import { SandboxClient } from "@solarisdk/sandbox";
|
|
3
|
+
export declare const DEFAULT_BASE_URL = "https://api.getsolari.com";
|
|
4
|
+
/** @internal Whether a base URL may receive a Solari key: https on getsolari.com or a subdomain, or loopback. */
|
|
5
|
+
export declare function isSolariBaseUrl(raw: string): boolean;
|
|
6
|
+
/** The E2B connection options this package reads. Everything else is accepted and ignored. */
|
|
7
|
+
export interface ConnectionOpts {
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
domain?: string;
|
|
10
|
+
apiUrl?: string;
|
|
11
|
+
requestTimeoutMs?: number;
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
apiHeaders?: Record<string, string>;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
retries?: number;
|
|
17
|
+
validateApiKey?: boolean;
|
|
18
|
+
logger?: unknown;
|
|
19
|
+
proxy?: string;
|
|
20
|
+
httpVersion?: "1.1" | "2";
|
|
21
|
+
}
|
|
22
|
+
/** @internal */
|
|
23
|
+
export interface Conn {
|
|
24
|
+
readonly apiKey: string;
|
|
25
|
+
readonly baseUrl: string;
|
|
26
|
+
readonly solari: SandboxClient;
|
|
27
|
+
readonly http: HttpTransport;
|
|
28
|
+
readonly requestTimeoutMs: number | undefined;
|
|
29
|
+
}
|
|
30
|
+
/** @internal Resolve the connection for one call: option, then environment, then default. Cached per key + URL. */
|
|
31
|
+
export declare function resolveConn(opts?: ConnectionOpts): Conn;
|
|
32
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAE5D,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWpD;AAUD,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC;CAC3B;AAED,gBAAgB;AAChB,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAKD,mHAAmH;AACnH,wBAAgB,WAAW,CAAC,IAAI,GAAE,cAAmB,GAAG,IAAI,CA2D3D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Connection config. Only a Solari key (slr_…) is ever used or sent. An E2B key (E2B_API_KEY, e2b_…) that a
|
|
2
|
+
// E2B-targeting program already has in its environment is never sent to Solari, and E2B_DOMAIN / E2B_API_URL
|
|
3
|
+
// are only honoured when they point at Solari or loopback.
|
|
4
|
+
import { HttpTransport } from "@solarisdk/core";
|
|
5
|
+
import { SandboxClient } from "@solarisdk/sandbox";
|
|
6
|
+
import { SandboxError, SolariCompatUnsupported } from "./errors.js";
|
|
7
|
+
export const DEFAULT_BASE_URL = "https://api.getsolari.com";
|
|
8
|
+
/** @internal Whether a base URL may receive a Solari key: https on getsolari.com or a subdomain, or loopback. */
|
|
9
|
+
export function isSolariBaseUrl(raw) {
|
|
10
|
+
let u;
|
|
11
|
+
try {
|
|
12
|
+
u = new URL(raw);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const host = u.hostname.toLowerCase().replace(/\.$/, "");
|
|
18
|
+
if (u.protocol === "https:" && (host === "getsolari.com" || host.endsWith(".getsolari.com")))
|
|
19
|
+
return true;
|
|
20
|
+
const loopback = host === "localhost" || host === "[::1]" || /^127(\.\d{1,3}){3}$/.test(host);
|
|
21
|
+
return loopback && (u.protocol === "http:" || u.protocol === "https:");
|
|
22
|
+
}
|
|
23
|
+
function describeHost(raw) {
|
|
24
|
+
try {
|
|
25
|
+
return new URL(raw).hostname || "unparsable URL";
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return "unparsable URL";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const env = (k) => (typeof process !== "undefined" ? process.env[k] : undefined) || undefined;
|
|
32
|
+
const cache = new Map();
|
|
33
|
+
/** @internal Resolve the connection for one call: option, then environment, then default. Cached per key + URL. */
|
|
34
|
+
export function resolveConn(opts = {}) {
|
|
35
|
+
if (opts.headers && Object.keys(opts.headers).length > 0)
|
|
36
|
+
throw new SolariCompatUnsupported("headers");
|
|
37
|
+
if (opts.apiHeaders && Object.keys(opts.apiHeaders).length > 0)
|
|
38
|
+
throw new SolariCompatUnsupported("apiHeaders");
|
|
39
|
+
if (opts.proxy)
|
|
40
|
+
throw new SolariCompatUnsupported("proxy");
|
|
41
|
+
const candidates = [
|
|
42
|
+
["the apiKey option", opts.apiKey],
|
|
43
|
+
["SOLARI_API_KEY", env("SOLARI_API_KEY")],
|
|
44
|
+
["E2B_API_KEY", env("E2B_API_KEY")],
|
|
45
|
+
];
|
|
46
|
+
let key;
|
|
47
|
+
for (const [source, value] of candidates) {
|
|
48
|
+
if (!value)
|
|
49
|
+
continue;
|
|
50
|
+
if (value.startsWith("slr_")) {
|
|
51
|
+
key = value;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
console.warn(`@solarisdk/e2b-compat: ignoring ${source}: it is not a Solari API key (slr_…). It is not sent anywhere.`);
|
|
55
|
+
}
|
|
56
|
+
if (!key) {
|
|
57
|
+
throw new SandboxError("No Solari API key. Set SOLARI_API_KEY, or pass { apiKey: 'slr_live_…' }. An E2B key (E2B_API_KEY) is never sent to Solari and cannot be used here.");
|
|
58
|
+
}
|
|
59
|
+
// E2B's own url settings usually point at e2b.dev. Using them blindly would send the user's slr_ key to E2B.
|
|
60
|
+
const explicit = opts.apiUrl ?? (opts.domain ? `https://api.${opts.domain}` : undefined);
|
|
61
|
+
const inheritedRaw = env("E2B_API_URL") ?? (env("E2B_DOMAIN") ? `https://api.${env("E2B_DOMAIN")}` : undefined);
|
|
62
|
+
let base;
|
|
63
|
+
if (explicit) {
|
|
64
|
+
if (!isSolariBaseUrl(explicit)) {
|
|
65
|
+
throw new SandboxError(`Refusing to send a Solari API key to ${describeHost(explicit)}: it does not point at Solari.`);
|
|
66
|
+
}
|
|
67
|
+
base = explicit;
|
|
68
|
+
}
|
|
69
|
+
let inherited;
|
|
70
|
+
if (inheritedRaw) {
|
|
71
|
+
if (isSolariBaseUrl(inheritedRaw))
|
|
72
|
+
inherited = inheritedRaw;
|
|
73
|
+
else if (!base && !env("SOLARI_BASE_URL")) {
|
|
74
|
+
console.warn(`@solarisdk/e2b-compat: ignoring E2B_API_URL/E2B_DOMAIN (${describeHost(inheritedRaw)}): it does not point at Solari, and your Solari API key is never sent anywhere else. Using ${DEFAULT_BASE_URL}.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const baseUrl = (base ?? env("SOLARI_BASE_URL") ?? inherited ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
78
|
+
const ck = `${key}\n${baseUrl}`;
|
|
79
|
+
let c = cache.get(ck);
|
|
80
|
+
if (!c) {
|
|
81
|
+
c = {
|
|
82
|
+
apiKey: key,
|
|
83
|
+
baseUrl,
|
|
84
|
+
solari: new SandboxClient({ apiKey: key, baseUrl }),
|
|
85
|
+
http: new HttpTransport({ apiKey: key, baseUrl }),
|
|
86
|
+
requestTimeoutMs: undefined,
|
|
87
|
+
};
|
|
88
|
+
cache.set(ck, c);
|
|
89
|
+
}
|
|
90
|
+
return opts.requestTimeoutMs ? { ...c, requestTimeoutMs: opts.requestTimeoutMs } : c;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export declare class SandboxError extends Error {
|
|
2
|
+
constructor(message?: string, opts?: {
|
|
3
|
+
cause?: unknown;
|
|
4
|
+
});
|
|
5
|
+
}
|
|
6
|
+
export declare class TimeoutError extends SandboxError {
|
|
7
|
+
}
|
|
8
|
+
export declare class InvalidArgumentError extends SandboxError {
|
|
9
|
+
}
|
|
10
|
+
export declare class NotEnoughSpaceError extends SandboxError {
|
|
11
|
+
}
|
|
12
|
+
export declare class NotFoundError extends SandboxError {
|
|
13
|
+
}
|
|
14
|
+
export declare class FileNotFoundError extends NotFoundError {
|
|
15
|
+
}
|
|
16
|
+
export declare class SandboxNotFoundError extends NotFoundError {
|
|
17
|
+
}
|
|
18
|
+
export declare class SandboxNotRunningError extends TimeoutError {
|
|
19
|
+
}
|
|
20
|
+
export declare class SandboxUnreachableError extends TimeoutError {
|
|
21
|
+
}
|
|
22
|
+
export declare class AuthenticationError extends Error {
|
|
23
|
+
constructor(message?: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class GitAuthError extends AuthenticationError {
|
|
26
|
+
}
|
|
27
|
+
export declare class GitUpstreamError extends SandboxError {
|
|
28
|
+
}
|
|
29
|
+
export declare class TemplateError extends SandboxError {
|
|
30
|
+
}
|
|
31
|
+
export declare class RateLimitError extends SandboxError {
|
|
32
|
+
}
|
|
33
|
+
export declare class ServiceBusyError extends Error {
|
|
34
|
+
constructor(message?: string);
|
|
35
|
+
}
|
|
36
|
+
export declare class BuildError extends Error {
|
|
37
|
+
constructor(message?: string, opts?: {
|
|
38
|
+
cause?: unknown;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export declare class FileUploadError extends BuildError {
|
|
42
|
+
}
|
|
43
|
+
export declare class VolumeError extends Error {
|
|
44
|
+
constructor(message?: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class VolumeNotFoundError extends VolumeError {
|
|
47
|
+
}
|
|
48
|
+
export declare class VolumePathNotFoundError extends VolumeError {
|
|
49
|
+
}
|
|
50
|
+
export declare class SecretError extends Error {
|
|
51
|
+
constructor(message?: string);
|
|
52
|
+
}
|
|
53
|
+
export declare class SecretNotFoundError extends SecretError {
|
|
54
|
+
}
|
|
55
|
+
/** A command exited non-zero. `commands.run` throws this (E2B semantics); `result.exitCode` etc. are on the error. */
|
|
56
|
+
export declare class CommandExitError extends SandboxError {
|
|
57
|
+
private readonly result;
|
|
58
|
+
constructor(result: {
|
|
59
|
+
exitCode: number;
|
|
60
|
+
error?: string;
|
|
61
|
+
stdout: string;
|
|
62
|
+
stderr: string;
|
|
63
|
+
});
|
|
64
|
+
get exitCode(): number;
|
|
65
|
+
get error(): string | undefined;
|
|
66
|
+
get stdout(): string;
|
|
67
|
+
get stderr(): string;
|
|
68
|
+
}
|
|
69
|
+
/** The feature has no Solari equivalent (see COMPAT.md). Never a silent no-op. */
|
|
70
|
+
export declare class SolariCompatUnsupported extends SandboxError {
|
|
71
|
+
readonly feature: string;
|
|
72
|
+
constructor(feature: string, detail?: string);
|
|
73
|
+
}
|
|
74
|
+
/** A namespace whose every method throws {@link SolariCompatUnsupported}. */
|
|
75
|
+
export declare function unsupportedNamespace<T extends object = Record<string, (...a: unknown[]) => never>>(feature: string): T;
|
|
76
|
+
/** Map a Solari error onto the E2B class a caller would catch. `what` says what was being looked up. */
|
|
77
|
+
export declare function translateError(err: unknown, what?: "sandbox" | "file" | "other"): unknown;
|
|
78
|
+
export declare function translating<T>(fn: () => Promise<T>, what?: "sandbox" | "file" | "other"): Promise<T>;
|
|
79
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAKA,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKzD;AACD,qBAAa,YAAa,SAAQ,YAAY;CAAG;AACjD,qBAAa,oBAAqB,SAAQ,YAAY;CAAG;AACzD,qBAAa,mBAAoB,SAAQ,YAAY;CAAG;AACxD,qBAAa,aAAc,SAAQ,YAAY;CAAG;AAClD,qBAAa,iBAAkB,SAAQ,aAAa;CAAG;AACvD,qBAAa,oBAAqB,SAAQ,aAAa;CAAG;AAC1D,qBAAa,sBAAuB,SAAQ,YAAY;CAAG;AAC3D,qBAAa,uBAAwB,SAAQ,YAAY;CAAG;AAC5D,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,CAAC,EAAE,MAAM;CAI7B;AACD,qBAAa,YAAa,SAAQ,mBAAmB;CAAG;AACxD,qBAAa,gBAAiB,SAAQ,YAAY;CAAG;AACrD,qBAAa,aAAc,SAAQ,YAAY;CAAG;AAClD,qBAAa,cAAe,SAAQ,YAAY;CAAG;AACnD,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,CAAC,EAAE,MAAM;CAI7B;AACD,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKzD;AACD,qBAAa,eAAgB,SAAQ,UAAU;CAAG;AAClD,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,CAAC,EAAE,MAAM;CAI7B;AACD,qBAAa,mBAAoB,SAAQ,WAAW;CAAG;AACvD,qBAAa,uBAAwB,SAAQ,WAAW;CAAG;AAC3D,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,CAAC,EAAE,MAAM;CAI7B;AACD,qBAAa,mBAAoB,SAAQ,WAAW;CAAG;AAEvD,sHAAsH;AACtH,qBAAa,gBAAiB,SAAQ,YAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAIzG,IAAI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IACD,IAAI,MAAM,IAAI,MAAM,CAEnB;IACD,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF;AAED,kFAAkF;AAClF,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAI7C;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAStH;AAID,wGAAwG;AACxG,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,GAAE,SAAS,GAAG,MAAM,GAAG,OAAiB,GAAG,OAAO,CAoBlG;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,SAAS,GAAG,MAAM,GAAG,OAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAMnH"}
|