@multiplayer-app/sandbox 2.0.0-wip-yjs-state-changes.0 → 3.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 +4 -0
- package/dist/cli.js +3011 -97
- package/dist/cli.js.map +7 -1
- package/dist/executor/detect.d.ts +1 -1
- package/dist/executor/docker-executor.d.ts +1 -1
- package/dist/executor/docker-sandbox-executor.d.ts +1 -1
- package/dist/executor/fargate-executor.d.ts +1 -1
- package/dist/executor/firecracker-executor.d.ts +1 -1
- package/dist/executor/index.d.ts +1 -1
- package/dist/executor/lambda-microvm-executor.d.ts +1 -1
- package/dist/executor/mock-executor.d.ts +1 -1
- package/dist/executor/qemu-executor.d.ts +1 -1
- package/dist/executor/remote-executor.d.ts +1 -1
- package/dist/executor/types.d.ts +1 -1
- package/dist/images.d.ts +1 -1
- package/dist/index.js +3005 -29
- package/dist/index.js.map +7 -1
- package/dist/vendor/builder-types/access.d.ts +25 -0
- package/dist/vendor/builder-types/access.d.ts.map +1 -0
- package/dist/vendor/builder-types/events.d.ts +80 -0
- package/dist/vendor/builder-types/events.d.ts.map +1 -0
- package/dist/vendor/builder-types/index.d.ts +11 -0
- package/dist/vendor/builder-types/index.d.ts.map +1 -0
- package/dist/vendor/builder-types/release.d.ts +49 -0
- package/dist/vendor/builder-types/release.d.ts.map +1 -0
- package/dist/vendor/builder-types/vm.d.ts +101 -0
- package/dist/vendor/builder-types/vm.d.ts.map +1 -0
- package/dist/vendor/builder-types/worker.d.ts +25 -0
- package/dist/vendor/builder-types/worker.d.ts.map +1 -0
- package/package.json +15 -6
- package/dist/config.js +0 -144
- package/dist/config.js.map +0 -1
- package/dist/console-relays.js +0 -46
- package/dist/console-relays.js.map +0 -1
- package/dist/executor/detect.js +0 -184
- package/dist/executor/detect.js.map +0 -1
- package/dist/executor/docker-executor.js +0 -331
- package/dist/executor/docker-executor.js.map +0 -1
- package/dist/executor/docker-sandbox-executor.js +0 -343
- package/dist/executor/docker-sandbox-executor.js.map +0 -1
- package/dist/executor/fargate-executor.js +0 -293
- package/dist/executor/fargate-executor.js.map +0 -1
- package/dist/executor/firecracker-executor.js +0 -352
- package/dist/executor/firecracker-executor.js.map +0 -1
- package/dist/executor/index.js +0 -166
- package/dist/executor/index.js.map +0 -1
- package/dist/executor/lambda-microvm-executor.js +0 -211
- package/dist/executor/lambda-microvm-executor.js.map +0 -1
- package/dist/executor/mock-executor.js +0 -198
- package/dist/executor/mock-executor.js.map +0 -1
- package/dist/executor/mock-executor.test.js +0 -81
- package/dist/executor/mock-executor.test.js.map +0 -1
- package/dist/executor/qemu-executor.js +0 -383
- package/dist/executor/qemu-executor.js.map +0 -1
- package/dist/executor/reattach-utils.js +0 -11
- package/dist/executor/reattach-utils.js.map +0 -1
- package/dist/executor/remote-executor.js +0 -125
- package/dist/executor/remote-executor.js.map +0 -1
- package/dist/executor/types.js +0 -3
- package/dist/executor/types.js.map +0 -1
- package/dist/images.js +0 -163
- package/dist/images.js.map +0 -1
- package/dist/services/serial-relay.js +0 -74
- package/dist/services/serial-relay.js.map +0 -1
- package/dist/services/vnc-relay.js +0 -101
- package/dist/services/vnc-relay.js.map +0 -1
- package/dist/socket-client.js +0 -119
- package/dist/socket-client.js.map +0 -1
package/dist/executor/detect.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.probeEngines = probeEngines;
|
|
7
|
-
exports.detectEngines = detectEngines;
|
|
8
|
-
const fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const child_process_1 = require("child_process");
|
|
10
|
-
const logger_1 = __importDefault(require("@multiplayer-app/logger"));
|
|
11
|
-
const builder_types_1 = require("@multiplayer-app/builder-types");
|
|
12
|
-
const images_1 = require("../images");
|
|
13
|
-
/** Auto-mode default preference when multiple engines are runnable on this host. */
|
|
14
|
-
const ENGINE_PRIORITY = ['firecracker', 'qemu', 'docker-sandbox', 'docker', 'lambda-microvm', 'fargate', 'remote', 'mock'];
|
|
15
|
-
function binaryOnPath(bin) {
|
|
16
|
-
if (bin.includes('/')) {
|
|
17
|
-
try {
|
|
18
|
-
fs_1.default.accessSync(bin, fs_1.default.constants.X_OK);
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
catch (_a) {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
try {
|
|
26
|
-
(0, child_process_1.execFileSync)('which', [bin], { stdio: 'ignore' });
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
catch (_b) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function kvmUsable() {
|
|
34
|
-
try {
|
|
35
|
-
fs_1.default.accessSync('/dev/kvm', fs_1.default.constants.R_OK | fs_1.default.constants.W_OK);
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
catch (_a) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/** Explicit kernel/initrd override present, or at least one stack dir with both image files. */
|
|
43
|
-
function hasBaseImages(cfg) {
|
|
44
|
-
if (cfg.kernelPath && cfg.initrdPath)
|
|
45
|
-
return fs_1.default.existsSync(cfg.kernelPath) && fs_1.default.existsSync(cfg.initrdPath);
|
|
46
|
-
return (0, images_1.availableStacks)(cfg.imagesDir).length > 0;
|
|
47
|
-
}
|
|
48
|
-
function probeQemu(config) {
|
|
49
|
-
const { bin, accel } = config.qemu;
|
|
50
|
-
if (!hasBaseImages(config.qemu)) {
|
|
51
|
-
return { engine: 'qemu', available: false, reason: `no base images under ${config.qemu.imagesDir} — run "worker-cli images pull" or scripts/setup-vm-images.sh` };
|
|
52
|
-
}
|
|
53
|
-
if (!binaryOnPath(bin)) {
|
|
54
|
-
return { engine: 'qemu', available: false, reason: `${bin} not found on PATH` };
|
|
55
|
-
}
|
|
56
|
-
if (accel === 'hvf' && process.platform !== 'darwin') {
|
|
57
|
-
return { engine: 'qemu', available: false, reason: 'QEMU_ACCEL=hvf requires macOS (use kvm or tcg)' };
|
|
58
|
-
}
|
|
59
|
-
if (accel === 'kvm' && !kvmUsable()) {
|
|
60
|
-
return { engine: 'qemu', available: false, reason: 'QEMU_ACCEL=kvm but /dev/kvm is not accessible' };
|
|
61
|
-
}
|
|
62
|
-
return { engine: 'qemu', available: true };
|
|
63
|
-
}
|
|
64
|
-
function probeFirecracker(config) {
|
|
65
|
-
const { bin } = config.firecracker;
|
|
66
|
-
if (process.platform !== 'linux') {
|
|
67
|
-
return { engine: 'firecracker', available: false, reason: 'requires a Linux host' };
|
|
68
|
-
}
|
|
69
|
-
if (!kvmUsable()) {
|
|
70
|
-
return { engine: 'firecracker', available: false, reason: '/dev/kvm is not accessible' };
|
|
71
|
-
}
|
|
72
|
-
if (!hasBaseImages(config.firecracker)) {
|
|
73
|
-
return { engine: 'firecracker', available: false, reason: `no base images under ${config.firecracker.imagesDir} — run "worker-cli images pull" or scripts/setup-vm-images.sh` };
|
|
74
|
-
}
|
|
75
|
-
if (!binaryOnPath(bin)) {
|
|
76
|
-
return { engine: 'firecracker', available: false, reason: `${bin} not found on PATH` };
|
|
77
|
-
}
|
|
78
|
-
return { engine: 'firecracker', available: true };
|
|
79
|
-
}
|
|
80
|
-
/** Whether at least one <imagePrefix>-<stack>:<imageTag> image exists in the local `docker` daemon. */
|
|
81
|
-
function hasLocalDockerImage(imagePrefix, imageTag) {
|
|
82
|
-
return builder_types_1.VM_STACKS.some((stack) => {
|
|
83
|
-
try {
|
|
84
|
-
(0, child_process_1.execFileSync)('docker', ['image', 'inspect', `${imagePrefix}-${stack}:${imageTag}`], { stdio: 'ignore' });
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
catch (_a) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
function probeDocker(config) {
|
|
93
|
-
const { bin, imagePrefix, imageTag } = config.docker;
|
|
94
|
-
if (!binaryOnPath(bin)) {
|
|
95
|
-
return { engine: 'docker', available: false, reason: `${bin} not found on PATH` };
|
|
96
|
-
}
|
|
97
|
-
try {
|
|
98
|
-
(0, child_process_1.execFileSync)(bin, ['info'], { stdio: 'ignore' });
|
|
99
|
-
}
|
|
100
|
-
catch (_a) {
|
|
101
|
-
return { engine: 'docker', available: false, reason: 'docker daemon not reachable' };
|
|
102
|
-
}
|
|
103
|
-
if (!hasLocalDockerImage(imagePrefix, imageTag)) {
|
|
104
|
-
return { engine: 'docker', available: false, reason: 'no local docker images — run scripts/setup-docker-images.sh' };
|
|
105
|
-
}
|
|
106
|
-
return { engine: 'docker', available: true };
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* `docker-sandbox` (Docker's own Sandboxes product, the `sbx` CLI) bridges the same local
|
|
110
|
-
* `docker` images in on demand (see DockerSandboxExecutor.ensureTemplateLoaded), so it needs
|
|
111
|
-
* both `sbx` itself and those local images to exist. A not-yet-initialized global network
|
|
112
|
-
* policy (`sbx policy init balanced|allow-all|deny-all`, required once before any sandbox can
|
|
113
|
-
* be created) isn't checked here — same as Fargate detect not validating IAM permissions
|
|
114
|
-
* upfront — it'll surface as a clear error the first time `create()` is called instead.
|
|
115
|
-
*/
|
|
116
|
-
function probeDockerSandbox(config) {
|
|
117
|
-
const { bin, imagePrefix, imageTag } = config.dockerSandbox;
|
|
118
|
-
if (!binaryOnPath(bin)) {
|
|
119
|
-
return { engine: 'docker-sandbox', available: false, reason: `${bin} not found on PATH` };
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
(0, child_process_1.execFileSync)(bin, ['ls'], { stdio: 'ignore' });
|
|
123
|
-
}
|
|
124
|
-
catch (_a) {
|
|
125
|
-
return { engine: 'docker-sandbox', available: false, reason: 'sbx daemon not reachable — run "sbx daemon start" and "sbx login"' };
|
|
126
|
-
}
|
|
127
|
-
if (!hasLocalDockerImage(imagePrefix, imageTag)) {
|
|
128
|
-
return { engine: 'docker-sandbox', available: false, reason: 'no local docker images — run scripts/setup-docker-images.sh' };
|
|
129
|
-
}
|
|
130
|
-
return { engine: 'docker-sandbox', available: true };
|
|
131
|
-
}
|
|
132
|
-
function probeRemote(config) {
|
|
133
|
-
return config.remote.agentUrl
|
|
134
|
-
? { engine: 'remote', available: true }
|
|
135
|
-
: { engine: 'remote', available: false, reason: 'AGENT_URL not set' };
|
|
136
|
-
}
|
|
137
|
-
function probeLambdaMicrovm(config) {
|
|
138
|
-
const { imageArn, stackImageArns } = config.lambdaMicrovm;
|
|
139
|
-
return imageArn || Object.keys(stackImageArns).length
|
|
140
|
-
? { engine: 'lambda-microvm', available: true }
|
|
141
|
-
: { engine: 'lambda-microvm', available: false, reason: 'MICROVM_IMAGE_ARN / MICROVM_STACK_IMAGE_ARNS not set' };
|
|
142
|
-
}
|
|
143
|
-
function probeFargate(config) {
|
|
144
|
-
const { cluster, taskDefinition, stackTaskDefinitions, subnets } = config.fargate;
|
|
145
|
-
if (!cluster) {
|
|
146
|
-
return { engine: 'fargate', available: false, reason: 'FARGATE_CLUSTER not set' };
|
|
147
|
-
}
|
|
148
|
-
if (!taskDefinition && !Object.keys(stackTaskDefinitions).length) {
|
|
149
|
-
return { engine: 'fargate', available: false, reason: 'FARGATE_TASK_DEFINITION / FARGATE_STACK_TASK_DEFS not set' };
|
|
150
|
-
}
|
|
151
|
-
if (!subnets.length) {
|
|
152
|
-
return { engine: 'fargate', available: false, reason: 'FARGATE_SUBNETS not set' };
|
|
153
|
-
}
|
|
154
|
-
return { engine: 'fargate', available: true };
|
|
155
|
-
}
|
|
156
|
-
/** Probe every engine against this host + config. Mock is always runnable. */
|
|
157
|
-
function probeEngines(config) {
|
|
158
|
-
return [
|
|
159
|
-
{ engine: 'mock', available: true },
|
|
160
|
-
probeQemu(config),
|
|
161
|
-
probeFirecracker(config),
|
|
162
|
-
probeDocker(config),
|
|
163
|
-
probeDockerSandbox(config),
|
|
164
|
-
probeRemote(config),
|
|
165
|
-
probeLambdaMicrovm(config),
|
|
166
|
-
probeFargate(config),
|
|
167
|
-
];
|
|
168
|
-
}
|
|
169
|
-
function detectEngines(config) {
|
|
170
|
-
var _a;
|
|
171
|
-
const probes = probeEngines(config);
|
|
172
|
-
for (const probe of probes) {
|
|
173
|
-
if (probe.available) {
|
|
174
|
-
logger_1.default.info({ engine: probe.engine }, 'micro-VM engine available');
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
logger_1.default.debug({ engine: probe.engine, reason: probe.reason }, 'micro-VM engine unavailable');
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
const engines = probes.filter((p) => p.available).map((p) => p.engine);
|
|
181
|
-
const defaultEngine = (_a = ENGINE_PRIORITY.find((engine) => engines.includes(engine))) !== null && _a !== void 0 ? _a : 'mock';
|
|
182
|
-
return { engines, defaultEngine };
|
|
183
|
-
}
|
|
184
|
-
//# sourceMappingURL=detect.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/executor/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DockerExecutor = void 0;
|
|
7
|
-
const child_process_1 = require("child_process");
|
|
8
|
-
const util_1 = require("util");
|
|
9
|
-
const http_1 = __importDefault(require("http"));
|
|
10
|
-
const logger_1 = __importDefault(require("@multiplayer-app/logger"));
|
|
11
|
-
const DEFAULT_EXEC_TIMEOUT_MS = 60000;
|
|
12
|
-
const MAX_EXEC_TIMEOUT_MS = 300000;
|
|
13
|
-
const MAX_OUTPUT_BYTES = 1024 * 1024;
|
|
14
|
-
const MAX_FILE_BYTES = 5 * 1024 * 1024;
|
|
15
|
-
const WORKSPACE_DIR = '/workspace';
|
|
16
|
-
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
17
|
-
/** Reject "../" and absolute paths, same rule MockExecutor applies to its own workspace. */
|
|
18
|
-
function assertSafeWorkspacePath(relativePath) {
|
|
19
|
-
const normalized = relativePath.replace(/^([/\\])+/, '');
|
|
20
|
-
if (normalized.split(/[/\\]/).includes('..')) {
|
|
21
|
-
throw new Error(`Path escapes the VM workspace: ${relativePath}`);
|
|
22
|
-
}
|
|
23
|
-
return normalized;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Runs VMs as local Docker containers (one container per VM), via the `docker` CLI —
|
|
27
|
-
* same shell-out style QemuExecutor uses for qemu-system-*. No kernel/HVF/KVM needed,
|
|
28
|
-
* so it's the lowest-friction local engine: just Docker Desktop/OrbStack.
|
|
29
|
-
*
|
|
30
|
-
* Unlike the other local engines, the container's process is directly reachable from
|
|
31
|
-
* the host, so exec/writeFiles are real (`docker exec` / `docker cp`) rather than
|
|
32
|
-
* MockExecutor-only stand-ins. pause/resume map to `docker pause`/`unpause` (a real
|
|
33
|
-
* cgroup freeze); stop/restore map to `docker stop`/`start`, so every VmAction does
|
|
34
|
-
* something meaningful — unlike QEMU (stop/restore alias pause/resume) or Fargate
|
|
35
|
-
* (only stop works).
|
|
36
|
-
*/
|
|
37
|
-
class DockerExecutor {
|
|
38
|
-
constructor(config) {
|
|
39
|
-
this.config = config;
|
|
40
|
-
this.vms = new Map();
|
|
41
|
-
this.usedPorts = new Set();
|
|
42
|
-
this.bin = config.bin;
|
|
43
|
-
}
|
|
44
|
-
allocatePort() {
|
|
45
|
-
for (let p = this.config.portRangeStart; p <= this.config.portRangeEnd; p++) {
|
|
46
|
-
if (!this.usedPorts.has(p)) {
|
|
47
|
-
this.usedPorts.add(p);
|
|
48
|
-
return p;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
throw new Error('no free ports in docker port range');
|
|
52
|
-
}
|
|
53
|
-
async resolveImage(stack) {
|
|
54
|
-
const explicit = this.config.stackImages[stack];
|
|
55
|
-
if (explicit)
|
|
56
|
-
return explicit;
|
|
57
|
-
const { imagePrefix, imageTag } = this.config;
|
|
58
|
-
const stackImage = `${imagePrefix}-${stack}:${imageTag}`;
|
|
59
|
-
if (await this.imageExists(stackImage))
|
|
60
|
-
return stackImage;
|
|
61
|
-
const genericImage = `${imagePrefix}-generic:${imageTag}`;
|
|
62
|
-
if (await this.imageExists(genericImage))
|
|
63
|
-
return genericImage;
|
|
64
|
-
throw new Error(`no local docker image for stack "${stack}" (${stackImage}) — run scripts/setup-docker-images.sh`);
|
|
65
|
-
}
|
|
66
|
-
async imageExists(image) {
|
|
67
|
-
try {
|
|
68
|
-
await execFileAsync(this.bin, ['image', 'inspect', image]);
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
catch (_a) {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async create(spec) {
|
|
76
|
-
const image = await this.resolveImage(spec.stack);
|
|
77
|
-
const hostPort = this.allocatePort();
|
|
78
|
-
const containerName = `multiplayer-vm-${spec.vmId}`;
|
|
79
|
-
const args = [
|
|
80
|
-
'run', '-d',
|
|
81
|
-
'--name', containerName,
|
|
82
|
-
'-p', `127.0.0.1:${hostPort}:${this.config.guestPort}`,
|
|
83
|
-
'--memory', `${spec.resources.memMib}m`,
|
|
84
|
-
'--cpus', String(spec.resources.vcpuCount),
|
|
85
|
-
'-e', `VM_ID=${spec.vmId}`,
|
|
86
|
-
'-e', `STACK=${spec.stack}`,
|
|
87
|
-
...(spec.sessionId ? ['-e', `SESSION_ID=${spec.sessionId}`] : []),
|
|
88
|
-
...(spec.appUrl ? ['-e', `APP_URL=${spec.appUrl}`] : []),
|
|
89
|
-
...(this.config.network ? ['--network', this.config.network] : []),
|
|
90
|
-
image,
|
|
91
|
-
];
|
|
92
|
-
logger_1.default.info({ vmId: spec.vmId, bin: this.bin, args }, 'starting docker container');
|
|
93
|
-
let containerId;
|
|
94
|
-
try {
|
|
95
|
-
const { stdout } = await execFileAsync(this.bin, args);
|
|
96
|
-
containerId = stdout.trim();
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
this.usedPorts.delete(hostPort);
|
|
100
|
-
throw error;
|
|
101
|
-
}
|
|
102
|
-
const handle = {
|
|
103
|
-
vmId: spec.vmId,
|
|
104
|
-
sessionId: spec.sessionId,
|
|
105
|
-
stack: spec.stack,
|
|
106
|
-
resources: spec.resources,
|
|
107
|
-
running: true,
|
|
108
|
-
metadata: { containerId, containerName, hostPort },
|
|
109
|
-
};
|
|
110
|
-
this.vms.set(spec.vmId, { handle, containerId, containerName, hostPort });
|
|
111
|
-
this.watchExit(spec.vmId, containerId);
|
|
112
|
-
await this.waitForAgent(hostPort);
|
|
113
|
-
logger_1.default.info({ vmId: spec.vmId, containerId, hostPort }, 'docker vm ready');
|
|
114
|
-
return handle;
|
|
115
|
-
}
|
|
116
|
-
/** Frees the allocated port once the container exits on its own (crash, OOM kill, `docker stop` from outside us). */
|
|
117
|
-
watchExit(vmId, containerId) {
|
|
118
|
-
execFileAsync(this.bin, ['wait', containerId])
|
|
119
|
-
.catch(() => { })
|
|
120
|
-
.then(() => {
|
|
121
|
-
const vm = this.vms.get(vmId);
|
|
122
|
-
if ((vm === null || vm === void 0 ? void 0 : vm.containerId) === containerId) {
|
|
123
|
-
vm.handle = { ...vm.handle, running: false };
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
async pause(vmId) {
|
|
128
|
-
const vm = this.mustGet(vmId);
|
|
129
|
-
await execFileAsync(this.bin, ['pause', vm.containerId]);
|
|
130
|
-
return this.setRunning(vmId, false);
|
|
131
|
-
}
|
|
132
|
-
async resume(vmId) {
|
|
133
|
-
const vm = this.mustGet(vmId);
|
|
134
|
-
await execFileAsync(this.bin, ['unpause', vm.containerId]);
|
|
135
|
-
return this.setRunning(vmId, true);
|
|
136
|
-
}
|
|
137
|
-
async stop(vmId) {
|
|
138
|
-
const vm = this.mustGet(vmId);
|
|
139
|
-
await execFileAsync(this.bin, ['stop', vm.containerId]);
|
|
140
|
-
return this.setRunning(vmId, false);
|
|
141
|
-
}
|
|
142
|
-
async restore(vmId) {
|
|
143
|
-
const vm = this.mustGet(vmId);
|
|
144
|
-
await execFileAsync(this.bin, ['start', vm.containerId]);
|
|
145
|
-
return this.setRunning(vmId, true);
|
|
146
|
-
}
|
|
147
|
-
async destroy(vmId) {
|
|
148
|
-
const vm = this.vms.get(vmId);
|
|
149
|
-
if (!vm)
|
|
150
|
-
return;
|
|
151
|
-
await execFileAsync(this.bin, ['rm', '-f', vm.containerId]).catch((error) => logger_1.default.warn({ vmId, err: error }, 'docker rm on destroy failed'));
|
|
152
|
-
this.usedPorts.delete(vm.hostPort);
|
|
153
|
-
this.vms.delete(vmId);
|
|
154
|
-
logger_1.default.info({ vmId }, 'docker vm destroyed');
|
|
155
|
-
}
|
|
156
|
-
get(vmId) {
|
|
157
|
-
var _a;
|
|
158
|
-
return (_a = this.vms.get(vmId)) === null || _a === void 0 ? void 0 : _a.handle;
|
|
159
|
-
}
|
|
160
|
-
list() {
|
|
161
|
-
return [...this.vms.values()].map((v) => v.handle);
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Recover a container after a worker restart: it's an independent process the
|
|
165
|
-
* Docker daemon owns, so just re-inspect it by ID and rebuild the local handle.
|
|
166
|
-
*/
|
|
167
|
-
async reattach(record) {
|
|
168
|
-
var _a;
|
|
169
|
-
const meta = record.runtimeMetadata;
|
|
170
|
-
if (!(meta === null || meta === void 0 ? void 0 : meta.containerId) || meta.hostPort === undefined)
|
|
171
|
-
return undefined;
|
|
172
|
-
let running;
|
|
173
|
-
try {
|
|
174
|
-
const { stdout } = await execFileAsync(this.bin, ['inspect', '-f', '{{.State.Running}}', meta.containerId]);
|
|
175
|
-
running = stdout.trim() === 'true';
|
|
176
|
-
}
|
|
177
|
-
catch (_b) {
|
|
178
|
-
return undefined;
|
|
179
|
-
}
|
|
180
|
-
const handle = {
|
|
181
|
-
vmId: record.vmId,
|
|
182
|
-
sessionId: record.sessionId,
|
|
183
|
-
stack: record.stack,
|
|
184
|
-
resources: record.resources,
|
|
185
|
-
running,
|
|
186
|
-
metadata: meta,
|
|
187
|
-
};
|
|
188
|
-
this.usedPorts.add(meta.hostPort);
|
|
189
|
-
this.vms.set(record.vmId, {
|
|
190
|
-
handle,
|
|
191
|
-
containerId: meta.containerId,
|
|
192
|
-
containerName: (_a = meta.containerName) !== null && _a !== void 0 ? _a : `multiplayer-vm-${record.vmId}`,
|
|
193
|
-
hostPort: meta.hostPort,
|
|
194
|
-
});
|
|
195
|
-
if (running)
|
|
196
|
-
this.watchExit(record.vmId, meta.containerId);
|
|
197
|
-
logger_1.default.info({ vmId: record.vmId, containerId: meta.containerId }, 'docker vm reattached');
|
|
198
|
-
return handle;
|
|
199
|
-
}
|
|
200
|
-
async proxyHttp(vmId, request) {
|
|
201
|
-
const vm = this.mustGet(vmId);
|
|
202
|
-
if (!vm.handle.running)
|
|
203
|
-
throw new Error(`vm ${vmId} is not running`);
|
|
204
|
-
return new Promise((resolve, reject) => {
|
|
205
|
-
const req = http_1.default.request({ host: '127.0.0.1', port: vm.hostPort, method: request.method, path: request.path, headers: request.headers }, (res) => {
|
|
206
|
-
const chunks = [];
|
|
207
|
-
res.on('data', (c) => chunks.push(c));
|
|
208
|
-
res.on('end', () => {
|
|
209
|
-
var _a;
|
|
210
|
-
return resolve({
|
|
211
|
-
statusCode: (_a = res.statusCode) !== null && _a !== void 0 ? _a : 502,
|
|
212
|
-
headers: Object.fromEntries(Object.entries(res.headers).map(([k, v]) => [k, Array.isArray(v) ? v.join(', ') : (v !== null && v !== void 0 ? v : '')])),
|
|
213
|
-
body: Buffer.concat(chunks),
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
req.on('error', reject);
|
|
218
|
-
if (request.body)
|
|
219
|
-
req.write(request.body);
|
|
220
|
-
req.end();
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
async exec(vmId, request) {
|
|
224
|
-
var _a;
|
|
225
|
-
const vm = this.mustGet(vmId);
|
|
226
|
-
const cwd = request.cwd ? `${WORKSPACE_DIR}/${assertSafeWorkspacePath(request.cwd)}` : WORKSPACE_DIR;
|
|
227
|
-
const timeoutMs = Math.min((_a = request.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_EXEC_TIMEOUT_MS, MAX_EXEC_TIMEOUT_MS);
|
|
228
|
-
const startedAt = Date.now();
|
|
229
|
-
return new Promise((resolve) => {
|
|
230
|
-
(0, child_process_1.execFile)(this.bin, ['exec', '-w', cwd, vm.containerId, '/bin/sh', '-c', request.command], { timeout: timeoutMs, maxBuffer: MAX_OUTPUT_BYTES }, (error, stdout, stderr) => {
|
|
231
|
-
const failed = error;
|
|
232
|
-
const timedOut = Boolean(failed === null || failed === void 0 ? void 0 : failed.killed);
|
|
233
|
-
const truncated = (failed === null || failed === void 0 ? void 0 : failed.code) === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER';
|
|
234
|
-
resolve({
|
|
235
|
-
exitCode: typeof (failed === null || failed === void 0 ? void 0 : failed.code) === 'number' ? failed.code : failed ? 1 : 0,
|
|
236
|
-
stdout: stdout.slice(0, MAX_OUTPUT_BYTES),
|
|
237
|
-
stderr: stderr.slice(0, MAX_OUTPUT_BYTES),
|
|
238
|
-
durationMs: Date.now() - startedAt,
|
|
239
|
-
truncated: Boolean(truncated),
|
|
240
|
-
timedOut,
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
async writeFiles(vmId, files) {
|
|
246
|
-
const vm = this.mustGet(vmId);
|
|
247
|
-
const written = [];
|
|
248
|
-
for (const file of files) {
|
|
249
|
-
const relativePath = assertSafeWorkspacePath(file.path);
|
|
250
|
-
const buffer = Buffer.from(file.content, file.encoding === 'base64' ? 'base64' : 'utf8');
|
|
251
|
-
if (buffer.byteLength > MAX_FILE_BYTES) {
|
|
252
|
-
throw new Error(`File too large (${buffer.byteLength} bytes, max ${MAX_FILE_BYTES}): ${file.path}`);
|
|
253
|
-
}
|
|
254
|
-
const dir = relativePath.includes('/') ? relativePath.slice(0, relativePath.lastIndexOf('/')) : '';
|
|
255
|
-
if (dir) {
|
|
256
|
-
await execFileAsync(this.bin, ['exec', vm.containerId, 'mkdir', '-p', `${WORKSPACE_DIR}/${dir}`]);
|
|
257
|
-
}
|
|
258
|
-
await this.copyIntoContainer(vm.containerId, `${WORKSPACE_DIR}/${relativePath}`, buffer);
|
|
259
|
-
written.push({ path: relativePath, bytes: buffer.byteLength });
|
|
260
|
-
}
|
|
261
|
-
logger_1.default.info({ vmId, files: written.length }, 'docker vm files written');
|
|
262
|
-
return { written };
|
|
263
|
-
}
|
|
264
|
-
/** `docker cp` needs a tar stream on stdin; build the smallest valid ustar archive for one file. */
|
|
265
|
-
copyIntoContainer(containerId, destPath, content) {
|
|
266
|
-
const entryName = destPath.replace(/^\//, '');
|
|
267
|
-
const tarStream = buildSingleFileTar(entryName, content);
|
|
268
|
-
return new Promise((resolve, reject) => {
|
|
269
|
-
var _a;
|
|
270
|
-
const proc = (0, child_process_1.spawn)(this.bin, ['cp', '-', `${containerId}:/`], { stdio: ['pipe', 'ignore', 'pipe'] });
|
|
271
|
-
let stderr = '';
|
|
272
|
-
(_a = proc.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (d) => { stderr += d.toString(); });
|
|
273
|
-
proc.on('error', reject);
|
|
274
|
-
proc.on('exit', (code) => (code === 0 ? resolve() : reject(new Error(`docker cp exited ${code}: ${stderr}`))));
|
|
275
|
-
proc.stdin.end(tarStream);
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
mustGet(vmId) {
|
|
279
|
-
const vm = this.vms.get(vmId);
|
|
280
|
-
if (!vm)
|
|
281
|
-
throw new Error(`vm ${vmId} not found`);
|
|
282
|
-
return vm;
|
|
283
|
-
}
|
|
284
|
-
setRunning(vmId, running) {
|
|
285
|
-
const vm = this.mustGet(vmId);
|
|
286
|
-
vm.handle = { ...vm.handle, running };
|
|
287
|
-
return vm.handle;
|
|
288
|
-
}
|
|
289
|
-
async waitForAgent(port, timeoutMs = 30000) {
|
|
290
|
-
const deadline = Date.now() + timeoutMs;
|
|
291
|
-
for (;;) {
|
|
292
|
-
const ok = await new Promise((resolve) => {
|
|
293
|
-
const req = http_1.default.get({ host: '127.0.0.1', port, path: '/', timeout: 2000 }, (res) => {
|
|
294
|
-
res.resume();
|
|
295
|
-
resolve(true);
|
|
296
|
-
});
|
|
297
|
-
req.on('error', () => resolve(false));
|
|
298
|
-
req.on('timeout', () => { req.destroy(); resolve(false); });
|
|
299
|
-
});
|
|
300
|
-
if (ok)
|
|
301
|
-
return;
|
|
302
|
-
if (Date.now() > deadline)
|
|
303
|
-
throw new Error(`timed out waiting for docker vm agent on port ${port}`);
|
|
304
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
exports.DockerExecutor = DockerExecutor;
|
|
309
|
-
/** POSIX ustar archive containing exactly one regular file — enough for `docker cp -`. */
|
|
310
|
-
function buildSingleFileTar(name, content) {
|
|
311
|
-
const header = Buffer.alloc(512);
|
|
312
|
-
header.write(name, 0, 'utf8');
|
|
313
|
-
header.write('0000644\0', 100, 'utf8'); // mode
|
|
314
|
-
header.write('0000000\0', 108, 'utf8'); // uid
|
|
315
|
-
header.write('0000000\0', 116, 'utf8'); // gid
|
|
316
|
-
header.write(content.byteLength.toString(8).padStart(11, '0') + '\0', 124, 'utf8'); // size (octal)
|
|
317
|
-
header.write(Math.floor(Date.now() / 1000).toString(8).padStart(11, '0') + '\0', 136, 'utf8'); // mtime
|
|
318
|
-
header.write(' ', 148, 'utf8'); // checksum placeholder (spaces while computing)
|
|
319
|
-
header.write('0', 156, 'utf8'); // typeflag: regular file
|
|
320
|
-
header.write('ustar\0', 257, 'utf8');
|
|
321
|
-
header.write('00', 263, 'utf8');
|
|
322
|
-
let checksum = 0;
|
|
323
|
-
for (const byte of header)
|
|
324
|
-
checksum += byte;
|
|
325
|
-
header.write(checksum.toString(8).padStart(6, '0') + '\0 ', 148, 'utf8');
|
|
326
|
-
const paddedContentLength = Math.ceil(content.byteLength / 512) * 512;
|
|
327
|
-
const paddedContent = Buffer.alloc(paddedContentLength);
|
|
328
|
-
content.copy(paddedContent);
|
|
329
|
-
return Buffer.concat([header, paddedContent, Buffer.alloc(1024)]); // two 512-byte zero blocks terminate the archive
|
|
330
|
-
}
|
|
331
|
-
//# sourceMappingURL=docker-executor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-executor.js","sourceRoot":"","sources":["../../src/executor/docker-executor.ts"],"names":[],"mappings":"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"}
|