@taliesinb/mash 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/mash.ts +253 -0
- package/dist/bin/mash.d.ts +39 -0
- package/dist/bin/mash.d.ts.map +1 -0
- package/dist/bin/mash.js +281 -0
- package/dist/bin/mash.js.map +1 -0
- package/dist/src/analysis/analyze.d.ts +97 -0
- package/dist/src/analysis/analyze.d.ts.map +1 -0
- package/dist/src/analysis/analyze.js +1406 -0
- package/dist/src/analysis/analyze.js.map +1 -0
- package/dist/src/analysis/fs.d.ts +39 -0
- package/dist/src/analysis/fs.d.ts.map +1 -0
- package/dist/src/analysis/fs.js +117 -0
- package/dist/src/analysis/fs.js.map +1 -0
- package/dist/src/analysis/outputs.d.ts +16 -0
- package/dist/src/analysis/outputs.d.ts.map +1 -0
- package/dist/src/analysis/outputs.js +277 -0
- package/dist/src/analysis/outputs.js.map +1 -0
- package/dist/src/analysis/value.d.ts +76 -0
- package/dist/src/analysis/value.d.ts.map +1 -0
- package/dist/src/analysis/value.js +248 -0
- package/dist/src/analysis/value.js.map +1 -0
- package/dist/src/behaviors/defs/core.d.ts +15 -0
- package/dist/src/behaviors/defs/core.d.ts.map +1 -0
- package/dist/src/behaviors/defs/core.js +1084 -0
- package/dist/src/behaviors/defs/core.js.map +1 -0
- package/dist/src/behaviors/defs/devtools.d.ts +9 -0
- package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/devtools.js +432 -0
- package/dist/src/behaviors/defs/devtools.js.map +1 -0
- package/dist/src/behaviors/defs/macos.d.ts +12 -0
- package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
- package/dist/src/behaviors/defs/macos.js +454 -0
- package/dist/src/behaviors/defs/macos.js.map +1 -0
- package/dist/src/behaviors/defs/tools.d.ts +9 -0
- package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/tools.js +639 -0
- package/dist/src/behaviors/defs/tools.js.map +1 -0
- package/dist/src/behaviors/dsl.d.ts +95 -0
- package/dist/src/behaviors/dsl.d.ts.map +1 -0
- package/dist/src/behaviors/dsl.js +267 -0
- package/dist/src/behaviors/dsl.js.map +1 -0
- package/dist/src/behaviors/index.d.ts +12 -0
- package/dist/src/behaviors/index.d.ts.map +1 -0
- package/dist/src/behaviors/index.js +18 -0
- package/dist/src/behaviors/index.js.map +1 -0
- package/dist/src/behaviors/registry.d.ts +45 -0
- package/dist/src/behaviors/registry.d.ts.map +1 -0
- package/dist/src/behaviors/registry.js +266 -0
- package/dist/src/behaviors/registry.js.map +1 -0
- package/dist/src/behaviors/roles.d.ts +29 -0
- package/dist/src/behaviors/roles.d.ts.map +1 -0
- package/dist/src/behaviors/roles.js +198 -0
- package/dist/src/behaviors/roles.js.map +1 -0
- package/dist/src/behaviors/types.d.ts +120 -0
- package/dist/src/behaviors/types.d.ts.map +1 -0
- package/dist/src/behaviors/types.js +12 -0
- package/dist/src/behaviors/types.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/deepsea.d.ts +121 -0
- package/dist/src/integrations/deepsea.d.ts.map +1 -0
- package/dist/src/integrations/deepsea.js +199 -0
- package/dist/src/integrations/deepsea.js.map +1 -0
- package/dist/src/machine.d.ts +139 -0
- package/dist/src/machine.d.ts.map +1 -0
- package/dist/src/machine.js +400 -0
- package/dist/src/machine.js.map +1 -0
- package/dist/src/parser/ast.d.ts +369 -0
- package/dist/src/parser/ast.d.ts.map +1 -0
- package/dist/src/parser/ast.js +17 -0
- package/dist/src/parser/ast.js.map +1 -0
- package/dist/src/parser/parser.d.ts +48 -0
- package/dist/src/parser/parser.d.ts.map +1 -0
- package/dist/src/parser/parser.js +1950 -0
- package/dist/src/parser/parser.js.map +1 -0
- package/dist/src/policy/effects.d.ts +86 -0
- package/dist/src/policy/effects.d.ts.map +1 -0
- package/dist/src/policy/effects.js +53 -0
- package/dist/src/policy/effects.js.map +1 -0
- package/dist/src/policy/policy.d.ts +130 -0
- package/dist/src/policy/policy.d.ts.map +1 -0
- package/dist/src/policy/policy.js +532 -0
- package/dist/src/policy/policy.js.map +1 -0
- package/dist/src/printer/doc.d.ts +151 -0
- package/dist/src/printer/doc.d.ts.map +1 -0
- package/dist/src/printer/doc.js +409 -0
- package/dist/src/printer/doc.js.map +1 -0
- package/dist/src/printer/highlight.d.ts +53 -0
- package/dist/src/printer/highlight.d.ts.map +1 -0
- package/dist/src/printer/highlight.js +339 -0
- package/dist/src/printer/highlight.js.map +1 -0
- package/dist/src/printer/html.d.ts +72 -0
- package/dist/src/printer/html.d.ts.map +1 -0
- package/dist/src/printer/html.js +423 -0
- package/dist/src/printer/html.js.map +1 -0
- package/dist/src/printer/print.d.ts +63 -0
- package/dist/src/printer/print.d.ts.map +1 -0
- package/dist/src/printer/print.js +484 -0
- package/dist/src/printer/print.js.map +1 -0
- package/dist/src/printer/summary.d.ts +50 -0
- package/dist/src/printer/summary.d.ts.map +1 -0
- package/dist/src/printer/summary.js +621 -0
- package/dist/src/printer/summary.js.map +1 -0
- package/dist/src/trace/events.d.ts +183 -0
- package/dist/src/trace/events.d.ts.map +1 -0
- package/dist/src/trace/events.js +9 -0
- package/dist/src/trace/events.js.map +1 -0
- package/dist/src/trace/progress.d.ts +58 -0
- package/dist/src/trace/progress.d.ts.map +1 -0
- package/dist/src/trace/progress.js +83 -0
- package/dist/src/trace/progress.js.map +1 -0
- package/dist/src/vm/arith.d.ts +29 -0
- package/dist/src/vm/arith.d.ts.map +1 -0
- package/dist/src/vm/arith.js +258 -0
- package/dist/src/vm/arith.js.map +1 -0
- package/dist/src/vm/builtins.d.ts +31 -0
- package/dist/src/vm/builtins.d.ts.map +1 -0
- package/dist/src/vm/builtins.js +1773 -0
- package/dist/src/vm/builtins.js.map +1 -0
- package/dist/src/vm/emulate.d.ts +75 -0
- package/dist/src/vm/emulate.d.ts.map +1 -0
- package/dist/src/vm/emulate.js +380 -0
- package/dist/src/vm/emulate.js.map +1 -0
- package/dist/src/vm/expand.d.ts +68 -0
- package/dist/src/vm/expand.d.ts.map +1 -0
- package/dist/src/vm/expand.js +744 -0
- package/dist/src/vm/expand.js.map +1 -0
- package/dist/src/vm/external.d.ts +34 -0
- package/dist/src/vm/external.d.ts.map +1 -0
- package/dist/src/vm/external.js +228 -0
- package/dist/src/vm/external.js.map +1 -0
- package/dist/src/vm/fifo.d.ts +66 -0
- package/dist/src/vm/fifo.d.ts.map +1 -0
- package/dist/src/vm/fifo.js +232 -0
- package/dist/src/vm/fifo.js.map +1 -0
- package/dist/src/vm/interp.d.ts +209 -0
- package/dist/src/vm/interp.d.ts.map +1 -0
- package/dist/src/vm/interp.js +1641 -0
- package/dist/src/vm/interp.js.map +1 -0
- package/dist/src/vm/io.d.ts +180 -0
- package/dist/src/vm/io.d.ts.map +1 -0
- package/dist/src/vm/io.js +502 -0
- package/dist/src/vm/io.js.map +1 -0
- package/dist/src/vm/pattern.d.ts +46 -0
- package/dist/src/vm/pattern.d.ts.map +1 -0
- package/dist/src/vm/pattern.js +498 -0
- package/dist/src/vm/pattern.js.map +1 -0
- package/dist/src/vm/proc.d.ts +94 -0
- package/dist/src/vm/proc.d.ts.map +1 -0
- package/dist/src/vm/proc.js +130 -0
- package/dist/src/vm/proc.js.map +1 -0
- package/dist/src/vm/state.d.ts +104 -0
- package/dist/src/vm/state.d.ts.map +1 -0
- package/dist/src/vm/state.js +233 -0
- package/dist/src/vm/state.js.map +1 -0
- package/dist/src/vm/test.d.ts +11 -0
- package/dist/src/vm/test.d.ts.map +1 -0
- package/dist/src/vm/test.js +277 -0
- package/dist/src/vm/test.js.map +1 -0
- package/package.json +63 -4
- package/src/analysis/analyze.ts +1395 -0
- package/src/analysis/fs.ts +121 -0
- package/src/analysis/outputs.ts +242 -0
- package/src/analysis/value.ts +264 -0
- package/src/behaviors/defs/core.ts +970 -0
- package/src/behaviors/defs/devtools.ts +400 -0
- package/src/behaviors/defs/macos.ts +426 -0
- package/src/behaviors/defs/tools.ts +596 -0
- package/src/behaviors/dsl.ts +293 -0
- package/src/behaviors/index.ts +19 -0
- package/src/behaviors/registry.ts +261 -0
- package/src/behaviors/roles.ts +187 -0
- package/src/behaviors/types.ts +127 -0
- package/src/index.ts +27 -0
- package/src/integrations/deepsea.ts +259 -0
- package/src/machine.ts +483 -0
- package/src/parser/ast.ts +472 -0
- package/src/parser/parser.ts +1826 -0
- package/src/policy/effects.ts +102 -0
- package/src/policy/policy.ts +578 -0
- package/src/printer/doc.ts +454 -0
- package/src/printer/highlight.ts +283 -0
- package/src/printer/html.ts +441 -0
- package/src/printer/print.ts +528 -0
- package/src/printer/summary.ts +601 -0
- package/src/trace/events.ts +102 -0
- package/src/trace/progress.ts +119 -0
- package/src/vm/arith.ts +236 -0
- package/src/vm/builtins.ts +1590 -0
- package/src/vm/emulate.ts +337 -0
- package/src/vm/expand.ts +721 -0
- package/src/vm/external.ts +265 -0
- package/src/vm/fifo.ts +226 -0
- package/src/vm/interp.ts +1623 -0
- package/src/vm/io.ts +570 -0
- package/src/vm/pattern.ts +477 -0
- package/src/vm/proc.ts +147 -0
- package/src/vm/state.ts +267 -0
- package/src/vm/test.ts +253 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Named-FIFO fallback for handing VM file descriptors to external commands.
|
|
3
|
+
*
|
|
4
|
+
* Node creates child stdio pipes as UNIX socketpairs. macOS lets a child open
|
|
5
|
+
* `/dev/fd/N` on a socket (it dups the descriptor); Linux reopens the file
|
|
6
|
+
* through `/proc/self/fd/N`, which fails with ENXIO for sockets. So on Linux a
|
|
7
|
+
* process substitution (`diff <(a) <(b)`) or an `exec 3<f; cmd /dev/fd/3`
|
|
8
|
+
* passed to an external command cannot use the socket slot. Instead the child
|
|
9
|
+
* gets the path of a named FIFO in a private temp dir, and mash pumps between
|
|
10
|
+
* the FIFO and the VM file (so taps and tracing still see the bytes).
|
|
11
|
+
*
|
|
12
|
+
* Opening a FIFO blocks until the other side opens it, and a blocking open
|
|
13
|
+
* would hold one of libuv's four threadpool threads. So mash never does a
|
|
14
|
+
* blocking open: everything here uses `O_NONBLOCK` descriptors and polls with
|
|
15
|
+
* a short backoff (immediate while data flows, at most {@link MAX_DELAY} ms
|
|
16
|
+
* when idle).
|
|
17
|
+
*
|
|
18
|
+
* - **The child reads** (`<(cmd)`): mash polls `open(O_WRONLY|O_NONBLOCK)`,
|
|
19
|
+
* which fails with ENXIO until the child has opened the FIFO for reading.
|
|
20
|
+
* Only then does it write, so no data can be lost in a pipe nobody holds,
|
|
21
|
+
* and closing it at the VM file's EOF gives the child EOF. If the child
|
|
22
|
+
* exits without opening it, nothing is consumed from the VM file.
|
|
23
|
+
* - **The child writes** (`>(cmd)`): mash opens the read side
|
|
24
|
+
* `O_RDONLY|O_NONBLOCK` up front (that never blocks, and lets the child's
|
|
25
|
+
* own open for writing succeed at once) and polls `read`. A read of 0 means
|
|
26
|
+
* "no writer right now", so the pump only stops once the child has exited
|
|
27
|
+
* and every writer (including grandchildren) has closed.
|
|
28
|
+
*
|
|
29
|
+
* The strategy is chosen per machine: {@link defaultFdPassing} (Linux and the
|
|
30
|
+
* other non-macOS systems → `fifo`, macOS → `devfd`), overridable with the
|
|
31
|
+
* `MASH_PROCSUBST=fifo|devfd` environment variable or `MachineOptions.procSubst`.
|
|
32
|
+
*/
|
|
33
|
+
import { execFile } from 'node:child_process';
|
|
34
|
+
import * as fs from 'node:fs';
|
|
35
|
+
import * as os from 'node:os';
|
|
36
|
+
import * as path from 'node:path';
|
|
37
|
+
/** `MASH_PROCSUBST` if set to `fifo`/`devfd`, else `devfd` on macOS and `fifo` elsewhere. */
|
|
38
|
+
export function defaultFdPassing(env = process.env) {
|
|
39
|
+
const v = env.MASH_PROCSUBST;
|
|
40
|
+
if (v === 'fifo' || v === 'devfd')
|
|
41
|
+
return v;
|
|
42
|
+
return process.platform === 'darwin' ? 'devfd' : 'fifo';
|
|
43
|
+
}
|
|
44
|
+
const MAX_DELAY = 16;
|
|
45
|
+
/** Exponential backoff for polling: 0 (a macrotask turn), 1, 2, 4 … MAX_DELAY ms. */
|
|
46
|
+
class Backoff {
|
|
47
|
+
delay = 0;
|
|
48
|
+
reset() {
|
|
49
|
+
this.delay = 0;
|
|
50
|
+
}
|
|
51
|
+
/** Sleep; if `signal` aborts *during* the sleep, wake early. */
|
|
52
|
+
wait(signal) {
|
|
53
|
+
const ms = this.delay;
|
|
54
|
+
this.delay = Math.min(MAX_DELAY, ms === 0 ? 1 : ms * 2);
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
if (signal?.aborted)
|
|
57
|
+
signal = undefined;
|
|
58
|
+
const done = () => {
|
|
59
|
+
clearTimeout(t);
|
|
60
|
+
signal?.removeEventListener('abort', done);
|
|
61
|
+
resolve();
|
|
62
|
+
};
|
|
63
|
+
const t = ms === 0 ? setTimeout(done, 0) : setTimeout(done, ms);
|
|
64
|
+
signal?.addEventListener('abort', done, { once: true });
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function unlink(p) {
|
|
69
|
+
try {
|
|
70
|
+
fs.unlinkSync(p);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// already gone
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function code(e) {
|
|
77
|
+
return e?.code;
|
|
78
|
+
}
|
|
79
|
+
/** A private temp dir holding the FIFOs of one external command. */
|
|
80
|
+
export class FifoSet {
|
|
81
|
+
dir;
|
|
82
|
+
feeds = [];
|
|
83
|
+
constructor(dir) {
|
|
84
|
+
this.dir = dir;
|
|
85
|
+
}
|
|
86
|
+
/** Create a private dir with `n` FIFOs (`0`, `1`, …), mode 0600, via one `mkfifo` call. */
|
|
87
|
+
static async create(n) {
|
|
88
|
+
const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'mash-fifo-'));
|
|
89
|
+
const set = new FifoSet(dir);
|
|
90
|
+
const paths = Array.from({ length: n }, (_, i) => path.join(dir, String(i)));
|
|
91
|
+
try {
|
|
92
|
+
await new Promise((resolve, reject) => {
|
|
93
|
+
execFile('mkfifo', ['-m', '600', ...paths], { env: { PATH: `/usr/bin:/bin:${process.env.PATH ?? ''}` } }, (err) => (err ? reject(err) : resolve()));
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
set.cleanup();
|
|
98
|
+
throw e;
|
|
99
|
+
}
|
|
100
|
+
return { set, paths };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Feed the FIFO at `p` from `file` (the child reads it). Resolves at the
|
|
104
|
+
* file's EOF, when the child stops reading, or once `exited` aborts.
|
|
105
|
+
*/
|
|
106
|
+
async feed(p, file, exited) {
|
|
107
|
+
this.feeds.push(p);
|
|
108
|
+
const C = fs.constants;
|
|
109
|
+
const backoff = new Backoff();
|
|
110
|
+
let fd = -1;
|
|
111
|
+
while (fd < 0) {
|
|
112
|
+
if (exited.aborted)
|
|
113
|
+
return;
|
|
114
|
+
try {
|
|
115
|
+
fd = fs.openSync(p, C.O_WRONLY | C.O_NONBLOCK);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
if (code(e) !== 'ENXIO')
|
|
119
|
+
return; // no reader yet is ENXIO; anything else: give up
|
|
120
|
+
await backoff.wait(exited);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
backoff.reset();
|
|
124
|
+
try {
|
|
125
|
+
for (;;) {
|
|
126
|
+
const chunk = await file.read(exited);
|
|
127
|
+
if (chunk === null)
|
|
128
|
+
return; // EOF (or the child exited: nothing consumed)
|
|
129
|
+
let off = 0;
|
|
130
|
+
while (off < chunk.length) {
|
|
131
|
+
if (exited.aborted) {
|
|
132
|
+
file.unread(chunk.subarray(off));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
off += fs.writeSync(fd, chunk, off, chunk.length - off);
|
|
137
|
+
backoff.reset();
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
if (code(e) === 'EAGAIN') {
|
|
141
|
+
await backoff.wait(exited);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
// EPIPE: the child closed it; leave the rest for other readers of a shared file
|
|
145
|
+
file.unread(chunk.subarray(off));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// reading the source failed: the child gets EOF
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
fs.closeSync(fd);
|
|
156
|
+
// a second open for reading would wait for a writer forever: make it fail instead
|
|
157
|
+
unlink(p);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Drain the FIFO at `p` into `file` (the child writes it). Resolves once
|
|
162
|
+
* the child has exited and no writer holds the FIFO, or when `file` has no
|
|
163
|
+
* readers left (the child's writes then fail with EPIPE/SIGPIPE).
|
|
164
|
+
*/
|
|
165
|
+
async drain(p, file, exited) {
|
|
166
|
+
const C = fs.constants;
|
|
167
|
+
let fd;
|
|
168
|
+
try {
|
|
169
|
+
fd = fs.openSync(p, C.O_RDONLY | C.O_NONBLOCK);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const buf = Buffer.allocUnsafe(65536);
|
|
175
|
+
const backoff = new Backoff();
|
|
176
|
+
try {
|
|
177
|
+
for (;;) {
|
|
178
|
+
let n;
|
|
179
|
+
try {
|
|
180
|
+
n = fs.readSync(fd, buf, 0, buf.length, null);
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
if (code(e) !== 'EAGAIN')
|
|
184
|
+
return;
|
|
185
|
+
await backoff.wait(); // a writer is connected but has nothing yet
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (n > 0) {
|
|
189
|
+
backoff.reset();
|
|
190
|
+
await file.write(Buffer.from(buf.subarray(0, n)));
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// n === 0: no writer at the moment (not opened yet, or closed)
|
|
194
|
+
if (exited.aborted)
|
|
195
|
+
return;
|
|
196
|
+
await backoff.wait(exited);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// BrokenPipeError: nobody reads any more. A later open for writing must fail, not block
|
|
201
|
+
unlink(p);
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
fs.closeSync(fd);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Remove the FIFOs and the dir. A reader of a fed FIFO still blocked in
|
|
209
|
+
* `open` (a grandchild that opened it late) is released first: a brief
|
|
210
|
+
* non-blocking writer open lets its open return, and it reads EOF.
|
|
211
|
+
*/
|
|
212
|
+
cleanup() {
|
|
213
|
+
const C = fs.constants;
|
|
214
|
+
for (const p of this.feeds) {
|
|
215
|
+
if (!fs.existsSync(p))
|
|
216
|
+
continue;
|
|
217
|
+
try {
|
|
218
|
+
fs.closeSync(fs.openSync(p, C.O_WRONLY | C.O_NONBLOCK));
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// ENXIO: no reader waiting
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
fs.rmSync(this.dir, { recursive: true, force: true });
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// best effort
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=fifo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fifo.js","sourceRoot":"","sources":["../../../src/vm/fifo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tree-walking interpreter. Every command node emits a `step` event
|
|
3
|
+
* before it runs; simple commands are expanded, resolved, assessed against
|
|
4
|
+
* the policy (through {@link Runtime.assess}, which consults behavior
|
|
5
|
+
* definitions and hooks), and only then have their redirections opened and
|
|
6
|
+
* run. Pipelines run their stages concurrently over in-memory pipes; external
|
|
7
|
+
* commands are real child processes whose stdio is pumped through the VM's
|
|
8
|
+
* channels so it can be observed.
|
|
9
|
+
*/
|
|
10
|
+
import type * as A from '../parser/ast.ts';
|
|
11
|
+
import { literalOf } from '../parser/parser.ts';
|
|
12
|
+
import type { Effect } from '../policy/effects.ts';
|
|
13
|
+
import type { CommandKind, SubshellReason, TraceEvent } from '../trace/events.ts';
|
|
14
|
+
import { type ArithEnv } from './arith.ts';
|
|
15
|
+
import { Expander } from './expand.ts';
|
|
16
|
+
import { type SpawnFn } from './external.ts';
|
|
17
|
+
import type { FdPassing } from './fifo.ts';
|
|
18
|
+
import { FdTable, type Channel, type ChannelKind, type DataListener } from './io.ts';
|
|
19
|
+
import { Proc, type Job } from './proc.ts';
|
|
20
|
+
import { ShellState } from './state.ts';
|
|
21
|
+
import { evalTest } from './test.ts';
|
|
22
|
+
export interface ExecIntent {
|
|
23
|
+
execId: number;
|
|
24
|
+
node: A.SimpleCommand;
|
|
25
|
+
argv: string[];
|
|
26
|
+
kind: CommandKind;
|
|
27
|
+
path?: string;
|
|
28
|
+
cwd: string;
|
|
29
|
+
env: Record<string, string>;
|
|
30
|
+
redirectEffects: Effect[];
|
|
31
|
+
stdinKind: 'pipe' | 'file' | 'null' | 'terminal' | 'unknown';
|
|
32
|
+
pid: number;
|
|
33
|
+
}
|
|
34
|
+
export type Assessment = {
|
|
35
|
+
action: 'run';
|
|
36
|
+
readsStdin: boolean | 'maybe';
|
|
37
|
+
} | {
|
|
38
|
+
action: 'deny';
|
|
39
|
+
reason: string;
|
|
40
|
+
status: number;
|
|
41
|
+
} | {
|
|
42
|
+
action: 'abort';
|
|
43
|
+
reason: string;
|
|
44
|
+
status: number;
|
|
45
|
+
} | {
|
|
46
|
+
action: 'simulate';
|
|
47
|
+
stdout: string;
|
|
48
|
+
stderr: string;
|
|
49
|
+
status: number;
|
|
50
|
+
};
|
|
51
|
+
export interface Runtime {
|
|
52
|
+
emit(event: TraceEvent): void;
|
|
53
|
+
readonly listeners: DataListener[];
|
|
54
|
+
channel(kind: ChannelKind, label: string, extra?: Partial<Channel>): Channel;
|
|
55
|
+
nextPid(): number;
|
|
56
|
+
nextExecId(): number;
|
|
57
|
+
readonly shellPid: number;
|
|
58
|
+
assess(intent: ExecIntent): Promise<Assessment>;
|
|
59
|
+
/** Policy check for redirections of compound commands (no command to attach them to). */
|
|
60
|
+
assessRedirects(effects: Effect[], node: A.Node, proc: Proc): Promise<Assessment>;
|
|
61
|
+
afterCommand(execId: number, status: number): Promise<void>;
|
|
62
|
+
spawn: SpawnFn;
|
|
63
|
+
readonly signal: AbortSignal;
|
|
64
|
+
/** Source text of a node (from whichever parse produced it). */
|
|
65
|
+
text(node: {
|
|
66
|
+
id: number;
|
|
67
|
+
span: A.Span;
|
|
68
|
+
}): string;
|
|
69
|
+
/** 1-based line number of a node in its source. */
|
|
70
|
+
line(node: {
|
|
71
|
+
id: number;
|
|
72
|
+
span: A.Span;
|
|
73
|
+
}): number;
|
|
74
|
+
/** Parse source text (eval, source, trap actions), registering it for text()/line(). */
|
|
75
|
+
parse(source: string, origin: string, opts?: {
|
|
76
|
+
partial?: boolean;
|
|
77
|
+
}): A.Script;
|
|
78
|
+
findJob(pid: number): Job | undefined;
|
|
79
|
+
/** Pending background work (process substitutions) to settle at the end. */
|
|
80
|
+
track(p: Promise<unknown>): void;
|
|
81
|
+
registerJob(job: Job): void;
|
|
82
|
+
/** Execute nested bash/sh scripts inside the VM. */
|
|
83
|
+
readonly inlineScripts: boolean;
|
|
84
|
+
/** Emulate xargs and find -exec/-delete so each resulting command is traced and checked. */
|
|
85
|
+
readonly emulate: boolean;
|
|
86
|
+
/** How `/dev/fd/N` arguments naming VM fds reach external commands (see fifo.ts). */
|
|
87
|
+
readonly fdPassing: FdPassing;
|
|
88
|
+
}
|
|
89
|
+
interface ResolvedRedirect {
|
|
90
|
+
node: A.Redirect;
|
|
91
|
+
fd: number;
|
|
92
|
+
op: A.RedirectOp;
|
|
93
|
+
/** Absolute path for file redirections. */
|
|
94
|
+
path?: string;
|
|
95
|
+
/** Special device handling. */
|
|
96
|
+
special?: 'null' | {
|
|
97
|
+
dup: number;
|
|
98
|
+
};
|
|
99
|
+
dupFd?: number;
|
|
100
|
+
close?: boolean;
|
|
101
|
+
content?: string;
|
|
102
|
+
fdVar?: string;
|
|
103
|
+
}
|
|
104
|
+
export declare class Interpreter {
|
|
105
|
+
readonly rt: Runtime;
|
|
106
|
+
readonly expander: Expander;
|
|
107
|
+
constructor(rt: Runtime);
|
|
108
|
+
/** Run a parsed script in `proc` (the top-level shell). Returns the exit status. */
|
|
109
|
+
runTop(script: A.Script, proc: Proc): Promise<number>;
|
|
110
|
+
/**
|
|
111
|
+
* Execute a script's top-level statements like bash reads them: an
|
|
112
|
+
* expansion error discards only the current top-level command, and a
|
|
113
|
+
* syntax error further down (partial parse) is reported when reached.
|
|
114
|
+
*/
|
|
115
|
+
execTopLevel(script: A.Script, proc: Proc): Promise<number>;
|
|
116
|
+
private handleTermination;
|
|
117
|
+
private runExitTrap;
|
|
118
|
+
write(proc: Proc, fd: number, text: string | Uint8Array): Promise<void>;
|
|
119
|
+
errorMessage(proc: Proc, message: string): void;
|
|
120
|
+
execList(stmts: A.Stmt[], proc: Proc): Promise<number>;
|
|
121
|
+
execStmt(stmt: A.Stmt, proc: Proc): Promise<number>;
|
|
122
|
+
private startBackground;
|
|
123
|
+
/** Run `fn` as the body of subshell `child`, handling exit, traps and fd cleanup. */
|
|
124
|
+
runSubshell(child: Proc, fn: () => Promise<number>, reason: SubshellReason, nodeId: number): Promise<number>;
|
|
125
|
+
private inErrTrap;
|
|
126
|
+
/** After a failing command outside a condition: run the ERR trap, then apply `set -e`. */
|
|
127
|
+
private checkErrexit;
|
|
128
|
+
private step;
|
|
129
|
+
private stepCount;
|
|
130
|
+
execCommand(cmd: A.Command, proc: Proc): Promise<number>;
|
|
131
|
+
private execCompound;
|
|
132
|
+
private execAndOr;
|
|
133
|
+
private execIf;
|
|
134
|
+
/** Run a loop body; returns 'break' / 'continue' / status. */
|
|
135
|
+
private loopBody;
|
|
136
|
+
private execLoop;
|
|
137
|
+
private execFor;
|
|
138
|
+
private execSelect;
|
|
139
|
+
private execArithFor;
|
|
140
|
+
private execCase;
|
|
141
|
+
private execPipeline;
|
|
142
|
+
private setPipestatus;
|
|
143
|
+
private expandFieldsChecked;
|
|
144
|
+
private execSimple;
|
|
145
|
+
private closeProcSubsts;
|
|
146
|
+
/** `expand_aliases`: re-parse the command with the alias text substituted for its first word. */
|
|
147
|
+
private expandAlias;
|
|
148
|
+
private execSimpleInner;
|
|
149
|
+
private setUnderscore;
|
|
150
|
+
private realArgv;
|
|
151
|
+
private dispatch;
|
|
152
|
+
/**
|
|
153
|
+
* Execute a nested shell script (`bash -c ...`, `bash file`, `./script.sh`)
|
|
154
|
+
* inside the VM as a fresh shell process: only exported variables carry
|
|
155
|
+
* over, functions and options do not. Its commands are traced and
|
|
156
|
+
* policy-checked individually instead of disappearing into a child bash.
|
|
157
|
+
*/
|
|
158
|
+
private runInlineScript;
|
|
159
|
+
/**
|
|
160
|
+
* Run an already-expanded argv (for `command`, `builtin`, `exec`): resolve,
|
|
161
|
+
* assess against the policy, and dispatch.
|
|
162
|
+
*/
|
|
163
|
+
runArgv(argv: string[], proc: Proc, node: A.SimpleCommand, opts: {
|
|
164
|
+
skipFunctions?: boolean;
|
|
165
|
+
externalOnly?: boolean;
|
|
166
|
+
builtinOnly?: boolean;
|
|
167
|
+
}): Promise<number>;
|
|
168
|
+
private withTempVars;
|
|
169
|
+
callFunction(def: A.FunctionDef, argv: string[], proc: Proc): Promise<number>;
|
|
170
|
+
private runBuiltin;
|
|
171
|
+
private redirectOnly;
|
|
172
|
+
private xtrace;
|
|
173
|
+
childEnv(proc: Proc, prefix: {
|
|
174
|
+
name: string;
|
|
175
|
+
value: string;
|
|
176
|
+
}[]): Record<string, string>;
|
|
177
|
+
assignScalar(proc: Proc, name: string, value: string, opts?: {
|
|
178
|
+
local?: boolean;
|
|
179
|
+
}): void;
|
|
180
|
+
/** `name[index]=value` from an already-expanded subscript (`printf -v 'a[1]'`). */
|
|
181
|
+
assignElement(proc: Proc, name: string, index: string, value: string): Promise<void>;
|
|
182
|
+
private applyAttrs;
|
|
183
|
+
/**
|
|
184
|
+
* Expand an assignment's value now and return an equivalent assignment with
|
|
185
|
+
* literal parts (so `local x=1 y=$x` sees the old `$x`, as bash expands
|
|
186
|
+
* all arguments before the builtin runs).
|
|
187
|
+
*/
|
|
188
|
+
freezeAssign(a: A.Assign, proc: Proc): Promise<A.Assign>;
|
|
189
|
+
/** Perform an assignment node (prefix, bare, or declaration-builtin argument). */
|
|
190
|
+
performAssign(a: A.Assign, proc: Proc, opts: {
|
|
191
|
+
local?: boolean;
|
|
192
|
+
exported?: boolean;
|
|
193
|
+
declareKind?: 'indexed' | 'assoc';
|
|
194
|
+
}): Promise<void>;
|
|
195
|
+
arithEnv(proc: Proc): ArithEnv;
|
|
196
|
+
arith(expr: A.ArithExpr | null, proc: Proc): Promise<bigint>;
|
|
197
|
+
arithText(text: string, proc: Proc): Promise<bigint>;
|
|
198
|
+
private readonly startTime;
|
|
199
|
+
dynamicVar(proc: Proc, name: string): string | undefined;
|
|
200
|
+
commandSubst(node: A.CmdSubst, proc: Proc): Promise<string>;
|
|
201
|
+
processSubst(node: A.ProcSubst, proc: Proc): Promise<string>;
|
|
202
|
+
private withCompoundRedirects;
|
|
203
|
+
resolveRedirects(redirs: A.Redirect[], proc: Proc): Promise<ResolvedRedirect[]>;
|
|
204
|
+
openRedirects(redirects: ResolvedRedirect[], fds: FdTable, proc: Proc): Promise<void>;
|
|
205
|
+
}
|
|
206
|
+
/** PATH lookup (with the shell's hash table). */
|
|
207
|
+
export declare function resolveCommand(name: string, state: ShellState, pathOverride?: string): string | undefined;
|
|
208
|
+
export { literalOf, evalTest };
|
|
209
|
+
//# sourceMappingURL=interp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interp.d.ts","sourceRoot":"","sources":["../../../src/vm/interp.ts"],"names":[],"mappings":"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"}
|