@ttsc/wasm 0.11.0 → 0.12.1

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 CHANGED
@@ -39,7 +39,11 @@ func main() {
39
39
  }
40
40
  ```
41
41
 
42
- The native sibling `main.go` is recommended so `go run ./cmd/your-wasm` exercises the same host helpers without the browser MemFS bridge — see `packages/wasm/cmd/ttsc-wasm/main.go` in the repo for a reference layout:
42
+ The native sibling `main.go` is recommended when you want `go run ./cmd/your-wasm`
43
+ to smoke-test the same `host.Plugin` dispatchers without the browser MemFS
44
+ bridge. See `packages/wasm/cmd/ttsc-wasm/main.go` and
45
+ `website/compiler/cmd/playground/main.go` in the repo for reference layouts.
46
+ A minimal custom plugin dispatcher looks like this:
43
47
 
44
48
  ```go
45
49
  //go:build !js
@@ -47,13 +51,25 @@ The native sibling `main.go` is recommended so `go run ./cmd/your-wasm` exercise
47
51
  package main
48
52
 
49
53
  import (
54
+ "fmt"
50
55
  "os"
51
56
 
52
57
  "github.com/samchon/ttsc/packages/wasm/host"
58
+ yourplugin "example.com/your/plugin"
53
59
  )
54
60
 
55
61
  func main() {
56
- os.Exit(host.Run(os.Args[1:]))
62
+ plugins := []host.Plugin{yourplugin.New()}
63
+ if len(os.Args) >= 3 {
64
+ name, command := os.Args[1], os.Args[2]
65
+ for _, p := range plugins {
66
+ if p.Name() == name {
67
+ os.Exit(p.Run(command, os.Args[3:]))
68
+ }
69
+ }
70
+ }
71
+ fmt.Fprintln(os.Stderr, "usage: your-wasm <plugin> <command> [args...]")
72
+ os.Exit(2)
57
73
  }
58
74
  ```
59
75
 
@@ -62,9 +78,15 @@ func main() {
62
78
  ```bash
63
79
  GOOS=js GOARCH=wasm go build -trimpath -ldflags "-s -w" \
64
80
  -o public/your.wasm ./cmd/your-wasm
65
- cp node_modules/@ttsc/wasm/dist/wasm_exec.js public/wasm_exec.js
81
+ cp "$(go env GOROOT)/lib/wasm/wasm_exec.js" public/wasm_exec.js
66
82
  ```
67
83
 
84
+ Keep `wasm_exec.js` from the same Go toolchain that built your wasm. The
85
+ prebuilt `dist/ttsc.wasm` and `dist/wasm_exec.js` pair already match each
86
+ other; custom binaries should copy the loader from their own toolchain. Older
87
+ Go installs may keep the loader under `$(go env GOROOT)/misc/wasm/wasm_exec.js`
88
+ instead of `lib/wasm`.
89
+
68
90
  ### Stamping version metadata at link time
69
91
 
70
92
  The `host` package exposes a build-time variable contract you can override via `-ldflags "-X ..."`:
@@ -77,7 +99,7 @@ GOOS=js GOARCH=wasm go build -trimpath \
77
99
 
78
100
  The `version`, `commit`, and `date` variables in `host/host.go` are all overridable. `globalThis[apiName].version()` reads from them.
79
101
 
80
- 4. Boot it from JS (a Web Worker is **required** — Go's `syscall/js` blocks the runtime while the wasm is alive; running on the main thread freezes the page):
102
+ 4. Boot it from JS (a Web Worker is **required** — Go's `syscall/js` blocks the runtime while the wasm is alive; running on the main thread freezes the page). Use a classic Worker or a bundler target that still exposes `importScripts`; `bootTtsc` imports `wasm_exec.js` before starting Go.
81
103
 
82
104
  ```ts
83
105
  import { bootTtsc } from "@ttsc/wasm";
@@ -122,4 +144,4 @@ The tarball intentionally drops the `replace github.com/samchon/ttsc/packages/tt
122
144
  ## Documents
123
145
 
124
146
  - The base wasm (`dist/ttsc.wasm`) is the binary `cmd/ttsc-wasm/main_wasm.go` produces. Look there for a minimal example.
125
- - Plugin authors should also read `docs/wasm-plugin.md` (TBD) for the Go host helper deep-dive.
147
+ - See the [`@ttsc/wasm` guide](https://ttsc.dev/docs/wasm) for the Worker, MemFS, plugin-host, and troubleshooting walkthrough.
package/dist/ttsc.wasm CHANGED
Binary file
package/host/host.go CHANGED
@@ -10,11 +10,10 @@
10
10
  package host
11
11
 
12
12
  import (
13
- "bytes"
14
13
  "fmt"
15
- "io"
16
14
  "os"
17
15
  "runtime"
16
+ "sync/atomic"
18
17
  "syscall/js"
19
18
  "time"
20
19
  )
@@ -278,40 +277,76 @@ func stringProp(obj js.Value, key string) string {
278
277
  return v.String()
279
278
  }
280
279
 
281
- // runWithCapturedIO redirects os.Stdout / os.Stderr through in-memory pipes
282
- // for the duration of `task`. Plugin Run methods write to os.Stdout / os.Stderr
280
+ // runWithCapturedIO redirects os.Stdout / os.Stderr to temp MemFS files for
281
+ // the duration of `task`. Plugin Run methods write to os.Stdout / os.Stderr
283
282
  // the same way the native sidecar binaries do; capturing the output lets the
284
283
  // JS host render it in a console panel without spawning a subprocess.
284
+ //
285
+ // We use MemFS temp files instead of os.Pipe because Go's js/wasm runtime
286
+ // returns `pipe: not implemented on js` for `syscall.Pipe` — pipes are not
287
+ // supported on the wasm target. The temp-file approach works because the
288
+ // MemFS shim implements file open/write/read.
285
289
  func runWithCapturedIO(task func() int) APIResult {
286
290
  prevOut, prevErr := os.Stdout, os.Stderr
287
- rOut, wOut, _ := os.Pipe()
288
- rErr, wErr, _ := os.Pipe()
289
- os.Stdout = wOut
290
- os.Stderr = wErr
291
-
292
- var outBuf, errBuf bytes.Buffer
293
- done := make(chan struct{}, 2)
294
- go func() {
295
- _, _ = io.Copy(&outBuf, rOut)
296
- done <- struct{}{}
297
- }()
298
- go func() {
299
- _, _ = io.Copy(&errBuf, rErr)
300
- done <- struct{}{}
291
+ defer func() {
292
+ os.Stdout = prevOut
293
+ os.Stderr = prevErr
301
294
  }()
302
295
 
296
+ stdoutPath := fmt.Sprintf("/tmp/ttsc-host-capture-%d-%d.stdout", os.Getpid(), captureCounter.Add(1))
297
+ stderrPath := fmt.Sprintf("/tmp/ttsc-host-capture-%d-%d.stderr", os.Getpid(), captureCounter.Add(1))
298
+
299
+ outFile, outErr := os.Create(stdoutPath)
300
+ errFile, errErr := os.Create(stderrPath)
301
+ if outErr != nil || errErr != nil {
302
+ // Fall back to the original streams. Better to lose capture than the
303
+ // call. The MemFS writeSync shim surfaces the failure to the host
304
+ // console so the regression is visible.
305
+ if outErr != nil {
306
+ fmt.Fprintf(prevErr, "host.runWithCapturedIO: stdout temp file failed: %v\n", outErr)
307
+ }
308
+ if errErr != nil {
309
+ fmt.Fprintf(prevErr, "host.runWithCapturedIO: stderr temp file failed: %v\n", errErr)
310
+ }
311
+ if outFile != nil {
312
+ _ = outFile.Close()
313
+ _ = os.Remove(stdoutPath)
314
+ }
315
+ if errFile != nil {
316
+ _ = errFile.Close()
317
+ _ = os.Remove(stderrPath)
318
+ }
319
+ return APIResult{Code: task()}
320
+ }
321
+
322
+ os.Stdout = outFile
323
+ os.Stderr = errFile
324
+
303
325
  code := task()
304
326
 
305
- _ = wOut.Close()
306
- _ = wErr.Close()
307
- <-done
308
- <-done
327
+ // Sync + close BEFORE swapping back, so the plugin's last writes hit the
328
+ // file before we read it.
329
+ _ = outFile.Sync()
330
+ _ = errFile.Sync()
331
+ _ = outFile.Close()
332
+ _ = errFile.Close()
333
+
309
334
  os.Stdout = prevOut
310
335
  os.Stderr = prevErr
311
336
 
337
+ stdoutBytes, _ := os.ReadFile(stdoutPath)
338
+ stderrBytes, _ := os.ReadFile(stderrPath)
339
+ _ = os.Remove(stdoutPath)
340
+ _ = os.Remove(stderrPath)
341
+
312
342
  return APIResult{
313
343
  Code: code,
314
- Stdout: outBuf.String(),
315
- Stderr: errBuf.String(),
344
+ Stdout: string(stdoutBytes),
345
+ Stderr: string(stderrBytes),
316
346
  }
317
347
  }
348
+
349
+ // captureCounter avoids temp-file name collisions when plugin dispatches
350
+ // overlap (multiple goroutines could be in runWithCapturedIO concurrently
351
+ // from independent JS callers).
352
+ var captureCounter atomic.Uint64
@@ -25,6 +25,7 @@ export interface IWasmExecFS {
25
25
  readlink(path: string, callback: (err: NodeJS.ErrnoException | null, link: string) => void): void;
26
26
  truncate(path: string, length: number, callback: (err: NodeJS.ErrnoException | null) => void): void;
27
27
  ftruncate(fd: number, length: number, callback: (err: NodeJS.ErrnoException | null) => void): void;
28
+ pipe2(flags: number, callback: (err: NodeJS.ErrnoException | null, fds: [number, number]) => void): void;
28
29
  }
29
30
  export interface IFileStats {
30
31
  isDirectory(): boolean;
package/lib/src/MemFS.js CHANGED
@@ -75,6 +75,31 @@ export function createMemFS() {
75
75
  // Reserve 1/2 for stdout/stderr writeSync routing.
76
76
  fdTable.set(1, { path: "/dev/stdout", position: 0, isStdout: true });
77
77
  fdTable.set(2, { path: "/dev/stderr", position: 0, isStderr: true });
78
+ const pipes = new Map();
79
+ function drainPipeInto(state, buffer, offset, length) {
80
+ let written = 0;
81
+ while (state.buffers.length > 0 && written < length) {
82
+ const chunk = state.buffers[0];
83
+ const copyLen = Math.min(chunk.byteLength, length - written);
84
+ buffer.set(chunk.subarray(0, copyLen), offset + written);
85
+ written += copyLen;
86
+ if (copyLen >= chunk.byteLength)
87
+ state.buffers.shift();
88
+ else
89
+ state.buffers[0] = chunk.subarray(copyLen);
90
+ }
91
+ return written;
92
+ }
93
+ function flushPipeReaders(state) {
94
+ while (state.pendingReaders.length > 0 &&
95
+ (state.buffers.length > 0 || state.writeClosed)) {
96
+ const reader = state.pendingReaders.shift();
97
+ const n = drainPipeInto(state, reader.buffer, reader.offset, reader.length);
98
+ // Even at EOF (writeClosed && empty buffers) we satisfy with n=0 which
99
+ // signals EOF to the Go-side caller.
100
+ reader.callback(null, n);
101
+ }
102
+ }
78
103
  function ensureParentDirs(p) {
79
104
  const segments = normalize(p).split("/").filter(Boolean);
80
105
  segments.pop();
@@ -183,20 +208,69 @@ export function createMemFS() {
183
208
  O_DIRECTORY: 65536,
184
209
  },
185
210
  writeSync(fd, buf) {
186
- const text = decoder.decode(buf);
187
211
  if (fd === 1) {
188
- stdout.buffer += text;
212
+ stdout.buffer += decoder.decode(buf);
213
+ return buf.length;
189
214
  }
190
- else if (fd === 2) {
215
+ if (fd === 2) {
216
+ const text = decoder.decode(buf);
191
217
  stderr.buffer += text;
218
+ // Surface wasm-side stderr to the host console in real-time so plugin
219
+ // debug prints / Go panics aren't trapped inside the MemFS buffer.
220
+ // Stripped at end of message for cleaner display.
221
+ const line = text.replace(/\n$/, "");
222
+ if (line.length > 0)
223
+ // eslint-disable-next-line no-console
224
+ console.error("[wasm]", line);
225
+ return buf.length;
192
226
  }
193
- else {
194
- stderr.buffer += text;
227
+ // Open-file fds (>= 100): append to the underlying file. This is the
228
+ // path the wasm host's runWithCapturedIO uses to capture plugin
229
+ // stdout/stderr via /tmp/* temp files (os.Pipe is not implemented on
230
+ // js/wasm so we mirror its semantics via files).
231
+ const entry = fdTable.get(fd);
232
+ if (entry) {
233
+ const node = nodes.get(entry.path);
234
+ if (node && node.kind === "file") {
235
+ const incoming = buf.subarray(0);
236
+ const existing = node.data;
237
+ const next = new Uint8Array(existing.byteLength + incoming.byteLength);
238
+ next.set(existing, 0);
239
+ next.set(incoming, existing.byteLength);
240
+ node.data = next;
241
+ node.mtimeMs = Date.now();
242
+ entry.position = next.byteLength;
243
+ return incoming.byteLength;
244
+ }
195
245
  }
246
+ // Unknown fd. Fall back to the stderr buffer so the bytes aren't lost
247
+ // entirely (and surface as a console.error so the regression is
248
+ // visible to whoever's looking).
249
+ stderr.buffer += decoder.decode(buf);
250
+ // eslint-disable-next-line no-console
251
+ console.error("[wasm] writeSync to unknown fd " + fd + " (" + buf.byteLength + " bytes); routed to stderr buffer");
196
252
  return buf.length;
197
253
  },
198
254
  write(fd, buf, offset, length, position, callback) {
199
255
  try {
256
+ // Pipe write: snapshot the data (caller may reuse `buf`) and queue.
257
+ // Synchronously wake any blocked reader so the cooperative wasm
258
+ // scheduler doesn't deadlock waiting for a future fs roundtrip.
259
+ const pipeState = pipes.get(fd);
260
+ if (pipeState) {
261
+ if (fd !== pipeState.writeFd) {
262
+ callback(new MemFSError("EBADF", "write"), 0);
263
+ return;
264
+ }
265
+ if (length > 0) {
266
+ const copy = new Uint8Array(length);
267
+ copy.set(buf.subarray(offset, offset + length));
268
+ pipeState.buffers.push(copy);
269
+ flushPipeReaders(pipeState);
270
+ }
271
+ callback(null, length);
272
+ return;
273
+ }
200
274
  if (position !== null && position !== 0) {
201
275
  callback(new MemFSError("ESPIPE", "write"), 0);
202
276
  return;
@@ -237,6 +311,16 @@ export function createMemFS() {
237
311
  callback(null, fd);
238
312
  },
239
313
  close(fd, callback) {
314
+ const pipeState = pipes.get(fd);
315
+ if (pipeState) {
316
+ if (fd === pipeState.writeFd) {
317
+ pipeState.writeClosed = true;
318
+ flushPipeReaders(pipeState);
319
+ }
320
+ pipes.delete(fd);
321
+ callback(null);
322
+ return;
323
+ }
240
324
  if (!fdTable.has(fd)) {
241
325
  callback(new MemFSError("EBADF", "close"));
242
326
  return;
@@ -246,6 +330,26 @@ export function createMemFS() {
246
330
  callback(null);
247
331
  },
248
332
  read(fd, buffer, offset, length, position, callback) {
333
+ // Pipe read: drain queued chunks; block (defer callback) on empty.
334
+ // Empty + writeClosed → return 0 (EOF). Position is ignored for pipes.
335
+ const pipeState = pipes.get(fd);
336
+ if (pipeState) {
337
+ if (fd !== pipeState.readFd) {
338
+ callback(new MemFSError("EBADF", "read"), 0);
339
+ return;
340
+ }
341
+ if (pipeState.buffers.length > 0) {
342
+ const n = drainPipeInto(pipeState, buffer, offset, length);
343
+ callback(null, n);
344
+ return;
345
+ }
346
+ if (pipeState.writeClosed) {
347
+ callback(null, 0);
348
+ return;
349
+ }
350
+ pipeState.pendingReaders.push({ buffer, offset, length, callback });
351
+ return;
352
+ }
249
353
  const entry = fdTable.get(fd);
250
354
  if (!entry) {
251
355
  callback(new MemFSError("EBADF", "read"), 0);
@@ -293,6 +397,13 @@ export function createMemFS() {
293
397
  this.stat(p, callback);
294
398
  },
295
399
  fstat(fd, callback) {
400
+ // fstat against a pipe end returns a synthetic file-stat. Go's
401
+ // os.Pipe-backed File uses fstat at construction time to populate
402
+ // Stat_t; without this it errors and falls back to invalid fds.
403
+ if (pipes.has(fd)) {
404
+ callback(null, makeStats({ kind: "file", data: new Uint8Array(), mtimeMs: Date.now() }));
405
+ return;
406
+ }
296
407
  const entry = fdTable.get(fd);
297
408
  if (!entry) {
298
409
  callback(new MemFSError("EBADF", "fstat"), undefined);
@@ -365,6 +476,20 @@ export function createMemFS() {
365
476
  ftruncate(_fd, _length, callback) {
366
477
  callback(null);
367
478
  },
479
+ pipe2(_flags, callback) {
480
+ const readFd = nextFd++;
481
+ const writeFd = nextFd++;
482
+ const state = {
483
+ buffers: [],
484
+ pendingReaders: [],
485
+ readFd,
486
+ writeFd,
487
+ writeClosed: false,
488
+ };
489
+ pipes.set(readFd, state);
490
+ pipes.set(writeFd, state);
491
+ callback(null, [readFd, writeFd]);
492
+ },
368
493
  };
369
494
  return {
370
495
  fs,
@@ -1 +1 @@
1
- {"version":3,"file":"MemFS.js","sourceRoot":"","sources":["../../src/MemFS.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MemFS.js","sourceRoot":"","sources":["../../src/MemFS.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttsc/wasm",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
4
4
  "description": "Build in-browser ttsc playgrounds. Compose ttsc + typescript-go with your own plugins via the Go host helper.",
5
5
  "main": "lib/src/index.js",
6
6
  "types": "lib/src/index.d.ts",
@@ -1,34 +1,28 @@
1
1
  // gen_shims:hand-maintained
2
2
  //
3
3
  // Minimal shim of tsgo's internal/lsp package. Hand-written instead of
4
- // generated so the surface stays narrow: ttscserver embeds the tsgo LSP
5
- // server unmodified and intercepts traffic at the byte level, so the only
6
- // types it touches are the opaque Server, its options struct, and the
7
- // Reader/Writer interfaces that ToReader/ToWriter return. The marker on
8
- // the first line tells gen_shims to skip this file.
4
+ // generated so the surface stays narrow for custom in-process host
5
+ // experiments. The shipped ttscserver wraps `tsgo --lsp --stdio` as an
6
+ // external process and does not import this package. The marker on the
7
+ // first line tells gen_shims to skip this file.
9
8
  package lsp
10
9
 
11
10
  import (
12
- "io"
13
- _ "unsafe"
11
+ "io"
12
+ _ "unsafe"
14
13
 
15
- innerlsp "github.com/microsoft/typescript-go/internal/lsp"
14
+ innerlsp "github.com/microsoft/typescript-go/internal/lsp"
16
15
  )
17
16
 
18
- // Server is the opaque LSP server type from tsgo. ttscserver does not poke
19
- // its internals; it only calls Run and (via wrapped Writer) observes the
20
- // traffic the server emits.
17
+ // Server is the opaque LSP server type from tsgo.
21
18
  type Server = innerlsp.Server
22
19
 
23
20
  // ServerOptions mirrors the upstream construction parameters. Fields with
24
- // internal-package types (e.g. ParseCache *project.ParseCache) are left
25
- // unset by ttscserver, which is safe because every such field is an
26
- // optional pointer the upstream constructor accepts as nil.
21
+ // internal-package types (e.g. ParseCache *project.ParseCache) can be left
22
+ // unset by callers when upstream accepts nil.
27
23
  type ServerOptions = innerlsp.ServerOptions
28
24
 
29
- // Reader / Writer carry framed lsproto.Message values. ttscserver feeds
30
- // the server through io.Pipe shims of these so it can splice its own
31
- // JSON-RPC traffic into the same stream the editor speaks.
25
+ // Reader / Writer carry framed lsproto.Message values.
32
26
  type Reader = innerlsp.Reader
33
27
  type Writer = innerlsp.Writer
34
28
 
package/src/MemFS.ts CHANGED
@@ -139,6 +139,17 @@ export interface IWasmExecFS {
139
139
  length: number,
140
140
  callback: (err: NodeJS.ErrnoException | null) => void,
141
141
  ): void;
142
+ // pipe2 is what Go's wasm `os.Pipe()` calls. Returns two fds: a read end
143
+ // and a write end. Used by the playground's host.runWithCapturedIO to
144
+ // capture plugin stdout/stderr; without it the plugin's typia transform
145
+ // output (multi-hundred-KB JSON) silently vanishes and Execute fails.
146
+ pipe2(
147
+ flags: number,
148
+ callback: (
149
+ err: NodeJS.ErrnoException | null,
150
+ fds: [number, number],
151
+ ) => void,
152
+ ): void;
142
153
  }
143
154
 
144
155
  export interface IFileStats {
@@ -242,6 +253,55 @@ export function createMemFS(): IMemFSHost {
242
253
  fdTable.set(1, { path: "/dev/stdout", position: 0, isStdout: true });
243
254
  fdTable.set(2, { path: "/dev/stderr", position: 0, isStderr: true });
244
255
 
256
+ // Pipe state. fs.pipe2 mints a pair of fds backed by a shared queue;
257
+ // writes append, reads consume. The state is keyed by fd so a single Map
258
+ // lookup in read/write/close can detect "this is a pipe end" without
259
+ // changing the existing fdTable entries.
260
+ interface IPipeState {
261
+ buffers: Uint8Array[];
262
+ pendingReaders: Array<{
263
+ buffer: Uint8Array;
264
+ offset: number;
265
+ length: number;
266
+ callback: (err: NodeJS.ErrnoException | null, n: number) => void;
267
+ }>;
268
+ readFd: number;
269
+ writeFd: number;
270
+ writeClosed: boolean;
271
+ }
272
+ const pipes = new Map<number, IPipeState>();
273
+
274
+ function drainPipeInto(
275
+ state: IPipeState,
276
+ buffer: Uint8Array,
277
+ offset: number,
278
+ length: number,
279
+ ): number {
280
+ let written = 0;
281
+ while (state.buffers.length > 0 && written < length) {
282
+ const chunk = state.buffers[0]!;
283
+ const copyLen = Math.min(chunk.byteLength, length - written);
284
+ buffer.set(chunk.subarray(0, copyLen), offset + written);
285
+ written += copyLen;
286
+ if (copyLen >= chunk.byteLength) state.buffers.shift();
287
+ else state.buffers[0] = chunk.subarray(copyLen);
288
+ }
289
+ return written;
290
+ }
291
+
292
+ function flushPipeReaders(state: IPipeState): void {
293
+ while (
294
+ state.pendingReaders.length > 0 &&
295
+ (state.buffers.length > 0 || state.writeClosed)
296
+ ) {
297
+ const reader = state.pendingReaders.shift()!;
298
+ const n = drainPipeInto(state, reader.buffer, reader.offset, reader.length);
299
+ // Even at EOF (writeClosed && empty buffers) we satisfy with n=0 which
300
+ // signals EOF to the Go-side caller.
301
+ reader.callback(null, n);
302
+ }
303
+ }
304
+
245
305
  function ensureParentDirs(p: string): void {
246
306
  const segments = normalize(p).split("/").filter(Boolean);
247
307
  segments.pop();
@@ -354,19 +414,72 @@ export function createMemFS(): IMemFSHost {
354
414
  },
355
415
 
356
416
  writeSync(fd, buf) {
357
- const text = decoder.decode(buf);
358
417
  if (fd === 1) {
359
- stdout.buffer += text;
360
- } else if (fd === 2) {
361
- stderr.buffer += text;
362
- } else {
418
+ stdout.buffer += decoder.decode(buf);
419
+ return buf.length;
420
+ }
421
+ if (fd === 2) {
422
+ const text = decoder.decode(buf);
363
423
  stderr.buffer += text;
424
+ // Surface wasm-side stderr to the host console in real-time so plugin
425
+ // debug prints / Go panics aren't trapped inside the MemFS buffer.
426
+ // Stripped at end of message for cleaner display.
427
+ const line = text.replace(/\n$/, "");
428
+ if (line.length > 0)
429
+ // eslint-disable-next-line no-console
430
+ console.error("[wasm]", line);
431
+ return buf.length;
364
432
  }
433
+ // Open-file fds (>= 100): append to the underlying file. This is the
434
+ // path the wasm host's runWithCapturedIO uses to capture plugin
435
+ // stdout/stderr via /tmp/* temp files (os.Pipe is not implemented on
436
+ // js/wasm so we mirror its semantics via files).
437
+ const entry = fdTable.get(fd);
438
+ if (entry) {
439
+ const node = nodes.get(entry.path);
440
+ if (node && node.kind === "file") {
441
+ const incoming = buf.subarray(0);
442
+ const existing = node.data;
443
+ const next = new Uint8Array(existing.byteLength + incoming.byteLength);
444
+ next.set(existing, 0);
445
+ next.set(incoming, existing.byteLength);
446
+ node.data = next;
447
+ node.mtimeMs = Date.now();
448
+ entry.position = next.byteLength;
449
+ return incoming.byteLength;
450
+ }
451
+ }
452
+ // Unknown fd. Fall back to the stderr buffer so the bytes aren't lost
453
+ // entirely (and surface as a console.error so the regression is
454
+ // visible to whoever's looking).
455
+ stderr.buffer += decoder.decode(buf);
456
+ // eslint-disable-next-line no-console
457
+ console.error(
458
+ "[wasm] writeSync to unknown fd " + fd + " (" + buf.byteLength + " bytes); routed to stderr buffer",
459
+ );
365
460
  return buf.length;
366
461
  },
367
462
 
368
463
  write(fd, buf, offset, length, position, callback) {
369
464
  try {
465
+ // Pipe write: snapshot the data (caller may reuse `buf`) and queue.
466
+ // Synchronously wake any blocked reader so the cooperative wasm
467
+ // scheduler doesn't deadlock waiting for a future fs roundtrip.
468
+ const pipeState = pipes.get(fd);
469
+ if (pipeState) {
470
+ if (fd !== pipeState.writeFd) {
471
+ callback(new MemFSError("EBADF", "write"), 0);
472
+ return;
473
+ }
474
+ if (length > 0) {
475
+ const copy = new Uint8Array(length);
476
+ copy.set(buf.subarray(offset, offset + length));
477
+ pipeState.buffers.push(copy);
478
+ flushPipeReaders(pipeState);
479
+ }
480
+ callback(null, length);
481
+ return;
482
+ }
370
483
  if (position !== null && position !== 0) {
371
484
  callback(new MemFSError("ESPIPE", "write"), 0);
372
485
  return;
@@ -408,6 +521,16 @@ export function createMemFS(): IMemFSHost {
408
521
  },
409
522
 
410
523
  close(fd, callback) {
524
+ const pipeState = pipes.get(fd);
525
+ if (pipeState) {
526
+ if (fd === pipeState.writeFd) {
527
+ pipeState.writeClosed = true;
528
+ flushPipeReaders(pipeState);
529
+ }
530
+ pipes.delete(fd);
531
+ callback(null);
532
+ return;
533
+ }
411
534
  if (!fdTable.has(fd)) {
412
535
  callback(new MemFSError("EBADF", "close"));
413
536
  return;
@@ -417,6 +540,26 @@ export function createMemFS(): IMemFSHost {
417
540
  },
418
541
 
419
542
  read(fd, buffer, offset, length, position, callback) {
543
+ // Pipe read: drain queued chunks; block (defer callback) on empty.
544
+ // Empty + writeClosed → return 0 (EOF). Position is ignored for pipes.
545
+ const pipeState = pipes.get(fd);
546
+ if (pipeState) {
547
+ if (fd !== pipeState.readFd) {
548
+ callback(new MemFSError("EBADF", "read"), 0);
549
+ return;
550
+ }
551
+ if (pipeState.buffers.length > 0) {
552
+ const n = drainPipeInto(pipeState, buffer, offset, length);
553
+ callback(null, n);
554
+ return;
555
+ }
556
+ if (pipeState.writeClosed) {
557
+ callback(null, 0);
558
+ return;
559
+ }
560
+ pipeState.pendingReaders.push({ buffer, offset, length, callback });
561
+ return;
562
+ }
420
563
  const entry = fdTable.get(fd);
421
564
  if (!entry) {
422
565
  callback(new MemFSError("EBADF", "read"), 0);
@@ -465,6 +608,16 @@ export function createMemFS(): IMemFSHost {
465
608
  },
466
609
 
467
610
  fstat(fd, callback) {
611
+ // fstat against a pipe end returns a synthetic file-stat. Go's
612
+ // os.Pipe-backed File uses fstat at construction time to populate
613
+ // Stat_t; without this it errors and falls back to invalid fds.
614
+ if (pipes.has(fd)) {
615
+ callback(
616
+ null,
617
+ makeStats({ kind: "file", data: new Uint8Array(), mtimeMs: Date.now() }),
618
+ );
619
+ return;
620
+ }
468
621
  const entry = fdTable.get(fd);
469
622
  if (!entry) {
470
623
  callback(
@@ -547,6 +700,20 @@ export function createMemFS(): IMemFSHost {
547
700
  ftruncate(_fd, _length, callback) {
548
701
  callback(null);
549
702
  },
703
+ pipe2(_flags, callback) {
704
+ const readFd = nextFd++;
705
+ const writeFd = nextFd++;
706
+ const state: IPipeState = {
707
+ buffers: [],
708
+ pendingReaders: [],
709
+ readFd,
710
+ writeFd,
711
+ writeClosed: false,
712
+ };
713
+ pipes.set(readFd, state);
714
+ pipes.set(writeFd, state);
715
+ callback(null, [readFd, writeFd]);
716
+ },
550
717
  };
551
718
 
552
719
  return {