modal 0.3.8 → 0.3.10
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/dist/index.cjs +186 -54
- package/dist/index.d.cts +45 -1
- package/dist/index.d.ts +45 -1
- package/dist/index.js +185 -54
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -46,6 +46,7 @@ __export(index_exports, {
|
|
|
46
46
|
QueueFullError: () => QueueFullError,
|
|
47
47
|
RemoteError: () => RemoteError,
|
|
48
48
|
Sandbox: () => Sandbox2,
|
|
49
|
+
SandboxFile: () => SandboxFile,
|
|
49
50
|
Secret: () => Secret
|
|
50
51
|
});
|
|
51
52
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -38086,6 +38087,156 @@ ${result.exception}`
|
|
|
38086
38087
|
return new Image2(resp.imageId);
|
|
38087
38088
|
}
|
|
38088
38089
|
|
|
38090
|
+
// src/errors.ts
|
|
38091
|
+
var FunctionTimeoutError = class extends Error {
|
|
38092
|
+
constructor(message) {
|
|
38093
|
+
super(message);
|
|
38094
|
+
this.name = "FunctionTimeoutError";
|
|
38095
|
+
}
|
|
38096
|
+
};
|
|
38097
|
+
var RemoteError = class extends Error {
|
|
38098
|
+
constructor(message) {
|
|
38099
|
+
super(message);
|
|
38100
|
+
this.name = "RemoteError";
|
|
38101
|
+
}
|
|
38102
|
+
};
|
|
38103
|
+
var InternalFailure = class extends Error {
|
|
38104
|
+
constructor(message) {
|
|
38105
|
+
super(message);
|
|
38106
|
+
this.name = "InternalFailure";
|
|
38107
|
+
}
|
|
38108
|
+
};
|
|
38109
|
+
var NotFoundError = class extends Error {
|
|
38110
|
+
constructor(message) {
|
|
38111
|
+
super(message);
|
|
38112
|
+
this.name = "NotFoundError";
|
|
38113
|
+
}
|
|
38114
|
+
};
|
|
38115
|
+
var InvalidError = class extends Error {
|
|
38116
|
+
constructor(message) {
|
|
38117
|
+
super(message);
|
|
38118
|
+
this.name = "InvalidError";
|
|
38119
|
+
}
|
|
38120
|
+
};
|
|
38121
|
+
var QueueEmptyError = class extends Error {
|
|
38122
|
+
constructor(message) {
|
|
38123
|
+
super(message);
|
|
38124
|
+
this.name = "QueueEmptyError";
|
|
38125
|
+
}
|
|
38126
|
+
};
|
|
38127
|
+
var QueueFullError = class extends Error {
|
|
38128
|
+
constructor(message) {
|
|
38129
|
+
super(message);
|
|
38130
|
+
this.name = "QueueFullError";
|
|
38131
|
+
}
|
|
38132
|
+
};
|
|
38133
|
+
var SandboxFilesystemError = class extends Error {
|
|
38134
|
+
constructor(message) {
|
|
38135
|
+
super(message);
|
|
38136
|
+
this.name = "SandboxFilesystemError";
|
|
38137
|
+
}
|
|
38138
|
+
};
|
|
38139
|
+
|
|
38140
|
+
// src/sandbox_filesystem.ts
|
|
38141
|
+
var SandboxFile = class {
|
|
38142
|
+
#fileDescriptor;
|
|
38143
|
+
#taskId;
|
|
38144
|
+
/** @ignore */
|
|
38145
|
+
constructor(fileDescriptor, taskId) {
|
|
38146
|
+
this.#fileDescriptor = fileDescriptor;
|
|
38147
|
+
this.#taskId = taskId;
|
|
38148
|
+
}
|
|
38149
|
+
/**
|
|
38150
|
+
* Read data from the file.
|
|
38151
|
+
* @returns Promise that resolves to the read data as Uint8Array
|
|
38152
|
+
*/
|
|
38153
|
+
async read() {
|
|
38154
|
+
const resp = await runFilesystemExec({
|
|
38155
|
+
fileReadRequest: {
|
|
38156
|
+
fileDescriptor: this.#fileDescriptor
|
|
38157
|
+
},
|
|
38158
|
+
taskId: this.#taskId
|
|
38159
|
+
});
|
|
38160
|
+
const chunks = resp.chunks;
|
|
38161
|
+
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
38162
|
+
const result = new Uint8Array(totalLength);
|
|
38163
|
+
let offset = 0;
|
|
38164
|
+
for (const chunk of chunks) {
|
|
38165
|
+
result.set(chunk, offset);
|
|
38166
|
+
offset += chunk.length;
|
|
38167
|
+
}
|
|
38168
|
+
return result;
|
|
38169
|
+
}
|
|
38170
|
+
/**
|
|
38171
|
+
* Write data to the file.
|
|
38172
|
+
* @param data - Data to write (string or Uint8Array)
|
|
38173
|
+
*/
|
|
38174
|
+
async write(data) {
|
|
38175
|
+
await runFilesystemExec({
|
|
38176
|
+
fileWriteRequest: {
|
|
38177
|
+
fileDescriptor: this.#fileDescriptor,
|
|
38178
|
+
data
|
|
38179
|
+
},
|
|
38180
|
+
taskId: this.#taskId
|
|
38181
|
+
});
|
|
38182
|
+
}
|
|
38183
|
+
/**
|
|
38184
|
+
* Flush any buffered data to the file.
|
|
38185
|
+
*/
|
|
38186
|
+
async flush() {
|
|
38187
|
+
await runFilesystemExec({
|
|
38188
|
+
fileFlushRequest: {
|
|
38189
|
+
fileDescriptor: this.#fileDescriptor
|
|
38190
|
+
},
|
|
38191
|
+
taskId: this.#taskId
|
|
38192
|
+
});
|
|
38193
|
+
}
|
|
38194
|
+
/**
|
|
38195
|
+
* Close the file handle.
|
|
38196
|
+
*/
|
|
38197
|
+
async close() {
|
|
38198
|
+
await runFilesystemExec({
|
|
38199
|
+
fileCloseRequest: {
|
|
38200
|
+
fileDescriptor: this.#fileDescriptor
|
|
38201
|
+
},
|
|
38202
|
+
taskId: this.#taskId
|
|
38203
|
+
});
|
|
38204
|
+
}
|
|
38205
|
+
};
|
|
38206
|
+
async function runFilesystemExec(request) {
|
|
38207
|
+
const response = await client.containerFilesystemExec(request);
|
|
38208
|
+
const chunks = [];
|
|
38209
|
+
let retries = 10;
|
|
38210
|
+
let completed = false;
|
|
38211
|
+
while (!completed) {
|
|
38212
|
+
try {
|
|
38213
|
+
const outputIterator = client.containerFilesystemExecGetOutput({
|
|
38214
|
+
execId: response.execId,
|
|
38215
|
+
timeout: 55
|
|
38216
|
+
});
|
|
38217
|
+
for await (const batch of outputIterator) {
|
|
38218
|
+
chunks.push(...batch.output);
|
|
38219
|
+
if (batch.eof) {
|
|
38220
|
+
completed = true;
|
|
38221
|
+
break;
|
|
38222
|
+
}
|
|
38223
|
+
if (batch.error !== void 0) {
|
|
38224
|
+
if (retries > 0) {
|
|
38225
|
+
retries--;
|
|
38226
|
+
break;
|
|
38227
|
+
}
|
|
38228
|
+
throw new SandboxFilesystemError(batch.error.errorMessage);
|
|
38229
|
+
}
|
|
38230
|
+
}
|
|
38231
|
+
} catch (err) {
|
|
38232
|
+
if (isRetryableGrpc(err) && retries > 0) {
|
|
38233
|
+
retries--;
|
|
38234
|
+
} else throw err;
|
|
38235
|
+
}
|
|
38236
|
+
}
|
|
38237
|
+
return { chunks, response };
|
|
38238
|
+
}
|
|
38239
|
+
|
|
38089
38240
|
// src/streams.ts
|
|
38090
38241
|
function toModalReadStream(stream) {
|
|
38091
38242
|
return Object.assign(stream, readMixin);
|
|
@@ -38218,28 +38369,52 @@ var Sandbox2 = class {
|
|
|
38218
38369
|
).pipeThrough(new TextDecoderStream())
|
|
38219
38370
|
);
|
|
38220
38371
|
}
|
|
38372
|
+
/**
|
|
38373
|
+
* Open a file in the sandbox filesystem.
|
|
38374
|
+
* @param path - Path to the file to open
|
|
38375
|
+
* @param mode - File open mode (r, w, a, r+, w+, a+)
|
|
38376
|
+
* @returns Promise that resolves to a SandboxFile
|
|
38377
|
+
*/
|
|
38378
|
+
async open(path2, mode = "r") {
|
|
38379
|
+
const taskId = await this.#getTaskId();
|
|
38380
|
+
const resp = await runFilesystemExec({
|
|
38381
|
+
fileOpenRequest: {
|
|
38382
|
+
path: path2,
|
|
38383
|
+
mode
|
|
38384
|
+
},
|
|
38385
|
+
taskId
|
|
38386
|
+
});
|
|
38387
|
+
const fileDescriptor = resp.response.fileDescriptor;
|
|
38388
|
+
return new SandboxFile(fileDescriptor, taskId);
|
|
38389
|
+
}
|
|
38221
38390
|
async exec(command, options) {
|
|
38391
|
+
const taskId = await this.#getTaskId();
|
|
38392
|
+
const resp = await client.containerExec({
|
|
38393
|
+
taskId,
|
|
38394
|
+
command,
|
|
38395
|
+
workdir: options?.workdir,
|
|
38396
|
+
timeoutSecs: options?.timeout ? options.timeout / 1e3 : 0
|
|
38397
|
+
});
|
|
38398
|
+
return new ContainerProcess(resp.execId, options);
|
|
38399
|
+
}
|
|
38400
|
+
async #getTaskId() {
|
|
38222
38401
|
if (this.#taskId === void 0) {
|
|
38223
|
-
const
|
|
38402
|
+
const resp = await client.sandboxGetTaskId({
|
|
38224
38403
|
sandboxId: this.sandboxId
|
|
38225
38404
|
});
|
|
38226
|
-
if (!
|
|
38405
|
+
if (!resp.taskId) {
|
|
38227
38406
|
throw new Error(
|
|
38228
38407
|
`Sandbox ${this.sandboxId} does not have a task ID. It may not be running.`
|
|
38229
38408
|
);
|
|
38230
38409
|
}
|
|
38231
|
-
if (
|
|
38410
|
+
if (resp.taskResult) {
|
|
38232
38411
|
throw new Error(
|
|
38233
|
-
`Sandbox ${this.sandboxId} has already completed with result: ${
|
|
38412
|
+
`Sandbox ${this.sandboxId} has already completed with result: ${resp.taskResult}`
|
|
38234
38413
|
);
|
|
38235
38414
|
}
|
|
38236
|
-
this.#taskId =
|
|
38415
|
+
this.#taskId = resp.taskId;
|
|
38237
38416
|
}
|
|
38238
|
-
|
|
38239
|
-
taskId: this.#taskId,
|
|
38240
|
-
command
|
|
38241
|
-
});
|
|
38242
|
-
return new ContainerProcess(resp.execId, options);
|
|
38417
|
+
return this.#taskId;
|
|
38243
38418
|
}
|
|
38244
38419
|
async terminate() {
|
|
38245
38420
|
await client.sandboxTerminate({ sandboxId: this.sandboxId });
|
|
@@ -38409,50 +38584,6 @@ function encodeIfString(chunk) {
|
|
|
38409
38584
|
return typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk;
|
|
38410
38585
|
}
|
|
38411
38586
|
|
|
38412
|
-
// src/errors.ts
|
|
38413
|
-
var FunctionTimeoutError = class extends Error {
|
|
38414
|
-
constructor(message) {
|
|
38415
|
-
super(message);
|
|
38416
|
-
this.name = "FunctionTimeoutError";
|
|
38417
|
-
}
|
|
38418
|
-
};
|
|
38419
|
-
var RemoteError = class extends Error {
|
|
38420
|
-
constructor(message) {
|
|
38421
|
-
super(message);
|
|
38422
|
-
this.name = "RemoteError";
|
|
38423
|
-
}
|
|
38424
|
-
};
|
|
38425
|
-
var InternalFailure = class extends Error {
|
|
38426
|
-
constructor(message) {
|
|
38427
|
-
super(message);
|
|
38428
|
-
this.name = "InternalFailure";
|
|
38429
|
-
}
|
|
38430
|
-
};
|
|
38431
|
-
var NotFoundError = class extends Error {
|
|
38432
|
-
constructor(message) {
|
|
38433
|
-
super(message);
|
|
38434
|
-
this.name = "NotFoundError";
|
|
38435
|
-
}
|
|
38436
|
-
};
|
|
38437
|
-
var InvalidError = class extends Error {
|
|
38438
|
-
constructor(message) {
|
|
38439
|
-
super(message);
|
|
38440
|
-
this.name = "InvalidError";
|
|
38441
|
-
}
|
|
38442
|
-
};
|
|
38443
|
-
var QueueEmptyError = class extends Error {
|
|
38444
|
-
constructor(message) {
|
|
38445
|
-
super(message);
|
|
38446
|
-
this.name = "QueueEmptyError";
|
|
38447
|
-
}
|
|
38448
|
-
};
|
|
38449
|
-
var QueueFullError = class extends Error {
|
|
38450
|
-
constructor(message) {
|
|
38451
|
-
super(message);
|
|
38452
|
-
this.name = "QueueFullError";
|
|
38453
|
-
}
|
|
38454
|
-
};
|
|
38455
|
-
|
|
38456
38587
|
// src/secret.ts
|
|
38457
38588
|
var import_nice_grpc2 = require("nice-grpc");
|
|
38458
38589
|
var Secret = class _Secret {
|
|
@@ -39570,5 +39701,6 @@ var Queue = class _Queue {
|
|
|
39570
39701
|
QueueFullError,
|
|
39571
39702
|
RemoteError,
|
|
39572
39703
|
Sandbox,
|
|
39704
|
+
SandboxFile,
|
|
39573
39705
|
Secret
|
|
39574
39706
|
});
|
package/dist/index.d.cts
CHANGED
|
@@ -57,6 +57,36 @@ declare class Image {
|
|
|
57
57
|
constructor(imageId: string);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/** File open modes supported by the filesystem API. */
|
|
61
|
+
type SandboxFileMode = "r" | "w" | "a" | "r+" | "w+" | "a+";
|
|
62
|
+
/**
|
|
63
|
+
* SandboxFile represents an open file in the sandbox filesystem.
|
|
64
|
+
* Provides read/write operations similar to Node.js `fsPromises.FileHandle`.
|
|
65
|
+
*/
|
|
66
|
+
declare class SandboxFile {
|
|
67
|
+
#private;
|
|
68
|
+
/** @ignore */
|
|
69
|
+
constructor(fileDescriptor: string, taskId: string);
|
|
70
|
+
/**
|
|
71
|
+
* Read data from the file.
|
|
72
|
+
* @returns Promise that resolves to the read data as Uint8Array
|
|
73
|
+
*/
|
|
74
|
+
read(): Promise<Uint8Array>;
|
|
75
|
+
/**
|
|
76
|
+
* Write data to the file.
|
|
77
|
+
* @param data - Data to write (string or Uint8Array)
|
|
78
|
+
*/
|
|
79
|
+
write(data: Uint8Array): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Flush any buffered data to the file.
|
|
82
|
+
*/
|
|
83
|
+
flush(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Close the file handle.
|
|
86
|
+
*/
|
|
87
|
+
close(): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
|
|
60
90
|
/**
|
|
61
91
|
* Wrapper around `ReadableStream` with convenience functions.
|
|
62
92
|
*
|
|
@@ -109,9 +139,16 @@ type StdioBehavior = "pipe" | "ignore";
|
|
|
109
139
|
type StreamMode = "text" | "binary";
|
|
110
140
|
/** Options to configure a `Sandbox.exec()` operation. */
|
|
111
141
|
type ExecOptions = {
|
|
142
|
+
/** Specifies text or binary encoding for input and output streams. */
|
|
112
143
|
mode?: StreamMode;
|
|
144
|
+
/** Whether to pipe or ignore standard output. */
|
|
113
145
|
stdout?: StdioBehavior;
|
|
146
|
+
/** Whether to pipe or ignore standard error. */
|
|
114
147
|
stderr?: StdioBehavior;
|
|
148
|
+
/** Working directory to run the command in. */
|
|
149
|
+
workdir?: string;
|
|
150
|
+
/** Timeout for the process in milliseconds. Defaults to 0 (no timeout). */
|
|
151
|
+
timeout?: number;
|
|
115
152
|
};
|
|
116
153
|
/** Sandboxes are secure, isolated containers in Modal that boot in seconds. */
|
|
117
154
|
declare class Sandbox {
|
|
@@ -122,6 +159,13 @@ declare class Sandbox {
|
|
|
122
159
|
stderr: ModalReadStream<string>;
|
|
123
160
|
/** @ignore */
|
|
124
161
|
constructor(sandboxId: string);
|
|
162
|
+
/**
|
|
163
|
+
* Open a file in the sandbox filesystem.
|
|
164
|
+
* @param path - Path to the file to open
|
|
165
|
+
* @param mode - File open mode (r, w, a, r+, w+, a+)
|
|
166
|
+
* @returns Promise that resolves to a SandboxFile
|
|
167
|
+
*/
|
|
168
|
+
open(path: string, mode?: SandboxFileMode): Promise<SandboxFile>;
|
|
125
169
|
exec(command: string[], options?: ExecOptions & {
|
|
126
170
|
mode?: "text";
|
|
127
171
|
}): Promise<ContainerProcess<string>>;
|
|
@@ -377,4 +421,4 @@ declare class Queue {
|
|
|
377
421
|
iterate(options?: QueueIterateOptions): AsyncGenerator<any, void, unknown>;
|
|
378
422
|
}
|
|
379
423
|
|
|
380
|
-
export { App, Cls, ClsInstance, ContainerProcess, type DeleteOptions, type EphemeralOptions, type ExecOptions, FunctionCall, type FunctionCallCancelOptions, type FunctionCallGetOptions, FunctionTimeoutError, Function_, Image, InternalFailure, InvalidError, type LookupOptions, type ModalReadStream, type ModalWriteStream, NotFoundError, Queue, type QueueClearOptions, QueueEmptyError, QueueFullError, type QueueGetOptions, type QueueIterateOptions, type QueueLenOptions, type QueuePutOptions, RemoteError, Sandbox, type SandboxCreateOptions, Secret, type SecretFromNameOptions, type StdioBehavior, type StreamMode };
|
|
424
|
+
export { App, Cls, ClsInstance, ContainerProcess, type DeleteOptions, type EphemeralOptions, type ExecOptions, FunctionCall, type FunctionCallCancelOptions, type FunctionCallGetOptions, FunctionTimeoutError, Function_, Image, InternalFailure, InvalidError, type LookupOptions, type ModalReadStream, type ModalWriteStream, NotFoundError, Queue, type QueueClearOptions, QueueEmptyError, QueueFullError, type QueueGetOptions, type QueueIterateOptions, type QueueLenOptions, type QueuePutOptions, RemoteError, Sandbox, type SandboxCreateOptions, SandboxFile, type SandboxFileMode, Secret, type SecretFromNameOptions, type StdioBehavior, type StreamMode };
|
package/dist/index.d.ts
CHANGED
|
@@ -57,6 +57,36 @@ declare class Image {
|
|
|
57
57
|
constructor(imageId: string);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
/** File open modes supported by the filesystem API. */
|
|
61
|
+
type SandboxFileMode = "r" | "w" | "a" | "r+" | "w+" | "a+";
|
|
62
|
+
/**
|
|
63
|
+
* SandboxFile represents an open file in the sandbox filesystem.
|
|
64
|
+
* Provides read/write operations similar to Node.js `fsPromises.FileHandle`.
|
|
65
|
+
*/
|
|
66
|
+
declare class SandboxFile {
|
|
67
|
+
#private;
|
|
68
|
+
/** @ignore */
|
|
69
|
+
constructor(fileDescriptor: string, taskId: string);
|
|
70
|
+
/**
|
|
71
|
+
* Read data from the file.
|
|
72
|
+
* @returns Promise that resolves to the read data as Uint8Array
|
|
73
|
+
*/
|
|
74
|
+
read(): Promise<Uint8Array>;
|
|
75
|
+
/**
|
|
76
|
+
* Write data to the file.
|
|
77
|
+
* @param data - Data to write (string or Uint8Array)
|
|
78
|
+
*/
|
|
79
|
+
write(data: Uint8Array): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Flush any buffered data to the file.
|
|
82
|
+
*/
|
|
83
|
+
flush(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Close the file handle.
|
|
86
|
+
*/
|
|
87
|
+
close(): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
|
|
60
90
|
/**
|
|
61
91
|
* Wrapper around `ReadableStream` with convenience functions.
|
|
62
92
|
*
|
|
@@ -109,9 +139,16 @@ type StdioBehavior = "pipe" | "ignore";
|
|
|
109
139
|
type StreamMode = "text" | "binary";
|
|
110
140
|
/** Options to configure a `Sandbox.exec()` operation. */
|
|
111
141
|
type ExecOptions = {
|
|
142
|
+
/** Specifies text or binary encoding for input and output streams. */
|
|
112
143
|
mode?: StreamMode;
|
|
144
|
+
/** Whether to pipe or ignore standard output. */
|
|
113
145
|
stdout?: StdioBehavior;
|
|
146
|
+
/** Whether to pipe or ignore standard error. */
|
|
114
147
|
stderr?: StdioBehavior;
|
|
148
|
+
/** Working directory to run the command in. */
|
|
149
|
+
workdir?: string;
|
|
150
|
+
/** Timeout for the process in milliseconds. Defaults to 0 (no timeout). */
|
|
151
|
+
timeout?: number;
|
|
115
152
|
};
|
|
116
153
|
/** Sandboxes are secure, isolated containers in Modal that boot in seconds. */
|
|
117
154
|
declare class Sandbox {
|
|
@@ -122,6 +159,13 @@ declare class Sandbox {
|
|
|
122
159
|
stderr: ModalReadStream<string>;
|
|
123
160
|
/** @ignore */
|
|
124
161
|
constructor(sandboxId: string);
|
|
162
|
+
/**
|
|
163
|
+
* Open a file in the sandbox filesystem.
|
|
164
|
+
* @param path - Path to the file to open
|
|
165
|
+
* @param mode - File open mode (r, w, a, r+, w+, a+)
|
|
166
|
+
* @returns Promise that resolves to a SandboxFile
|
|
167
|
+
*/
|
|
168
|
+
open(path: string, mode?: SandboxFileMode): Promise<SandboxFile>;
|
|
125
169
|
exec(command: string[], options?: ExecOptions & {
|
|
126
170
|
mode?: "text";
|
|
127
171
|
}): Promise<ContainerProcess<string>>;
|
|
@@ -377,4 +421,4 @@ declare class Queue {
|
|
|
377
421
|
iterate(options?: QueueIterateOptions): AsyncGenerator<any, void, unknown>;
|
|
378
422
|
}
|
|
379
423
|
|
|
380
|
-
export { App, Cls, ClsInstance, ContainerProcess, type DeleteOptions, type EphemeralOptions, type ExecOptions, FunctionCall, type FunctionCallCancelOptions, type FunctionCallGetOptions, FunctionTimeoutError, Function_, Image, InternalFailure, InvalidError, type LookupOptions, type ModalReadStream, type ModalWriteStream, NotFoundError, Queue, type QueueClearOptions, QueueEmptyError, QueueFullError, type QueueGetOptions, type QueueIterateOptions, type QueueLenOptions, type QueuePutOptions, RemoteError, Sandbox, type SandboxCreateOptions, Secret, type SecretFromNameOptions, type StdioBehavior, type StreamMode };
|
|
424
|
+
export { App, Cls, ClsInstance, ContainerProcess, type DeleteOptions, type EphemeralOptions, type ExecOptions, FunctionCall, type FunctionCallCancelOptions, type FunctionCallGetOptions, FunctionTimeoutError, Function_, Image, InternalFailure, InvalidError, type LookupOptions, type ModalReadStream, type ModalWriteStream, NotFoundError, Queue, type QueueClearOptions, QueueEmptyError, QueueFullError, type QueueGetOptions, type QueueIterateOptions, type QueueLenOptions, type QueuePutOptions, RemoteError, Sandbox, type SandboxCreateOptions, SandboxFile, type SandboxFileMode, Secret, type SecretFromNameOptions, type StdioBehavior, type StreamMode };
|
package/dist/index.js
CHANGED
|
@@ -38040,6 +38040,156 @@ ${result.exception}`
|
|
|
38040
38040
|
return new Image2(resp.imageId);
|
|
38041
38041
|
}
|
|
38042
38042
|
|
|
38043
|
+
// src/errors.ts
|
|
38044
|
+
var FunctionTimeoutError = class extends Error {
|
|
38045
|
+
constructor(message) {
|
|
38046
|
+
super(message);
|
|
38047
|
+
this.name = "FunctionTimeoutError";
|
|
38048
|
+
}
|
|
38049
|
+
};
|
|
38050
|
+
var RemoteError = class extends Error {
|
|
38051
|
+
constructor(message) {
|
|
38052
|
+
super(message);
|
|
38053
|
+
this.name = "RemoteError";
|
|
38054
|
+
}
|
|
38055
|
+
};
|
|
38056
|
+
var InternalFailure = class extends Error {
|
|
38057
|
+
constructor(message) {
|
|
38058
|
+
super(message);
|
|
38059
|
+
this.name = "InternalFailure";
|
|
38060
|
+
}
|
|
38061
|
+
};
|
|
38062
|
+
var NotFoundError = class extends Error {
|
|
38063
|
+
constructor(message) {
|
|
38064
|
+
super(message);
|
|
38065
|
+
this.name = "NotFoundError";
|
|
38066
|
+
}
|
|
38067
|
+
};
|
|
38068
|
+
var InvalidError = class extends Error {
|
|
38069
|
+
constructor(message) {
|
|
38070
|
+
super(message);
|
|
38071
|
+
this.name = "InvalidError";
|
|
38072
|
+
}
|
|
38073
|
+
};
|
|
38074
|
+
var QueueEmptyError = class extends Error {
|
|
38075
|
+
constructor(message) {
|
|
38076
|
+
super(message);
|
|
38077
|
+
this.name = "QueueEmptyError";
|
|
38078
|
+
}
|
|
38079
|
+
};
|
|
38080
|
+
var QueueFullError = class extends Error {
|
|
38081
|
+
constructor(message) {
|
|
38082
|
+
super(message);
|
|
38083
|
+
this.name = "QueueFullError";
|
|
38084
|
+
}
|
|
38085
|
+
};
|
|
38086
|
+
var SandboxFilesystemError = class extends Error {
|
|
38087
|
+
constructor(message) {
|
|
38088
|
+
super(message);
|
|
38089
|
+
this.name = "SandboxFilesystemError";
|
|
38090
|
+
}
|
|
38091
|
+
};
|
|
38092
|
+
|
|
38093
|
+
// src/sandbox_filesystem.ts
|
|
38094
|
+
var SandboxFile = class {
|
|
38095
|
+
#fileDescriptor;
|
|
38096
|
+
#taskId;
|
|
38097
|
+
/** @ignore */
|
|
38098
|
+
constructor(fileDescriptor, taskId) {
|
|
38099
|
+
this.#fileDescriptor = fileDescriptor;
|
|
38100
|
+
this.#taskId = taskId;
|
|
38101
|
+
}
|
|
38102
|
+
/**
|
|
38103
|
+
* Read data from the file.
|
|
38104
|
+
* @returns Promise that resolves to the read data as Uint8Array
|
|
38105
|
+
*/
|
|
38106
|
+
async read() {
|
|
38107
|
+
const resp = await runFilesystemExec({
|
|
38108
|
+
fileReadRequest: {
|
|
38109
|
+
fileDescriptor: this.#fileDescriptor
|
|
38110
|
+
},
|
|
38111
|
+
taskId: this.#taskId
|
|
38112
|
+
});
|
|
38113
|
+
const chunks = resp.chunks;
|
|
38114
|
+
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
38115
|
+
const result = new Uint8Array(totalLength);
|
|
38116
|
+
let offset = 0;
|
|
38117
|
+
for (const chunk of chunks) {
|
|
38118
|
+
result.set(chunk, offset);
|
|
38119
|
+
offset += chunk.length;
|
|
38120
|
+
}
|
|
38121
|
+
return result;
|
|
38122
|
+
}
|
|
38123
|
+
/**
|
|
38124
|
+
* Write data to the file.
|
|
38125
|
+
* @param data - Data to write (string or Uint8Array)
|
|
38126
|
+
*/
|
|
38127
|
+
async write(data) {
|
|
38128
|
+
await runFilesystemExec({
|
|
38129
|
+
fileWriteRequest: {
|
|
38130
|
+
fileDescriptor: this.#fileDescriptor,
|
|
38131
|
+
data
|
|
38132
|
+
},
|
|
38133
|
+
taskId: this.#taskId
|
|
38134
|
+
});
|
|
38135
|
+
}
|
|
38136
|
+
/**
|
|
38137
|
+
* Flush any buffered data to the file.
|
|
38138
|
+
*/
|
|
38139
|
+
async flush() {
|
|
38140
|
+
await runFilesystemExec({
|
|
38141
|
+
fileFlushRequest: {
|
|
38142
|
+
fileDescriptor: this.#fileDescriptor
|
|
38143
|
+
},
|
|
38144
|
+
taskId: this.#taskId
|
|
38145
|
+
});
|
|
38146
|
+
}
|
|
38147
|
+
/**
|
|
38148
|
+
* Close the file handle.
|
|
38149
|
+
*/
|
|
38150
|
+
async close() {
|
|
38151
|
+
await runFilesystemExec({
|
|
38152
|
+
fileCloseRequest: {
|
|
38153
|
+
fileDescriptor: this.#fileDescriptor
|
|
38154
|
+
},
|
|
38155
|
+
taskId: this.#taskId
|
|
38156
|
+
});
|
|
38157
|
+
}
|
|
38158
|
+
};
|
|
38159
|
+
async function runFilesystemExec(request) {
|
|
38160
|
+
const response = await client.containerFilesystemExec(request);
|
|
38161
|
+
const chunks = [];
|
|
38162
|
+
let retries = 10;
|
|
38163
|
+
let completed = false;
|
|
38164
|
+
while (!completed) {
|
|
38165
|
+
try {
|
|
38166
|
+
const outputIterator = client.containerFilesystemExecGetOutput({
|
|
38167
|
+
execId: response.execId,
|
|
38168
|
+
timeout: 55
|
|
38169
|
+
});
|
|
38170
|
+
for await (const batch of outputIterator) {
|
|
38171
|
+
chunks.push(...batch.output);
|
|
38172
|
+
if (batch.eof) {
|
|
38173
|
+
completed = true;
|
|
38174
|
+
break;
|
|
38175
|
+
}
|
|
38176
|
+
if (batch.error !== void 0) {
|
|
38177
|
+
if (retries > 0) {
|
|
38178
|
+
retries--;
|
|
38179
|
+
break;
|
|
38180
|
+
}
|
|
38181
|
+
throw new SandboxFilesystemError(batch.error.errorMessage);
|
|
38182
|
+
}
|
|
38183
|
+
}
|
|
38184
|
+
} catch (err) {
|
|
38185
|
+
if (isRetryableGrpc(err) && retries > 0) {
|
|
38186
|
+
retries--;
|
|
38187
|
+
} else throw err;
|
|
38188
|
+
}
|
|
38189
|
+
}
|
|
38190
|
+
return { chunks, response };
|
|
38191
|
+
}
|
|
38192
|
+
|
|
38043
38193
|
// src/streams.ts
|
|
38044
38194
|
function toModalReadStream(stream) {
|
|
38045
38195
|
return Object.assign(stream, readMixin);
|
|
@@ -38172,28 +38322,52 @@ var Sandbox2 = class {
|
|
|
38172
38322
|
).pipeThrough(new TextDecoderStream())
|
|
38173
38323
|
);
|
|
38174
38324
|
}
|
|
38325
|
+
/**
|
|
38326
|
+
* Open a file in the sandbox filesystem.
|
|
38327
|
+
* @param path - Path to the file to open
|
|
38328
|
+
* @param mode - File open mode (r, w, a, r+, w+, a+)
|
|
38329
|
+
* @returns Promise that resolves to a SandboxFile
|
|
38330
|
+
*/
|
|
38331
|
+
async open(path2, mode = "r") {
|
|
38332
|
+
const taskId = await this.#getTaskId();
|
|
38333
|
+
const resp = await runFilesystemExec({
|
|
38334
|
+
fileOpenRequest: {
|
|
38335
|
+
path: path2,
|
|
38336
|
+
mode
|
|
38337
|
+
},
|
|
38338
|
+
taskId
|
|
38339
|
+
});
|
|
38340
|
+
const fileDescriptor = resp.response.fileDescriptor;
|
|
38341
|
+
return new SandboxFile(fileDescriptor, taskId);
|
|
38342
|
+
}
|
|
38175
38343
|
async exec(command, options) {
|
|
38344
|
+
const taskId = await this.#getTaskId();
|
|
38345
|
+
const resp = await client.containerExec({
|
|
38346
|
+
taskId,
|
|
38347
|
+
command,
|
|
38348
|
+
workdir: options?.workdir,
|
|
38349
|
+
timeoutSecs: options?.timeout ? options.timeout / 1e3 : 0
|
|
38350
|
+
});
|
|
38351
|
+
return new ContainerProcess(resp.execId, options);
|
|
38352
|
+
}
|
|
38353
|
+
async #getTaskId() {
|
|
38176
38354
|
if (this.#taskId === void 0) {
|
|
38177
|
-
const
|
|
38355
|
+
const resp = await client.sandboxGetTaskId({
|
|
38178
38356
|
sandboxId: this.sandboxId
|
|
38179
38357
|
});
|
|
38180
|
-
if (!
|
|
38358
|
+
if (!resp.taskId) {
|
|
38181
38359
|
throw new Error(
|
|
38182
38360
|
`Sandbox ${this.sandboxId} does not have a task ID. It may not be running.`
|
|
38183
38361
|
);
|
|
38184
38362
|
}
|
|
38185
|
-
if (
|
|
38363
|
+
if (resp.taskResult) {
|
|
38186
38364
|
throw new Error(
|
|
38187
|
-
`Sandbox ${this.sandboxId} has already completed with result: ${
|
|
38365
|
+
`Sandbox ${this.sandboxId} has already completed with result: ${resp.taskResult}`
|
|
38188
38366
|
);
|
|
38189
38367
|
}
|
|
38190
|
-
this.#taskId =
|
|
38368
|
+
this.#taskId = resp.taskId;
|
|
38191
38369
|
}
|
|
38192
|
-
|
|
38193
|
-
taskId: this.#taskId,
|
|
38194
|
-
command
|
|
38195
|
-
});
|
|
38196
|
-
return new ContainerProcess(resp.execId, options);
|
|
38370
|
+
return this.#taskId;
|
|
38197
38371
|
}
|
|
38198
38372
|
async terminate() {
|
|
38199
38373
|
await client.sandboxTerminate({ sandboxId: this.sandboxId });
|
|
@@ -38363,50 +38537,6 @@ function encodeIfString(chunk) {
|
|
|
38363
38537
|
return typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk;
|
|
38364
38538
|
}
|
|
38365
38539
|
|
|
38366
|
-
// src/errors.ts
|
|
38367
|
-
var FunctionTimeoutError = class extends Error {
|
|
38368
|
-
constructor(message) {
|
|
38369
|
-
super(message);
|
|
38370
|
-
this.name = "FunctionTimeoutError";
|
|
38371
|
-
}
|
|
38372
|
-
};
|
|
38373
|
-
var RemoteError = class extends Error {
|
|
38374
|
-
constructor(message) {
|
|
38375
|
-
super(message);
|
|
38376
|
-
this.name = "RemoteError";
|
|
38377
|
-
}
|
|
38378
|
-
};
|
|
38379
|
-
var InternalFailure = class extends Error {
|
|
38380
|
-
constructor(message) {
|
|
38381
|
-
super(message);
|
|
38382
|
-
this.name = "InternalFailure";
|
|
38383
|
-
}
|
|
38384
|
-
};
|
|
38385
|
-
var NotFoundError = class extends Error {
|
|
38386
|
-
constructor(message) {
|
|
38387
|
-
super(message);
|
|
38388
|
-
this.name = "NotFoundError";
|
|
38389
|
-
}
|
|
38390
|
-
};
|
|
38391
|
-
var InvalidError = class extends Error {
|
|
38392
|
-
constructor(message) {
|
|
38393
|
-
super(message);
|
|
38394
|
-
this.name = "InvalidError";
|
|
38395
|
-
}
|
|
38396
|
-
};
|
|
38397
|
-
var QueueEmptyError = class extends Error {
|
|
38398
|
-
constructor(message) {
|
|
38399
|
-
super(message);
|
|
38400
|
-
this.name = "QueueEmptyError";
|
|
38401
|
-
}
|
|
38402
|
-
};
|
|
38403
|
-
var QueueFullError = class extends Error {
|
|
38404
|
-
constructor(message) {
|
|
38405
|
-
super(message);
|
|
38406
|
-
this.name = "QueueFullError";
|
|
38407
|
-
}
|
|
38408
|
-
};
|
|
38409
|
-
|
|
38410
38540
|
// src/secret.ts
|
|
38411
38541
|
import { ClientError as ClientError2, Status as Status2 } from "nice-grpc";
|
|
38412
38542
|
var Secret = class _Secret {
|
|
@@ -39523,5 +39653,6 @@ export {
|
|
|
39523
39653
|
QueueFullError,
|
|
39524
39654
|
RemoteError,
|
|
39525
39655
|
Sandbox2 as Sandbox,
|
|
39656
|
+
SandboxFile,
|
|
39526
39657
|
Secret
|
|
39527
39658
|
};
|