@unionstreet/apple-sandboxes 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +113 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +101 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +58 -0
- package/dist/client.js +73 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +10 -0
- package/dist/paths.js +16 -0
- package/dist/paths.js.map +1 -0
- package/dist/runtime.d.ts +61 -0
- package/dist/runtime.js +407 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.js +105 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +23 -0
- package/dist/store.js +71 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +15 -0
- package/dist/util.js +63 -0
- package/dist/util.js.map +1 -0
- package/docs/architecture.md +130 -0
- package/package.json +59 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Store } from './store.js';
|
|
2
|
+
import type { CreateImageRequest, CreateSandboxRequest, CreateSnapshotRequest, CreateVolumeRequest, ExecRequest, ExecResult, ImageDefinition, Sandbox, Snapshot, Volume } from './types.js';
|
|
3
|
+
export declare class AppleSandboxRuntime {
|
|
4
|
+
readonly store: Store;
|
|
5
|
+
private reaperTimer?;
|
|
6
|
+
constructor(root?: string);
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
health(): Promise<{
|
|
9
|
+
status: string;
|
|
10
|
+
runtime: string;
|
|
11
|
+
root: string;
|
|
12
|
+
containerBin: string;
|
|
13
|
+
}>;
|
|
14
|
+
createImage(req: CreateImageRequest): Promise<ImageDefinition>;
|
|
15
|
+
buildImage(idOrName: string): Promise<ImageDefinition>;
|
|
16
|
+
listImages(): Promise<ImageDefinition[]>;
|
|
17
|
+
getImage(idOrName: string): Promise<ImageDefinition>;
|
|
18
|
+
deleteImage(idOrName: string): Promise<{
|
|
19
|
+
deleted: string;
|
|
20
|
+
}>;
|
|
21
|
+
createVolume(req: CreateVolumeRequest): Promise<Volume>;
|
|
22
|
+
listVolumes(): Promise<Volume[]>;
|
|
23
|
+
getVolume(idOrName: string): Promise<Volume>;
|
|
24
|
+
deleteVolume(idOrName: string, opts?: {
|
|
25
|
+
force?: boolean;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
deleted: string;
|
|
28
|
+
}>;
|
|
29
|
+
createSandbox(req?: CreateSandboxRequest): Promise<Sandbox>;
|
|
30
|
+
listSandboxes(): Promise<Sandbox[]>;
|
|
31
|
+
getSandbox(idOrName: string): Promise<Sandbox>;
|
|
32
|
+
startSandbox(idOrName: string): Promise<Sandbox>;
|
|
33
|
+
stopSandbox(idOrName: string): Promise<Sandbox>;
|
|
34
|
+
deleteSandbox(idOrName: string): Promise<{
|
|
35
|
+
deleted: string;
|
|
36
|
+
}>;
|
|
37
|
+
exec(idOrName: string, req: ExecRequest): Promise<ExecResult>;
|
|
38
|
+
readFile(idOrName: string, filePath: string): Promise<Buffer>;
|
|
39
|
+
writeFile(idOrName: string, filePath: string, body: Buffer): Promise<{
|
|
40
|
+
path: string;
|
|
41
|
+
bytes: number;
|
|
42
|
+
}>;
|
|
43
|
+
createSnapshot(req: CreateSnapshotRequest): Promise<Snapshot>;
|
|
44
|
+
listSnapshots(): Promise<Snapshot[]>;
|
|
45
|
+
getSnapshot(idOrName: string): Promise<Snapshot>;
|
|
46
|
+
deleteSnapshot(idOrName: string): Promise<{
|
|
47
|
+
deleted: string;
|
|
48
|
+
}>;
|
|
49
|
+
extractArchive(archivePath: string, workspace: string): Promise<void>;
|
|
50
|
+
reapOnce(): Promise<{
|
|
51
|
+
stopped: string[];
|
|
52
|
+
deleted: string[];
|
|
53
|
+
errors: Array<{
|
|
54
|
+
sandboxId: string;
|
|
55
|
+
error: string;
|
|
56
|
+
}>;
|
|
57
|
+
}>;
|
|
58
|
+
startReaper(intervalMs?: number): NodeJS.Timeout;
|
|
59
|
+
stopReaper(): void;
|
|
60
|
+
close(): Promise<void>;
|
|
61
|
+
}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import fsSync from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { Store } from './store.js';
|
|
5
|
+
import { ensureDir, exists, id, now, run, safeJoin, writeJson } from './util.js';
|
|
6
|
+
const containerBin = process.env.APPLE_CONTAINER_BIN ||
|
|
7
|
+
(fsSync.existsSync('/opt/homebrew/bin/container') ? '/opt/homebrew/bin/container' : '/usr/local/bin/container');
|
|
8
|
+
function normalizeNetwork(input) {
|
|
9
|
+
if (input === true)
|
|
10
|
+
return { mode: 'open' };
|
|
11
|
+
if (input === false || input == null)
|
|
12
|
+
return { mode: 'deny' };
|
|
13
|
+
return { mode: input.mode || 'deny', allowedHosts: input.allowedHosts || [] };
|
|
14
|
+
}
|
|
15
|
+
async function dirSize(root) {
|
|
16
|
+
let total = 0;
|
|
17
|
+
async function walk(dir) {
|
|
18
|
+
for (const entry of await fs.readdir(dir, { withFileTypes: true })) {
|
|
19
|
+
const file = path.join(dir, entry.name);
|
|
20
|
+
if (entry.isDirectory())
|
|
21
|
+
await walk(file);
|
|
22
|
+
else if (entry.isFile())
|
|
23
|
+
total += (await fs.stat(file)).size;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (await exists(root))
|
|
27
|
+
await walk(root);
|
|
28
|
+
return total;
|
|
29
|
+
}
|
|
30
|
+
function secondsSince(iso) {
|
|
31
|
+
return (Date.now() - Date.parse(iso)) / 1000;
|
|
32
|
+
}
|
|
33
|
+
export class AppleSandboxRuntime {
|
|
34
|
+
store;
|
|
35
|
+
reaperTimer;
|
|
36
|
+
constructor(root) {
|
|
37
|
+
this.store = new Store(root);
|
|
38
|
+
}
|
|
39
|
+
async init() {
|
|
40
|
+
await this.store.init();
|
|
41
|
+
}
|
|
42
|
+
async health() {
|
|
43
|
+
await this.init();
|
|
44
|
+
return {
|
|
45
|
+
status: 'ok',
|
|
46
|
+
runtime: 'apple-container',
|
|
47
|
+
root: this.store.paths.root,
|
|
48
|
+
containerBin,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async createImage(req) {
|
|
52
|
+
await this.init();
|
|
53
|
+
if (!req.image && !req.dockerfile)
|
|
54
|
+
throw Object.assign(new Error('image or dockerfile is required'), { status: 400 });
|
|
55
|
+
const imageId = id('img');
|
|
56
|
+
const image = req.image || `apple-sandboxes/${req.name}:${imageId.replace('img_', '')}`;
|
|
57
|
+
const context = this.store.imageContext(imageId);
|
|
58
|
+
await ensureDir(context);
|
|
59
|
+
if (req.dockerfile)
|
|
60
|
+
await fs.writeFile(path.join(context, 'Dockerfile'), req.dockerfile);
|
|
61
|
+
const meta = {
|
|
62
|
+
id: imageId,
|
|
63
|
+
name: req.name,
|
|
64
|
+
image,
|
|
65
|
+
state: req.dockerfile ? 'created' : 'ready',
|
|
66
|
+
hasDockerfile: Boolean(req.dockerfile),
|
|
67
|
+
cpus: req.cpus || 2,
|
|
68
|
+
memory: req.memory || '2G',
|
|
69
|
+
labels: req.labels || {},
|
|
70
|
+
createdAt: now(),
|
|
71
|
+
updatedAt: now(),
|
|
72
|
+
};
|
|
73
|
+
await this.store.put('images', meta);
|
|
74
|
+
if (req.build)
|
|
75
|
+
return this.buildImage(imageId);
|
|
76
|
+
return meta;
|
|
77
|
+
}
|
|
78
|
+
async buildImage(idOrName) {
|
|
79
|
+
const meta = await this.store.get('images', idOrName);
|
|
80
|
+
if (!meta.hasDockerfile)
|
|
81
|
+
throw Object.assign(new Error('image has no Dockerfile'), { status: 400 });
|
|
82
|
+
meta.state = 'building';
|
|
83
|
+
meta.updatedAt = now();
|
|
84
|
+
await this.store.put('images', meta);
|
|
85
|
+
const result = await run(containerBin, [
|
|
86
|
+
'build',
|
|
87
|
+
'--platform',
|
|
88
|
+
'linux/arm64',
|
|
89
|
+
'--cpus',
|
|
90
|
+
String(meta.cpus),
|
|
91
|
+
'--memory',
|
|
92
|
+
meta.memory,
|
|
93
|
+
'--tag',
|
|
94
|
+
meta.image,
|
|
95
|
+
this.store.imageContext(meta.id),
|
|
96
|
+
], { timeoutMs: 30 * 60_000 });
|
|
97
|
+
if (result.exitCode !== 0) {
|
|
98
|
+
meta.state = 'error';
|
|
99
|
+
meta.error = result.stderr || result.stdout;
|
|
100
|
+
meta.updatedAt = now();
|
|
101
|
+
await this.store.put('images', meta);
|
|
102
|
+
throw Object.assign(new Error(meta.error), { status: 500 });
|
|
103
|
+
}
|
|
104
|
+
meta.state = 'ready';
|
|
105
|
+
meta.updatedAt = now();
|
|
106
|
+
delete meta.error;
|
|
107
|
+
return this.store.put('images', meta);
|
|
108
|
+
}
|
|
109
|
+
listImages() {
|
|
110
|
+
return this.store.list('images');
|
|
111
|
+
}
|
|
112
|
+
getImage(idOrName) {
|
|
113
|
+
return this.store.get('images', idOrName);
|
|
114
|
+
}
|
|
115
|
+
async deleteImage(idOrName) {
|
|
116
|
+
return { deleted: await this.store.delete('images', idOrName) };
|
|
117
|
+
}
|
|
118
|
+
async createVolume(req) {
|
|
119
|
+
await this.init();
|
|
120
|
+
const volume = {
|
|
121
|
+
id: id('vol'),
|
|
122
|
+
name: req.name,
|
|
123
|
+
path: '',
|
|
124
|
+
labels: req.labels || {},
|
|
125
|
+
createdAt: now(),
|
|
126
|
+
updatedAt: now(),
|
|
127
|
+
};
|
|
128
|
+
volume.path = this.store.volumePath(volume.id);
|
|
129
|
+
await ensureDir(volume.path);
|
|
130
|
+
return this.store.put('volumes', volume);
|
|
131
|
+
}
|
|
132
|
+
listVolumes() {
|
|
133
|
+
return this.store.list('volumes');
|
|
134
|
+
}
|
|
135
|
+
getVolume(idOrName) {
|
|
136
|
+
return this.store.get('volumes', idOrName);
|
|
137
|
+
}
|
|
138
|
+
async deleteVolume(idOrName, opts = {}) {
|
|
139
|
+
const volume = await this.getVolume(idOrName);
|
|
140
|
+
if (!opts.force) {
|
|
141
|
+
const sandboxes = await this.listSandboxes();
|
|
142
|
+
const attached = sandboxes.find((sandbox) => sandbox.state !== 'deleted' && sandbox.volumes.some((mount) => mount.volumeId === volume.id || mount.volumeId === volume.name));
|
|
143
|
+
if (attached) {
|
|
144
|
+
throw Object.assign(new Error(`volume is attached to sandbox ${attached.id}; pass force=true to delete anyway`), { status: 409 });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { deleted: await this.store.delete('volumes', idOrName) };
|
|
148
|
+
}
|
|
149
|
+
async createSandbox(req = {}) {
|
|
150
|
+
await this.init();
|
|
151
|
+
const sandboxId = id('sbx');
|
|
152
|
+
const imageDef = req.imageId ? await this.store.get('images', req.imageId) : undefined;
|
|
153
|
+
const snapshot = req.snapshotId ? await this.store.get('snapshots', req.snapshotId) : undefined;
|
|
154
|
+
const image = snapshot?.image || imageDef?.image || req.image || 'ubuntu:24.04';
|
|
155
|
+
const network = normalizeNetwork(req.network);
|
|
156
|
+
const workspace = this.store.sandboxWorkspace(sandboxId);
|
|
157
|
+
await ensureDir(workspace);
|
|
158
|
+
await ensureDir(this.store.sandboxSnapshots(sandboxId));
|
|
159
|
+
const sandbox = {
|
|
160
|
+
id: sandboxId,
|
|
161
|
+
name: req.name || sandboxId,
|
|
162
|
+
state: 'creating',
|
|
163
|
+
source: snapshot ? 'snapshot' : imageDef ? 'image' : 'inline',
|
|
164
|
+
image,
|
|
165
|
+
imageId: imageDef?.id,
|
|
166
|
+
snapshotId: snapshot?.id,
|
|
167
|
+
containerName: `apple-sbx-${sandboxId.replace('sbx_', '')}`,
|
|
168
|
+
workspace,
|
|
169
|
+
cpus: req.cpus || 2,
|
|
170
|
+
memory: req.memory || '2G',
|
|
171
|
+
network,
|
|
172
|
+
volumes: req.volumes || [],
|
|
173
|
+
createdAt: now(),
|
|
174
|
+
updatedAt: now(),
|
|
175
|
+
lastActivityAt: now(),
|
|
176
|
+
idleTimeoutSeconds: req.idleTimeoutSeconds,
|
|
177
|
+
maxLifetimeSeconds: req.maxLifetimeSeconds,
|
|
178
|
+
autoDeleteSeconds: req.autoDeleteSeconds,
|
|
179
|
+
};
|
|
180
|
+
await this.store.put('sandboxes', sandbox);
|
|
181
|
+
if (snapshot)
|
|
182
|
+
await this.extractArchive(snapshot.archivePath, workspace);
|
|
183
|
+
const args = [
|
|
184
|
+
'create',
|
|
185
|
+
'--name',
|
|
186
|
+
sandbox.containerName,
|
|
187
|
+
'--platform',
|
|
188
|
+
'linux/arm64',
|
|
189
|
+
'--cpus',
|
|
190
|
+
String(sandbox.cpus),
|
|
191
|
+
'--memory',
|
|
192
|
+
sandbox.memory,
|
|
193
|
+
'--mount',
|
|
194
|
+
`type=bind,source=${workspace},target=/workspace`,
|
|
195
|
+
'--workdir',
|
|
196
|
+
'/workspace',
|
|
197
|
+
];
|
|
198
|
+
if (network.mode !== 'open')
|
|
199
|
+
args.push('--network', 'none');
|
|
200
|
+
for (const mount of sandbox.volumes) {
|
|
201
|
+
const volume = await this.store.get('volumes', mount.volumeId);
|
|
202
|
+
args.push('--mount', `type=bind,source=${volume.path},target=${mount.mountPath}${mount.readonly ? ',readonly' : ''}`);
|
|
203
|
+
}
|
|
204
|
+
for (const [key, value] of Object.entries(req.env || {}))
|
|
205
|
+
args.push('--env', `${key}=${value}`);
|
|
206
|
+
args.push(image, 'sh', '-lc', 'while true; do sleep 3600; done');
|
|
207
|
+
const created = await run(containerBin, args, { timeoutMs: 120_000 });
|
|
208
|
+
if (created.exitCode !== 0) {
|
|
209
|
+
sandbox.state = 'error';
|
|
210
|
+
sandbox.updatedAt = now();
|
|
211
|
+
await this.store.put('sandboxes', sandbox);
|
|
212
|
+
throw Object.assign(new Error(created.stderr || created.stdout), { status: 500 });
|
|
213
|
+
}
|
|
214
|
+
sandbox.state = 'created';
|
|
215
|
+
sandbox.updatedAt = now();
|
|
216
|
+
await this.store.put('sandboxes', sandbox);
|
|
217
|
+
if (req.autoStart !== false)
|
|
218
|
+
return this.startSandbox(sandbox.id);
|
|
219
|
+
return sandbox;
|
|
220
|
+
}
|
|
221
|
+
listSandboxes() {
|
|
222
|
+
return this.store.list('sandboxes');
|
|
223
|
+
}
|
|
224
|
+
getSandbox(idOrName) {
|
|
225
|
+
return this.store.get('sandboxes', idOrName);
|
|
226
|
+
}
|
|
227
|
+
async startSandbox(idOrName) {
|
|
228
|
+
const sandbox = await this.getSandbox(idOrName);
|
|
229
|
+
if (sandbox.state !== 'running') {
|
|
230
|
+
const result = await run(containerBin, ['start', sandbox.containerName], { timeoutMs: 60_000 });
|
|
231
|
+
if (result.exitCode !== 0)
|
|
232
|
+
throw Object.assign(new Error(result.stderr || result.stdout), { status: 500 });
|
|
233
|
+
sandbox.state = 'running';
|
|
234
|
+
}
|
|
235
|
+
sandbox.lastActivityAt = now();
|
|
236
|
+
sandbox.updatedAt = now();
|
|
237
|
+
return this.store.put('sandboxes', sandbox);
|
|
238
|
+
}
|
|
239
|
+
async stopSandbox(idOrName) {
|
|
240
|
+
const sandbox = await this.getSandbox(idOrName);
|
|
241
|
+
if (sandbox.state === 'running') {
|
|
242
|
+
const result = await run(containerBin, ['stop', '--time', '5', sandbox.containerName], { timeoutMs: 60_000 });
|
|
243
|
+
if (result.exitCode !== 0)
|
|
244
|
+
throw Object.assign(new Error(result.stderr || result.stdout), { status: 500 });
|
|
245
|
+
}
|
|
246
|
+
sandbox.state = 'stopped';
|
|
247
|
+
sandbox.updatedAt = now();
|
|
248
|
+
return this.store.put('sandboxes', sandbox);
|
|
249
|
+
}
|
|
250
|
+
async deleteSandbox(idOrName) {
|
|
251
|
+
const sandbox = await this.getSandbox(idOrName);
|
|
252
|
+
const result = await run(containerBin, ['delete', '--force', sandbox.containerName], { timeoutMs: 60_000 });
|
|
253
|
+
if (result.exitCode !== 0)
|
|
254
|
+
throw Object.assign(new Error(result.stderr || result.stdout), { status: 500 });
|
|
255
|
+
sandbox.state = 'deleted';
|
|
256
|
+
sandbox.updatedAt = now();
|
|
257
|
+
await this.store.put('sandboxes', sandbox);
|
|
258
|
+
return { deleted: sandbox.id };
|
|
259
|
+
}
|
|
260
|
+
async exec(idOrName, req) {
|
|
261
|
+
const sandbox = await this.getSandbox(idOrName);
|
|
262
|
+
if (sandbox.state !== 'running')
|
|
263
|
+
await this.startSandbox(sandbox.id);
|
|
264
|
+
sandbox.lastActivityAt = now();
|
|
265
|
+
sandbox.updatedAt = now();
|
|
266
|
+
await this.store.put('sandboxes', sandbox);
|
|
267
|
+
const args = ['exec', '-w', '/workspace'];
|
|
268
|
+
for (const [key, value] of Object.entries(req.env || {}))
|
|
269
|
+
args.push('--env', `${key}=${value}`);
|
|
270
|
+
args.push(sandbox.containerName, 'sh', '-lc', req.command);
|
|
271
|
+
const startedAt = now();
|
|
272
|
+
let result = await run(containerBin, args, { timeoutMs: (req.timeoutSeconds || 300) * 1000 });
|
|
273
|
+
if (result.exitCode !== 0 && result.stderr.includes('container is not running')) {
|
|
274
|
+
const started = await run(containerBin, ['start', sandbox.containerName], { timeoutMs: 60_000 });
|
|
275
|
+
if (started.exitCode === 0) {
|
|
276
|
+
sandbox.state = 'running';
|
|
277
|
+
sandbox.updatedAt = now();
|
|
278
|
+
sandbox.lastActivityAt = now();
|
|
279
|
+
await this.store.put('sandboxes', sandbox);
|
|
280
|
+
}
|
|
281
|
+
result = await run(containerBin, args, { timeoutMs: (req.timeoutSeconds || 300) * 1000 });
|
|
282
|
+
}
|
|
283
|
+
const execResult = {
|
|
284
|
+
id: id('exec'),
|
|
285
|
+
sandboxId: sandbox.id,
|
|
286
|
+
command: req.command,
|
|
287
|
+
status: result.exitCode === 0 ? 'succeeded' : result.exitCode === null ? 'timed_out' : 'failed',
|
|
288
|
+
exitCode: result.exitCode,
|
|
289
|
+
stdout: result.stdout,
|
|
290
|
+
stderr: result.stderr,
|
|
291
|
+
createdAt: startedAt,
|
|
292
|
+
startedAt,
|
|
293
|
+
finishedAt: now(),
|
|
294
|
+
};
|
|
295
|
+
sandbox.lastActivityAt = now();
|
|
296
|
+
sandbox.updatedAt = now();
|
|
297
|
+
await this.store.put('sandboxes', sandbox);
|
|
298
|
+
await writeJson(path.join(this.store.dir('sandboxes', sandbox.id), 'execs', execResult.id, 'meta.json'), execResult);
|
|
299
|
+
return execResult;
|
|
300
|
+
}
|
|
301
|
+
async readFile(idOrName, filePath) {
|
|
302
|
+
const sandbox = await this.getSandbox(idOrName);
|
|
303
|
+
return fs.readFile(safeJoin(sandbox.workspace, filePath));
|
|
304
|
+
}
|
|
305
|
+
async writeFile(idOrName, filePath, body) {
|
|
306
|
+
const sandbox = await this.getSandbox(idOrName);
|
|
307
|
+
const target = safeJoin(sandbox.workspace, filePath);
|
|
308
|
+
await ensureDir(path.dirname(target));
|
|
309
|
+
await fs.writeFile(target, body);
|
|
310
|
+
sandbox.lastActivityAt = now();
|
|
311
|
+
sandbox.updatedAt = now();
|
|
312
|
+
await this.store.put('sandboxes', sandbox);
|
|
313
|
+
return { path: filePath, bytes: body.byteLength };
|
|
314
|
+
}
|
|
315
|
+
async createSnapshot(req) {
|
|
316
|
+
const sandbox = await this.getSandbox(req.sandboxId);
|
|
317
|
+
const snapshotId = id('snap');
|
|
318
|
+
const archivePath = this.store.snapshotArchive(snapshotId);
|
|
319
|
+
await ensureDir(path.dirname(archivePath));
|
|
320
|
+
const result = await run('/usr/bin/tar', ['-czf', archivePath, '-C', path.dirname(sandbox.workspace), path.basename(sandbox.workspace)], {
|
|
321
|
+
timeoutMs: 10 * 60_000,
|
|
322
|
+
});
|
|
323
|
+
if (result.exitCode !== 0)
|
|
324
|
+
throw Object.assign(new Error(result.stderr || result.stdout), { status: 500 });
|
|
325
|
+
const snapshot = {
|
|
326
|
+
id: snapshotId,
|
|
327
|
+
name: req.name,
|
|
328
|
+
state: 'ready',
|
|
329
|
+
sourceSandboxId: sandbox.id,
|
|
330
|
+
image: sandbox.image,
|
|
331
|
+
archivePath,
|
|
332
|
+
archiveBytes: (await fs.stat(archivePath)).size,
|
|
333
|
+
workspaceBytes: await dirSize(sandbox.workspace),
|
|
334
|
+
labels: req.labels || {},
|
|
335
|
+
createdAt: now(),
|
|
336
|
+
updatedAt: now(),
|
|
337
|
+
};
|
|
338
|
+
return this.store.put('snapshots', snapshot);
|
|
339
|
+
}
|
|
340
|
+
listSnapshots() {
|
|
341
|
+
return this.store.list('snapshots');
|
|
342
|
+
}
|
|
343
|
+
getSnapshot(idOrName) {
|
|
344
|
+
return this.store.get('snapshots', idOrName);
|
|
345
|
+
}
|
|
346
|
+
async deleteSnapshot(idOrName) {
|
|
347
|
+
return { deleted: await this.store.delete('snapshots', idOrName) };
|
|
348
|
+
}
|
|
349
|
+
async extractArchive(archivePath, workspace) {
|
|
350
|
+
await fs.rm(workspace, { recursive: true, force: true });
|
|
351
|
+
await ensureDir(workspace);
|
|
352
|
+
const result = await run('/usr/bin/tar', ['-xzf', archivePath, '-C', path.dirname(workspace)], { timeoutMs: 10 * 60_000 });
|
|
353
|
+
if (result.exitCode !== 0)
|
|
354
|
+
throw Object.assign(new Error(result.stderr || result.stdout), { status: 500 });
|
|
355
|
+
}
|
|
356
|
+
async reapOnce() {
|
|
357
|
+
const stopped = [];
|
|
358
|
+
const deleted = [];
|
|
359
|
+
const errors = [];
|
|
360
|
+
for (const sandbox of await this.listSandboxes()) {
|
|
361
|
+
if (sandbox.state === 'deleted' || sandbox.state === 'error')
|
|
362
|
+
continue;
|
|
363
|
+
try {
|
|
364
|
+
const age = secondsSince(sandbox.createdAt);
|
|
365
|
+
const idle = secondsSince(sandbox.lastActivityAt);
|
|
366
|
+
if (sandbox.state === 'running' && sandbox.maxLifetimeSeconds && age >= sandbox.maxLifetimeSeconds) {
|
|
367
|
+
await this.stopSandbox(sandbox.id);
|
|
368
|
+
stopped.push(sandbox.id);
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
if (sandbox.state === 'running' && sandbox.idleTimeoutSeconds && idle >= sandbox.idleTimeoutSeconds) {
|
|
372
|
+
await this.stopSandbox(sandbox.id);
|
|
373
|
+
stopped.push(sandbox.id);
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
const current = await this.getSandbox(sandbox.id);
|
|
377
|
+
if (current.state !== 'running' && current.autoDeleteSeconds && secondsSince(current.updatedAt) >= current.autoDeleteSeconds) {
|
|
378
|
+
await this.deleteSandbox(current.id);
|
|
379
|
+
deleted.push(current.id);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
errors.push({ sandboxId: sandbox.id, error: error instanceof Error ? error.message : String(error) });
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return { stopped, deleted, errors };
|
|
387
|
+
}
|
|
388
|
+
startReaper(intervalMs = 30_000) {
|
|
389
|
+
this.stopReaper();
|
|
390
|
+
const timer = setInterval(() => {
|
|
391
|
+
this.reapOnce().catch(() => undefined);
|
|
392
|
+
}, intervalMs);
|
|
393
|
+
timer.unref();
|
|
394
|
+
this.reaperTimer = timer;
|
|
395
|
+
return timer;
|
|
396
|
+
}
|
|
397
|
+
stopReaper() {
|
|
398
|
+
if (this.reaperTimer) {
|
|
399
|
+
clearInterval(this.reaperTimer);
|
|
400
|
+
this.reaperTimer = undefined;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
async close() {
|
|
404
|
+
this.stopReaper();
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ServeOptions {
|
|
2
|
+
root?: string;
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
reaper?: boolean;
|
|
7
|
+
reaperIntervalMs?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function createApp(root?: string, options?: Pick<ServeOptions, 'apiKey' | 'reaper' | 'reaperIntervalMs'>): import("express-serve-static-core").Express;
|
|
10
|
+
export declare function serve(options?: ServeOptions): Promise<{
|
|
11
|
+
host: string;
|
|
12
|
+
port: number;
|
|
13
|
+
}>;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { AppleSandboxRuntime } from './runtime.js';
|
|
3
|
+
function asyncRoute(fn) {
|
|
4
|
+
return (req, res) => {
|
|
5
|
+
fn(req, res)
|
|
6
|
+
.then((value) => {
|
|
7
|
+
if (!res.headersSent)
|
|
8
|
+
res.json(value);
|
|
9
|
+
})
|
|
10
|
+
.catch((error) => {
|
|
11
|
+
const status = typeof error.status === 'number' ? error.status : 500;
|
|
12
|
+
res.status(status).json({ error: error.message || String(error) });
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function param(value) {
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return value.join('/');
|
|
19
|
+
return value || '';
|
|
20
|
+
}
|
|
21
|
+
export function createApp(root, options = {}) {
|
|
22
|
+
const runtime = new AppleSandboxRuntime(root);
|
|
23
|
+
const app = express();
|
|
24
|
+
app.use(express.json({ limit: '20mb' }));
|
|
25
|
+
const apiKey = options.apiKey ?? process.env.APPLE_SANDBOXES_API_KEY;
|
|
26
|
+
if (apiKey) {
|
|
27
|
+
const publicPaths = new Set(['/health', '/openapi.json']);
|
|
28
|
+
app.use((req, res, next) => {
|
|
29
|
+
if (publicPaths.has(req.path))
|
|
30
|
+
return next();
|
|
31
|
+
const auth = req.header('authorization');
|
|
32
|
+
const bearer = auth?.toLowerCase().startsWith('bearer ') ? auth.slice(7) : undefined;
|
|
33
|
+
const key = bearer || req.header('x-api-key');
|
|
34
|
+
if (key !== apiKey)
|
|
35
|
+
return res.status(401).json({ error: 'unauthorized' });
|
|
36
|
+
next();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (options.reaper !== false)
|
|
40
|
+
runtime.startReaper(options.reaperIntervalMs);
|
|
41
|
+
app.get('/health', asyncRoute(async () => runtime.health()));
|
|
42
|
+
app.get('/openapi.json', (_req, res) => res.json(openApi()));
|
|
43
|
+
app.post('/v1/images', asyncRoute(async (req) => runtime.createImage(req.body)));
|
|
44
|
+
app.get('/v1/images', asyncRoute(async () => ({ images: await runtime.listImages() })));
|
|
45
|
+
app.get('/v1/images/:id', asyncRoute(async (req) => runtime.getImage(param(req.params.id))));
|
|
46
|
+
app.post('/v1/images/:id/build', asyncRoute(async (req) => runtime.buildImage(param(req.params.id))));
|
|
47
|
+
app.delete('/v1/images/:id', asyncRoute(async (req) => runtime.deleteImage(param(req.params.id))));
|
|
48
|
+
app.post('/v1/volumes', asyncRoute(async (req) => runtime.createVolume(req.body)));
|
|
49
|
+
app.get('/v1/volumes', asyncRoute(async () => ({ volumes: await runtime.listVolumes() })));
|
|
50
|
+
app.get('/v1/volumes/:id', asyncRoute(async (req) => runtime.getVolume(param(req.params.id))));
|
|
51
|
+
app.delete('/v1/volumes/:id', asyncRoute(async (req) => runtime.deleteVolume(param(req.params.id), { force: req.query.force === 'true' })));
|
|
52
|
+
app.post('/v1/snapshots', asyncRoute(async (req) => runtime.createSnapshot(req.body)));
|
|
53
|
+
app.get('/v1/snapshots', asyncRoute(async () => ({ snapshots: await runtime.listSnapshots() })));
|
|
54
|
+
app.get('/v1/snapshots/:id', asyncRoute(async (req) => runtime.getSnapshot(param(req.params.id))));
|
|
55
|
+
app.delete('/v1/snapshots/:id', asyncRoute(async (req) => runtime.deleteSnapshot(param(req.params.id))));
|
|
56
|
+
app.post('/v1/sandboxes', asyncRoute(async (req) => runtime.createSandbox(req.body)));
|
|
57
|
+
app.get('/v1/sandboxes', asyncRoute(async () => ({ sandboxes: await runtime.listSandboxes() })));
|
|
58
|
+
app.get('/v1/sandboxes/:id', asyncRoute(async (req) => runtime.getSandbox(param(req.params.id))));
|
|
59
|
+
app.post('/v1/sandboxes/:id/start', asyncRoute(async (req) => runtime.startSandbox(param(req.params.id))));
|
|
60
|
+
app.post('/v1/sandboxes/:id/stop', asyncRoute(async (req) => runtime.stopSandbox(param(req.params.id))));
|
|
61
|
+
app.delete('/v1/sandboxes/:id', asyncRoute(async (req) => runtime.deleteSandbox(param(req.params.id))));
|
|
62
|
+
app.post('/v1/sandboxes/:id/exec', asyncRoute(async (req) => runtime.exec(param(req.params.id), req.body)));
|
|
63
|
+
app.get('/v1/sandboxes/:id/files/*path', asyncRoute(async (req, res) => {
|
|
64
|
+
const file = await runtime.readFile(param(req.params.id), param(req.params.path));
|
|
65
|
+
res.type('application/octet-stream').send(file);
|
|
66
|
+
return undefined;
|
|
67
|
+
}));
|
|
68
|
+
app.put('/v1/sandboxes/:id/files/*path', express.raw({ type: '*/*', limit: '200mb' }), asyncRoute(async (req) => runtime.writeFile(param(req.params.id), param(req.params.path), Buffer.isBuffer(req.body) ? req.body : Buffer.from(req.body || ''))));
|
|
69
|
+
return app;
|
|
70
|
+
}
|
|
71
|
+
export async function serve(options = {}) {
|
|
72
|
+
const host = options.host || process.env.APPLE_SANDBOXES_HOST || '127.0.0.1';
|
|
73
|
+
const port = options.port || Number(process.env.APPLE_SANDBOXES_PORT || 9102);
|
|
74
|
+
const app = createApp(options.root, options);
|
|
75
|
+
await new Promise((resolve) => {
|
|
76
|
+
app.listen(port, host, () => resolve());
|
|
77
|
+
});
|
|
78
|
+
return { host, port };
|
|
79
|
+
}
|
|
80
|
+
function openApi() {
|
|
81
|
+
return {
|
|
82
|
+
openapi: '3.1.0',
|
|
83
|
+
info: {
|
|
84
|
+
title: 'Apple Sandboxes',
|
|
85
|
+
version: '0.1.0',
|
|
86
|
+
},
|
|
87
|
+
paths: {
|
|
88
|
+
'/health': { get: {} },
|
|
89
|
+
'/v1/images': { get: {}, post: {} },
|
|
90
|
+
'/v1/images/{id}': { get: {}, delete: {} },
|
|
91
|
+
'/v1/images/{id}/build': { post: {} },
|
|
92
|
+
'/v1/volumes': { get: {}, post: {} },
|
|
93
|
+
'/v1/volumes/{id}': { get: {}, delete: {} },
|
|
94
|
+
'/v1/snapshots': { get: {}, post: {} },
|
|
95
|
+
'/v1/snapshots/{id}': { get: {}, delete: {} },
|
|
96
|
+
'/v1/sandboxes': { get: {}, post: {} },
|
|
97
|
+
'/v1/sandboxes/{id}': { get: {}, delete: {} },
|
|
98
|
+
'/v1/sandboxes/{id}/start': { post: {} },
|
|
99
|
+
'/v1/sandboxes/{id}/stop': { post: {} },
|
|
100
|
+
'/v1/sandboxes/{id}/exec': { post: {} },
|
|
101
|
+
'/v1/sandboxes/{id}/files/{path}': { get: {}, put: {} },
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type StorePaths } from './paths.js';
|
|
2
|
+
import type { ImageDefinition, Sandbox, Snapshot, Volume } from './types.js';
|
|
3
|
+
type Kind = 'sandboxes' | 'images' | 'snapshots' | 'volumes';
|
|
4
|
+
export declare class Store {
|
|
5
|
+
readonly paths: StorePaths;
|
|
6
|
+
constructor(root?: string);
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
dir(kind: Kind, id: string): string;
|
|
9
|
+
meta(kind: Kind, id: string): string;
|
|
10
|
+
put<T extends {
|
|
11
|
+
id: string;
|
|
12
|
+
}>(kind: Kind, value: T): Promise<T>;
|
|
13
|
+
get<T>(kind: Kind, idOrName: string): Promise<T>;
|
|
14
|
+
list<T>(kind: Kind): Promise<T[]>;
|
|
15
|
+
delete(kind: Kind, idOrName: string): Promise<string>;
|
|
16
|
+
sandboxWorkspace(id: string): string;
|
|
17
|
+
sandboxSnapshots(id: string): string;
|
|
18
|
+
imageContext(id: string): string;
|
|
19
|
+
snapshotArchive(id: string): string;
|
|
20
|
+
volumePath(id: string): string;
|
|
21
|
+
}
|
|
22
|
+
export type Stored = Sandbox | ImageDefinition | Snapshot | Volume;
|
|
23
|
+
export {};
|