`flutter build web --wasm` had been broken since the tree-sitter/PTY dart:ffi pivot. Per D-100 (resolving Q-50: keep the web "happy accident" alive), every native binding now sits behind a `dart.library.ffi` conditional import with a graceful web stub. Desktop builds are unchanged — no fidelity loss; the web target degrades (no terminal, native git, or syntax highlighting). Discriminator is `dart.library.ffi`, not `dart.library.io` — dart2wasm provides dart:io, so FFI is the only blocker. Fences: - PTY: pty_session → pty_backend_io / pty_backend_web (stub throws). - tree-sitter: pure types → syntax_result.dart; tree_sitter_service is now a facade over _ffi/_stub; tree_sitter_boot_io/stub fences TreeSitterLib.init(). - watchdog: watchdog_windows_stub (all -1 sampler). - claude ABI probe: native_abi_io/stub (was `dart:ffi show Abi`). - testmode fd-check: fd_check_io/stub. Also dart2js-safe: the 64-bit FNV literals in session_naming.dart + paths.dart (the dual JS fallback rejected them) — split into 32-bit halves, dropped a no-op 64-bit mask. Desktop/wasm hash values unchanged. CI: added a `web-wasm` job (flutter build web --wasm) so the fence can't rot. Two FFI-constructing tree-sitter tests import _ffi.dart directly (the analyzer resolves the conditional facade to the stub branch). Verified: `flutter build web --wasm` → built; `flutter analyze` clean; `make test` green. Full Playwright e2e harness wiring is the tracked follow-on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 lines
1.1 KiB
Dart
30 lines
1.1 KiB
Dart
/// FFI fd-inheritance probe for the testmode harness (T-438 web fence, D-100).
|
|
///
|
|
/// Desktop-only — [test_app.dart] selects [fd_check_stub.dart] on web so the
|
|
/// `dart:ffi` / `package:ffi` / libc imports stay out of the wasm graph.
|
|
library;
|
|
|
|
import 'dart:convert';
|
|
import 'dart:ffi' as ffi;
|
|
import 'dart:io';
|
|
|
|
import 'package:ffi/ffi.dart' as pkg_ffi;
|
|
|
|
import 'src/pty/ffi/libc.dart' as libc;
|
|
|
|
/// Probe whether `Process.start` inherits socket fds (the macOS question the
|
|
/// testmode harness answers). Returns a human-readable result line.
|
|
Future<String> fdInheritanceCheck() async {
|
|
final sv = pkg_ffi.calloc<ffi.Int32>(2);
|
|
libc.socketpair(1, 1, 0, sv); // AF_UNIX, SOCK_STREAM
|
|
final parent = sv[0];
|
|
final child = sv[1];
|
|
pkg_ffi.calloc.free(sv);
|
|
final proc = await Process.start('/tmp/checkfd', [], environment: {...Platform.environment, 'PTYC_SOCK_FD': '$child'});
|
|
final stderr = await proc.stderr.transform(utf8.decoder).join();
|
|
final exit = await proc.exitCode;
|
|
libc.close(parent);
|
|
libc.close(child);
|
|
return 'exit=$exit stderr=${stderr.trim()}';
|
|
}
|