feat(websocket): ride alkcall 0.5.0 — OpenableAlpn establisher + timeout (ADR-049 Unit 3)

Mechanical pass for the alkcall 0.5.0 bump (review 006 sequencing:
ADR-049 → alkcall 0.5.0 → alkhttp mechanical pass):

- bump alkcall 0.4 → 0.5 (gateway feature unchanged)
- OpenableAlpn gains establisher: Option<OpenEstablisher> and
  establisher_timeout: Option<Duration> (both default None via
  OpenableAlpn::new — existing constructions compile unchanged) plus
  a with_establisher(establisher, timeout) builder
- the install_channel_zero ferry calls
  register_openable_with_establisher, threading both fields through
- docs updated (websocket.md, adapter.rs doc comments)

The alkcall 0.5.0 open_channel error-type change (ADR-049 §4) needs
no change here — this crate never calls open_channel (from_wss uses
ChannelClient::from_connection only).

Verification: cargo test (454 passed), cargo test --all-features
(587 passed), cargo clippy --all-targets/-D warnings (default +
all-features), cargo fmt --check
This commit is contained in:
glm-5.3-flash committed 2026-09-06 20:04:25 +00:00
1 parent 5f12abf80e
commit 80d6ba0e5a
5 files changed
+73 -21

No files matched your search

+12 -3
View File
@@ -275,9 +275,18 @@ that motivated the alknet WebTransport track) workable over WS: the
SSH byte stream rides a data channel.
The openable set is declared with `HttpAdapter::with_ws_openable_alpns`
(each `OpenableAlpn { spec, open_handler }`; the ALPN-specific handlers
stay in the ALPN crates — alkhttp ferries the registrations), with the
`OpenableAlpns` request-extension fallback for bare-registry/custom
(each `OpenableAlpn { spec, open_handler, establisher,
establisher_timeout }`; the ALPN-specific handlers and establishers
stay in the ALPN crates — alkhttp ferries the registrations). The
establisher (alkcall 0.5.0 / ADR-049) is the awaited establishment
phase of the open op: `None` (the default) keeps the pre-0.5 shape —
the open replies as soon as the pump handler spawns; `Some`
semantically-validating hook dials/prepares the backend before the
reply, and a bounded failure resolves `channel:open_failed` with
`details.reason` (the channel never exists consumer-side). The
per-registration timeout override bounds the establisher when the
dispatch carries no deadline. The `OpenableAlpns` request-extension
fallback is available for bare-registry/custom
upgrade routes. Cap policy is the `ChannelsPolicy` extension (one
instance consulted by both the open wrappers and the demux teardown).
Peer-announced ops (`op/register`) land in the connection-local