@ttsc/wasm 0.11.0-dev.20260518-2 → 0.12.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 +27 -5
- package/dist/ttsc.wasm +0 -0
- package/host/host.go +59 -24
- package/lib/src/MemFS.d.ts +1 -0
- package/lib/src/MemFS.js +130 -5
- package/lib/src/MemFS.js.map +1 -1
- package/package.json +2 -2
- package/shim-vendor/shim/lsp/shim.go +11 -17
- package/src/MemFS.ts +172 -5
package/README.md
CHANGED
|
@@ -39,7 +39,11 @@ func main() {
|
|
|
39
39
|
}
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
The native sibling `main.go` is recommended
|
|
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
|
-
|
|
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
|
|
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
|
-
-
|
|
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
|
|
282
|
-
//
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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:
|
|
315
|
-
Stderr:
|
|
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
|
package/lib/src/MemFS.d.ts
CHANGED
|
@@ -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 +=
|
|
212
|
+
stdout.buffer += decoder.decode(buf);
|
|
213
|
+
return buf.length;
|
|
189
214
|
}
|
|
190
|
-
|
|
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
|
-
|
|
194
|
-
|
|
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,
|
package/lib/src/MemFS.js.map
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "0.12.0",
|
|
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",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"bugs": {
|
|
36
36
|
"url": "https://github.com/samchon/ttsc/issues"
|
|
37
37
|
},
|
|
38
|
-
"homepage": "https://
|
|
38
|
+
"homepage": "https://ttsc.dev",
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^25.3.0",
|
|
41
41
|
"@typescript/native-preview": "7.0.0-dev.20260515.1",
|
|
@@ -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
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
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
|
-
|
|
13
|
-
|
|
11
|
+
"io"
|
|
12
|
+
_ "unsafe"
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
innerlsp "github.com/microsoft/typescript-go/internal/lsp"
|
|
16
15
|
)
|
|
17
16
|
|
|
18
|
-
// Server is the opaque LSP server type from tsgo.
|
|
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)
|
|
25
|
-
// unset by
|
|
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.
|
|
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 +=
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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 {
|