@e2b/code-interpreter 1.2.5-autopause.1 → 1.5.1
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/LICENSE +9 -0
- package/dist/index.js +132 -160
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +132 -160
- package/dist/index.mjs.map +1 -1
- package/package.json +21 -24
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 FOUNDRYLABS, INC.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/dist/index.js
CHANGED
|
@@ -35,26 +35,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
35
35
|
};
|
|
36
36
|
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
37
37
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
38
|
-
var __async = (__this, __arguments, generator) => {
|
|
39
|
-
return new Promise((resolve, reject) => {
|
|
40
|
-
var fulfilled = (value) => {
|
|
41
|
-
try {
|
|
42
|
-
step(generator.next(value));
|
|
43
|
-
} catch (e) {
|
|
44
|
-
reject(e);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
var rejected = (value) => {
|
|
48
|
-
try {
|
|
49
|
-
step(generator.throw(value));
|
|
50
|
-
} catch (e) {
|
|
51
|
-
reject(e);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
55
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
38
|
var __await = function(promise, isYieldStar) {
|
|
59
39
|
this[0] = promise;
|
|
60
40
|
this[1] = isYieldStar;
|
|
@@ -86,22 +66,20 @@ var import_e2b3 = require("e2b");
|
|
|
86
66
|
|
|
87
67
|
// src/messaging.ts
|
|
88
68
|
var import_e2b = require("e2b");
|
|
89
|
-
function extractError(res) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
});
|
|
69
|
+
async function extractError(res) {
|
|
70
|
+
if (res.ok) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
switch (res.status) {
|
|
74
|
+
case 502:
|
|
75
|
+
return new import_e2b.TimeoutError(
|
|
76
|
+
`${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`
|
|
77
|
+
);
|
|
78
|
+
case 404:
|
|
79
|
+
return new import_e2b.NotFoundError(await res.text());
|
|
80
|
+
default:
|
|
81
|
+
return new import_e2b.SandboxError(`${res.status} ${res.statusText}`);
|
|
82
|
+
}
|
|
105
83
|
}
|
|
106
84
|
var ExecutionError = class {
|
|
107
85
|
constructor(name, value, traceback) {
|
|
@@ -240,51 +218,49 @@ var Execution = class {
|
|
|
240
218
|
};
|
|
241
219
|
}
|
|
242
220
|
};
|
|
243
|
-
function parseOutput(execution, line, onStdout, onStderr, onResult, onError) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
287
|
-
});
|
|
221
|
+
async function parseOutput(execution, line, onStdout, onStderr, onResult, onError) {
|
|
222
|
+
const msg = JSON.parse(line);
|
|
223
|
+
switch (msg.type) {
|
|
224
|
+
case "result":
|
|
225
|
+
const result = new Result(
|
|
226
|
+
__spreadProps(__spreadValues({}, msg), { type: void 0, is_main_result: void 0 }),
|
|
227
|
+
msg.is_main_result
|
|
228
|
+
);
|
|
229
|
+
execution.results.push(result);
|
|
230
|
+
if (onResult) {
|
|
231
|
+
await onResult(result);
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
234
|
+
case "stdout":
|
|
235
|
+
execution.logs.stdout.push(msg.text);
|
|
236
|
+
if (onStdout) {
|
|
237
|
+
await onStdout({
|
|
238
|
+
error: false,
|
|
239
|
+
line: msg.text,
|
|
240
|
+
timestamp: (/* @__PURE__ */ new Date()).getTime() * 1e3
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
case "stderr":
|
|
245
|
+
execution.logs.stderr.push(msg.text);
|
|
246
|
+
if (onStderr) {
|
|
247
|
+
await onStderr({
|
|
248
|
+
error: true,
|
|
249
|
+
line: msg.text,
|
|
250
|
+
timestamp: (/* @__PURE__ */ new Date()).getTime() * 1e3
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
break;
|
|
254
|
+
case "error":
|
|
255
|
+
execution.error = new ExecutionError(msg.name, msg.value, msg.traceback);
|
|
256
|
+
if (onError) {
|
|
257
|
+
await onError(execution.error);
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
case "number_of_executions":
|
|
261
|
+
execution.executionCount = msg.execution_count;
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
288
264
|
}
|
|
289
265
|
|
|
290
266
|
// src/utils.ts
|
|
@@ -338,71 +314,69 @@ var JUPYTER_PORT = 49999;
|
|
|
338
314
|
|
|
339
315
|
// src/sandbox.ts
|
|
340
316
|
var Sandbox = class extends import_e2b3.Sandbox {
|
|
341
|
-
runCode(code, opts) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
317
|
+
async runCode(code, opts) {
|
|
318
|
+
var _a, _b, _c;
|
|
319
|
+
if ((opts == null ? void 0 : opts.context) && (opts == null ? void 0 : opts.language)) {
|
|
320
|
+
throw new import_e2b3.InvalidArgumentError("You can provide context or language, but not both at the same time.");
|
|
321
|
+
}
|
|
322
|
+
const controller = new AbortController();
|
|
323
|
+
const requestTimeout = (_a = opts == null ? void 0 : opts.requestTimeoutMs) != null ? _a : this.connectionConfig.requestTimeoutMs;
|
|
324
|
+
const reqTimer = requestTimeout ? setTimeout(() => {
|
|
325
|
+
controller.abort();
|
|
326
|
+
}, requestTimeout) : void 0;
|
|
327
|
+
try {
|
|
328
|
+
const res = await fetch(`${this.jupyterUrl}/execute`, {
|
|
329
|
+
method: "POST",
|
|
330
|
+
headers: {
|
|
331
|
+
"Content-Type": "application/json"
|
|
332
|
+
},
|
|
333
|
+
body: JSON.stringify({
|
|
334
|
+
code,
|
|
335
|
+
context_id: (_b = opts == null ? void 0 : opts.context) == null ? void 0 : _b.id,
|
|
336
|
+
language: opts == null ? void 0 : opts.language,
|
|
337
|
+
env_vars: opts == null ? void 0 : opts.envs
|
|
338
|
+
}),
|
|
339
|
+
signal: controller.signal,
|
|
340
|
+
keepalive: true
|
|
341
|
+
});
|
|
342
|
+
const error2 = await extractError(res);
|
|
343
|
+
if (error2) {
|
|
344
|
+
throw error2;
|
|
345
|
+
}
|
|
346
|
+
if (!res.body) {
|
|
347
|
+
throw new Error(`Not response body: ${res.statusText} ${await (res == null ? void 0 : res.text())}`);
|
|
346
348
|
}
|
|
347
|
-
|
|
348
|
-
const
|
|
349
|
-
const
|
|
349
|
+
clearTimeout(reqTimer);
|
|
350
|
+
const bodyTimeout = (_c = opts == null ? void 0 : opts.timeoutMs) != null ? _c : DEFAULT_TIMEOUT_MS;
|
|
351
|
+
const bodyTimer = bodyTimeout ? setTimeout(() => {
|
|
350
352
|
controller.abort();
|
|
351
|
-
},
|
|
353
|
+
}, bodyTimeout) : void 0;
|
|
354
|
+
const execution = new Execution();
|
|
352
355
|
try {
|
|
353
|
-
const res = yield fetch(`${this.jupyterUrl}/execute`, {
|
|
354
|
-
method: "POST",
|
|
355
|
-
headers: {
|
|
356
|
-
"Content-Type": "application/json"
|
|
357
|
-
},
|
|
358
|
-
body: JSON.stringify({
|
|
359
|
-
code,
|
|
360
|
-
context_id: (_b = opts == null ? void 0 : opts.context) == null ? void 0 : _b.id,
|
|
361
|
-
language: opts == null ? void 0 : opts.language,
|
|
362
|
-
env_vars: opts == null ? void 0 : opts.envs
|
|
363
|
-
}),
|
|
364
|
-
signal: controller.signal,
|
|
365
|
-
keepalive: true
|
|
366
|
-
});
|
|
367
|
-
const error2 = yield extractError(res);
|
|
368
|
-
if (error2) {
|
|
369
|
-
throw error2;
|
|
370
|
-
}
|
|
371
|
-
if (!res.body) {
|
|
372
|
-
throw new Error(`Not response body: ${res.statusText} ${yield res == null ? void 0 : res.text()}`);
|
|
373
|
-
}
|
|
374
|
-
clearTimeout(reqTimer);
|
|
375
|
-
const bodyTimeout = (_c = opts == null ? void 0 : opts.timeoutMs) != null ? _c : DEFAULT_TIMEOUT_MS;
|
|
376
|
-
const bodyTimer = bodyTimeout ? setTimeout(() => {
|
|
377
|
-
controller.abort();
|
|
378
|
-
}, bodyTimeout) : void 0;
|
|
379
|
-
const execution = new Execution();
|
|
380
356
|
try {
|
|
357
|
+
for (var iter = __forAwait(readLines(res.body)), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
|
|
358
|
+
const chunk = temp.value;
|
|
359
|
+
await parseOutput(execution, chunk, opts == null ? void 0 : opts.onStdout, opts == null ? void 0 : opts.onStderr, opts == null ? void 0 : opts.onResult, opts == null ? void 0 : opts.onError);
|
|
360
|
+
}
|
|
361
|
+
} catch (temp) {
|
|
362
|
+
error = [temp];
|
|
363
|
+
} finally {
|
|
381
364
|
try {
|
|
382
|
-
|
|
383
|
-
const chunk = temp.value;
|
|
384
|
-
yield parseOutput(execution, chunk, opts == null ? void 0 : opts.onStdout, opts == null ? void 0 : opts.onStderr, opts == null ? void 0 : opts.onResult, opts == null ? void 0 : opts.onError);
|
|
385
|
-
}
|
|
386
|
-
} catch (temp) {
|
|
387
|
-
error = [temp];
|
|
365
|
+
more && (temp = iter.return) && await temp.call(iter);
|
|
388
366
|
} finally {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
} finally {
|
|
392
|
-
if (error)
|
|
393
|
-
throw error[0];
|
|
394
|
-
}
|
|
367
|
+
if (error)
|
|
368
|
+
throw error[0];
|
|
395
369
|
}
|
|
396
|
-
} catch (error3) {
|
|
397
|
-
throw formatExecutionTimeoutError(error3);
|
|
398
|
-
} finally {
|
|
399
|
-
clearTimeout(bodyTimer);
|
|
400
370
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
371
|
+
} catch (error3) {
|
|
372
|
+
throw formatExecutionTimeoutError(error3);
|
|
373
|
+
} finally {
|
|
374
|
+
clearTimeout(bodyTimer);
|
|
404
375
|
}
|
|
405
|
-
|
|
376
|
+
return execution;
|
|
377
|
+
} catch (error2) {
|
|
378
|
+
throw formatRequestTimeoutError(error2);
|
|
379
|
+
}
|
|
406
380
|
}
|
|
407
381
|
/**
|
|
408
382
|
* Creates a new context to run code in.
|
|
@@ -411,30 +385,28 @@ var Sandbox = class extends import_e2b3.Sandbox {
|
|
|
411
385
|
*
|
|
412
386
|
* @returns context object.
|
|
413
387
|
*/
|
|
414
|
-
createCodeContext(opts) {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
throw error;
|
|
432
|
-
}
|
|
433
|
-
return yield res.json();
|
|
434
|
-
} catch (error) {
|
|
435
|
-
throw formatRequestTimeoutError(error);
|
|
388
|
+
async createCodeContext(opts) {
|
|
389
|
+
try {
|
|
390
|
+
const res = await fetch(`${this.jupyterUrl}/contexts`, {
|
|
391
|
+
method: "POST",
|
|
392
|
+
headers: {
|
|
393
|
+
"Content-Type": "application/json"
|
|
394
|
+
},
|
|
395
|
+
body: JSON.stringify({
|
|
396
|
+
language: opts == null ? void 0 : opts.language,
|
|
397
|
+
cwd: opts == null ? void 0 : opts.cwd
|
|
398
|
+
}),
|
|
399
|
+
keepalive: true,
|
|
400
|
+
signal: this.connectionConfig.getSignal(opts == null ? void 0 : opts.requestTimeoutMs)
|
|
401
|
+
});
|
|
402
|
+
const error = await extractError(res);
|
|
403
|
+
if (error) {
|
|
404
|
+
throw error;
|
|
436
405
|
}
|
|
437
|
-
|
|
406
|
+
return await res.json();
|
|
407
|
+
} catch (error) {
|
|
408
|
+
throw formatRequestTimeoutError(error);
|
|
409
|
+
}
|
|
438
410
|
}
|
|
439
411
|
get jupyterUrl() {
|
|
440
412
|
return `${this.connectionConfig.debug ? "http" : "https"}://${this.getHost(JUPYTER_PORT)}`;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/sandbox.ts","../src/messaging.ts","../src/utils.ts","../src/consts.ts"],"sourcesContent":["export * from 'e2b'\n\nexport { Sandbox } from './sandbox'\nexport type { Context, RunCodeOpts, CreateCodeContextOpts } from './sandbox'\nexport type {\n Logs,\n ExecutionError,\n Result,\n Execution,\n MIMEType,\n RawData,\n OutputMessage,\n} from './messaging'\nexport type {\n ScaleType,\n ChartType,\n ChartTypes,\n Chart,\n BarChart,\n BarData,\n LineChart,\n ScatterChart,\n BoxAndWhiskerChart,\n BoxAndWhiskerData,\n PieChart,\n PieData,\n SuperChart,\n PointData,\n} from './charts'\nimport { Sandbox } from './sandbox'\n\nexport default Sandbox\n","import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b'\n\nimport { Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError } from './messaging'\nimport { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from \"./utils\";\nimport { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts'\n\n/**\n * Represents a context for code execution.\n */\nexport type Context = {\n /**\n * The ID of the context.\n */\n id: string\n /**\n * The language of the context.\n */\n language: string\n /**\n * The working directory of the context.\n */\n cwd: string\n}\n\n/**\n * Options for running code.\n */\nexport interface RunCodeOpts {\n /**\n * Callback for handling stdout messages.\n */\n onStdout?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling stderr messages.\n */\n onStderr?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling the final execution result.\n */\n onResult?: (data: Result) => (Promise<any> | any),\n /**\n * Callback for handling the `ExecutionError` object.\n */\n onError?: (error: ExecutionError) => (Promise<any> | any),\n /**\n * Custom environment variables for code execution.\n * \n * @default {}\n */\n envs?: Record<string, string>,\n /**\n * Timeout for the code execution in **milliseconds**.\n * \n * @default 60_000 // 60 seconds\n */\n timeoutMs?: number,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * Options for creating a code context.\n */\nexport interface CreateCodeContextOpts {\n /**\n * Working directory for the context.\n * \n * @default /home/user\n */\n cwd?: string,\n /**\n * Language for the context.\n * \n * @default python\n */\n language?: string,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * E2B cloud sandbox is a secure and isolated cloud environment.\n *\n * The sandbox allows you to:\n * - Access Linux OS\n * - Create, list, and delete files and directories\n * - Run commands\n * - Run isolated code\n * - Access the internet\n *\n * Check docs [here](https://e2b.dev/docs).\n *\n * Use {@link Sandbox.create} to create a new sandbox.\n *\n * @example\n * ```ts\n * import { Sandbox } from '@e2b/code-interpreter'\n *\n * const sandbox = await Sandbox.create()\n * ```\n */\nexport class Sandbox extends BaseSandbox {\n protected static override readonly defaultTemplate: string = 'code-interpreter-v1'\n\n /**\n * Run the code as Python.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: 'python',\n },\n ): Promise<Execution>\n /**\n * Run the code for the specified language.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * If no language is specified, Python is used.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: string,\n },\n ): Promise<Execution>\n /**\n * Runs the code in the specified context, if not specified, the default context is used.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code\n * \n * @returns `Execution` result object\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Context to run the code in.\n */\n context?: Context,\n },\n ): Promise<Execution>\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n language?: string,\n context?: Context,\n },\n ): Promise<Execution> {\n if (opts?.context && opts?.language) {\n throw new InvalidArgumentError(\"You can provide context or language, but not both at the same time.\")\n }\n\n const controller = new AbortController()\n\n const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n const reqTimer = requestTimeout ? setTimeout(() => {\n controller.abort()\n }, requestTimeout)\n : undefined\n\n try {\n const res = await fetch(`${this.jupyterUrl}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n context_id: opts?.context?.id,\n language: opts?.language,\n env_vars: opts?.envs,\n }),\n signal: controller.signal,\n keepalive: true,\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n if (!res.body) {\n throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`)\n }\n\n clearTimeout(reqTimer)\n\n const bodyTimeout = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n\n const bodyTimer = bodyTimeout\n ? setTimeout(() => {\n controller.abort()\n }, bodyTimeout)\n : undefined\n\n const execution = new Execution()\n\n\n try {\n for await (const chunk of readLines(res.body)) {\n await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult, opts?.onError)\n }\n } catch (error) {\n throw formatExecutionTimeoutError(error)\n } finally {\n clearTimeout(bodyTimer)\n }\n\n return execution\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n /**\n * Creates a new context to run code in.\n *\n * @param opts options for creating the context.\n * \n * @returns context object.\n */\n async createCodeContext(opts?: CreateCodeContextOpts): Promise<Context> {\n try {\n const res = await fetch(`${this.jupyterUrl}/contexts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n language: opts?.language,\n cwd: opts?.cwd,\n }),\n keepalive: true,\n signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n return await res.json()\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n protected get jupyterUrl(): string {\n return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}`\n }\n}\n","import { NotFoundError, SandboxError, TimeoutError } from 'e2b'\nimport { ChartTypes } from './charts'\n\nexport async function extractError(res: Response) {\n if (res.ok) {\n return\n }\n\n switch (res.status) {\n case 502:\n return new TimeoutError(\n `${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`\n )\n case 404:\n return new NotFoundError(await res.text())\n default:\n return new SandboxError(`${res.status} ${res.statusText}`)\n }\n}\n\n/**\n * Represents an output message from the sandbox code execution.\n */\nexport class OutputMessage {\n constructor(\n /**\n * The output line.\n */\n public readonly line: string,\n /**\n * Unix epoch in nanoseconds.\n */\n public readonly timestamp: number,\n /**\n * Whether the output is an error.\n */\n public readonly error: boolean\n ) { }\n\n public toString() {\n return this.line\n }\n}\n\n/**\n * Represents an error that occurred during the execution of a cell.\n * The error contains the name of the error, the value of the error, and the traceback.\n */\nexport class ExecutionError {\n constructor(\n /**\n * Name of the error.\n **/\n public name: string,\n /**\n * Value of the error.\n **/\n public value: string,\n /**\n * The raw traceback of the error.\n **/\n public traceback: string\n ) { }\n}\n\n/**\n * Represents a MIME type.\n */\nexport type MIMEType = string\n\n\ntype E2BData = {\n data: Record<string, unknown>\n chart: ChartTypes\n}\n\n/**\n * Dictionary that maps MIME types to their corresponding representations of the data.\n */\nexport type RawData = {\n [key: MIMEType]: string\n} & E2BData\n\n/**\n * Represents the data to be displayed as a result of executing a cell in a Jupyter notebook.\n * The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics\n *\n *\n * The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented\n * as a string, and the result can contain multiple types of data. The display calls don't have to have text representation,\n * for the actual result the representation is always present for the result, the other representations are always optional.\n */\nexport class Result {\n /**\n * Text representation of the result.\n */\n readonly text?: string\n /**\n * HTML representation of the data.\n */\n readonly html?: string\n /**\n * Markdown representation of the data.\n */\n readonly markdown?: string\n /**\n * SVG representation of the data.\n */\n readonly svg?: string\n /**\n * PNG representation of the data.\n */\n readonly png?: string\n /**\n * JPEG representation of the data.\n */\n readonly jpeg?: string\n /**\n * PDF representation of the data.\n */\n readonly pdf?: string\n /**\n * LaTeX representation of the data.\n */\n readonly latex?: string\n /**\n * JSON representation of the data.\n */\n readonly json?: string\n /**\n * JavaScript representation of the data.\n */\n readonly javascript?: string\n /**\n * Contains the data from DataFrame.\n */\n readonly data?: Record<string, unknown>\n /**\n * Contains the chart data.\n */\n readonly chart?: ChartTypes\n /**\n * Extra data that can be included. Not part of the standard types.\n */\n readonly extra?: any\n\n readonly raw: RawData\n\n constructor(rawData: RawData, public readonly isMainResult: boolean) {\n const data = { ...rawData }\n delete data['type']\n delete data['is_main_result']\n\n this.text = data['text']\n this.html = data['html']\n this.markdown = data['markdown']\n this.svg = data['svg']\n this.png = data['png']\n this.jpeg = data['jpeg']\n this.pdf = data['pdf']\n this.latex = data['latex']\n this.json = data['json']\n this.javascript = data['javascript']\n this.isMainResult = isMainResult\n this.raw = data\n\n this.data = data['data']\n this.chart = data['chart']\n\n this.extra = {}\n\n for (const key of Object.keys(data)) {\n if (\n ![\n 'plain',\n 'html',\n 'markdown',\n 'svg',\n 'png',\n 'jpeg',\n 'pdf',\n 'latex',\n 'json',\n 'javascript',\n 'data',\n 'chart',\n 'extra',\n \"text\"\n ].includes(key)\n ) {\n this.extra[key] = data[key]\n }\n }\n }\n\n /**\n * Returns all the formats available for the result.\n *\n * @returns Array of strings representing the formats available for the result.\n */\n formats(): string[] {\n const formats = []\n if (this.html) {\n formats.push('html')\n }\n if (this.markdown) {\n formats.push('markdown')\n }\n if (this.svg) {\n formats.push('svg')\n }\n if (this.png) {\n formats.push('png')\n }\n if (this.jpeg) {\n formats.push('jpeg')\n }\n if (this.pdf) {\n formats.push('pdf')\n }\n if (this.latex) {\n formats.push('latex')\n }\n if (this.json) {\n formats.push('json')\n }\n if (this.javascript) {\n formats.push('javascript')\n }\n if (this.data) {\n formats.push('data')\n }\n\n for (const key of Object.keys(this.extra)) {\n formats.push(key)\n }\n\n return formats\n }\n\n /**\n * Returns the serializable representation of the result.\n */\n toJSON() {\n return {\n text: this.text,\n html: this.html,\n markdown: this.markdown,\n svg: this.svg,\n png: this.png,\n jpeg: this.jpeg,\n pdf: this.pdf,\n latex: this.latex,\n json: this.json,\n javascript: this.javascript,\n ...(Object.keys(this.extra).length > 0 ? { extra: this.extra } : {}),\n }\n }\n}\n\n/**\n * Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc.\n */\nexport type Logs = {\n /**\n * List of strings printed to stdout by prints, subprocesses, etc.\n */\n stdout: string[]\n /**\n * List of strings printed to stderr by prints, subprocesses, etc.\n */\n stderr: string[]\n}\n\n/**\n * Represents the result of a cell execution.\n */\nexport class Execution {\n constructor(\n /**\n * List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).\n */\n public results: Result[] = [],\n /**\n * Logs printed to stdout and stderr during execution.\n */\n public logs: Logs = { stdout: [], stderr: [] },\n /**\n * An Error object if an error occurred, null otherwise.\n */\n public error?: ExecutionError,\n /**\n * Execution count of the cell.\n */\n public executionCount?: number\n ) { }\n\n /**\n * Returns the text representation of the main result of the cell.\n */\n get text(): string | undefined {\n for (const data of this.results) {\n if (data.isMainResult) {\n return data.text\n }\n }\n }\n\n /**\n * Returns the serializable representation of the execution result.\n */\n toJSON() {\n return {\n results: this.results,\n logs: this.logs,\n error: this.error,\n }\n }\n}\n\nexport async function parseOutput(\n execution: Execution,\n line: string,\n onStdout?: (output: OutputMessage) => Promise<any> | any,\n onStderr?: (output: OutputMessage) => Promise<any> | any,\n onResult?: (data: Result) => Promise<any> | any,\n onError?: (error: ExecutionError) => Promise<any> | any\n) {\n const msg = JSON.parse(line)\n\n switch (msg.type) {\n case 'result':\n const result = new Result(\n { ...msg, type: undefined, is_main_result: undefined },\n msg.is_main_result\n )\n execution.results.push(result)\n if (onResult) {\n await onResult(result)\n }\n break\n case 'stdout':\n execution.logs.stdout.push(msg.text)\n if (onStdout) {\n await onStdout({\n error: false,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'stderr':\n execution.logs.stderr.push(msg.text)\n if (onStderr) {\n await onStderr({\n error: true,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'error':\n execution.error = new ExecutionError(msg.name, msg.value, msg.traceback)\n if (onError) {\n await onError(execution.error)\n }\n break\n case 'number_of_executions':\n execution.executionCount = msg.execution_count\n break\n }\n}\n","import { TimeoutError } from 'e2b'\n\nexport function formatRequestTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Request timed out — the \\'requestTimeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport function formatExecutionTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Execution timed out — the \\'timeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport async function* readLines(stream: ReadableStream<Uint8Array>) {\n const reader = stream.getReader();\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (value !== undefined) {\n buffer += new TextDecoder().decode(value)\n }\n\n if (done) {\n if (buffer.length > 0) {\n yield buffer\n }\n break\n }\n\n let newlineIdx = -1\n\n do {\n newlineIdx = buffer.indexOf('\\n')\n if (newlineIdx !== -1) {\n yield buffer.slice(0, newlineIdx)\n buffer = buffer.slice(newlineIdx + 1)\n }\n } while (newlineIdx !== -1)\n }\n } finally {\n reader.releaseLock()\n }\n}\n","export const DEFAULT_TIMEOUT_MS = 60_000 // 1 minute\nexport const JUPYTER_PORT = 49999\n"],"mappings":"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","names":["import_e2b","import_e2b","BaseSandbox","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/sandbox.ts","../src/messaging.ts","../src/utils.ts","../src/consts.ts"],"sourcesContent":["export * from 'e2b'\n\nexport { Sandbox } from './sandbox'\nexport type { Context, RunCodeOpts, CreateCodeContextOpts } from './sandbox'\nexport type {\n Logs,\n ExecutionError,\n Result,\n Execution,\n MIMEType,\n RawData,\n OutputMessage,\n} from './messaging'\nexport type {\n ScaleType,\n ChartType,\n ChartTypes,\n Chart,\n BarChart,\n BarData,\n LineChart,\n ScatterChart,\n BoxAndWhiskerChart,\n BoxAndWhiskerData,\n PieChart,\n PieData,\n SuperChart,\n PointData,\n} from './charts'\nimport { Sandbox } from './sandbox'\n\nexport default Sandbox\n","import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b'\n\nimport { Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError } from './messaging'\nimport { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from \"./utils\";\nimport { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts'\n\n/**\n * Represents a context for code execution.\n */\nexport type Context = {\n /**\n * The ID of the context.\n */\n id: string\n /**\n * The language of the context.\n */\n language: string\n /**\n * The working directory of the context.\n */\n cwd: string\n}\n\n/**\n * Options for running code.\n */\nexport interface RunCodeOpts {\n /**\n * Callback for handling stdout messages.\n */\n onStdout?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling stderr messages.\n */\n onStderr?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling the final execution result.\n */\n onResult?: (data: Result) => (Promise<any> | any),\n /**\n * Callback for handling the `ExecutionError` object.\n */\n onError?: (error: ExecutionError) => (Promise<any> | any),\n /**\n * Custom environment variables for code execution.\n * \n * @default {}\n */\n envs?: Record<string, string>,\n /**\n * Timeout for the code execution in **milliseconds**.\n * \n * @default 60_000 // 60 seconds\n */\n timeoutMs?: number,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * Options for creating a code context.\n */\nexport interface CreateCodeContextOpts {\n /**\n * Working directory for the context.\n * \n * @default /home/user\n */\n cwd?: string,\n /**\n * Language for the context.\n * \n * @default python\n */\n language?: string,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * E2B cloud sandbox is a secure and isolated cloud environment.\n *\n * The sandbox allows you to:\n * - Access Linux OS\n * - Create, list, and delete files and directories\n * - Run commands\n * - Run isolated code\n * - Access the internet\n *\n * Check docs [here](https://e2b.dev/docs).\n *\n * Use {@link Sandbox.create} to create a new sandbox.\n *\n * @example\n * ```ts\n * import { Sandbox } from '@e2b/code-interpreter'\n *\n * const sandbox = await Sandbox.create()\n * ```\n */\nexport class Sandbox extends BaseSandbox {\n protected static override readonly defaultTemplate: string = 'code-interpreter-v1'\n\n /**\n * Run the code as Python.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: 'python',\n },\n ): Promise<Execution>\n /**\n * Run the code for the specified language.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * If no language is specified, Python is used.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: string,\n },\n ): Promise<Execution>\n /**\n * Runs the code in the specified context, if not specified, the default context is used.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code\n * \n * @returns `Execution` result object\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Context to run the code in.\n */\n context?: Context,\n },\n ): Promise<Execution>\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n language?: string,\n context?: Context,\n },\n ): Promise<Execution> {\n if (opts?.context && opts?.language) {\n throw new InvalidArgumentError(\"You can provide context or language, but not both at the same time.\")\n }\n\n const controller = new AbortController()\n\n const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n const reqTimer = requestTimeout ? setTimeout(() => {\n controller.abort()\n }, requestTimeout)\n : undefined\n\n try {\n const res = await fetch(`${this.jupyterUrl}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n context_id: opts?.context?.id,\n language: opts?.language,\n env_vars: opts?.envs,\n }),\n signal: controller.signal,\n keepalive: true,\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n if (!res.body) {\n throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`)\n }\n\n clearTimeout(reqTimer)\n\n const bodyTimeout = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n\n const bodyTimer = bodyTimeout\n ? setTimeout(() => {\n controller.abort()\n }, bodyTimeout)\n : undefined\n\n const execution = new Execution()\n\n\n try {\n for await (const chunk of readLines(res.body)) {\n await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult, opts?.onError)\n }\n } catch (error) {\n throw formatExecutionTimeoutError(error)\n } finally {\n clearTimeout(bodyTimer)\n }\n\n return execution\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n /**\n * Creates a new context to run code in.\n *\n * @param opts options for creating the context.\n * \n * @returns context object.\n */\n async createCodeContext(opts?: CreateCodeContextOpts): Promise<Context> {\n try {\n const res = await fetch(`${this.jupyterUrl}/contexts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n language: opts?.language,\n cwd: opts?.cwd,\n }),\n keepalive: true,\n signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n return await res.json()\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n protected get jupyterUrl(): string {\n return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}`\n }\n}\n","import { NotFoundError, SandboxError, TimeoutError } from 'e2b'\nimport { ChartTypes } from './charts'\n\nexport async function extractError(res: Response) {\n if (res.ok) {\n return\n }\n\n switch (res.status) {\n case 502:\n return new TimeoutError(\n `${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`\n )\n case 404:\n return new NotFoundError(await res.text())\n default:\n return new SandboxError(`${res.status} ${res.statusText}`)\n }\n}\n\n/**\n * Represents an output message from the sandbox code execution.\n */\nexport class OutputMessage {\n constructor(\n /**\n * The output line.\n */\n public readonly line: string,\n /**\n * Unix epoch in nanoseconds.\n */\n public readonly timestamp: number,\n /**\n * Whether the output is an error.\n */\n public readonly error: boolean\n ) { }\n\n public toString() {\n return this.line\n }\n}\n\n/**\n * Represents an error that occurred during the execution of a cell.\n * The error contains the name of the error, the value of the error, and the traceback.\n */\nexport class ExecutionError {\n constructor(\n /**\n * Name of the error.\n **/\n public name: string,\n /**\n * Value of the error.\n **/\n public value: string,\n /**\n * The raw traceback of the error.\n **/\n public traceback: string\n ) { }\n}\n\n/**\n * Represents a MIME type.\n */\nexport type MIMEType = string\n\n\ntype E2BData = {\n data: Record<string, unknown>\n chart: ChartTypes\n}\n\n/**\n * Dictionary that maps MIME types to their corresponding representations of the data.\n */\nexport type RawData = {\n [key: MIMEType]: string\n} & E2BData\n\n/**\n * Represents the data to be displayed as a result of executing a cell in a Jupyter notebook.\n * The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics\n *\n *\n * The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented\n * as a string, and the result can contain multiple types of data. The display calls don't have to have text representation,\n * for the actual result the representation is always present for the result, the other representations are always optional.\n */\nexport class Result {\n /**\n * Text representation of the result.\n */\n readonly text?: string\n /**\n * HTML representation of the data.\n */\n readonly html?: string\n /**\n * Markdown representation of the data.\n */\n readonly markdown?: string\n /**\n * SVG representation of the data.\n */\n readonly svg?: string\n /**\n * PNG representation of the data.\n */\n readonly png?: string\n /**\n * JPEG representation of the data.\n */\n readonly jpeg?: string\n /**\n * PDF representation of the data.\n */\n readonly pdf?: string\n /**\n * LaTeX representation of the data.\n */\n readonly latex?: string\n /**\n * JSON representation of the data.\n */\n readonly json?: string\n /**\n * JavaScript representation of the data.\n */\n readonly javascript?: string\n /**\n * Contains the data from DataFrame.\n */\n readonly data?: Record<string, unknown>\n /**\n * Contains the chart data.\n */\n readonly chart?: ChartTypes\n /**\n * Extra data that can be included. Not part of the standard types.\n */\n readonly extra?: any\n\n readonly raw: RawData\n\n constructor(rawData: RawData, public readonly isMainResult: boolean) {\n const data = { ...rawData }\n delete data['type']\n delete data['is_main_result']\n\n this.text = data['text']\n this.html = data['html']\n this.markdown = data['markdown']\n this.svg = data['svg']\n this.png = data['png']\n this.jpeg = data['jpeg']\n this.pdf = data['pdf']\n this.latex = data['latex']\n this.json = data['json']\n this.javascript = data['javascript']\n this.isMainResult = isMainResult\n this.raw = data\n\n this.data = data['data']\n this.chart = data['chart']\n\n this.extra = {}\n\n for (const key of Object.keys(data)) {\n if (\n ![\n 'plain',\n 'html',\n 'markdown',\n 'svg',\n 'png',\n 'jpeg',\n 'pdf',\n 'latex',\n 'json',\n 'javascript',\n 'data',\n 'chart',\n 'extra',\n \"text\"\n ].includes(key)\n ) {\n this.extra[key] = data[key]\n }\n }\n }\n\n /**\n * Returns all the formats available for the result.\n *\n * @returns Array of strings representing the formats available for the result.\n */\n formats(): string[] {\n const formats = []\n if (this.html) {\n formats.push('html')\n }\n if (this.markdown) {\n formats.push('markdown')\n }\n if (this.svg) {\n formats.push('svg')\n }\n if (this.png) {\n formats.push('png')\n }\n if (this.jpeg) {\n formats.push('jpeg')\n }\n if (this.pdf) {\n formats.push('pdf')\n }\n if (this.latex) {\n formats.push('latex')\n }\n if (this.json) {\n formats.push('json')\n }\n if (this.javascript) {\n formats.push('javascript')\n }\n if (this.data) {\n formats.push('data')\n }\n\n for (const key of Object.keys(this.extra)) {\n formats.push(key)\n }\n\n return formats\n }\n\n /**\n * Returns the serializable representation of the result.\n */\n toJSON() {\n return {\n text: this.text,\n html: this.html,\n markdown: this.markdown,\n svg: this.svg,\n png: this.png,\n jpeg: this.jpeg,\n pdf: this.pdf,\n latex: this.latex,\n json: this.json,\n javascript: this.javascript,\n ...(Object.keys(this.extra).length > 0 ? { extra: this.extra } : {}),\n }\n }\n}\n\n/**\n * Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc.\n */\nexport type Logs = {\n /**\n * List of strings printed to stdout by prints, subprocesses, etc.\n */\n stdout: string[]\n /**\n * List of strings printed to stderr by prints, subprocesses, etc.\n */\n stderr: string[]\n}\n\n/**\n * Represents the result of a cell execution.\n */\nexport class Execution {\n constructor(\n /**\n * List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).\n */\n public results: Result[] = [],\n /**\n * Logs printed to stdout and stderr during execution.\n */\n public logs: Logs = { stdout: [], stderr: [] },\n /**\n * An Error object if an error occurred, null otherwise.\n */\n public error?: ExecutionError,\n /**\n * Execution count of the cell.\n */\n public executionCount?: number\n ) { }\n\n /**\n * Returns the text representation of the main result of the cell.\n */\n get text(): string | undefined {\n for (const data of this.results) {\n if (data.isMainResult) {\n return data.text\n }\n }\n }\n\n /**\n * Returns the serializable representation of the execution result.\n */\n toJSON() {\n return {\n results: this.results,\n logs: this.logs,\n error: this.error,\n }\n }\n}\n\nexport async function parseOutput(\n execution: Execution,\n line: string,\n onStdout?: (output: OutputMessage) => Promise<any> | any,\n onStderr?: (output: OutputMessage) => Promise<any> | any,\n onResult?: (data: Result) => Promise<any> | any,\n onError?: (error: ExecutionError) => Promise<any> | any\n) {\n const msg = JSON.parse(line)\n\n switch (msg.type) {\n case 'result':\n const result = new Result(\n { ...msg, type: undefined, is_main_result: undefined },\n msg.is_main_result\n )\n execution.results.push(result)\n if (onResult) {\n await onResult(result)\n }\n break\n case 'stdout':\n execution.logs.stdout.push(msg.text)\n if (onStdout) {\n await onStdout({\n error: false,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'stderr':\n execution.logs.stderr.push(msg.text)\n if (onStderr) {\n await onStderr({\n error: true,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'error':\n execution.error = new ExecutionError(msg.name, msg.value, msg.traceback)\n if (onError) {\n await onError(execution.error)\n }\n break\n case 'number_of_executions':\n execution.executionCount = msg.execution_count\n break\n }\n}\n","import { TimeoutError } from 'e2b'\n\nexport function formatRequestTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Request timed out — the \\'requestTimeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport function formatExecutionTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Execution timed out — the \\'timeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport async function* readLines(stream: ReadableStream<Uint8Array>) {\n const reader = stream.getReader();\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (value !== undefined) {\n buffer += new TextDecoder().decode(value)\n }\n\n if (done) {\n if (buffer.length > 0) {\n yield buffer\n }\n break\n }\n\n let newlineIdx = -1\n\n do {\n newlineIdx = buffer.indexOf('\\n')\n if (newlineIdx !== -1) {\n yield buffer.slice(0, newlineIdx)\n buffer = buffer.slice(newlineIdx + 1)\n }\n } while (newlineIdx !== -1)\n }\n } finally {\n reader.releaseLock()\n }\n}\n","export const DEFAULT_TIMEOUT_MS = 60_000 // 1 minute\nexport const JUPYTER_PORT = 49999\n"],"mappings":"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","names":["import_e2b","import_e2b","BaseSandbox","error"]}
|
package/dist/index.mjs
CHANGED
|
@@ -18,26 +18,6 @@ var __spreadValues = (a, b) => {
|
|
|
18
18
|
return a;
|
|
19
19
|
};
|
|
20
20
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
-
var __async = (__this, __arguments, generator) => {
|
|
22
|
-
return new Promise((resolve, reject) => {
|
|
23
|
-
var fulfilled = (value) => {
|
|
24
|
-
try {
|
|
25
|
-
step(generator.next(value));
|
|
26
|
-
} catch (e) {
|
|
27
|
-
reject(e);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
var rejected = (value) => {
|
|
31
|
-
try {
|
|
32
|
-
step(generator.throw(value));
|
|
33
|
-
} catch (e) {
|
|
34
|
-
reject(e);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
38
|
-
step((generator = generator.apply(__this, __arguments)).next());
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
21
|
var __await = function(promise, isYieldStar) {
|
|
42
22
|
this[0] = promise;
|
|
43
23
|
this[1] = isYieldStar;
|
|
@@ -63,22 +43,20 @@ import { Sandbox as BaseSandbox, InvalidArgumentError } from "e2b";
|
|
|
63
43
|
|
|
64
44
|
// src/messaging.ts
|
|
65
45
|
import { NotFoundError, SandboxError, TimeoutError } from "e2b";
|
|
66
|
-
function extractError(res) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
});
|
|
46
|
+
async function extractError(res) {
|
|
47
|
+
if (res.ok) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
switch (res.status) {
|
|
51
|
+
case 502:
|
|
52
|
+
return new TimeoutError(
|
|
53
|
+
`${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`
|
|
54
|
+
);
|
|
55
|
+
case 404:
|
|
56
|
+
return new NotFoundError(await res.text());
|
|
57
|
+
default:
|
|
58
|
+
return new SandboxError(`${res.status} ${res.statusText}`);
|
|
59
|
+
}
|
|
82
60
|
}
|
|
83
61
|
var ExecutionError = class {
|
|
84
62
|
constructor(name, value, traceback) {
|
|
@@ -217,51 +195,49 @@ var Execution = class {
|
|
|
217
195
|
};
|
|
218
196
|
}
|
|
219
197
|
};
|
|
220
|
-
function parseOutput(execution, line, onStdout, onStderr, onResult, onError) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
264
|
-
});
|
|
198
|
+
async function parseOutput(execution, line, onStdout, onStderr, onResult, onError) {
|
|
199
|
+
const msg = JSON.parse(line);
|
|
200
|
+
switch (msg.type) {
|
|
201
|
+
case "result":
|
|
202
|
+
const result = new Result(
|
|
203
|
+
__spreadProps(__spreadValues({}, msg), { type: void 0, is_main_result: void 0 }),
|
|
204
|
+
msg.is_main_result
|
|
205
|
+
);
|
|
206
|
+
execution.results.push(result);
|
|
207
|
+
if (onResult) {
|
|
208
|
+
await onResult(result);
|
|
209
|
+
}
|
|
210
|
+
break;
|
|
211
|
+
case "stdout":
|
|
212
|
+
execution.logs.stdout.push(msg.text);
|
|
213
|
+
if (onStdout) {
|
|
214
|
+
await onStdout({
|
|
215
|
+
error: false,
|
|
216
|
+
line: msg.text,
|
|
217
|
+
timestamp: (/* @__PURE__ */ new Date()).getTime() * 1e3
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
case "stderr":
|
|
222
|
+
execution.logs.stderr.push(msg.text);
|
|
223
|
+
if (onStderr) {
|
|
224
|
+
await onStderr({
|
|
225
|
+
error: true,
|
|
226
|
+
line: msg.text,
|
|
227
|
+
timestamp: (/* @__PURE__ */ new Date()).getTime() * 1e3
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
break;
|
|
231
|
+
case "error":
|
|
232
|
+
execution.error = new ExecutionError(msg.name, msg.value, msg.traceback);
|
|
233
|
+
if (onError) {
|
|
234
|
+
await onError(execution.error);
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case "number_of_executions":
|
|
238
|
+
execution.executionCount = msg.execution_count;
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
265
241
|
}
|
|
266
242
|
|
|
267
243
|
// src/utils.ts
|
|
@@ -315,71 +291,69 @@ var JUPYTER_PORT = 49999;
|
|
|
315
291
|
|
|
316
292
|
// src/sandbox.ts
|
|
317
293
|
var Sandbox = class extends BaseSandbox {
|
|
318
|
-
runCode(code, opts) {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
294
|
+
async runCode(code, opts) {
|
|
295
|
+
var _a, _b, _c;
|
|
296
|
+
if ((opts == null ? void 0 : opts.context) && (opts == null ? void 0 : opts.language)) {
|
|
297
|
+
throw new InvalidArgumentError("You can provide context or language, but not both at the same time.");
|
|
298
|
+
}
|
|
299
|
+
const controller = new AbortController();
|
|
300
|
+
const requestTimeout = (_a = opts == null ? void 0 : opts.requestTimeoutMs) != null ? _a : this.connectionConfig.requestTimeoutMs;
|
|
301
|
+
const reqTimer = requestTimeout ? setTimeout(() => {
|
|
302
|
+
controller.abort();
|
|
303
|
+
}, requestTimeout) : void 0;
|
|
304
|
+
try {
|
|
305
|
+
const res = await fetch(`${this.jupyterUrl}/execute`, {
|
|
306
|
+
method: "POST",
|
|
307
|
+
headers: {
|
|
308
|
+
"Content-Type": "application/json"
|
|
309
|
+
},
|
|
310
|
+
body: JSON.stringify({
|
|
311
|
+
code,
|
|
312
|
+
context_id: (_b = opts == null ? void 0 : opts.context) == null ? void 0 : _b.id,
|
|
313
|
+
language: opts == null ? void 0 : opts.language,
|
|
314
|
+
env_vars: opts == null ? void 0 : opts.envs
|
|
315
|
+
}),
|
|
316
|
+
signal: controller.signal,
|
|
317
|
+
keepalive: true
|
|
318
|
+
});
|
|
319
|
+
const error2 = await extractError(res);
|
|
320
|
+
if (error2) {
|
|
321
|
+
throw error2;
|
|
322
|
+
}
|
|
323
|
+
if (!res.body) {
|
|
324
|
+
throw new Error(`Not response body: ${res.statusText} ${await (res == null ? void 0 : res.text())}`);
|
|
323
325
|
}
|
|
324
|
-
|
|
325
|
-
const
|
|
326
|
-
const
|
|
326
|
+
clearTimeout(reqTimer);
|
|
327
|
+
const bodyTimeout = (_c = opts == null ? void 0 : opts.timeoutMs) != null ? _c : DEFAULT_TIMEOUT_MS;
|
|
328
|
+
const bodyTimer = bodyTimeout ? setTimeout(() => {
|
|
327
329
|
controller.abort();
|
|
328
|
-
},
|
|
330
|
+
}, bodyTimeout) : void 0;
|
|
331
|
+
const execution = new Execution();
|
|
329
332
|
try {
|
|
330
|
-
const res = yield fetch(`${this.jupyterUrl}/execute`, {
|
|
331
|
-
method: "POST",
|
|
332
|
-
headers: {
|
|
333
|
-
"Content-Type": "application/json"
|
|
334
|
-
},
|
|
335
|
-
body: JSON.stringify({
|
|
336
|
-
code,
|
|
337
|
-
context_id: (_b = opts == null ? void 0 : opts.context) == null ? void 0 : _b.id,
|
|
338
|
-
language: opts == null ? void 0 : opts.language,
|
|
339
|
-
env_vars: opts == null ? void 0 : opts.envs
|
|
340
|
-
}),
|
|
341
|
-
signal: controller.signal,
|
|
342
|
-
keepalive: true
|
|
343
|
-
});
|
|
344
|
-
const error2 = yield extractError(res);
|
|
345
|
-
if (error2) {
|
|
346
|
-
throw error2;
|
|
347
|
-
}
|
|
348
|
-
if (!res.body) {
|
|
349
|
-
throw new Error(`Not response body: ${res.statusText} ${yield res == null ? void 0 : res.text()}`);
|
|
350
|
-
}
|
|
351
|
-
clearTimeout(reqTimer);
|
|
352
|
-
const bodyTimeout = (_c = opts == null ? void 0 : opts.timeoutMs) != null ? _c : DEFAULT_TIMEOUT_MS;
|
|
353
|
-
const bodyTimer = bodyTimeout ? setTimeout(() => {
|
|
354
|
-
controller.abort();
|
|
355
|
-
}, bodyTimeout) : void 0;
|
|
356
|
-
const execution = new Execution();
|
|
357
333
|
try {
|
|
334
|
+
for (var iter = __forAwait(readLines(res.body)), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
|
|
335
|
+
const chunk = temp.value;
|
|
336
|
+
await parseOutput(execution, chunk, opts == null ? void 0 : opts.onStdout, opts == null ? void 0 : opts.onStderr, opts == null ? void 0 : opts.onResult, opts == null ? void 0 : opts.onError);
|
|
337
|
+
}
|
|
338
|
+
} catch (temp) {
|
|
339
|
+
error = [temp];
|
|
340
|
+
} finally {
|
|
358
341
|
try {
|
|
359
|
-
|
|
360
|
-
const chunk = temp.value;
|
|
361
|
-
yield parseOutput(execution, chunk, opts == null ? void 0 : opts.onStdout, opts == null ? void 0 : opts.onStderr, opts == null ? void 0 : opts.onResult, opts == null ? void 0 : opts.onError);
|
|
362
|
-
}
|
|
363
|
-
} catch (temp) {
|
|
364
|
-
error = [temp];
|
|
342
|
+
more && (temp = iter.return) && await temp.call(iter);
|
|
365
343
|
} finally {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
} finally {
|
|
369
|
-
if (error)
|
|
370
|
-
throw error[0];
|
|
371
|
-
}
|
|
344
|
+
if (error)
|
|
345
|
+
throw error[0];
|
|
372
346
|
}
|
|
373
|
-
} catch (error3) {
|
|
374
|
-
throw formatExecutionTimeoutError(error3);
|
|
375
|
-
} finally {
|
|
376
|
-
clearTimeout(bodyTimer);
|
|
377
347
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
348
|
+
} catch (error3) {
|
|
349
|
+
throw formatExecutionTimeoutError(error3);
|
|
350
|
+
} finally {
|
|
351
|
+
clearTimeout(bodyTimer);
|
|
381
352
|
}
|
|
382
|
-
|
|
353
|
+
return execution;
|
|
354
|
+
} catch (error2) {
|
|
355
|
+
throw formatRequestTimeoutError(error2);
|
|
356
|
+
}
|
|
383
357
|
}
|
|
384
358
|
/**
|
|
385
359
|
* Creates a new context to run code in.
|
|
@@ -388,30 +362,28 @@ var Sandbox = class extends BaseSandbox {
|
|
|
388
362
|
*
|
|
389
363
|
* @returns context object.
|
|
390
364
|
*/
|
|
391
|
-
createCodeContext(opts) {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
throw error;
|
|
409
|
-
}
|
|
410
|
-
return yield res.json();
|
|
411
|
-
} catch (error) {
|
|
412
|
-
throw formatRequestTimeoutError(error);
|
|
365
|
+
async createCodeContext(opts) {
|
|
366
|
+
try {
|
|
367
|
+
const res = await fetch(`${this.jupyterUrl}/contexts`, {
|
|
368
|
+
method: "POST",
|
|
369
|
+
headers: {
|
|
370
|
+
"Content-Type": "application/json"
|
|
371
|
+
},
|
|
372
|
+
body: JSON.stringify({
|
|
373
|
+
language: opts == null ? void 0 : opts.language,
|
|
374
|
+
cwd: opts == null ? void 0 : opts.cwd
|
|
375
|
+
}),
|
|
376
|
+
keepalive: true,
|
|
377
|
+
signal: this.connectionConfig.getSignal(opts == null ? void 0 : opts.requestTimeoutMs)
|
|
378
|
+
});
|
|
379
|
+
const error = await extractError(res);
|
|
380
|
+
if (error) {
|
|
381
|
+
throw error;
|
|
413
382
|
}
|
|
414
|
-
|
|
383
|
+
return await res.json();
|
|
384
|
+
} catch (error) {
|
|
385
|
+
throw formatRequestTimeoutError(error);
|
|
386
|
+
}
|
|
415
387
|
}
|
|
416
388
|
get jupyterUrl() {
|
|
417
389
|
return `${this.connectionConfig.debug ? "http" : "https"}://${this.getHost(JUPYTER_PORT)}`;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/sandbox.ts","../src/messaging.ts","../src/utils.ts","../src/consts.ts"],"sourcesContent":["export * from 'e2b'\n\nexport { Sandbox } from './sandbox'\nexport type { Context, RunCodeOpts, CreateCodeContextOpts } from './sandbox'\nexport type {\n Logs,\n ExecutionError,\n Result,\n Execution,\n MIMEType,\n RawData,\n OutputMessage,\n} from './messaging'\nexport type {\n ScaleType,\n ChartType,\n ChartTypes,\n Chart,\n BarChart,\n BarData,\n LineChart,\n ScatterChart,\n BoxAndWhiskerChart,\n BoxAndWhiskerData,\n PieChart,\n PieData,\n SuperChart,\n PointData,\n} from './charts'\nimport { Sandbox } from './sandbox'\n\nexport default Sandbox\n","import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b'\n\nimport { Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError } from './messaging'\nimport { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from \"./utils\";\nimport { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts'\n\n/**\n * Represents a context for code execution.\n */\nexport type Context = {\n /**\n * The ID of the context.\n */\n id: string\n /**\n * The language of the context.\n */\n language: string\n /**\n * The working directory of the context.\n */\n cwd: string\n}\n\n/**\n * Options for running code.\n */\nexport interface RunCodeOpts {\n /**\n * Callback for handling stdout messages.\n */\n onStdout?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling stderr messages.\n */\n onStderr?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling the final execution result.\n */\n onResult?: (data: Result) => (Promise<any> | any),\n /**\n * Callback for handling the `ExecutionError` object.\n */\n onError?: (error: ExecutionError) => (Promise<any> | any),\n /**\n * Custom environment variables for code execution.\n * \n * @default {}\n */\n envs?: Record<string, string>,\n /**\n * Timeout for the code execution in **milliseconds**.\n * \n * @default 60_000 // 60 seconds\n */\n timeoutMs?: number,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * Options for creating a code context.\n */\nexport interface CreateCodeContextOpts {\n /**\n * Working directory for the context.\n * \n * @default /home/user\n */\n cwd?: string,\n /**\n * Language for the context.\n * \n * @default python\n */\n language?: string,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * E2B cloud sandbox is a secure and isolated cloud environment.\n *\n * The sandbox allows you to:\n * - Access Linux OS\n * - Create, list, and delete files and directories\n * - Run commands\n * - Run isolated code\n * - Access the internet\n *\n * Check docs [here](https://e2b.dev/docs).\n *\n * Use {@link Sandbox.create} to create a new sandbox.\n *\n * @example\n * ```ts\n * import { Sandbox } from '@e2b/code-interpreter'\n *\n * const sandbox = await Sandbox.create()\n * ```\n */\nexport class Sandbox extends BaseSandbox {\n protected static override readonly defaultTemplate: string = 'code-interpreter-v1'\n\n /**\n * Run the code as Python.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: 'python',\n },\n ): Promise<Execution>\n /**\n * Run the code for the specified language.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * If no language is specified, Python is used.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: string,\n },\n ): Promise<Execution>\n /**\n * Runs the code in the specified context, if not specified, the default context is used.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code\n * \n * @returns `Execution` result object\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Context to run the code in.\n */\n context?: Context,\n },\n ): Promise<Execution>\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n language?: string,\n context?: Context,\n },\n ): Promise<Execution> {\n if (opts?.context && opts?.language) {\n throw new InvalidArgumentError(\"You can provide context or language, but not both at the same time.\")\n }\n\n const controller = new AbortController()\n\n const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n const reqTimer = requestTimeout ? setTimeout(() => {\n controller.abort()\n }, requestTimeout)\n : undefined\n\n try {\n const res = await fetch(`${this.jupyterUrl}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n context_id: opts?.context?.id,\n language: opts?.language,\n env_vars: opts?.envs,\n }),\n signal: controller.signal,\n keepalive: true,\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n if (!res.body) {\n throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`)\n }\n\n clearTimeout(reqTimer)\n\n const bodyTimeout = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n\n const bodyTimer = bodyTimeout\n ? setTimeout(() => {\n controller.abort()\n }, bodyTimeout)\n : undefined\n\n const execution = new Execution()\n\n\n try {\n for await (const chunk of readLines(res.body)) {\n await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult, opts?.onError)\n }\n } catch (error) {\n throw formatExecutionTimeoutError(error)\n } finally {\n clearTimeout(bodyTimer)\n }\n\n return execution\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n /**\n * Creates a new context to run code in.\n *\n * @param opts options for creating the context.\n * \n * @returns context object.\n */\n async createCodeContext(opts?: CreateCodeContextOpts): Promise<Context> {\n try {\n const res = await fetch(`${this.jupyterUrl}/contexts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n language: opts?.language,\n cwd: opts?.cwd,\n }),\n keepalive: true,\n signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n return await res.json()\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n protected get jupyterUrl(): string {\n return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}`\n }\n}\n","import { NotFoundError, SandboxError, TimeoutError } from 'e2b'\nimport { ChartTypes } from './charts'\n\nexport async function extractError(res: Response) {\n if (res.ok) {\n return\n }\n\n switch (res.status) {\n case 502:\n return new TimeoutError(\n `${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`\n )\n case 404:\n return new NotFoundError(await res.text())\n default:\n return new SandboxError(`${res.status} ${res.statusText}`)\n }\n}\n\n/**\n * Represents an output message from the sandbox code execution.\n */\nexport class OutputMessage {\n constructor(\n /**\n * The output line.\n */\n public readonly line: string,\n /**\n * Unix epoch in nanoseconds.\n */\n public readonly timestamp: number,\n /**\n * Whether the output is an error.\n */\n public readonly error: boolean\n ) { }\n\n public toString() {\n return this.line\n }\n}\n\n/**\n * Represents an error that occurred during the execution of a cell.\n * The error contains the name of the error, the value of the error, and the traceback.\n */\nexport class ExecutionError {\n constructor(\n /**\n * Name of the error.\n **/\n public name: string,\n /**\n * Value of the error.\n **/\n public value: string,\n /**\n * The raw traceback of the error.\n **/\n public traceback: string\n ) { }\n}\n\n/**\n * Represents a MIME type.\n */\nexport type MIMEType = string\n\n\ntype E2BData = {\n data: Record<string, unknown>\n chart: ChartTypes\n}\n\n/**\n * Dictionary that maps MIME types to their corresponding representations of the data.\n */\nexport type RawData = {\n [key: MIMEType]: string\n} & E2BData\n\n/**\n * Represents the data to be displayed as a result of executing a cell in a Jupyter notebook.\n * The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics\n *\n *\n * The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented\n * as a string, and the result can contain multiple types of data. The display calls don't have to have text representation,\n * for the actual result the representation is always present for the result, the other representations are always optional.\n */\nexport class Result {\n /**\n * Text representation of the result.\n */\n readonly text?: string\n /**\n * HTML representation of the data.\n */\n readonly html?: string\n /**\n * Markdown representation of the data.\n */\n readonly markdown?: string\n /**\n * SVG representation of the data.\n */\n readonly svg?: string\n /**\n * PNG representation of the data.\n */\n readonly png?: string\n /**\n * JPEG representation of the data.\n */\n readonly jpeg?: string\n /**\n * PDF representation of the data.\n */\n readonly pdf?: string\n /**\n * LaTeX representation of the data.\n */\n readonly latex?: string\n /**\n * JSON representation of the data.\n */\n readonly json?: string\n /**\n * JavaScript representation of the data.\n */\n readonly javascript?: string\n /**\n * Contains the data from DataFrame.\n */\n readonly data?: Record<string, unknown>\n /**\n * Contains the chart data.\n */\n readonly chart?: ChartTypes\n /**\n * Extra data that can be included. Not part of the standard types.\n */\n readonly extra?: any\n\n readonly raw: RawData\n\n constructor(rawData: RawData, public readonly isMainResult: boolean) {\n const data = { ...rawData }\n delete data['type']\n delete data['is_main_result']\n\n this.text = data['text']\n this.html = data['html']\n this.markdown = data['markdown']\n this.svg = data['svg']\n this.png = data['png']\n this.jpeg = data['jpeg']\n this.pdf = data['pdf']\n this.latex = data['latex']\n this.json = data['json']\n this.javascript = data['javascript']\n this.isMainResult = isMainResult\n this.raw = data\n\n this.data = data['data']\n this.chart = data['chart']\n\n this.extra = {}\n\n for (const key of Object.keys(data)) {\n if (\n ![\n 'plain',\n 'html',\n 'markdown',\n 'svg',\n 'png',\n 'jpeg',\n 'pdf',\n 'latex',\n 'json',\n 'javascript',\n 'data',\n 'chart',\n 'extra',\n \"text\"\n ].includes(key)\n ) {\n this.extra[key] = data[key]\n }\n }\n }\n\n /**\n * Returns all the formats available for the result.\n *\n * @returns Array of strings representing the formats available for the result.\n */\n formats(): string[] {\n const formats = []\n if (this.html) {\n formats.push('html')\n }\n if (this.markdown) {\n formats.push('markdown')\n }\n if (this.svg) {\n formats.push('svg')\n }\n if (this.png) {\n formats.push('png')\n }\n if (this.jpeg) {\n formats.push('jpeg')\n }\n if (this.pdf) {\n formats.push('pdf')\n }\n if (this.latex) {\n formats.push('latex')\n }\n if (this.json) {\n formats.push('json')\n }\n if (this.javascript) {\n formats.push('javascript')\n }\n if (this.data) {\n formats.push('data')\n }\n\n for (const key of Object.keys(this.extra)) {\n formats.push(key)\n }\n\n return formats\n }\n\n /**\n * Returns the serializable representation of the result.\n */\n toJSON() {\n return {\n text: this.text,\n html: this.html,\n markdown: this.markdown,\n svg: this.svg,\n png: this.png,\n jpeg: this.jpeg,\n pdf: this.pdf,\n latex: this.latex,\n json: this.json,\n javascript: this.javascript,\n ...(Object.keys(this.extra).length > 0 ? { extra: this.extra } : {}),\n }\n }\n}\n\n/**\n * Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc.\n */\nexport type Logs = {\n /**\n * List of strings printed to stdout by prints, subprocesses, etc.\n */\n stdout: string[]\n /**\n * List of strings printed to stderr by prints, subprocesses, etc.\n */\n stderr: string[]\n}\n\n/**\n * Represents the result of a cell execution.\n */\nexport class Execution {\n constructor(\n /**\n * List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).\n */\n public results: Result[] = [],\n /**\n * Logs printed to stdout and stderr during execution.\n */\n public logs: Logs = { stdout: [], stderr: [] },\n /**\n * An Error object if an error occurred, null otherwise.\n */\n public error?: ExecutionError,\n /**\n * Execution count of the cell.\n */\n public executionCount?: number\n ) { }\n\n /**\n * Returns the text representation of the main result of the cell.\n */\n get text(): string | undefined {\n for (const data of this.results) {\n if (data.isMainResult) {\n return data.text\n }\n }\n }\n\n /**\n * Returns the serializable representation of the execution result.\n */\n toJSON() {\n return {\n results: this.results,\n logs: this.logs,\n error: this.error,\n }\n }\n}\n\nexport async function parseOutput(\n execution: Execution,\n line: string,\n onStdout?: (output: OutputMessage) => Promise<any> | any,\n onStderr?: (output: OutputMessage) => Promise<any> | any,\n onResult?: (data: Result) => Promise<any> | any,\n onError?: (error: ExecutionError) => Promise<any> | any\n) {\n const msg = JSON.parse(line)\n\n switch (msg.type) {\n case 'result':\n const result = new Result(\n { ...msg, type: undefined, is_main_result: undefined },\n msg.is_main_result\n )\n execution.results.push(result)\n if (onResult) {\n await onResult(result)\n }\n break\n case 'stdout':\n execution.logs.stdout.push(msg.text)\n if (onStdout) {\n await onStdout({\n error: false,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'stderr':\n execution.logs.stderr.push(msg.text)\n if (onStderr) {\n await onStderr({\n error: true,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'error':\n execution.error = new ExecutionError(msg.name, msg.value, msg.traceback)\n if (onError) {\n await onError(execution.error)\n }\n break\n case 'number_of_executions':\n execution.executionCount = msg.execution_count\n break\n }\n}\n","import { TimeoutError } from 'e2b'\n\nexport function formatRequestTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Request timed out — the \\'requestTimeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport function formatExecutionTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Execution timed out — the \\'timeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport async function* readLines(stream: ReadableStream<Uint8Array>) {\n const reader = stream.getReader();\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (value !== undefined) {\n buffer += new TextDecoder().decode(value)\n }\n\n if (done) {\n if (buffer.length > 0) {\n yield buffer\n }\n break\n }\n\n let newlineIdx = -1\n\n do {\n newlineIdx = buffer.indexOf('\\n')\n if (newlineIdx !== -1) {\n yield buffer.slice(0, newlineIdx)\n buffer = buffer.slice(newlineIdx + 1)\n }\n } while (newlineIdx !== -1)\n }\n } finally {\n reader.releaseLock()\n }\n}\n","export const DEFAULT_TIMEOUT_MS = 60_000 // 1 minute\nexport const JUPYTER_PORT = 49999\n"],"mappings":"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","names":["TimeoutError","TimeoutError","error"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/sandbox.ts","../src/messaging.ts","../src/utils.ts","../src/consts.ts"],"sourcesContent":["export * from 'e2b'\n\nexport { Sandbox } from './sandbox'\nexport type { Context, RunCodeOpts, CreateCodeContextOpts } from './sandbox'\nexport type {\n Logs,\n ExecutionError,\n Result,\n Execution,\n MIMEType,\n RawData,\n OutputMessage,\n} from './messaging'\nexport type {\n ScaleType,\n ChartType,\n ChartTypes,\n Chart,\n BarChart,\n BarData,\n LineChart,\n ScatterChart,\n BoxAndWhiskerChart,\n BoxAndWhiskerData,\n PieChart,\n PieData,\n SuperChart,\n PointData,\n} from './charts'\nimport { Sandbox } from './sandbox'\n\nexport default Sandbox\n","import { Sandbox as BaseSandbox, InvalidArgumentError } from 'e2b'\n\nimport { Result, Execution, OutputMessage, parseOutput, extractError, ExecutionError } from './messaging'\nimport { formatExecutionTimeoutError, formatRequestTimeoutError, readLines } from \"./utils\";\nimport { JUPYTER_PORT, DEFAULT_TIMEOUT_MS } from './consts'\n\n/**\n * Represents a context for code execution.\n */\nexport type Context = {\n /**\n * The ID of the context.\n */\n id: string\n /**\n * The language of the context.\n */\n language: string\n /**\n * The working directory of the context.\n */\n cwd: string\n}\n\n/**\n * Options for running code.\n */\nexport interface RunCodeOpts {\n /**\n * Callback for handling stdout messages.\n */\n onStdout?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling stderr messages.\n */\n onStderr?: (output: OutputMessage) => (Promise<any> | any),\n /**\n * Callback for handling the final execution result.\n */\n onResult?: (data: Result) => (Promise<any> | any),\n /**\n * Callback for handling the `ExecutionError` object.\n */\n onError?: (error: ExecutionError) => (Promise<any> | any),\n /**\n * Custom environment variables for code execution.\n * \n * @default {}\n */\n envs?: Record<string, string>,\n /**\n * Timeout for the code execution in **milliseconds**.\n * \n * @default 60_000 // 60 seconds\n */\n timeoutMs?: number,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * Options for creating a code context.\n */\nexport interface CreateCodeContextOpts {\n /**\n * Working directory for the context.\n * \n * @default /home/user\n */\n cwd?: string,\n /**\n * Language for the context.\n * \n * @default python\n */\n language?: string,\n /**\n * Timeout for the request in **milliseconds**.\n * \n * @default 30_000 // 30 seconds\n */\n requestTimeoutMs?: number,\n}\n\n/**\n * E2B cloud sandbox is a secure and isolated cloud environment.\n *\n * The sandbox allows you to:\n * - Access Linux OS\n * - Create, list, and delete files and directories\n * - Run commands\n * - Run isolated code\n * - Access the internet\n *\n * Check docs [here](https://e2b.dev/docs).\n *\n * Use {@link Sandbox.create} to create a new sandbox.\n *\n * @example\n * ```ts\n * import { Sandbox } from '@e2b/code-interpreter'\n *\n * const sandbox = await Sandbox.create()\n * ```\n */\nexport class Sandbox extends BaseSandbox {\n protected static override readonly defaultTemplate: string = 'code-interpreter-v1'\n\n /**\n * Run the code as Python.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: 'python',\n },\n ): Promise<Execution>\n /**\n * Run the code for the specified language.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * If no language is specified, Python is used.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code.\n * \n * @returns `Execution` result object.\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Language to use for code execution.\n * \n * If not defined, the default Python context is used.\n */\n language?: string,\n },\n ): Promise<Execution>\n /**\n * Runs the code in the specified context, if not specified, the default context is used.\n * \n * Specify the `language` or `context` option to run the code as a different language or in a different `Context`.\n * \n * You can reference previously defined variables, imports, and functions in the code.\n *\n * @param code code to execute.\n * @param opts options for executing the code\n * \n * @returns `Execution` result object\n */\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n /**\n * Context to run the code in.\n */\n context?: Context,\n },\n ): Promise<Execution>\n async runCode(\n code: string,\n opts?: RunCodeOpts & {\n language?: string,\n context?: Context,\n },\n ): Promise<Execution> {\n if (opts?.context && opts?.language) {\n throw new InvalidArgumentError(\"You can provide context or language, but not both at the same time.\")\n }\n\n const controller = new AbortController()\n\n const requestTimeout = opts?.requestTimeoutMs ?? this.connectionConfig.requestTimeoutMs\n\n const reqTimer = requestTimeout ? setTimeout(() => {\n controller.abort()\n }, requestTimeout)\n : undefined\n\n try {\n const res = await fetch(`${this.jupyterUrl}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n code,\n context_id: opts?.context?.id,\n language: opts?.language,\n env_vars: opts?.envs,\n }),\n signal: controller.signal,\n keepalive: true,\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n if (!res.body) {\n throw new Error(`Not response body: ${res.statusText} ${await res?.text()}`)\n }\n\n clearTimeout(reqTimer)\n\n const bodyTimeout = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS\n\n const bodyTimer = bodyTimeout\n ? setTimeout(() => {\n controller.abort()\n }, bodyTimeout)\n : undefined\n\n const execution = new Execution()\n\n\n try {\n for await (const chunk of readLines(res.body)) {\n await parseOutput(execution, chunk, opts?.onStdout, opts?.onStderr, opts?.onResult, opts?.onError)\n }\n } catch (error) {\n throw formatExecutionTimeoutError(error)\n } finally {\n clearTimeout(bodyTimer)\n }\n\n return execution\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n /**\n * Creates a new context to run code in.\n *\n * @param opts options for creating the context.\n * \n * @returns context object.\n */\n async createCodeContext(opts?: CreateCodeContextOpts): Promise<Context> {\n try {\n const res = await fetch(`${this.jupyterUrl}/contexts`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n language: opts?.language,\n cwd: opts?.cwd,\n }),\n keepalive: true,\n signal: this.connectionConfig.getSignal(opts?.requestTimeoutMs),\n })\n\n const error = await extractError(res)\n if (error) {\n throw error\n }\n\n return await res.json()\n } catch (error) {\n throw formatRequestTimeoutError(error)\n }\n }\n\n protected get jupyterUrl(): string {\n return `${this.connectionConfig.debug ? 'http' : 'https'}://${this.getHost(JUPYTER_PORT)}`\n }\n}\n","import { NotFoundError, SandboxError, TimeoutError } from 'e2b'\nimport { ChartTypes } from './charts'\n\nexport async function extractError(res: Response) {\n if (res.ok) {\n return\n }\n\n switch (res.status) {\n case 502:\n return new TimeoutError(\n `${await res.text()}: This error is likely due to sandbox timeout. You can modify the sandbox timeout by passing 'timeoutMs' when starting the sandbox or calling '.setTimeout' on the sandbox with the desired timeout.`\n )\n case 404:\n return new NotFoundError(await res.text())\n default:\n return new SandboxError(`${res.status} ${res.statusText}`)\n }\n}\n\n/**\n * Represents an output message from the sandbox code execution.\n */\nexport class OutputMessage {\n constructor(\n /**\n * The output line.\n */\n public readonly line: string,\n /**\n * Unix epoch in nanoseconds.\n */\n public readonly timestamp: number,\n /**\n * Whether the output is an error.\n */\n public readonly error: boolean\n ) { }\n\n public toString() {\n return this.line\n }\n}\n\n/**\n * Represents an error that occurred during the execution of a cell.\n * The error contains the name of the error, the value of the error, and the traceback.\n */\nexport class ExecutionError {\n constructor(\n /**\n * Name of the error.\n **/\n public name: string,\n /**\n * Value of the error.\n **/\n public value: string,\n /**\n * The raw traceback of the error.\n **/\n public traceback: string\n ) { }\n}\n\n/**\n * Represents a MIME type.\n */\nexport type MIMEType = string\n\n\ntype E2BData = {\n data: Record<string, unknown>\n chart: ChartTypes\n}\n\n/**\n * Dictionary that maps MIME types to their corresponding representations of the data.\n */\nexport type RawData = {\n [key: MIMEType]: string\n} & E2BData\n\n/**\n * Represents the data to be displayed as a result of executing a cell in a Jupyter notebook.\n * The result is similar to the structure returned by ipython kernel: https://ipython.readthedocs.io/en/stable/development/execution.html#execution-semantics\n *\n *\n * The result can contain multiple types of data, such as text, images, plots, etc. Each type of data is represented\n * as a string, and the result can contain multiple types of data. The display calls don't have to have text representation,\n * for the actual result the representation is always present for the result, the other representations are always optional.\n */\nexport class Result {\n /**\n * Text representation of the result.\n */\n readonly text?: string\n /**\n * HTML representation of the data.\n */\n readonly html?: string\n /**\n * Markdown representation of the data.\n */\n readonly markdown?: string\n /**\n * SVG representation of the data.\n */\n readonly svg?: string\n /**\n * PNG representation of the data.\n */\n readonly png?: string\n /**\n * JPEG representation of the data.\n */\n readonly jpeg?: string\n /**\n * PDF representation of the data.\n */\n readonly pdf?: string\n /**\n * LaTeX representation of the data.\n */\n readonly latex?: string\n /**\n * JSON representation of the data.\n */\n readonly json?: string\n /**\n * JavaScript representation of the data.\n */\n readonly javascript?: string\n /**\n * Contains the data from DataFrame.\n */\n readonly data?: Record<string, unknown>\n /**\n * Contains the chart data.\n */\n readonly chart?: ChartTypes\n /**\n * Extra data that can be included. Not part of the standard types.\n */\n readonly extra?: any\n\n readonly raw: RawData\n\n constructor(rawData: RawData, public readonly isMainResult: boolean) {\n const data = { ...rawData }\n delete data['type']\n delete data['is_main_result']\n\n this.text = data['text']\n this.html = data['html']\n this.markdown = data['markdown']\n this.svg = data['svg']\n this.png = data['png']\n this.jpeg = data['jpeg']\n this.pdf = data['pdf']\n this.latex = data['latex']\n this.json = data['json']\n this.javascript = data['javascript']\n this.isMainResult = isMainResult\n this.raw = data\n\n this.data = data['data']\n this.chart = data['chart']\n\n this.extra = {}\n\n for (const key of Object.keys(data)) {\n if (\n ![\n 'plain',\n 'html',\n 'markdown',\n 'svg',\n 'png',\n 'jpeg',\n 'pdf',\n 'latex',\n 'json',\n 'javascript',\n 'data',\n 'chart',\n 'extra',\n \"text\"\n ].includes(key)\n ) {\n this.extra[key] = data[key]\n }\n }\n }\n\n /**\n * Returns all the formats available for the result.\n *\n * @returns Array of strings representing the formats available for the result.\n */\n formats(): string[] {\n const formats = []\n if (this.html) {\n formats.push('html')\n }\n if (this.markdown) {\n formats.push('markdown')\n }\n if (this.svg) {\n formats.push('svg')\n }\n if (this.png) {\n formats.push('png')\n }\n if (this.jpeg) {\n formats.push('jpeg')\n }\n if (this.pdf) {\n formats.push('pdf')\n }\n if (this.latex) {\n formats.push('latex')\n }\n if (this.json) {\n formats.push('json')\n }\n if (this.javascript) {\n formats.push('javascript')\n }\n if (this.data) {\n formats.push('data')\n }\n\n for (const key of Object.keys(this.extra)) {\n formats.push(key)\n }\n\n return formats\n }\n\n /**\n * Returns the serializable representation of the result.\n */\n toJSON() {\n return {\n text: this.text,\n html: this.html,\n markdown: this.markdown,\n svg: this.svg,\n png: this.png,\n jpeg: this.jpeg,\n pdf: this.pdf,\n latex: this.latex,\n json: this.json,\n javascript: this.javascript,\n ...(Object.keys(this.extra).length > 0 ? { extra: this.extra } : {}),\n }\n }\n}\n\n/**\n * Data printed to stdout and stderr during execution, usually by print statements, logs, warnings, subprocesses, etc.\n */\nexport type Logs = {\n /**\n * List of strings printed to stdout by prints, subprocesses, etc.\n */\n stdout: string[]\n /**\n * List of strings printed to stderr by prints, subprocesses, etc.\n */\n stderr: string[]\n}\n\n/**\n * Represents the result of a cell execution.\n */\nexport class Execution {\n constructor(\n /**\n * List of result of the cell (interactively interpreted last line), display calls (e.g. matplotlib plots).\n */\n public results: Result[] = [],\n /**\n * Logs printed to stdout and stderr during execution.\n */\n public logs: Logs = { stdout: [], stderr: [] },\n /**\n * An Error object if an error occurred, null otherwise.\n */\n public error?: ExecutionError,\n /**\n * Execution count of the cell.\n */\n public executionCount?: number\n ) { }\n\n /**\n * Returns the text representation of the main result of the cell.\n */\n get text(): string | undefined {\n for (const data of this.results) {\n if (data.isMainResult) {\n return data.text\n }\n }\n }\n\n /**\n * Returns the serializable representation of the execution result.\n */\n toJSON() {\n return {\n results: this.results,\n logs: this.logs,\n error: this.error,\n }\n }\n}\n\nexport async function parseOutput(\n execution: Execution,\n line: string,\n onStdout?: (output: OutputMessage) => Promise<any> | any,\n onStderr?: (output: OutputMessage) => Promise<any> | any,\n onResult?: (data: Result) => Promise<any> | any,\n onError?: (error: ExecutionError) => Promise<any> | any\n) {\n const msg = JSON.parse(line)\n\n switch (msg.type) {\n case 'result':\n const result = new Result(\n { ...msg, type: undefined, is_main_result: undefined },\n msg.is_main_result\n )\n execution.results.push(result)\n if (onResult) {\n await onResult(result)\n }\n break\n case 'stdout':\n execution.logs.stdout.push(msg.text)\n if (onStdout) {\n await onStdout({\n error: false,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'stderr':\n execution.logs.stderr.push(msg.text)\n if (onStderr) {\n await onStderr({\n error: true,\n line: msg.text,\n timestamp: new Date().getTime() * 1000,\n })\n }\n break\n case 'error':\n execution.error = new ExecutionError(msg.name, msg.value, msg.traceback)\n if (onError) {\n await onError(execution.error)\n }\n break\n case 'number_of_executions':\n execution.executionCount = msg.execution_count\n break\n }\n}\n","import { TimeoutError } from 'e2b'\n\nexport function formatRequestTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Request timed out — the \\'requestTimeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport function formatExecutionTimeoutError(error: unknown) {\n if (error instanceof Error && error.name === 'AbortError') {\n return new TimeoutError('Execution timed out — the \\'timeoutMs\\' option can be used to increase this timeout')\n }\n\n return error\n}\n\nexport async function* readLines(stream: ReadableStream<Uint8Array>) {\n const reader = stream.getReader();\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (value !== undefined) {\n buffer += new TextDecoder().decode(value)\n }\n\n if (done) {\n if (buffer.length > 0) {\n yield buffer\n }\n break\n }\n\n let newlineIdx = -1\n\n do {\n newlineIdx = buffer.indexOf('\\n')\n if (newlineIdx !== -1) {\n yield buffer.slice(0, newlineIdx)\n buffer = buffer.slice(newlineIdx + 1)\n }\n } while (newlineIdx !== -1)\n }\n } finally {\n reader.releaseLock()\n }\n}\n","export const DEFAULT_TIMEOUT_MS = 60_000 // 1 minute\nexport const JUPYTER_PORT = 49999\n"],"mappings":"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","names":["TimeoutError","TimeoutError","error"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@e2b/code-interpreter",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"packageManager": "pnpm@8.7.6",
|
|
3
|
+
"version": "1.5.1",
|
|
5
4
|
"description": "E2B Code Interpreter - Stateful code execution",
|
|
6
5
|
"homepage": "https://e2b.dev",
|
|
7
6
|
"license": "MIT",
|
|
@@ -23,30 +22,16 @@
|
|
|
23
22
|
"main": "dist/index.js",
|
|
24
23
|
"module": "dist/index.mjs",
|
|
25
24
|
"types": "dist/index.d.ts",
|
|
26
|
-
"scripts": {
|
|
27
|
-
"prepublishOnly": "pnpm build",
|
|
28
|
-
"build": "tsc --noEmit && tsup",
|
|
29
|
-
"dev": "tsup --watch",
|
|
30
|
-
"test": "vitest run",
|
|
31
|
-
"test:coverage": "vitest run --coverage",
|
|
32
|
-
"check-deps": "knip",
|
|
33
|
-
"update-deps": "ncu -u && pnpm i",
|
|
34
|
-
"example": "npx tsx example.mts",
|
|
35
|
-
"test:bun": "bun test tests/runtimes/bun --env-file=.env",
|
|
36
|
-
"test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks",
|
|
37
|
-
"generate-ref": "./scripts/generate_sdk_ref.sh"
|
|
38
|
-
},
|
|
39
25
|
"devDependencies": {
|
|
40
26
|
"@types/node": "^18.18.6",
|
|
41
|
-
"@types/ws": "^8.5.10",
|
|
42
27
|
"dotenv": "^16.4.5",
|
|
43
28
|
"knip": "^5.25.1",
|
|
44
|
-
"npm-check-updates": "^
|
|
45
|
-
"tsup": "^8.
|
|
46
|
-
"typedoc": "
|
|
47
|
-
"typedoc-plugin-markdown": "
|
|
29
|
+
"npm-check-updates": "^17.1.14",
|
|
30
|
+
"tsup": "^8.4.0",
|
|
31
|
+
"typedoc": "0.26.8",
|
|
32
|
+
"typedoc-plugin-markdown": "4.2.7",
|
|
48
33
|
"typescript": "^5.5.3",
|
|
49
|
-
"vitest": "^
|
|
34
|
+
"vitest": "^3.0.9"
|
|
50
35
|
},
|
|
51
36
|
"files": [
|
|
52
37
|
"dist",
|
|
@@ -67,12 +52,24 @@
|
|
|
67
52
|
"vm"
|
|
68
53
|
],
|
|
69
54
|
"dependencies": {
|
|
70
|
-
"e2b": "1.
|
|
55
|
+
"e2b": "^1.4.0"
|
|
71
56
|
},
|
|
72
57
|
"engines": {
|
|
73
58
|
"node": ">=18"
|
|
74
59
|
},
|
|
75
60
|
"browserslist": [
|
|
76
61
|
"defaults"
|
|
77
|
-
]
|
|
78
|
-
|
|
62
|
+
],
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "tsc --noEmit && tsup",
|
|
65
|
+
"dev": "tsup --watch",
|
|
66
|
+
"test": "vitest run",
|
|
67
|
+
"test:coverage": "vitest run --coverage",
|
|
68
|
+
"check-deps": "knip",
|
|
69
|
+
"update-deps": "ncu -u && pnpm i",
|
|
70
|
+
"example": "npx tsx example.mts",
|
|
71
|
+
"test:bun": "bun test tests/runtimes/bun --env-file=.env",
|
|
72
|
+
"test:deno": "deno test tests/runtimes/deno/ --allow-net --allow-read --allow-env --unstable-sloppy-imports --trace-leaks",
|
|
73
|
+
"generate-ref": "./scripts/generate_sdk_ref.sh"
|
|
74
|
+
}
|
|
75
|
+
}
|