@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,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The VM's I/O model, modelled on POSIX file descriptions.
|
|
3
|
+
*
|
|
4
|
+
* An {@link OpenFile} is an open file description: a pipe end, a real file,
|
|
5
|
+
* a capture buffer (command substitution), /dev/null, or a host stream. It is
|
|
6
|
+
* reference-counted: an {@link FdTable} (one per shell "process") holds
|
|
7
|
+
* references, subshells and pipeline stages clone the table (adding
|
|
8
|
+
* references), and closing the last write reference of a pipe delivers EOF to
|
|
9
|
+
* its reader — exactly the behaviour scripts rely on.
|
|
10
|
+
*
|
|
11
|
+
* Every OpenFile belongs to a {@link Channel}, the identity trace consumers
|
|
12
|
+
* see. Data events are reported once per byte: on write for output channels
|
|
13
|
+
* (pipes, files, captures, stdout/stderr) and on read for input-only channels
|
|
14
|
+
* (input files, here-docs).
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
/** Thrown by writes to a pipe whose read end is fully closed (EPIPE / SIGPIPE). */
|
|
18
|
+
export class BrokenPipeError extends Error {
|
|
19
|
+
constructor() {
|
|
20
|
+
super('Broken pipe');
|
|
21
|
+
this.name = 'BrokenPipeError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const encoder = new TextEncoder();
|
|
25
|
+
export function toBytes(data) {
|
|
26
|
+
return typeof data === 'string' ? encoder.encode(data) : data;
|
|
27
|
+
}
|
|
28
|
+
function concat(a, b) {
|
|
29
|
+
if (a.length === 0)
|
|
30
|
+
return b;
|
|
31
|
+
if (b.length === 0)
|
|
32
|
+
return a;
|
|
33
|
+
const out = new Uint8Array(a.length + b.length);
|
|
34
|
+
out.set(a, 0);
|
|
35
|
+
out.set(b, a.length);
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* An open file description. Subclasses implement the raw operations; this
|
|
40
|
+
* base class adds reference counting, a shared read-ahead buffer (so `read`
|
|
41
|
+
* can consume one line and leave the rest for the next reader) and tracing.
|
|
42
|
+
*/
|
|
43
|
+
export class OpenFile {
|
|
44
|
+
refs = 1;
|
|
45
|
+
channel;
|
|
46
|
+
readable;
|
|
47
|
+
writable;
|
|
48
|
+
listeners;
|
|
49
|
+
pushback = new Uint8Array(0);
|
|
50
|
+
closedForGood = false;
|
|
51
|
+
/** Report reads to listeners (input-only channels). */
|
|
52
|
+
traceReads = false;
|
|
53
|
+
constructor(channel, readable, writable, listeners) {
|
|
54
|
+
this.channel = channel;
|
|
55
|
+
this.readable = readable;
|
|
56
|
+
this.writable = writable;
|
|
57
|
+
this.listeners = listeners;
|
|
58
|
+
}
|
|
59
|
+
/** Add a reference (fd duplication / table clone). */
|
|
60
|
+
retain() {
|
|
61
|
+
this.refs++;
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
/** Drop a reference; the last one closes the description. */
|
|
65
|
+
release() {
|
|
66
|
+
if (this.refs <= 0)
|
|
67
|
+
return;
|
|
68
|
+
this.refs--;
|
|
69
|
+
if (this.refs === 0 && !this.closedForGood) {
|
|
70
|
+
this.closedForGood = true;
|
|
71
|
+
this.onLastClose();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
get closed() {
|
|
75
|
+
return this.closedForGood;
|
|
76
|
+
}
|
|
77
|
+
async write(data) {
|
|
78
|
+
if (!this.writable)
|
|
79
|
+
throw new Error(`${this.channel.label}: not open for writing`);
|
|
80
|
+
const bytes = toBytes(data);
|
|
81
|
+
if (bytes.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
await this.rawWrite(bytes);
|
|
84
|
+
for (const l of this.listeners)
|
|
85
|
+
l(this.channel, bytes, 'write');
|
|
86
|
+
}
|
|
87
|
+
inflight = null;
|
|
88
|
+
sawEof = false;
|
|
89
|
+
readError = null;
|
|
90
|
+
/** Bytes already read from the underlying source but not yet consumed. */
|
|
91
|
+
get buffered() {
|
|
92
|
+
return this.pushback.length;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Next chunk, or null at EOF. With `signal`, returns null early when the
|
|
96
|
+
* signal aborts — without consuming anything: data that arrives later stays
|
|
97
|
+
* buffered for the next reader. (This is what lets the VM stop feeding a
|
|
98
|
+
* child process that has exited without losing the rest of a shared stdin.)
|
|
99
|
+
*/
|
|
100
|
+
async read(signal) {
|
|
101
|
+
if (!this.readable)
|
|
102
|
+
throw new Error(`${this.channel.label}: not open for reading`);
|
|
103
|
+
for (;;) {
|
|
104
|
+
if (this.pushback.length > 0) {
|
|
105
|
+
const b = this.pushback;
|
|
106
|
+
this.pushback = new Uint8Array(0);
|
|
107
|
+
return b;
|
|
108
|
+
}
|
|
109
|
+
if (this.readError !== null) {
|
|
110
|
+
const e = this.readError;
|
|
111
|
+
this.readError = null;
|
|
112
|
+
throw e;
|
|
113
|
+
}
|
|
114
|
+
if (this.sawEof)
|
|
115
|
+
return null;
|
|
116
|
+
if (signal?.aborted)
|
|
117
|
+
return null;
|
|
118
|
+
if (!this.inflight) {
|
|
119
|
+
this.inflight = this.rawRead().then((chunk) => {
|
|
120
|
+
this.inflight = null;
|
|
121
|
+
if (chunk === null)
|
|
122
|
+
this.sawEof = true;
|
|
123
|
+
else {
|
|
124
|
+
this.pushback = concat(this.pushback, chunk);
|
|
125
|
+
if (this.traceReads)
|
|
126
|
+
for (const l of this.listeners)
|
|
127
|
+
l(this.channel, chunk, 'read');
|
|
128
|
+
}
|
|
129
|
+
}, (err) => {
|
|
130
|
+
this.inflight = null;
|
|
131
|
+
this.readError = err;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (signal) {
|
|
135
|
+
await new Promise((resolve) => {
|
|
136
|
+
const onAbort = () => resolve();
|
|
137
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
138
|
+
this.inflight.then(() => {
|
|
139
|
+
signal.removeEventListener('abort', onAbort);
|
|
140
|
+
resolve();
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
await this.inflight;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Return unconsumed bytes to the front of the stream. */
|
|
150
|
+
unread(bytes) {
|
|
151
|
+
if (bytes.length > 0)
|
|
152
|
+
this.pushback = concat(bytes, this.pushback);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Read up to and including `delim` (a byte), or to EOF. Returns null at EOF
|
|
156
|
+
* with nothing read. Leaves the remainder buffered for the next reader.
|
|
157
|
+
*/
|
|
158
|
+
async readUntil(delim, maxBytes = Infinity) {
|
|
159
|
+
let acc = new Uint8Array(0);
|
|
160
|
+
for (;;) {
|
|
161
|
+
const chunk = await this.read();
|
|
162
|
+
if (chunk === null)
|
|
163
|
+
return acc.length > 0 ? acc : null;
|
|
164
|
+
const idx = delim === null ? -1 : chunk.indexOf(delim);
|
|
165
|
+
if (idx >= 0 && acc.length + idx + 1 <= maxBytes) {
|
|
166
|
+
acc = concat(acc, chunk.subarray(0, idx + 1));
|
|
167
|
+
this.unread(chunk.subarray(idx + 1));
|
|
168
|
+
return acc;
|
|
169
|
+
}
|
|
170
|
+
if (acc.length + chunk.length >= maxBytes) {
|
|
171
|
+
const take = maxBytes - acc.length;
|
|
172
|
+
acc = concat(acc, chunk.subarray(0, take));
|
|
173
|
+
this.unread(chunk.subarray(take));
|
|
174
|
+
return acc;
|
|
175
|
+
}
|
|
176
|
+
acc = concat(acc, chunk);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** Read everything to EOF. */
|
|
180
|
+
async readAll() {
|
|
181
|
+
let acc = new Uint8Array(0);
|
|
182
|
+
for (;;) {
|
|
183
|
+
const chunk = await this.read();
|
|
184
|
+
if (chunk === null)
|
|
185
|
+
return acc;
|
|
186
|
+
acc = concat(acc, chunk);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// Pipes
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
/** An in-memory pipe with bounded buffering (backpressure) and POSIX EOF/EPIPE semantics. */
|
|
194
|
+
export class Pipe {
|
|
195
|
+
channel;
|
|
196
|
+
chunks = [];
|
|
197
|
+
buffered = 0;
|
|
198
|
+
capacity;
|
|
199
|
+
writersOpen = true;
|
|
200
|
+
readersOpen = true;
|
|
201
|
+
readWaiters = [];
|
|
202
|
+
writeWaiters = [];
|
|
203
|
+
readEnd;
|
|
204
|
+
writeEnd;
|
|
205
|
+
constructor(channel, listeners, capacity = 64 * 1024) {
|
|
206
|
+
this.channel = channel;
|
|
207
|
+
this.capacity = capacity;
|
|
208
|
+
this.readEnd = new PipeEnd(this, 'read', listeners);
|
|
209
|
+
this.writeEnd = new PipeEnd(this, 'write', listeners);
|
|
210
|
+
}
|
|
211
|
+
wakeReaders() {
|
|
212
|
+
const w = this.readWaiters;
|
|
213
|
+
this.readWaiters = [];
|
|
214
|
+
for (const f of w)
|
|
215
|
+
f();
|
|
216
|
+
}
|
|
217
|
+
wakeWriters() {
|
|
218
|
+
const w = this.writeWaiters;
|
|
219
|
+
this.writeWaiters = [];
|
|
220
|
+
for (const f of w)
|
|
221
|
+
f();
|
|
222
|
+
}
|
|
223
|
+
async write(chunk) {
|
|
224
|
+
while (this.readersOpen && this.buffered >= this.capacity) {
|
|
225
|
+
await new Promise((r) => this.writeWaiters.push(r));
|
|
226
|
+
}
|
|
227
|
+
if (!this.readersOpen)
|
|
228
|
+
throw new BrokenPipeError();
|
|
229
|
+
this.chunks.push(chunk);
|
|
230
|
+
this.buffered += chunk.length;
|
|
231
|
+
this.wakeReaders();
|
|
232
|
+
}
|
|
233
|
+
async read() {
|
|
234
|
+
while (this.chunks.length === 0 && this.writersOpen) {
|
|
235
|
+
await new Promise((r) => this.readWaiters.push(r));
|
|
236
|
+
}
|
|
237
|
+
const chunk = this.chunks.shift();
|
|
238
|
+
if (chunk === undefined)
|
|
239
|
+
return null;
|
|
240
|
+
this.buffered -= chunk.length;
|
|
241
|
+
this.wakeWriters();
|
|
242
|
+
return chunk;
|
|
243
|
+
}
|
|
244
|
+
closeWriters() {
|
|
245
|
+
this.writersOpen = false;
|
|
246
|
+
this.wakeReaders();
|
|
247
|
+
}
|
|
248
|
+
closeReaders() {
|
|
249
|
+
this.readersOpen = false;
|
|
250
|
+
this.chunks = [];
|
|
251
|
+
this.buffered = 0;
|
|
252
|
+
this.wakeWriters();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
export class PipeEnd extends OpenFile {
|
|
256
|
+
pipe;
|
|
257
|
+
constructor(pipe, end, listeners) {
|
|
258
|
+
super(pipe.channel, end === 'read', end === 'write', listeners);
|
|
259
|
+
this.pipe = pipe;
|
|
260
|
+
}
|
|
261
|
+
rawRead() {
|
|
262
|
+
return this.pipe.read();
|
|
263
|
+
}
|
|
264
|
+
rawWrite(chunk) {
|
|
265
|
+
return this.pipe.write(chunk);
|
|
266
|
+
}
|
|
267
|
+
onLastClose() {
|
|
268
|
+
if (this.writable)
|
|
269
|
+
this.pipe.closeWriters();
|
|
270
|
+
else
|
|
271
|
+
this.pipe.closeReaders();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/** A real file opened on the host. */
|
|
275
|
+
export class HostFile extends OpenFile {
|
|
276
|
+
fd;
|
|
277
|
+
eof = false;
|
|
278
|
+
constructor(channel, fd, mode, listeners) {
|
|
279
|
+
super(channel, mode === 'read' || mode === 'readwrite', mode !== 'read', listeners);
|
|
280
|
+
this.fd = fd;
|
|
281
|
+
this.traceReads = mode === 'read';
|
|
282
|
+
}
|
|
283
|
+
static async open(channel, path, mode, listeners, noclobber = false, umask) {
|
|
284
|
+
const existed = mode !== 'read' && umask !== undefined && fs.existsSync(path);
|
|
285
|
+
const flags = mode === 'read' ? 'r' : mode === 'write' ? (noclobber ? 'wx' : 'w') : mode === 'append' ? 'a' : 'r+';
|
|
286
|
+
let fd;
|
|
287
|
+
try {
|
|
288
|
+
fd = await new Promise((resolve, reject) => fs.open(path, mode === 'readwrite' && !fs.existsSync(path) ? 'w+' : flags, 0o666, (err, f) => (err ? reject(err) : resolve(f))));
|
|
289
|
+
}
|
|
290
|
+
catch (e) {
|
|
291
|
+
throw describeFsError(e, path);
|
|
292
|
+
}
|
|
293
|
+
if (mode !== 'read' && umask !== undefined && !existed) {
|
|
294
|
+
try {
|
|
295
|
+
fs.fchmodSync(fd, 0o666 & ~umask);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// ignore
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return new HostFile(channel, fd, mode, listeners);
|
|
302
|
+
}
|
|
303
|
+
rawRead() {
|
|
304
|
+
if (this.eof)
|
|
305
|
+
return Promise.resolve(null);
|
|
306
|
+
return new Promise((resolve, reject) => {
|
|
307
|
+
const buf = Buffer.allocUnsafe(64 * 1024);
|
|
308
|
+
fs.read(this.fd, buf, 0, buf.length, null, (err, n) => {
|
|
309
|
+
if (err)
|
|
310
|
+
return reject(err);
|
|
311
|
+
if (n === 0) {
|
|
312
|
+
this.eof = true;
|
|
313
|
+
return resolve(null);
|
|
314
|
+
}
|
|
315
|
+
resolve(new Uint8Array(buf.buffer, buf.byteOffset, n).slice());
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
rawWrite(chunk) {
|
|
320
|
+
return new Promise((resolve, reject) => {
|
|
321
|
+
fs.write(this.fd, chunk, 0, chunk.length, null, (err) => (err ? reject(err) : resolve()));
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
onLastClose() {
|
|
325
|
+
fs.close(this.fd, () => { });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
export class FsError extends Error {
|
|
329
|
+
code;
|
|
330
|
+
constructor(message, code) {
|
|
331
|
+
super(message);
|
|
332
|
+
this.code = code;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
export function describeFsError(e, path) {
|
|
336
|
+
const code = e.code ?? 'EIO';
|
|
337
|
+
const text = {
|
|
338
|
+
ENOENT: 'No such file or directory',
|
|
339
|
+
EACCES: 'Permission denied',
|
|
340
|
+
EPERM: 'Operation not permitted',
|
|
341
|
+
EISDIR: 'Is a directory',
|
|
342
|
+
ENOTDIR: 'Not a directory',
|
|
343
|
+
EEXIST: 'cannot overwrite existing file',
|
|
344
|
+
EROFS: 'Read-only file system',
|
|
345
|
+
};
|
|
346
|
+
return new FsError(`${path}: ${text[code] ?? code}`, code);
|
|
347
|
+
}
|
|
348
|
+
// ---------------------------------------------------------------------------
|
|
349
|
+
// Captures, null, constant input, host streams
|
|
350
|
+
// ---------------------------------------------------------------------------
|
|
351
|
+
/** Collects written bytes (command substitution, `run()` output capture). */
|
|
352
|
+
export class Capture extends OpenFile {
|
|
353
|
+
parts = [];
|
|
354
|
+
size = 0;
|
|
355
|
+
/** Bytes beyond this are discarded (but counted). */
|
|
356
|
+
limit;
|
|
357
|
+
truncated = false;
|
|
358
|
+
constructor(channel, listeners, limit = 64 * 1024 * 1024) {
|
|
359
|
+
super(channel, false, true, listeners);
|
|
360
|
+
this.limit = limit;
|
|
361
|
+
}
|
|
362
|
+
rawRead() {
|
|
363
|
+
return Promise.resolve(null);
|
|
364
|
+
}
|
|
365
|
+
async rawWrite(chunk) {
|
|
366
|
+
if (this.size + chunk.length > this.limit) {
|
|
367
|
+
this.truncated = true;
|
|
368
|
+
const room = Math.max(0, this.limit - this.size);
|
|
369
|
+
if (room > 0)
|
|
370
|
+
this.parts.push(chunk.slice(0, room));
|
|
371
|
+
this.size += chunk.length;
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
this.parts.push(chunk);
|
|
375
|
+
this.size += chunk.length;
|
|
376
|
+
}
|
|
377
|
+
onLastClose() { }
|
|
378
|
+
bytes() {
|
|
379
|
+
let n = 0;
|
|
380
|
+
for (const p of this.parts)
|
|
381
|
+
n += p.length;
|
|
382
|
+
const out = new Uint8Array(n);
|
|
383
|
+
let o = 0;
|
|
384
|
+
for (const p of this.parts) {
|
|
385
|
+
out.set(p, o);
|
|
386
|
+
o += p.length;
|
|
387
|
+
}
|
|
388
|
+
return out;
|
|
389
|
+
}
|
|
390
|
+
text() {
|
|
391
|
+
return new TextDecoder().decode(this.bytes());
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
export class NullFile extends OpenFile {
|
|
395
|
+
constructor(channel, listeners) {
|
|
396
|
+
super(channel, true, true, listeners);
|
|
397
|
+
}
|
|
398
|
+
rawRead() {
|
|
399
|
+
return Promise.resolve(null);
|
|
400
|
+
}
|
|
401
|
+
rawWrite() {
|
|
402
|
+
return Promise.resolve();
|
|
403
|
+
}
|
|
404
|
+
onLastClose() { }
|
|
405
|
+
}
|
|
406
|
+
/** Fixed input (here-docs, here-strings). */
|
|
407
|
+
export class ConstInput extends OpenFile {
|
|
408
|
+
data;
|
|
409
|
+
constructor(channel, data, listeners) {
|
|
410
|
+
super(channel, true, false, listeners);
|
|
411
|
+
this.data = toBytes(data);
|
|
412
|
+
this.traceReads = true;
|
|
413
|
+
}
|
|
414
|
+
rawRead() {
|
|
415
|
+
const d = this.data;
|
|
416
|
+
this.data = null;
|
|
417
|
+
return Promise.resolve(d && d.length > 0 ? d : null);
|
|
418
|
+
}
|
|
419
|
+
rawWrite() {
|
|
420
|
+
return Promise.reject(new Error('not writable'));
|
|
421
|
+
}
|
|
422
|
+
onLastClose() { }
|
|
423
|
+
}
|
|
424
|
+
/** Adapts a host Node stream (or callback) as the VM's stdin/stdout/stderr. */
|
|
425
|
+
export class HostStream extends OpenFile {
|
|
426
|
+
onWrite;
|
|
427
|
+
iterator;
|
|
428
|
+
constructor(channel, listeners, opts) {
|
|
429
|
+
super(channel, opts.input !== undefined, opts.write !== undefined, listeners);
|
|
430
|
+
this.onWrite = opts.write;
|
|
431
|
+
this.iterator = opts.input?.[Symbol.asyncIterator]();
|
|
432
|
+
this.traceReads = opts.input !== undefined;
|
|
433
|
+
}
|
|
434
|
+
async rawRead() {
|
|
435
|
+
if (!this.iterator)
|
|
436
|
+
return null;
|
|
437
|
+
const r = await this.iterator.next();
|
|
438
|
+
if (r.done)
|
|
439
|
+
return null;
|
|
440
|
+
return toBytes(r.value);
|
|
441
|
+
}
|
|
442
|
+
async rawWrite(chunk) {
|
|
443
|
+
await this.onWrite?.(chunk);
|
|
444
|
+
}
|
|
445
|
+
onLastClose() { }
|
|
446
|
+
}
|
|
447
|
+
// ---------------------------------------------------------------------------
|
|
448
|
+
// Fd tables
|
|
449
|
+
// ---------------------------------------------------------------------------
|
|
450
|
+
/** One shell process's file descriptor table. */
|
|
451
|
+
export class FdTable {
|
|
452
|
+
fds = new Map();
|
|
453
|
+
get(fd) {
|
|
454
|
+
return this.fds.get(fd);
|
|
455
|
+
}
|
|
456
|
+
/** Install `file` at `fd` (taking ownership of one reference), closing what was there. */
|
|
457
|
+
set(fd, file) {
|
|
458
|
+
const old = this.fds.get(fd);
|
|
459
|
+
this.fds.set(fd, file);
|
|
460
|
+
old?.release();
|
|
461
|
+
}
|
|
462
|
+
close(fd) {
|
|
463
|
+
const old = this.fds.get(fd);
|
|
464
|
+
if (old) {
|
|
465
|
+
this.fds.delete(fd);
|
|
466
|
+
old.release();
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/** `n>&m` */
|
|
470
|
+
dup(from, to) {
|
|
471
|
+
const f = this.fds.get(from);
|
|
472
|
+
if (!f)
|
|
473
|
+
return false;
|
|
474
|
+
if (from === to)
|
|
475
|
+
return true;
|
|
476
|
+
this.set(to, f.retain());
|
|
477
|
+
return true;
|
|
478
|
+
}
|
|
479
|
+
/** A copy sharing every open file (each gains a reference). */
|
|
480
|
+
clone() {
|
|
481
|
+
const t = new FdTable();
|
|
482
|
+
for (const [fd, f] of this.fds)
|
|
483
|
+
t.fds.set(fd, f.retain());
|
|
484
|
+
return t;
|
|
485
|
+
}
|
|
486
|
+
closeAll() {
|
|
487
|
+
for (const f of this.fds.values())
|
|
488
|
+
f.release();
|
|
489
|
+
this.fds.clear();
|
|
490
|
+
}
|
|
491
|
+
entries() {
|
|
492
|
+
return [...this.fds.entries()];
|
|
493
|
+
}
|
|
494
|
+
/** Lowest free fd ≥ `min` (for `{var}>file`, bash starts at 10). */
|
|
495
|
+
freeFd(min = 10) {
|
|
496
|
+
let n = min;
|
|
497
|
+
while (this.fds.has(n))
|
|
498
|
+
n++;
|
|
499
|
+
return n;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../../src/vm/io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell pattern matching (`case`, `[[ == ]]`, `${x#pat}`, pathname globs).
|
|
3
|
+
*
|
|
4
|
+
* Patterns are strings in which quoted characters have been backslash-escaped
|
|
5
|
+
* (see `quotePattern`), so `"*"` from a quoted word matches a literal star.
|
|
6
|
+
*/
|
|
7
|
+
/** Escape pattern metacharacters so `s` matches literally. */
|
|
8
|
+
export declare function quotePattern(s: string): string;
|
|
9
|
+
/** True if the pattern contains an unescaped `*`, `?` or `[`. */
|
|
10
|
+
export declare function hasGlobChars(pat: string): boolean;
|
|
11
|
+
/** Remove pattern escapes: the literal string a glob-free pattern denotes. */
|
|
12
|
+
export declare function unescapePattern(pat: string): string;
|
|
13
|
+
export interface PatternOptions {
|
|
14
|
+
/** Pathname matching: `*` and `?` do not match `/`. */
|
|
15
|
+
pathname?: boolean;
|
|
16
|
+
nocase?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Translate a shell pattern to regex source (unanchored). */
|
|
19
|
+
export declare function patternToRegexSource(pat: string, opts?: PatternOptions): string;
|
|
20
|
+
/** A compiled pattern: a RegExp when possible, else a backtracking matcher with the same `test` API. */
|
|
21
|
+
export declare function patternRegex(pat: string, opts?: PatternOptions): {
|
|
22
|
+
test(s: string): boolean;
|
|
23
|
+
};
|
|
24
|
+
export declare function matchPattern(s: string, pat: string, opts?: PatternOptions): boolean;
|
|
25
|
+
/** `${x#pat}` / `${x##pat}` */
|
|
26
|
+
export declare function removePrefix(s: string, pat: string, longest: boolean): string;
|
|
27
|
+
/** `${x%pat}` / `${x%%pat}` */
|
|
28
|
+
export declare function removeSuffix(s: string, pat: string, longest: boolean): string;
|
|
29
|
+
/** `${x/pat/rep}` and friends. */
|
|
30
|
+
/**
|
|
31
|
+
* `${s/pat/rep}`. `rep` is a string, or a function of the matched text (bash
|
|
32
|
+
* 5.2 `patsub_replacement`: an unquoted `&` in the replacement is the match).
|
|
33
|
+
*/
|
|
34
|
+
export declare function replacePattern(s: string, pat: string, rep: string | ((match: string) => string), mode: 'first' | 'all' | 'prefix' | 'suffix'): string;
|
|
35
|
+
export interface GlobOptions {
|
|
36
|
+
cwd: string;
|
|
37
|
+
dotglob?: boolean;
|
|
38
|
+
globstar?: boolean;
|
|
39
|
+
nocase?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Expand a pathname pattern against the filesystem. Returns matches sorted
|
|
43
|
+
* (C locale), or an empty array when nothing matches.
|
|
44
|
+
*/
|
|
45
|
+
export declare function globPaths(pattern: string, opts: GlobOptions): string[];
|
|
46
|
+
//# sourceMappingURL=pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../../src/vm/pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYjD;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAMD,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CAsFnF;AAqID,wGAAwG;AACxG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG;IAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAMjG;AAaD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAEvF;AAED,+BAA+B;AAC/B,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAQ7E;AAED,+BAA+B;AAC/B,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAQ7E;AAED,kCAAkC;AAClC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAgCrJ;AAMD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAgDD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CA2DtE"}
|