@bluewombat/isolator 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/README.md +94 -0
- package/SPECS.md +294 -0
- package/dist/args/parse-args.d.ts +6 -0
- package/dist/args/parse-args.d.ts.map +1 -0
- package/dist/args/parse-args.js +223 -0
- package/dist/args/parse-args.js.map +1 -0
- package/dist/child/run-child.d.ts +39 -0
- package/dist/child/run-child.d.ts.map +1 -0
- package/dist/child/run-child.js +132 -0
- package/dist/child/run-child.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +99 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/isolate/backend.d.ts +31 -0
- package/dist/isolate/backend.d.ts.map +1 -0
- package/dist/isolate/backend.js +2 -0
- package/dist/isolate/backend.js.map +1 -0
- package/dist/isolate/create-child.d.ts +26 -0
- package/dist/isolate/create-child.d.ts.map +1 -0
- package/dist/isolate/create-child.js +62 -0
- package/dist/isolate/create-child.js.map +1 -0
- package/dist/isolate/stop.d.ts +7 -0
- package/dist/isolate/stop.d.ts.map +1 -0
- package/dist/isolate/stop.js +17 -0
- package/dist/isolate/stop.js.map +1 -0
- package/dist/progress/emit.d.ts +5 -0
- package/dist/progress/emit.d.ts.map +1 -0
- package/dist/progress/emit.js +17 -0
- package/dist/progress/emit.js.map +1 -0
- package/dist/run/run-isolator.d.ts +35 -0
- package/dist/run/run-isolator.d.ts.map +1 -0
- package/dist/run/run-isolator.js +164 -0
- package/dist/run/run-isolator.js.map +1 -0
- package/dist/status/announce.d.ts +14 -0
- package/dist/status/announce.d.ts.map +1 -0
- package/dist/status/announce.js +28 -0
- package/dist/status/announce.js.map +1 -0
- package/dist/status/make-status.d.ts +7 -0
- package/dist/status/make-status.d.ts.map +1 -0
- package/dist/status/make-status.js +19 -0
- package/dist/status/make-status.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
const OUTPUT_TRUNCATE = 8_192;
|
|
3
|
+
const OUTPUT_LIMIT_CHARS = 8 * 1024 * 1024;
|
|
4
|
+
function truncate(text) {
|
|
5
|
+
if (text.length <= OUTPUT_TRUNCATE) {
|
|
6
|
+
return text;
|
|
7
|
+
}
|
|
8
|
+
return `${text.slice(0, OUTPUT_TRUNCATE)}…[truncated]`;
|
|
9
|
+
}
|
|
10
|
+
function killProcessTree(child) {
|
|
11
|
+
try {
|
|
12
|
+
child.kill("SIGKILL");
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// already gone
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run one child with a wall-clock timeout. Does not inherit Isolator stdin.
|
|
20
|
+
*/
|
|
21
|
+
export function runChild(request) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const [file, ...args] = request.argv;
|
|
24
|
+
if (file === undefined) {
|
|
25
|
+
resolve({ kind: "spawn_error", detail: "Empty command." });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
let settled = false;
|
|
29
|
+
let timedOut = false;
|
|
30
|
+
let interrupted = false;
|
|
31
|
+
let stdout = "";
|
|
32
|
+
let stderr = "";
|
|
33
|
+
let timer;
|
|
34
|
+
let interruptPoll;
|
|
35
|
+
const finish = (outcome) => {
|
|
36
|
+
if (settled) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
settled = true;
|
|
40
|
+
if (timer !== undefined) {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
}
|
|
43
|
+
if (interruptPoll !== undefined) {
|
|
44
|
+
clearInterval(interruptPoll);
|
|
45
|
+
}
|
|
46
|
+
resolve(outcome);
|
|
47
|
+
};
|
|
48
|
+
let child;
|
|
49
|
+
try {
|
|
50
|
+
child = spawn(file, args, {
|
|
51
|
+
cwd: request.cwd,
|
|
52
|
+
env: request.env,
|
|
53
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
58
|
+
finish({ kind: "spawn_error", detail });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!child.stdout || !child.stderr) {
|
|
62
|
+
finish({ kind: "spawn_error", detail: "Child stdout/stderr pipes unavailable." });
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
child.stdout.setEncoding("utf8");
|
|
66
|
+
child.stderr.setEncoding("utf8");
|
|
67
|
+
let overflowed = false;
|
|
68
|
+
const take = (chunk) => {
|
|
69
|
+
if (overflowed) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (stdout.length + stderr.length + chunk.length > OUTPUT_LIMIT_CHARS) {
|
|
73
|
+
overflowed = true;
|
|
74
|
+
killProcessTree(child);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
};
|
|
79
|
+
child.stdout.on("data", (chunk) => {
|
|
80
|
+
if (take(chunk)) {
|
|
81
|
+
stdout += chunk;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
child.stderr.on("data", (chunk) => {
|
|
85
|
+
if (take(chunk)) {
|
|
86
|
+
stderr += chunk;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
child.on("error", (error) => {
|
|
90
|
+
finish({ kind: "spawn_error", detail: error.message });
|
|
91
|
+
});
|
|
92
|
+
timer = setTimeout(() => {
|
|
93
|
+
timedOut = true;
|
|
94
|
+
killProcessTree(child);
|
|
95
|
+
}, Math.max(1, request.timeoutMs));
|
|
96
|
+
interruptPoll = setInterval(() => {
|
|
97
|
+
if (request.shouldInterrupt()) {
|
|
98
|
+
interrupted = true;
|
|
99
|
+
killProcessTree(child);
|
|
100
|
+
}
|
|
101
|
+
}, 20);
|
|
102
|
+
if (request.shouldInterrupt()) {
|
|
103
|
+
interrupted = true;
|
|
104
|
+
killProcessTree(child);
|
|
105
|
+
}
|
|
106
|
+
child.on("close", (exitCode, signal) => {
|
|
107
|
+
const out = truncate(stdout);
|
|
108
|
+
const err = truncate(stderr);
|
|
109
|
+
if (overflowed) {
|
|
110
|
+
finish({
|
|
111
|
+
kind: "spawn_error",
|
|
112
|
+
detail: `Child wrote more than ${OUTPUT_LIMIT_CHARS} characters; its answer cannot be read.`,
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (interrupted || request.shouldInterrupt()) {
|
|
117
|
+
finish({ kind: "interrupted", stdout: out, stderr: err });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (timedOut) {
|
|
121
|
+
finish({ kind: "timed_out", clock: request.timeoutClock, stdout: out, stderr: err });
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
finish({ kind: "exited", exitCode, signal, stdout: out, stderr: err });
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
export function combinedOutput(stdout, stderr) {
|
|
129
|
+
const parts = [stdout, stderr].filter((p) => p.length > 0);
|
|
130
|
+
return truncate(parts.join("\n"));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=run-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-child.js","sourceRoot":"","sources":["../../src/child/run-child.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, resolve } from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import { parseArgs } from "./args/parse-args.js";
|
|
6
|
+
import { createStdoutProgressWriter } from "./progress/emit.js";
|
|
7
|
+
import { invalidInvocationResult, runIsolator } from "./run/run-isolator.js";
|
|
8
|
+
/**
|
|
9
|
+
* Process signals belong to the binary, not to the Transformer: a Transformer imported into
|
|
10
|
+
* a host must not hijack the host's SIGINT. The CLI owns the flag it passes in.
|
|
11
|
+
*/
|
|
12
|
+
function installSignalHandlers(state) {
|
|
13
|
+
const onSignal = () => {
|
|
14
|
+
state.interrupted = true;
|
|
15
|
+
};
|
|
16
|
+
process.on("SIGINT", onSignal);
|
|
17
|
+
process.on("SIGTERM", onSignal);
|
|
18
|
+
return () => {
|
|
19
|
+
process.off("SIGINT", onSignal);
|
|
20
|
+
process.off("SIGTERM", onSignal);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load an isolation strategy package. Same contract Host uses: export `strategy`.
|
|
25
|
+
*/
|
|
26
|
+
async function loadStrategy(specifier) {
|
|
27
|
+
let url = specifier;
|
|
28
|
+
if (specifier.startsWith(".") || isAbsolute(specifier)) {
|
|
29
|
+
const path = resolve(process.cwd(), specifier);
|
|
30
|
+
if (!existsSync(path)) {
|
|
31
|
+
return { ok: false, reason: `Strategy "${specifier}" is not a file: ${path}` };
|
|
32
|
+
}
|
|
33
|
+
url = pathToFileURL(path).href;
|
|
34
|
+
}
|
|
35
|
+
let loaded;
|
|
36
|
+
try {
|
|
37
|
+
loaded = await import(url);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
reason: `Strategy "${specifier}" could not be loaded: ${error instanceof Error ? error.message : String(error)}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const strategy = loaded.strategy;
|
|
46
|
+
if (strategy === null ||
|
|
47
|
+
typeof strategy !== "object" ||
|
|
48
|
+
typeof strategy.isolation !== "object" ||
|
|
49
|
+
strategy === undefined) {
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
reason: `Strategy "${specifier}" does not export strategy with an isolation backend.`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { ok: true, isolation: strategy.isolation };
|
|
56
|
+
}
|
|
57
|
+
async function main(argv) {
|
|
58
|
+
const write = createStdoutProgressWriter();
|
|
59
|
+
const parsed = parseArgs(argv);
|
|
60
|
+
if (!parsed.ok) {
|
|
61
|
+
const result = await invalidInvocationResult({
|
|
62
|
+
id: parsed.id,
|
|
63
|
+
onStatusArgv: parsed.onStatusArgv,
|
|
64
|
+
write,
|
|
65
|
+
reason: parsed.reason,
|
|
66
|
+
cwd: process.cwd(),
|
|
67
|
+
});
|
|
68
|
+
return result.exitCode;
|
|
69
|
+
}
|
|
70
|
+
const loaded = await loadStrategy(parsed.strategy);
|
|
71
|
+
if (!loaded.ok) {
|
|
72
|
+
const result = await invalidInvocationResult({
|
|
73
|
+
id: parsed.invocation.id,
|
|
74
|
+
onStatusArgv: parsed.invocation.onStatusArgv,
|
|
75
|
+
write,
|
|
76
|
+
reason: loaded.reason,
|
|
77
|
+
cwd: process.cwd(),
|
|
78
|
+
});
|
|
79
|
+
return result.exitCode;
|
|
80
|
+
}
|
|
81
|
+
const interruptFlag = { interrupted: false };
|
|
82
|
+
const detachSignals = installSignalHandlers(interruptFlag);
|
|
83
|
+
try {
|
|
84
|
+
const result = await runIsolator({
|
|
85
|
+
invocation: parsed.invocation,
|
|
86
|
+
backend: loaded.isolation,
|
|
87
|
+
write,
|
|
88
|
+
interruptFlag,
|
|
89
|
+
cwd: process.cwd(),
|
|
90
|
+
});
|
|
91
|
+
return result.exitCode;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
detachSignals();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const exitCode = await main(process.argv.slice(2));
|
|
98
|
+
process.exitCode = exitCode;
|
|
99
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import entry point for this Transformer.
|
|
3
|
+
*
|
|
4
|
+
* The Transformer is a function. `cli.ts` is a thin adapter over this surface: it
|
|
5
|
+
* reads argv and stdin, calls runIsolator, and maps the outcome to an exit code.
|
|
6
|
+
* Everything a caller needs in process is reachable from here.
|
|
7
|
+
*
|
|
8
|
+
* Isolation strategies (git, copy, …) live under `packages/plugins/isolation-*`.
|
|
9
|
+
*/
|
|
10
|
+
export type { IsolationBackend } from "./isolate/backend.js";
|
|
11
|
+
export type { IsolationStop } from "./isolate/stop.js";
|
|
12
|
+
export { IsolationStoppedError, throwIfStopped } from "./isolate/stop.js";
|
|
13
|
+
export type { ProgressWriter } from "./progress/emit.js";
|
|
14
|
+
export type { RunOptions, RunResult } from "./run/run-isolator.js";
|
|
15
|
+
export { runIsolator } from "./run/run-isolator.js";
|
|
16
|
+
export type * from "./types.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,mBAAmB,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import entry point for this Transformer.
|
|
3
|
+
*
|
|
4
|
+
* The Transformer is a function. `cli.ts` is a thin adapter over this surface: it
|
|
5
|
+
* reads argv and stdin, calls runIsolator, and maps the outcome to an exit code.
|
|
6
|
+
* Everything a caller needs in process is reachable from here.
|
|
7
|
+
*
|
|
8
|
+
* Isolation strategies (git, copy, …) live under `packages/plugins/isolation-*`.
|
|
9
|
+
*/
|
|
10
|
+
export { IsolationStoppedError, throwIfStopped } from "./isolate/stop.js";
|
|
11
|
+
export { runIsolator } from "./run/run-isolator.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IsolationStop } from "./stop.js";
|
|
2
|
+
export type AttachResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
} | {
|
|
5
|
+
ok: false;
|
|
6
|
+
stop: IsolationStop;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
detail: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* How Isolator produces the Child. The caller injects one; Isolator does not
|
|
13
|
+
* choose a strategy or know git versus copy.
|
|
14
|
+
*/
|
|
15
|
+
export type IsolationBackend = {
|
|
16
|
+
attach(input: {
|
|
17
|
+
parent: string;
|
|
18
|
+
child: string;
|
|
19
|
+
/** Isolation id; a strategy may derive a branch or other label from it. */
|
|
20
|
+
id?: string;
|
|
21
|
+
timeoutMs: number;
|
|
22
|
+
shouldInterrupt: () => boolean;
|
|
23
|
+
shouldStop: () => IsolationStop | undefined;
|
|
24
|
+
}): Promise<AttachResult>;
|
|
25
|
+
/** Drop Isolation bookkeeping for an incomplete Child. Best-effort. */
|
|
26
|
+
abort(input: {
|
|
27
|
+
parent: string;
|
|
28
|
+
child: string;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/isolate/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,KAAK,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,2EAA2E;QAC3E,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,OAAO,CAAC;QAC/B,UAAU,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;KAC7C,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1B,uEAAuE;IACvE,KAAK,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/isolate/backend.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IsolationBackend } from "./backend.js";
|
|
2
|
+
import { type IsolationStop } from "./stop.js";
|
|
3
|
+
export type CreateChildResult = {
|
|
4
|
+
ok: true;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
stop: IsolationStop;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
detail: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Create `--child` as a snapshot of the Parent's working files, through the
|
|
14
|
+
* injected backend. Isolator does not choose a strategy.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createChild(input: {
|
|
17
|
+
parent: string;
|
|
18
|
+
child: string;
|
|
19
|
+
backend: IsolationBackend;
|
|
20
|
+
/** Passed to the strategy; may name a branch or other label. */
|
|
21
|
+
id?: string;
|
|
22
|
+
deadlineMs: number;
|
|
23
|
+
now: () => number;
|
|
24
|
+
shouldInterrupt: () => boolean;
|
|
25
|
+
}): Promise<CreateChildResult>;
|
|
26
|
+
//# sourceMappingURL=create-child.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-child.d.ts","sourceRoot":"","sources":["../../src/isolate/create-child.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,KAAK,aAAa,EAAyC,MAAM,WAAW,CAAC;AAEtF,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAMlC;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC;IAC1B,gEAAgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,OAAO,CAAC;CAChC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoD7B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, rm } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { IsolationStoppedError, throwIfStopped } from "./stop.js";
|
|
5
|
+
function remainingMs(deadlineMs, now) {
|
|
6
|
+
return Math.max(1, deadlineMs - now);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create `--child` as a snapshot of the Parent's working files, through the
|
|
10
|
+
* injected backend. Isolator does not choose a strategy.
|
|
11
|
+
*/
|
|
12
|
+
export async function createChild(input) {
|
|
13
|
+
const { parent, child, backend, id, deadlineMs, now, shouldInterrupt } = input;
|
|
14
|
+
let created = false;
|
|
15
|
+
const shouldStop = () => {
|
|
16
|
+
if (shouldInterrupt()) {
|
|
17
|
+
return "interrupt";
|
|
18
|
+
}
|
|
19
|
+
if (now() >= deadlineMs) {
|
|
20
|
+
return "clock";
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
};
|
|
24
|
+
const fail = async (result) => {
|
|
25
|
+
if (created || existsSync(child)) {
|
|
26
|
+
await backend.abort({ parent, child });
|
|
27
|
+
await rm(child, { recursive: true, force: true });
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
await throwIfStopped(shouldStop);
|
|
33
|
+
await mkdir(dirname(child), { recursive: true });
|
|
34
|
+
const attached = await backend.attach({
|
|
35
|
+
parent,
|
|
36
|
+
child,
|
|
37
|
+
...(id === undefined ? {} : { id }),
|
|
38
|
+
timeoutMs: remainingMs(deadlineMs, now()),
|
|
39
|
+
shouldInterrupt,
|
|
40
|
+
shouldStop,
|
|
41
|
+
});
|
|
42
|
+
created = existsSync(child);
|
|
43
|
+
if (!attached.ok) {
|
|
44
|
+
if ("stop" in attached) {
|
|
45
|
+
return fail({ ok: false, stop: attached.stop });
|
|
46
|
+
}
|
|
47
|
+
return fail({ ok: false, detail: attached.detail });
|
|
48
|
+
}
|
|
49
|
+
return { ok: true };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof IsolationStoppedError) {
|
|
53
|
+
return fail({ ok: false, stop: error.stop });
|
|
54
|
+
}
|
|
55
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
56
|
+
return fail({
|
|
57
|
+
ok: false,
|
|
58
|
+
detail: `Isolation could not complete: ${detail}`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=create-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-child.js","sourceRoot":"","sources":["../../src/isolate/create-child.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type IsolationStop = "clock" | "interrupt";
|
|
2
|
+
export declare class IsolationStoppedError extends Error {
|
|
3
|
+
readonly stop: IsolationStop;
|
|
4
|
+
constructor(stop: IsolationStop);
|
|
5
|
+
}
|
|
6
|
+
export declare function throwIfStopped(shouldStop: () => IsolationStop | undefined): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=stop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/isolate/stop.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,WAAW,CAAC;AAElD,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;gBAEjB,IAAI,EAAE,aAAa;CAShC;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class IsolationStoppedError extends Error {
|
|
2
|
+
stop;
|
|
3
|
+
constructor(stop) {
|
|
4
|
+
super(stop === "clock"
|
|
5
|
+
? "The Isolation clock fired."
|
|
6
|
+
: "A stop signal arrived before Isolation completed.");
|
|
7
|
+
this.name = "IsolationStoppedError";
|
|
8
|
+
this.stop = stop;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function throwIfStopped(shouldStop) {
|
|
12
|
+
const stop = shouldStop();
|
|
13
|
+
if (stop !== undefined) {
|
|
14
|
+
throw new IsolationStoppedError(stop);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/isolate/stop.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAAgB;IAE7B,YAAY,IAAmB;QAC7B,KAAK,CACH,IAAI,KAAK,OAAO;YACd,CAAC,CAAC,4BAA4B;YAC9B,CAAC,CAAC,mDAAmD,CACxD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA2C;IAC9E,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Status } from "../types.js";
|
|
2
|
+
export type ProgressWriter = (line: Record<string, unknown>) => void;
|
|
3
|
+
export declare function createStdoutProgressWriter(): ProgressWriter;
|
|
4
|
+
export declare function emitStatusEvent(write: ProgressWriter, status: Status): void;
|
|
5
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/progress/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAErE,wBAAgB,0BAA0B,IAAI,cAAc,CAI3D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAU3E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function createStdoutProgressWriter() {
|
|
2
|
+
return (line) => {
|
|
3
|
+
process.stdout.write(`${JSON.stringify(line)}\n`);
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
export function emitStatusEvent(write, status) {
|
|
7
|
+
const line = {
|
|
8
|
+
event: "status",
|
|
9
|
+
phase: status.phase,
|
|
10
|
+
label: status.label,
|
|
11
|
+
};
|
|
12
|
+
if (status.id !== undefined) {
|
|
13
|
+
line.id = status.id;
|
|
14
|
+
}
|
|
15
|
+
write(line);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/progress/emit.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,0BAA0B;IACxC,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAqB,EAAE,MAAc;IACnE,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IACF,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { IsolationBackend } from "../isolate/backend.js";
|
|
2
|
+
import type { ProgressWriter } from "../progress/emit.js";
|
|
3
|
+
import type { Invocation, IsolationOutcome } from "../types.js";
|
|
4
|
+
export type RunResult = {
|
|
5
|
+
outcome: IsolationOutcome;
|
|
6
|
+
child?: string;
|
|
7
|
+
report?: string;
|
|
8
|
+
exitCode: number;
|
|
9
|
+
};
|
|
10
|
+
export type RunOptions = {
|
|
11
|
+
invocation: Invocation;
|
|
12
|
+
/** How Isolator produces the Child. Required; Isolator does not sniff `.git`. */
|
|
13
|
+
backend: IsolationBackend;
|
|
14
|
+
write?: ProgressWriter;
|
|
15
|
+
/** Injectable clock for tests. */
|
|
16
|
+
now?: () => number;
|
|
17
|
+
/** When set, polled for interrupt; otherwise process signals are used. */
|
|
18
|
+
interruptFlag?: {
|
|
19
|
+
interrupted: boolean;
|
|
20
|
+
};
|
|
21
|
+
/** Working directory for the --on-status child. Undefined lets it inherit. */
|
|
22
|
+
cwd?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Run one Isolator invocation to an Isolation outcome.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runIsolator(options: RunOptions): Promise<RunResult>;
|
|
28
|
+
export declare function invalidInvocationResult(input: {
|
|
29
|
+
id: string | undefined;
|
|
30
|
+
onStatusArgv: string[] | undefined;
|
|
31
|
+
write: ProgressWriter;
|
|
32
|
+
reason: string;
|
|
33
|
+
cwd?: string | undefined;
|
|
34
|
+
}): Promise<RunResult>;
|
|
35
|
+
//# sourceMappingURL=run-isolator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-isolator.d.ts","sourceRoot":"","sources":["../../src/run/run-isolator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,iFAAiF;IACjF,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,0EAA0E;IAC1E,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAsBF;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAgBzE;AAgID,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B,GAAG,OAAO,CAAC,SAAS,CAAC,CA0BrB"}
|