@blaxel/core 0.2.0-preview4 → 0.2.0-preview5
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/client/sdk.gen.d.ts +31 -1
- package/dist/client/sdk.gen.js +112 -2
- package/dist/client/types.gen.d.ts +122 -0
- package/dist/common/internal.d.ts +1 -1
- package/dist/common/internal.js +3 -6
- package/dist/common/settings.d.ts +2 -0
- package/dist/common/settings.js +9 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/jobs/index.d.ts +1 -0
- package/dist/jobs/index.js +17 -0
- package/dist/jobs/jobs.d.ts +10 -0
- package/dist/jobs/jobs.js +42 -0
- package/dist/mcp/client.js +0 -3
- package/dist/sandbox/action.d.ts +4 -3
- package/dist/sandbox/action.js +16 -2
- package/dist/sandbox/client/sdk.gen.d.ts +10 -7
- package/dist/sandbox/client/sdk.gen.js +14 -3
- package/dist/sandbox/client/types.gen.d.ts +47 -28
- package/dist/sandbox/filesystem.d.ts +6 -0
- package/dist/sandbox/filesystem.js +74 -0
- package/dist/sandbox/process.d.ts +11 -0
- package/dist/sandbox/process.js +77 -0
- package/dist/sandbox/sandbox.d.ts +5 -1
- package/dist/sandbox/sandbox.js +6 -0
- package/dist/sandbox/session.d.ts +21 -0
- package/dist/sandbox/session.js +97 -0
- package/dist/sandbox/types.d.ts +15 -0
- package/dist/sandbox/types.js +2 -0
- package/dist/telemetry/telemetry.d.ts +1 -0
- package/dist/telemetry/telemetry.js +14 -0
- package/package.json +3 -1
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
export type Directory = {
|
|
2
|
-
files?: Array<File>;
|
|
3
|
-
path?: string;
|
|
4
|
-
/**
|
|
5
|
-
* @name Subdirectories
|
|
6
|
-
*/
|
|
7
|
-
subdirectories?: Array<Subdirectory>;
|
|
8
|
-
};
|
|
9
1
|
export type ErrorResponse = {
|
|
10
2
|
error?: string;
|
|
11
3
|
};
|
|
@@ -14,6 +6,9 @@ export type File = {
|
|
|
14
6
|
lastModified?: string;
|
|
15
7
|
owner?: string;
|
|
16
8
|
path?: string;
|
|
9
|
+
/**
|
|
10
|
+
* swagger:strfmt string
|
|
11
|
+
*/
|
|
17
12
|
permissions?: string;
|
|
18
13
|
size?: number;
|
|
19
14
|
};
|
|
@@ -28,6 +23,9 @@ export type FileWithContent = {
|
|
|
28
23
|
lastModified?: string;
|
|
29
24
|
owner?: string;
|
|
30
25
|
path?: string;
|
|
26
|
+
/**
|
|
27
|
+
* swagger:strfmt string
|
|
28
|
+
*/
|
|
31
29
|
permissions?: string;
|
|
32
30
|
size?: number;
|
|
33
31
|
};
|
|
@@ -43,7 +41,6 @@ export type ProcessKillRequest = {
|
|
|
43
41
|
export type ProcessRequest = {
|
|
44
42
|
command: string;
|
|
45
43
|
name?: string;
|
|
46
|
-
streamLogs?: boolean;
|
|
47
44
|
timeout?: number;
|
|
48
45
|
waitForCompletion?: boolean;
|
|
49
46
|
waitForPorts?: Array<number>;
|
|
@@ -59,13 +56,18 @@ export type ProcessResponse = {
|
|
|
59
56
|
status?: string;
|
|
60
57
|
workingDir?: string;
|
|
61
58
|
};
|
|
62
|
-
export type Subdirectory = {
|
|
63
|
-
path?: string;
|
|
64
|
-
};
|
|
65
59
|
export type SuccessResponse = {
|
|
66
60
|
message?: string;
|
|
67
61
|
path?: string;
|
|
68
62
|
};
|
|
63
|
+
export type Directory = {
|
|
64
|
+
files?: Array<File>;
|
|
65
|
+
path?: string;
|
|
66
|
+
/**
|
|
67
|
+
* @name Subdirectories
|
|
68
|
+
*/
|
|
69
|
+
subdirectories?: Array<Directory>;
|
|
70
|
+
};
|
|
69
71
|
export type DeleteFilesystemByPathData = {
|
|
70
72
|
body?: never;
|
|
71
73
|
path: {
|
|
@@ -391,12 +393,7 @@ export type GetProcessByIdentifierLogsData = {
|
|
|
391
393
|
*/
|
|
392
394
|
identifier: string;
|
|
393
395
|
};
|
|
394
|
-
query?:
|
|
395
|
-
/**
|
|
396
|
-
* Stream logs
|
|
397
|
-
*/
|
|
398
|
-
stream?: boolean;
|
|
399
|
-
};
|
|
396
|
+
query?: never;
|
|
400
397
|
url: '/process/{identifier}/logs';
|
|
401
398
|
};
|
|
402
399
|
export type GetProcessByIdentifierLogsErrors = {
|
|
@@ -427,12 +424,7 @@ export type GetProcessByIdentifierLogsStreamData = {
|
|
|
427
424
|
*/
|
|
428
425
|
identifier: string;
|
|
429
426
|
};
|
|
430
|
-
query?:
|
|
431
|
-
/**
|
|
432
|
-
* Stream logs
|
|
433
|
-
*/
|
|
434
|
-
stream?: boolean;
|
|
435
|
-
};
|
|
427
|
+
query?: never;
|
|
436
428
|
url: '/process/{identifier}/logs/stream';
|
|
437
429
|
};
|
|
438
430
|
export type GetProcessByIdentifierLogsStreamErrors = {
|
|
@@ -448,13 +440,40 @@ export type GetProcessByIdentifierLogsStreamErrors = {
|
|
|
448
440
|
export type GetProcessByIdentifierLogsStreamError = GetProcessByIdentifierLogsStreamErrors[keyof GetProcessByIdentifierLogsStreamErrors];
|
|
449
441
|
export type GetProcessByIdentifierLogsStreamResponses = {
|
|
450
442
|
/**
|
|
451
|
-
*
|
|
443
|
+
* Stream of process logs, one line per log (prefixed with stdout:/stderr:)
|
|
452
444
|
*/
|
|
453
|
-
200:
|
|
454
|
-
[key: string]: string;
|
|
455
|
-
};
|
|
445
|
+
200: string;
|
|
456
446
|
};
|
|
457
447
|
export type GetProcessByIdentifierLogsStreamResponse = GetProcessByIdentifierLogsStreamResponses[keyof GetProcessByIdentifierLogsStreamResponses];
|
|
448
|
+
export type GetWatchFilesystemByPathData = {
|
|
449
|
+
body?: never;
|
|
450
|
+
path: {
|
|
451
|
+
/**
|
|
452
|
+
* Directory path to watch
|
|
453
|
+
*/
|
|
454
|
+
path: string;
|
|
455
|
+
};
|
|
456
|
+
query?: never;
|
|
457
|
+
url: '/watch/filesystem/{path}';
|
|
458
|
+
};
|
|
459
|
+
export type GetWatchFilesystemByPathErrors = {
|
|
460
|
+
/**
|
|
461
|
+
* Invalid path
|
|
462
|
+
*/
|
|
463
|
+
400: ErrorResponse;
|
|
464
|
+
/**
|
|
465
|
+
* Internal server error
|
|
466
|
+
*/
|
|
467
|
+
500: ErrorResponse;
|
|
468
|
+
};
|
|
469
|
+
export type GetWatchFilesystemByPathError = GetWatchFilesystemByPathErrors[keyof GetWatchFilesystemByPathErrors];
|
|
470
|
+
export type GetWatchFilesystemByPathResponses = {
|
|
471
|
+
/**
|
|
472
|
+
* Stream of modified file paths, one per line
|
|
473
|
+
*/
|
|
474
|
+
200: string;
|
|
475
|
+
};
|
|
476
|
+
export type GetWatchFilesystemByPathResponse = GetWatchFilesystemByPathResponses[keyof GetWatchFilesystemByPathResponses];
|
|
458
477
|
export type ClientOptions = {
|
|
459
478
|
baseUrl: `${string}://localhost:8080` | (string & {});
|
|
460
479
|
};
|
|
@@ -14,5 +14,11 @@ export declare class SandboxFileSystem extends SandboxAction {
|
|
|
14
14
|
rm(path: string, recursive?: boolean): Promise<SuccessResponse>;
|
|
15
15
|
ls(path: string): Promise<Directory>;
|
|
16
16
|
cp(source: string, destination: string): Promise<CopyResponse>;
|
|
17
|
+
watch(path: string, callback: (filePath: string, content?: string) => void | Promise<void>, options?: {
|
|
18
|
+
onError?: (error: Error) => void;
|
|
19
|
+
withContent: boolean;
|
|
20
|
+
}): {
|
|
21
|
+
close: () => void;
|
|
22
|
+
};
|
|
17
23
|
private formatPath;
|
|
18
24
|
}
|
|
@@ -13,6 +13,7 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
13
13
|
path: { path },
|
|
14
14
|
body: { isDirectory: true, permissions },
|
|
15
15
|
baseUrl: this.url,
|
|
16
|
+
client: this.client,
|
|
16
17
|
});
|
|
17
18
|
this.handleResponseError(response, data, error);
|
|
18
19
|
return data;
|
|
@@ -23,6 +24,7 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
23
24
|
path: { path },
|
|
24
25
|
body: { content },
|
|
25
26
|
baseUrl: this.url,
|
|
27
|
+
client: this.client,
|
|
26
28
|
});
|
|
27
29
|
this.handleResponseError(response, data, error);
|
|
28
30
|
return data;
|
|
@@ -32,6 +34,7 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
32
34
|
const { response, data, error } = await (0, index_js_1.getFilesystemByPath)({
|
|
33
35
|
path: { path },
|
|
34
36
|
baseUrl: this.url,
|
|
37
|
+
client: this.client,
|
|
35
38
|
});
|
|
36
39
|
this.handleResponseError(response, data, error);
|
|
37
40
|
if (data && 'content' in data) {
|
|
@@ -45,6 +48,7 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
45
48
|
path: { path },
|
|
46
49
|
query: { recursive },
|
|
47
50
|
baseUrl: this.url,
|
|
51
|
+
client: this.client,
|
|
48
52
|
});
|
|
49
53
|
this.handleResponseError(response, data, error);
|
|
50
54
|
return data;
|
|
@@ -54,6 +58,7 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
54
58
|
const { response, data, error } = await (0, index_js_1.getFilesystemByPath)({
|
|
55
59
|
path: { path },
|
|
56
60
|
baseUrl: this.url,
|
|
61
|
+
client: this.client,
|
|
57
62
|
});
|
|
58
63
|
this.handleResponseError(response, data, error);
|
|
59
64
|
if (!data || !('files' in data || 'subdirectories' in data)) {
|
|
@@ -67,6 +72,7 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
67
72
|
const { response, data, error } = await (0, index_js_1.getFilesystemByPath)({
|
|
68
73
|
path: { path: source },
|
|
69
74
|
baseUrl: this.url,
|
|
75
|
+
client: this.client,
|
|
70
76
|
});
|
|
71
77
|
this.handleResponseError(response, data, error);
|
|
72
78
|
if (data && ('files' in data || 'subdirectories' in data)) {
|
|
@@ -111,6 +117,74 @@ class SandboxFileSystem extends action_js_1.SandboxAction {
|
|
|
111
117
|
}
|
|
112
118
|
throw new Error("Unsupported file type");
|
|
113
119
|
}
|
|
120
|
+
watch(path, callback, options) {
|
|
121
|
+
path = this.formatPath(path);
|
|
122
|
+
let closed = false;
|
|
123
|
+
let controller = new AbortController();
|
|
124
|
+
const start = async () => {
|
|
125
|
+
const { response, data, error } = await (0, index_js_1.getWatchFilesystemByPath)({
|
|
126
|
+
client: this.client,
|
|
127
|
+
path: { path },
|
|
128
|
+
baseUrl: this.url,
|
|
129
|
+
parseAs: 'stream',
|
|
130
|
+
signal: controller.signal,
|
|
131
|
+
});
|
|
132
|
+
if (error)
|
|
133
|
+
throw error;
|
|
134
|
+
const stream = data ?? response.body;
|
|
135
|
+
if (!stream)
|
|
136
|
+
throw new Error('No stream returned');
|
|
137
|
+
const reader = stream.getReader();
|
|
138
|
+
let buffer = '';
|
|
139
|
+
const decoder = new TextDecoder();
|
|
140
|
+
try {
|
|
141
|
+
while (!closed) {
|
|
142
|
+
const { value, done } = await reader.read();
|
|
143
|
+
if (done)
|
|
144
|
+
break;
|
|
145
|
+
buffer += decoder.decode(value, { stream: true });
|
|
146
|
+
let lines = buffer.split('\n');
|
|
147
|
+
buffer = lines.pop();
|
|
148
|
+
for (const line of lines) {
|
|
149
|
+
const filePath = line.trim();
|
|
150
|
+
if (!filePath)
|
|
151
|
+
continue;
|
|
152
|
+
if (options?.withContent) {
|
|
153
|
+
try {
|
|
154
|
+
const content = await this.read(filePath);
|
|
155
|
+
await callback(filePath, content);
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
await callback(filePath, undefined);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
await callback(filePath);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
reader.releaseLock();
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
start().catch((err) => {
|
|
172
|
+
// Suppress AbortError when closing
|
|
173
|
+
if (!(err && err.name === 'AbortError')) {
|
|
174
|
+
if (options?.onError) {
|
|
175
|
+
options.onError(err);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
closed = true;
|
|
179
|
+
controller?.abort();
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
close: () => {
|
|
183
|
+
closed = true;
|
|
184
|
+
controller?.abort();
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
114
188
|
formatPath(path) {
|
|
115
189
|
if (path === "/") {
|
|
116
190
|
return path;
|
|
@@ -3,7 +3,18 @@ import { SandboxAction } from "./action.js";
|
|
|
3
3
|
import { DeleteProcessByIdentifierKillResponse, DeleteProcessByIdentifierResponse, GetProcessByIdentifierResponse, GetProcessResponse, PostProcessResponse, ProcessRequest } from "./client/index.js";
|
|
4
4
|
export declare class SandboxProcess extends SandboxAction {
|
|
5
5
|
constructor(sandbox: Sandbox);
|
|
6
|
+
streamLogs(identifier: string, options: {
|
|
7
|
+
onLog?: (log: string) => void;
|
|
8
|
+
onStdout?: (stdout: string) => void;
|
|
9
|
+
onStderr?: (stderr: string) => void;
|
|
10
|
+
}): {
|
|
11
|
+
close: () => void;
|
|
12
|
+
};
|
|
6
13
|
exec(process: ProcessRequest): Promise<PostProcessResponse>;
|
|
14
|
+
wait(identifier: string, { maxWait, interval }?: {
|
|
15
|
+
maxWait?: number;
|
|
16
|
+
interval?: number;
|
|
17
|
+
}): Promise<GetProcessByIdentifierResponse>;
|
|
7
18
|
get(identifier: string): Promise<GetProcessByIdentifierResponse>;
|
|
8
19
|
list(): Promise<GetProcessResponse>;
|
|
9
20
|
stop(identifier: string): Promise<DeleteProcessByIdentifierResponse>;
|
package/dist/sandbox/process.js
CHANGED
|
@@ -1,24 +1,97 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SandboxProcess = void 0;
|
|
4
|
+
const settings_js_1 = require("../common/settings.js");
|
|
4
5
|
const action_js_1 = require("./action.js");
|
|
5
6
|
const index_js_1 = require("./client/index.js");
|
|
6
7
|
class SandboxProcess extends action_js_1.SandboxAction {
|
|
7
8
|
constructor(sandbox) {
|
|
8
9
|
super(sandbox);
|
|
9
10
|
}
|
|
11
|
+
streamLogs(identifier, options) {
|
|
12
|
+
const controller = new AbortController();
|
|
13
|
+
(async () => {
|
|
14
|
+
try {
|
|
15
|
+
const headers = this.sandbox.forceUrl ? this.sandbox.headers : settings_js_1.settings.headers;
|
|
16
|
+
const stream = await fetch(`${this.url}/process/${identifier}/logs/stream`, {
|
|
17
|
+
method: 'GET',
|
|
18
|
+
signal: controller.signal,
|
|
19
|
+
headers,
|
|
20
|
+
});
|
|
21
|
+
if (stream.status !== 200) {
|
|
22
|
+
throw new Error(`Failed to stream logs: ${await stream.text()}`);
|
|
23
|
+
}
|
|
24
|
+
if (!stream.body)
|
|
25
|
+
throw new Error('No stream body');
|
|
26
|
+
const reader = stream.body.getReader();
|
|
27
|
+
const decoder = new TextDecoder();
|
|
28
|
+
let buffer = '';
|
|
29
|
+
while (true) {
|
|
30
|
+
const { done, value } = await reader.read();
|
|
31
|
+
if (done)
|
|
32
|
+
break;
|
|
33
|
+
buffer += decoder.decode(value, { stream: true });
|
|
34
|
+
let lines = buffer.split(/\r?\n/);
|
|
35
|
+
buffer = lines.pop();
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
if (line.startsWith('stdout:')) {
|
|
38
|
+
options.onStdout?.(line.slice(7));
|
|
39
|
+
options.onLog?.(line.slice(7));
|
|
40
|
+
}
|
|
41
|
+
else if (line.startsWith('stderr:')) {
|
|
42
|
+
options.onStderr?.(line.slice(7));
|
|
43
|
+
options.onLog?.(line.slice(7));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
options.onLog?.(line);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err && err.name !== 'AbortError') {
|
|
53
|
+
console.error("Stream error:", err);
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
})();
|
|
58
|
+
return {
|
|
59
|
+
close: () => controller.abort(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
10
62
|
async exec(process) {
|
|
11
63
|
const { response, data, error } = await (0, index_js_1.postProcess)({
|
|
12
64
|
body: process,
|
|
13
65
|
baseUrl: this.url,
|
|
66
|
+
client: this.client,
|
|
14
67
|
});
|
|
15
68
|
this.handleResponseError(response, data, error);
|
|
16
69
|
return data;
|
|
17
70
|
}
|
|
71
|
+
async wait(identifier, { maxWait = 60000, interval = 1000 } = {}) {
|
|
72
|
+
const startTime = Date.now();
|
|
73
|
+
let status = "running";
|
|
74
|
+
let data = await this.get(identifier);
|
|
75
|
+
while (status === "running") {
|
|
76
|
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
77
|
+
try {
|
|
78
|
+
data = await this.get(identifier);
|
|
79
|
+
status = data.status ?? "running";
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
if (Date.now() - startTime > maxWait) {
|
|
85
|
+
throw new Error("Process did not finish in time");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return data;
|
|
89
|
+
}
|
|
18
90
|
async get(identifier) {
|
|
19
91
|
const { response, data, error } = await (0, index_js_1.getProcessByIdentifier)({
|
|
20
92
|
path: { identifier },
|
|
21
93
|
baseUrl: this.url,
|
|
94
|
+
client: this.client,
|
|
22
95
|
});
|
|
23
96
|
this.handleResponseError(response, data, error);
|
|
24
97
|
return data;
|
|
@@ -26,6 +99,7 @@ class SandboxProcess extends action_js_1.SandboxAction {
|
|
|
26
99
|
async list() {
|
|
27
100
|
const { response, data, error } = await (0, index_js_1.getProcess)({
|
|
28
101
|
baseUrl: this.url,
|
|
102
|
+
client: this.client,
|
|
29
103
|
});
|
|
30
104
|
this.handleResponseError(response, data, error);
|
|
31
105
|
return data;
|
|
@@ -34,6 +108,7 @@ class SandboxProcess extends action_js_1.SandboxAction {
|
|
|
34
108
|
const { response, data, error } = await (0, index_js_1.deleteProcessByIdentifier)({
|
|
35
109
|
path: { identifier },
|
|
36
110
|
baseUrl: this.url,
|
|
111
|
+
client: this.client,
|
|
37
112
|
});
|
|
38
113
|
this.handleResponseError(response, data, error);
|
|
39
114
|
return data;
|
|
@@ -42,6 +117,7 @@ class SandboxProcess extends action_js_1.SandboxAction {
|
|
|
42
117
|
const { response, data, error } = await (0, index_js_1.deleteProcessByIdentifierKill)({
|
|
43
118
|
path: { identifier },
|
|
44
119
|
baseUrl: this.url,
|
|
120
|
+
client: this.client,
|
|
45
121
|
});
|
|
46
122
|
this.handleResponseError(response, data, error);
|
|
47
123
|
return data;
|
|
@@ -50,6 +126,7 @@ class SandboxProcess extends action_js_1.SandboxAction {
|
|
|
50
126
|
const { response, data, error } = await (0, index_js_1.getProcessByIdentifierLogs)({
|
|
51
127
|
path: { identifier },
|
|
52
128
|
baseUrl: this.url,
|
|
129
|
+
client: this.client,
|
|
53
130
|
});
|
|
54
131
|
this.handleResponseError(response, data, error);
|
|
55
132
|
if (data && type in data) {
|
|
@@ -3,13 +3,16 @@ import { SandboxFileSystem } from "./filesystem.js";
|
|
|
3
3
|
import { SandboxNetwork } from "./network.js";
|
|
4
4
|
import { SandboxPreviews } from "./preview.js";
|
|
5
5
|
import { SandboxProcess } from "./process.js";
|
|
6
|
+
import { SandboxSessions } from "./session.js";
|
|
7
|
+
import { SandboxConfiguration, SessionWithToken } from "./types.js";
|
|
6
8
|
export declare class SandboxInstance {
|
|
7
9
|
private sandbox;
|
|
8
10
|
fs: SandboxFileSystem;
|
|
9
11
|
network: SandboxNetwork;
|
|
10
12
|
process: SandboxProcess;
|
|
11
13
|
previews: SandboxPreviews;
|
|
12
|
-
|
|
14
|
+
sessions: SandboxSessions;
|
|
15
|
+
constructor(sandbox: SandboxConfiguration);
|
|
13
16
|
get metadata(): import("../client/types.gen.js").Metadata | undefined;
|
|
14
17
|
get status(): string | undefined;
|
|
15
18
|
get events(): import("../client/types.gen.js").CoreEvents | undefined;
|
|
@@ -22,4 +25,5 @@ export declare class SandboxInstance {
|
|
|
22
25
|
static get(sandboxName: string): Promise<SandboxInstance>;
|
|
23
26
|
static list(): Promise<SandboxInstance[]>;
|
|
24
27
|
static delete(sandboxName: string): Promise<SandboxModel>;
|
|
28
|
+
static fromSession(session: SessionWithToken): Promise<SandboxInstance>;
|
|
25
29
|
}
|
package/dist/sandbox/sandbox.js
CHANGED
|
@@ -7,18 +7,21 @@ const filesystem_js_1 = require("./filesystem.js");
|
|
|
7
7
|
const network_js_1 = require("./network.js");
|
|
8
8
|
const preview_js_1 = require("./preview.js");
|
|
9
9
|
const process_js_1 = require("./process.js");
|
|
10
|
+
const session_js_1 = require("./session.js");
|
|
10
11
|
class SandboxInstance {
|
|
11
12
|
sandbox;
|
|
12
13
|
fs;
|
|
13
14
|
network;
|
|
14
15
|
process;
|
|
15
16
|
previews;
|
|
17
|
+
sessions;
|
|
16
18
|
constructor(sandbox) {
|
|
17
19
|
this.sandbox = sandbox;
|
|
18
20
|
this.fs = new filesystem_js_1.SandboxFileSystem(sandbox);
|
|
19
21
|
this.network = new network_js_1.SandboxNetwork(sandbox);
|
|
20
22
|
this.process = new process_js_1.SandboxProcess(sandbox);
|
|
21
23
|
this.previews = new preview_js_1.SandboxPreviews(sandbox);
|
|
24
|
+
this.sessions = new session_js_1.SandboxSessions(sandbox);
|
|
22
25
|
}
|
|
23
26
|
get metadata() {
|
|
24
27
|
return this.sandbox.metadata;
|
|
@@ -91,5 +94,8 @@ class SandboxInstance {
|
|
|
91
94
|
});
|
|
92
95
|
return data;
|
|
93
96
|
}
|
|
97
|
+
static async fromSession(session) {
|
|
98
|
+
return new SandboxInstance({ forceUrl: session.url, params: { bl_preview_token: session.token }, headers: { "X-Blaxel-Preview-Token": session.token } });
|
|
99
|
+
}
|
|
94
100
|
}
|
|
95
101
|
exports.SandboxInstance = SandboxInstance;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Sandbox } from "../client/index.js";
|
|
2
|
+
import { SessionCreateOptions, SessionWithToken } from "./types.js";
|
|
3
|
+
export declare class SandboxSessions {
|
|
4
|
+
private sandbox;
|
|
5
|
+
constructor(sandbox: Sandbox);
|
|
6
|
+
get sandboxName(): string;
|
|
7
|
+
create(options?: SessionCreateOptions): Promise<SessionWithToken>;
|
|
8
|
+
list(): Promise<{
|
|
9
|
+
name: string;
|
|
10
|
+
url: string;
|
|
11
|
+
token: string;
|
|
12
|
+
expiresAt: string | Date;
|
|
13
|
+
}[]>;
|
|
14
|
+
get(name: string): Promise<{
|
|
15
|
+
url: string;
|
|
16
|
+
token: string;
|
|
17
|
+
expiresAt: string | Date;
|
|
18
|
+
}>;
|
|
19
|
+
delete(name: string): Promise<import("../client/types.gen.js").Preview>;
|
|
20
|
+
getToken(previewName: string): Promise<import("../client/types.gen.js").PreviewToken | null>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SandboxSessions = void 0;
|
|
4
|
+
const index_js_1 = require("../client/index.js");
|
|
5
|
+
const preview_js_1 = require("./preview.js");
|
|
6
|
+
class SandboxSessions {
|
|
7
|
+
sandbox;
|
|
8
|
+
constructor(sandbox) {
|
|
9
|
+
this.sandbox = sandbox;
|
|
10
|
+
}
|
|
11
|
+
get sandboxName() {
|
|
12
|
+
return this.sandbox.metadata?.name ?? "";
|
|
13
|
+
}
|
|
14
|
+
async create(options = {}) {
|
|
15
|
+
const expiresAt = options.expiresAt ?? new Date(Date.now() + 24 * 60 * 60 * 1000); // 1 day from now
|
|
16
|
+
const body = {
|
|
17
|
+
metadata: {
|
|
18
|
+
name: "session-" + Date.now(),
|
|
19
|
+
},
|
|
20
|
+
spec: {
|
|
21
|
+
port: 443,
|
|
22
|
+
public: false,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const { data } = await (0, index_js_1.createSandboxPreview)({
|
|
26
|
+
path: {
|
|
27
|
+
sandboxName: this.sandboxName,
|
|
28
|
+
},
|
|
29
|
+
body,
|
|
30
|
+
throwOnError: true,
|
|
31
|
+
});
|
|
32
|
+
const preview = new preview_js_1.SandboxPreview(data);
|
|
33
|
+
// Create a token for the preview with the given expiresAt
|
|
34
|
+
const tokenObj = await preview.tokens.create(expiresAt);
|
|
35
|
+
return {
|
|
36
|
+
name: body.metadata.name,
|
|
37
|
+
url: preview.spec?.url ?? "",
|
|
38
|
+
token: tokenObj.value,
|
|
39
|
+
expiresAt: typeof tokenObj.expiresAt === 'string' ? new Date(tokenObj.expiresAt) : tokenObj.expiresAt,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async list() {
|
|
43
|
+
const { data } = await (0, index_js_1.listSandboxPreviews)({
|
|
44
|
+
path: {
|
|
45
|
+
sandboxName: this.sandboxName,
|
|
46
|
+
},
|
|
47
|
+
throwOnError: true,
|
|
48
|
+
});
|
|
49
|
+
return await Promise.all(data.filter((preview) => preview.metadata?.name?.includes("session-")).map(async (preview) => {
|
|
50
|
+
const token = await this.getToken(preview.metadata?.name ?? "");
|
|
51
|
+
return {
|
|
52
|
+
name: preview.metadata?.name ?? "",
|
|
53
|
+
url: preview.spec?.url ?? "",
|
|
54
|
+
token: token?.spec?.token ?? "",
|
|
55
|
+
expiresAt: token?.spec?.expiresAt ?? new Date(),
|
|
56
|
+
};
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
async get(name) {
|
|
60
|
+
const { data } = await (0, index_js_1.getSandboxPreview)({
|
|
61
|
+
path: {
|
|
62
|
+
sandboxName: this.sandboxName,
|
|
63
|
+
previewName: name,
|
|
64
|
+
},
|
|
65
|
+
throwOnError: true,
|
|
66
|
+
});
|
|
67
|
+
const token = await this.getToken(name);
|
|
68
|
+
return {
|
|
69
|
+
url: data.spec?.url ?? "",
|
|
70
|
+
token: token?.spec?.token ?? "",
|
|
71
|
+
expiresAt: token?.spec?.expiresAt ?? new Date(),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async delete(name) {
|
|
75
|
+
const { data } = await (0, index_js_1.deleteSandboxPreview)({
|
|
76
|
+
path: {
|
|
77
|
+
sandboxName: this.sandboxName,
|
|
78
|
+
previewName: name,
|
|
79
|
+
},
|
|
80
|
+
throwOnError: true,
|
|
81
|
+
});
|
|
82
|
+
return data;
|
|
83
|
+
}
|
|
84
|
+
async getToken(previewName) {
|
|
85
|
+
const { data } = await (0, index_js_1.listSandboxPreviewTokens)({
|
|
86
|
+
path: {
|
|
87
|
+
sandboxName: this.sandboxName,
|
|
88
|
+
previewName,
|
|
89
|
+
},
|
|
90
|
+
throwOnError: true,
|
|
91
|
+
});
|
|
92
|
+
if (data.length === 0)
|
|
93
|
+
return null;
|
|
94
|
+
return data[0];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.SandboxSessions = SandboxSessions;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Sandbox } from "../client/types.gen";
|
|
2
|
+
export interface SessionCreateOptions {
|
|
3
|
+
expiresAt?: Date;
|
|
4
|
+
}
|
|
5
|
+
export interface SessionWithToken {
|
|
6
|
+
name: string;
|
|
7
|
+
url: string;
|
|
8
|
+
token: string;
|
|
9
|
+
expiresAt: Date;
|
|
10
|
+
}
|
|
11
|
+
export type SandboxConfiguration = {
|
|
12
|
+
forceUrl?: string;
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
params?: Record<string, string>;
|
|
15
|
+
} & Sandbox;
|
|
@@ -55,4 +55,5 @@ export declare const telemetryRegistry: TelemetryRegistry;
|
|
|
55
55
|
* Create a span with the registered provider
|
|
56
56
|
*/
|
|
57
57
|
export declare function startSpan(name: string, options?: BlaxelSpanOptions): BlaxelSpan;
|
|
58
|
+
export declare function withSpan<T>(name: string, fn: () => T, options?: BlaxelSpanOptions): T;
|
|
58
59
|
export {};
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.telemetryRegistry = void 0;
|
|
5
5
|
exports.startSpan = startSpan;
|
|
6
|
+
exports.withSpan = withSpan;
|
|
6
7
|
/**
|
|
7
8
|
* No-operation implementation of Span
|
|
8
9
|
*/
|
|
@@ -57,3 +58,16 @@ exports.telemetryRegistry = TelemetryRegistry.getInstance();
|
|
|
57
58
|
function startSpan(name, options) {
|
|
58
59
|
return exports.telemetryRegistry.getProvider().startSpan(name, options);
|
|
59
60
|
}
|
|
61
|
+
function withSpan(name, fn, options) {
|
|
62
|
+
const span = startSpan(name, options);
|
|
63
|
+
try {
|
|
64
|
+
const result = fn();
|
|
65
|
+
span.end();
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
span.recordException(error);
|
|
70
|
+
span.end();
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blaxel/core",
|
|
3
|
-
"version": "0.2.0-
|
|
3
|
+
"version": "0.2.0-preview5",
|
|
4
4
|
"description": "Blaxel Core SDK for TypeScript",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Blaxel, INC (https://blaxel.ai)",
|
|
@@ -62,11 +62,13 @@
|
|
|
62
62
|
"uuid": "^11.1.0",
|
|
63
63
|
"ws": "^8.18.2",
|
|
64
64
|
"yaml": "^2.7.1",
|
|
65
|
+
"yargs": "^17.7.2",
|
|
65
66
|
"zod": "^3.24.3"
|
|
66
67
|
},
|
|
67
68
|
"devDependencies": {
|
|
68
69
|
"@eslint/js": "^9.26.0",
|
|
69
70
|
"@types/ws": "^8.18.1",
|
|
71
|
+
"@types/yargs": "^17.0.33",
|
|
70
72
|
"typescript": "^5.0.0",
|
|
71
73
|
"typescript-eslint": "^8.31.1"
|
|
72
74
|
},
|