@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.
@@ -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
+ }
@@ -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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"}
@@ -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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"}
@@ -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 {};