diff --git a/plans/tcl-sx-completion.md b/plans/tcl-sx-completion.md index d9cf7148..1c1671d9 100644 --- a/plans/tcl-sx-completion.md +++ b/plans/tcl-sx-completion.md @@ -191,6 +191,35 @@ vwait-timing. 354/354 green.** --- +## Phase 5c — TCP sockets (client + server) ✓ + +Tcl `socket` command for both connecting and listening. Reuses the channel +registry built in Phase 5 and the event loop from Phase 5b. Server channels +auto-fire user callbacks via fileevent on each accept. + +| Status | Work | Unlocks in Tcl | +|---|---|---| +| [x] | `socket-connect host port` SX primitive | TCP client via `Unix.socket`+`Unix.connect` | +| [x] | `socket-server ?host? port` SX primitive | listening socket; `Unix.bind`+`Unix.listen` (backlog 8) | +| [x] | `socket-accept server-chan` SX primitive | returns `{:channel :host :port}` | +| [x] | Tcl `socket host port` | TCP client; returns "sockN" | +| [x] | Tcl `socket -server cb port` | listening socket; auto-fires `cb sock host port` per accept | +| [x] | `puts` channel detection extended | "sockN" channels also dispatch to `channel-write` | + +The auto-accept mechanism is a tiny internal Tcl command `_sock-do-accept` +registered by `socket -server`. Its registered handler, fired by the event +loop, accepts the pending client, then evaluates `cb client-chan host port`. + +`Unix.SO_REUSEADDR` is set on server sockets to avoid TIME_WAIT issues +during testing. Host argument supports `localhost`, `0.0.0.0`, IPv4 literal, +or DNS lookup via `Unix.gethostbyname`. + +**Total: ~half day. 4 new idiom tests: socket-server-fires-callback, +socket-client-server-roundtrip, socket-server-peer-host, socket-multiple- +connections. 358/358 green.** + +--- + ## Suggested order 1. **Phase 1** — immediate Tcl wins, zero risk, proves the approach @@ -207,6 +236,7 @@ becomes a lasting SX contribution used by every future hosted language. _Newest first._ +- 2026-05-07: Phase 5c sockets — socket-connect/socket-server/socket-accept SX primitives wrapping Unix.socket/connect/bind/listen/accept; tcl-cmd-socket dispatches client (host port) vs server (-server cb port); server auto-registers fileevent → _sock-do-accept handler that calls user callback per accept; puts now dispatches "sockN" channels to channel-write too; +4 idiom tests; 358/358 green - 2026-05-07: Phase 5b event loop — io-select-channels SX primitive + Tcl-side fileevent/after/vwait/update; tcl-event-step drives expired timers + Unix.select on registered channels; +5 idiom tests; 354/354 green - 2026-05-07: Phase 5 channel I/O — 11 SX primitives (channel-open/close/read/read-line/write/flush/seek/tell/eof?/blocking?/set-blocking!) wrapping Unix.openfile/read/write/lseek/set_nonblock; tcl-cmd-open/close/read/gets-chan/seek/tell/flush rewritten + new tcl-cmd-fconfigure; tcl-cmd-puts dispatches on "fileN" arg; gets registration fixed; +7 idiom tests; 349/349 green - 2026-05-06: Phase 4 env-as-value — current-env (special form via Sx_ref.register_special_form), eval-in-env (primitive in setup_evaluator_bridge), env-lookup + env-extend (in setup_env_operations); 5 idiom tests; 342/342 green