@multiplayer-app/sandbox 1.0.0-wip-yjs-state-changes.0 → 2.0.0-wip-yjs-state-changes.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/README.md +26 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +44 -6
- package/dist/cli.js.map +1 -1
- package/dist/config.js +32 -32
- package/dist/config.js.map +1 -1
- package/package.json +7 -4
package/README.md
CHANGED
|
@@ -8,12 +8,35 @@ WebSocket, so the worker needs **no inbound ports**.
|
|
|
8
8
|
Supported engines (auto-detected): `qemu`, `firecracker`, `docker`, `docker-sandbox`,
|
|
9
9
|
`lambda-microvm`, `fargate`, `remote`, and `mock`.
|
|
10
10
|
|
|
11
|
-
`vm-gateway`
|
|
12
|
-
`services/vm-gateway/src/index.ts`)
|
|
13
|
-
`
|
|
11
|
+
`vm-gateway` can import this package directly and run the worker in-process (see
|
|
12
|
+
`services/vm-gateway/src/index.ts`). The published package also installs a standalone
|
|
13
|
+
`sandbox` executable. Engine configuration is env-driven and auto-detected —
|
|
14
14
|
`WORKER_ID`, `WORKER_TOKEN`, `SANDBOX_URL`, `MAX_VMS`, `WORKER_REGION`, plus per-engine
|
|
15
15
|
vars like `QEMU_IMAGES_DIR`, `DOCKER_STACK_IMAGES`, `MICROVM_IMAGE_ARN`,
|
|
16
16
|
`FARGATE_CLUSTER`, `AGENT_URL` — see `src/config.ts` for the full list.
|
|
17
|
+
`WORKER_TOKEN` is required. `WORKER_ID` is optional and defaults to the machine
|
|
18
|
+
hostname; set it explicitly when multiple workers could report the same hostname.
|
|
19
|
+
`SANDBOX_URL` is optional and defaults to
|
|
20
|
+
`https://api.sandbox.filingramp.com`; set it explicitly for local or self-hosted
|
|
21
|
+
control planes.
|
|
22
|
+
|
|
23
|
+
## Start a worker
|
|
24
|
+
|
|
25
|
+
Install the package globally and start the worker with its authentication token:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npm install --global @multiplayer-app/sandbox
|
|
29
|
+
WORKER_TOKEN=<token> sandbox start
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The worker ID defaults to the hostname and the control-plane URL defaults to
|
|
33
|
+
`https://api.sandbox.filingramp.com`. Both can be overridden with environment
|
|
34
|
+
variables or flags:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
sandbox start --token <token> --worker-id worker-eu-01 \
|
|
38
|
+
--sandbox-url http://localhost:3011 --max-vms 5
|
|
39
|
+
```
|
|
17
40
|
|
|
18
41
|
For the `qemu` engine, the host needs QEMU (`qemu-system-*`) installed; for
|
|
19
42
|
`firecracker`, a Linux host with `/dev/kvm`; for `docker`, just a running Docker
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAIA,OAAO,eAAe,CAAA"}
|
package/dist/cli.js
CHANGED
|
@@ -2,20 +2,58 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
/* eslint-disable no-console -- console output is the CLI's user interface */
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// sandbox in-process); invoke via `pnpm --filter @multiplayer-app/sandbox run cli -- <args>`.
|
|
5
|
+
// Worker CLI. Published as the global `sandbox` executable and also available locally via
|
|
6
|
+
// `pnpm --filter @multiplayer-app/sandbox run cli -- <args>`.
|
|
8
7
|
require("dotenv/config");
|
|
9
8
|
const commander_1 = require("commander");
|
|
10
9
|
const package_json_1 = require("../package.json");
|
|
11
10
|
const config_1 = require("./config");
|
|
11
|
+
const executor_1 = require("./executor");
|
|
12
12
|
const detect_1 = require("./executor/detect");
|
|
13
13
|
const images_1 = require("./images");
|
|
14
|
+
const socket_client_1 = require("./socket-client");
|
|
15
|
+
const console_relays_1 = require("./console-relays");
|
|
14
16
|
const program = new commander_1.Command();
|
|
15
17
|
program
|
|
16
|
-
.name('
|
|
17
|
-
.description('
|
|
18
|
+
.name('sandbox')
|
|
19
|
+
.description('Run and manage a Multiplayer sandbox worker')
|
|
18
20
|
.version(package_json_1.version);
|
|
21
|
+
program
|
|
22
|
+
.command('start')
|
|
23
|
+
.description('start a worker and connect it to the sandbox control plane')
|
|
24
|
+
.option('--token <token>', 'worker authentication token (env: WORKER_TOKEN)')
|
|
25
|
+
.option('--worker-id <id>', 'stable worker ID (env: WORKER_ID; default: hostname)')
|
|
26
|
+
.option('--sandbox-url <url>', 'control-plane URL (env: SANDBOX_URL; default: https://api.sandbox.filingramp.com)')
|
|
27
|
+
.option('--max-vms <count>', 'maximum concurrent VMs (env: MAX_VMS)')
|
|
28
|
+
.action(async (opts) => {
|
|
29
|
+
const config = (0, config_1.loadWorkerConfigFromEnv)({
|
|
30
|
+
...process.env,
|
|
31
|
+
...(opts.token ? { WORKER_TOKEN: opts.token } : {}),
|
|
32
|
+
...(opts.workerId ? { WORKER_ID: opts.workerId } : {}),
|
|
33
|
+
...(opts.sandboxUrl ? { SANDBOX_URL: opts.sandboxUrl } : {}),
|
|
34
|
+
...(opts.maxVms ? { MAX_VMS: opts.maxVms } : {}),
|
|
35
|
+
});
|
|
36
|
+
const executor = (0, executor_1.createExecutor)(config);
|
|
37
|
+
const socket = (0, socket_client_1.connectToSandbox)(config, executor);
|
|
38
|
+
(0, console_relays_1.attachConsoleRelays)(executor, socket);
|
|
39
|
+
let stopping = false;
|
|
40
|
+
const stop = async (signal) => {
|
|
41
|
+
if (stopping)
|
|
42
|
+
return;
|
|
43
|
+
stopping = true;
|
|
44
|
+
console.log(`\n${signal} received; shutting down sandbox worker...`);
|
|
45
|
+
socket.disconnect();
|
|
46
|
+
const results = await Promise.allSettled(executor.list().map((vm) => executor.destroy(vm.vmId)));
|
|
47
|
+
const failed = results.filter((result) => result.status === 'rejected');
|
|
48
|
+
if (failed.length)
|
|
49
|
+
console.error(`Failed to destroy ${failed.length} VM(s) during shutdown`);
|
|
50
|
+
process.exit(failed.length ? 1 : 0);
|
|
51
|
+
};
|
|
52
|
+
process.once('SIGINT', () => { void stop('SIGINT'); });
|
|
53
|
+
process.once('SIGTERM', () => { void stop('SIGTERM'); });
|
|
54
|
+
console.log(`Starting sandbox worker ${config.workerId} → ${config.sandboxUrl}`);
|
|
55
|
+
// Socket.IO's reconnect timers keep the process alive until a termination signal arrives.
|
|
56
|
+
});
|
|
19
57
|
program
|
|
20
58
|
.command('detect')
|
|
21
59
|
.description('probe this host and report which micro-VM engines it can run')
|
|
@@ -43,7 +81,7 @@ images
|
|
|
43
81
|
const files = await (0, images_1.pullImages)({ location: opts.from, arch: opts.arch, stacks: opts.stack, endpoint: opts.endpoint }, dest);
|
|
44
82
|
for (const file of files)
|
|
45
83
|
console.log(`pulled ${file}`);
|
|
46
|
-
console.log('\nbase images ready — "
|
|
84
|
+
console.log('\nbase images ready — "sandbox detect" shows which engines they enable');
|
|
47
85
|
});
|
|
48
86
|
images
|
|
49
87
|
.command('push')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -33,65 +33,65 @@ function parseArnList(raw) {
|
|
|
33
33
|
return arns.length ? arns : undefined;
|
|
34
34
|
}
|
|
35
35
|
function loadWorkerConfigFromEnv(env = process.env) {
|
|
36
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6;
|
|
37
|
-
const workerId = env.WORKER_ID;
|
|
36
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7;
|
|
37
|
+
const workerId = ((_a = env.WORKER_ID) === null || _a === void 0 ? void 0 : _a.trim()) || os_1.default.hostname();
|
|
38
38
|
const token = env.WORKER_TOKEN;
|
|
39
|
-
if (!
|
|
40
|
-
throw new Error('
|
|
39
|
+
if (!token) {
|
|
40
|
+
throw new Error('WORKER_TOKEN is required');
|
|
41
41
|
}
|
|
42
42
|
return {
|
|
43
43
|
workerId,
|
|
44
44
|
token,
|
|
45
|
-
sandboxUrl: (
|
|
46
|
-
workerSocketPath: (
|
|
45
|
+
sandboxUrl: (_b = env.SANDBOX_URL) !== null && _b !== void 0 ? _b : 'https://api.sandbox.filingramp.com',
|
|
46
|
+
workerSocketPath: (_c = env.WORKER_SOCKET_PATH) !== null && _c !== void 0 ? _c : '/v0/sapi/workers/ws',
|
|
47
47
|
maxVms: Number(env.MAX_VMS) || 10,
|
|
48
48
|
region: env.WORKER_REGION,
|
|
49
49
|
remote: {
|
|
50
50
|
// No default: an unset AGENT_URL means the remote engine is not configured on this worker
|
|
51
|
-
agentUrl: (
|
|
51
|
+
agentUrl: (_d = env.AGENT_URL) !== null && _d !== void 0 ? _d : '',
|
|
52
52
|
authToken: env.AGENT_TOKEN,
|
|
53
53
|
},
|
|
54
54
|
firecracker: {
|
|
55
|
-
bin: (
|
|
55
|
+
bin: (_e = env.FIRECRACKER_BIN) !== null && _e !== void 0 ? _e : 'firecracker',
|
|
56
56
|
// Per-stack base images (<imagesDir>/<stack>/vmlinuz + initramfs.img) from
|
|
57
57
|
// `worker-cli images pull` / setup-vm-images.sh; engine detection checks
|
|
58
58
|
// existence, so missing images just disable the engine.
|
|
59
|
-
imagesDir: (
|
|
59
|
+
imagesDir: (_g = (_f = env.FIRECRACKER_IMAGES_DIR) !== null && _f !== void 0 ? _f : env.VM_IMAGES_DIR) !== null && _g !== void 0 ? _g : (0, images_1.defaultImagesDir)(),
|
|
60
60
|
// Explicit single-image override, applied to every stack when both are set
|
|
61
61
|
kernelPath: env.FIRECRACKER_KERNEL,
|
|
62
62
|
initrdPath: env.FIRECRACKER_INITRD,
|
|
63
|
-
vmDataPath: (
|
|
63
|
+
vmDataPath: (_h = env.FIRECRACKER_VM_DATA) !== null && _h !== void 0 ? _h : path_1.default.join(os_1.default.tmpdir(), 'firecracker-vms'),
|
|
64
64
|
},
|
|
65
65
|
lambdaMicrovm: {
|
|
66
|
-
region: (
|
|
67
|
-
imageArn: (
|
|
66
|
+
region: (_j = env.MICROVM_AWS_REGION) !== null && _j !== void 0 ? _j : env.AWS_REGION,
|
|
67
|
+
imageArn: (_k = env.MICROVM_IMAGE_ARN) !== null && _k !== void 0 ? _k : '',
|
|
68
68
|
stackImageArns: parseStackMap(env.MICROVM_STACK_IMAGE_ARNS),
|
|
69
69
|
ingressConnectorArns: parseArnList(env.MICROVM_INGRESS_CONNECTORS),
|
|
70
70
|
egressConnectorArns: parseArnList(env.MICROVM_EGRESS_CONNECTORS),
|
|
71
71
|
executionRoleArn: env.MICROVM_EXECUTION_ROLE_ARN,
|
|
72
72
|
// 0 disables auto-suspend; the sandbox drives pause/resume explicitly by default
|
|
73
|
-
maxIdleSeconds: Number((
|
|
74
|
-
suspendedDurationSeconds: Number((
|
|
75
|
-
maximumDurationInSeconds: Number((
|
|
73
|
+
maxIdleSeconds: Number((_l = env.MICROVM_MAX_IDLE_SECONDS) !== null && _l !== void 0 ? _l : 900),
|
|
74
|
+
suspendedDurationSeconds: Number((_m = env.MICROVM_SUSPENDED_DURATION_SECONDS) !== null && _m !== void 0 ? _m : 28800),
|
|
75
|
+
maximumDurationInSeconds: Number((_o = env.MICROVM_MAX_DURATION_SECONDS) !== null && _o !== void 0 ? _o : 28800),
|
|
76
76
|
},
|
|
77
77
|
fargate: {
|
|
78
|
-
region: (
|
|
79
|
-
cluster: (
|
|
78
|
+
region: (_p = env.FARGATE_AWS_REGION) !== null && _p !== void 0 ? _p : env.AWS_REGION,
|
|
79
|
+
cluster: (_q = env.FARGATE_CLUSTER) !== null && _q !== void 0 ? _q : '',
|
|
80
80
|
taskDefinition: env.FARGATE_TASK_DEFINITION,
|
|
81
81
|
// Per-stack task definitions: "node:builder-node:3,python:builder-python:1"
|
|
82
82
|
stackTaskDefinitions: parseStackMap(env.FARGATE_STACK_TASK_DEFS),
|
|
83
|
-
subnets: (
|
|
84
|
-
securityGroups: (
|
|
83
|
+
subnets: (_s = (_r = env.FARGATE_SUBNETS) === null || _r === void 0 ? void 0 : _r.split(',').map((s) => s.trim()).filter(Boolean)) !== null && _s !== void 0 ? _s : [],
|
|
84
|
+
securityGroups: (_t = env.FARGATE_SECURITY_GROUPS) === null || _t === void 0 ? void 0 : _t.split(',').map((s) => s.trim()).filter(Boolean),
|
|
85
85
|
// ENABLED when the worker runs outside the task VPC (proxies to the task's public IP)
|
|
86
86
|
assignPublicIp: env.FARGATE_ASSIGN_PUBLIC_IP === 'true',
|
|
87
87
|
guestPort: Number(env.FARGATE_GUEST_PORT) || 8080,
|
|
88
88
|
startTimeoutMs: Number(env.FARGATE_START_TIMEOUT_MS) || 180000,
|
|
89
89
|
},
|
|
90
90
|
docker: {
|
|
91
|
-
bin: (
|
|
91
|
+
bin: (_u = env.DOCKER_BIN) !== null && _u !== void 0 ? _u : 'docker',
|
|
92
92
|
// Local images from `scripts/setup-docker-images.sh`: <imagePrefix>-<stack>:<imageTag>
|
|
93
|
-
imagePrefix: (
|
|
94
|
-
imageTag: (
|
|
93
|
+
imagePrefix: (_v = env.DOCKER_IMAGE_PREFIX) !== null && _v !== void 0 ? _v : 'multiplayer-builder-vm',
|
|
94
|
+
imageTag: (_w = env.DOCKER_IMAGE_TAG) !== null && _w !== void 0 ? _w : 'local',
|
|
95
95
|
stackImages: parseStackMap(env.DOCKER_STACK_IMAGES),
|
|
96
96
|
network: env.DOCKER_NETWORK,
|
|
97
97
|
portRangeStart: Number(env.DOCKER_PORT_MIN) || 9100,
|
|
@@ -99,11 +99,11 @@ function loadWorkerConfigFromEnv(env = process.env) {
|
|
|
99
99
|
guestPort: Number(env.DOCKER_GUEST_PORT) || 8080,
|
|
100
100
|
},
|
|
101
101
|
dockerSandbox: {
|
|
102
|
-
bin: (
|
|
102
|
+
bin: (_x = env.SBX_BIN) !== null && _x !== void 0 ? _x : 'sbx',
|
|
103
103
|
// Bridged from the same local images `docker` (imagePrefix-imageTag) already uses —
|
|
104
104
|
// `docker save` + `sbx template load`, see docker-sandbox-executor.ts.
|
|
105
|
-
imagePrefix: (
|
|
106
|
-
imageTag: (
|
|
105
|
+
imagePrefix: (_y = env.SBX_IMAGE_PREFIX) !== null && _y !== void 0 ? _y : 'multiplayer-builder-vm',
|
|
106
|
+
imageTag: (_z = env.SBX_IMAGE_TAG) !== null && _z !== void 0 ? _z : 'local',
|
|
107
107
|
stackTemplates: parseStackMap(env.SBX_STACK_TEMPLATES),
|
|
108
108
|
// `sbx create shell` doesn't run the image's own CMD, so the engine launches
|
|
109
109
|
// it explicitly — defaults match each Dockerfile's own WORKDIR /app + CMD.
|
|
@@ -113,7 +113,7 @@ function loadWorkerConfigFromEnv(env = process.env) {
|
|
|
113
113
|
static: 'node app.js',
|
|
114
114
|
...parseStackMap(env.SBX_STACK_AGENT_COMMANDS),
|
|
115
115
|
},
|
|
116
|
-
workspaceRoot: (
|
|
116
|
+
workspaceRoot: (_0 = env.SBX_WORKSPACE_DIR) !== null && _0 !== void 0 ? _0 : path_1.default.join(os_1.default.tmpdir(), 'sbx-vms'),
|
|
117
117
|
portRangeStart: Number(env.SBX_PORT_MIN) || 9200,
|
|
118
118
|
portRangeEnd: Number(env.SBX_PORT_MAX) || 9299,
|
|
119
119
|
guestPort: Number(env.SBX_GUEST_PORT) || 8080,
|
|
@@ -121,23 +121,23 @@ function loadWorkerConfigFromEnv(env = process.env) {
|
|
|
121
121
|
minMemoryMib: Number(env.SBX_MIN_MEMORY_MIB) || 1024,
|
|
122
122
|
},
|
|
123
123
|
qemu: {
|
|
124
|
-
bin: (
|
|
124
|
+
bin: (_1 = env.QEMU_BIN) !== null && _1 !== void 0 ? _1 : 'qemu-system-aarch64',
|
|
125
125
|
// Per-stack base images (<imagesDir>/<stack>/vmlinuz + initramfs.img) from
|
|
126
126
|
// `worker-cli images pull` / setup-vm-images.sh; engine detection checks
|
|
127
127
|
// existence, so missing images just disable the engine.
|
|
128
|
-
imagesDir: (
|
|
128
|
+
imagesDir: (_3 = (_2 = env.QEMU_IMAGES_DIR) !== null && _2 !== void 0 ? _2 : env.VM_IMAGES_DIR) !== null && _3 !== void 0 ? _3 : (0, images_1.defaultImagesDir)(),
|
|
129
129
|
// Explicit single-image override, applied to every stack when both are set
|
|
130
130
|
kernelPath: env.QEMU_KERNEL,
|
|
131
131
|
initrdPath: env.QEMU_INITRD,
|
|
132
|
-
vmDataPath: (
|
|
132
|
+
vmDataPath: (_4 = env.QEMU_VM_DATA) !== null && _4 !== void 0 ? _4 : path_1.default.join(os_1.default.tmpdir(), 'qemu-vms'),
|
|
133
133
|
portRangeStart: Number(env.QEMU_PORT_MIN) || 9000,
|
|
134
134
|
portRangeEnd: Number(env.QEMU_PORT_MAX) || 9999,
|
|
135
135
|
// Accelerator: hvf (macOS host), kvm (Linux + /dev/kvm), tcg (software, any host — slow)
|
|
136
|
-
accel: (
|
|
136
|
+
accel: (_5 = env.QEMU_ACCEL) !== null && _5 !== void 0 ? _5 : (process.platform === 'darwin' ? 'hvf' : 'kvm'),
|
|
137
137
|
// CPU model: host requires hvf/kvm; max is best for tcg on aarch64; qemu64 for tcg x86_64
|
|
138
|
-
cpu: (
|
|
138
|
+
cpu: (_6 = env.QEMU_CPU) !== null && _6 !== void 0 ? _6 : 'host',
|
|
139
139
|
// Machine type: virt (aarch64), q35 (x86_64)
|
|
140
|
-
machine: (
|
|
140
|
+
machine: (_7 = env.QEMU_MACHINE) !== null && _7 !== void 0 ? _7 : 'virt',
|
|
141
141
|
},
|
|
142
142
|
};
|
|
143
143
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;AAuHA,0DA4GC;AAnOD,4CAAmB;AACnB,gDAAuB;AACvB,kDAA2D;AAGlD,+FAHW,sBAAc,OAGX;AAFvB,qCAA2C;AAgG3C,2GAA2G;AAC3G,SAAS,aAAa,CAAC,GAAuB;IAC5C,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAA;IACpB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,SAAQ;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACtC,IAAI,KAAK,IAAI,GAAG;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA;IACpC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AACvC,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAyB,OAAO,CAAC,GAAG;;IAC1E,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplayer-app/sandbox",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0-wip-yjs-state-changes.0",
|
|
4
|
+
"description": "Sandbox worker library and CLI (Docker, QEMU, Firecracker, AWS Lambda MicroVM, Fargate)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"sandbox": "dist/cli.js"
|
|
9
|
+
},
|
|
7
10
|
"files": [
|
|
8
11
|
"dist"
|
|
9
12
|
],
|
|
@@ -28,12 +31,12 @@
|
|
|
28
31
|
"typescript": "^6.0.3"
|
|
29
32
|
},
|
|
30
33
|
"scripts": {
|
|
31
|
-
"build": "tsc --build --force",
|
|
34
|
+
"build": "tsc --build --force && chmod +x dist/cli.js",
|
|
32
35
|
"clean": "rm -rf ./dist tsconfig.tsbuildinfo",
|
|
33
36
|
"typecheck": "tsc --noEmit",
|
|
34
37
|
"lint": "eslint src/**/*.ts --config ../../eslint.config.js",
|
|
35
38
|
"images:build": "bash scripts/build-base-images.sh",
|
|
36
|
-
"
|
|
39
|
+
"start": "node dist/cli.js",
|
|
37
40
|
"test": "tsc --build --force && node --test 'dist/**/*.test.js'",
|
|
38
41
|
"postversion": "git commit -m \"sandbox v$npm_package_version\" -- package.json && git tag \"sandbox-v$npm_package_version\" && git push && git push --tags"
|
|
39
42
|
}
|