Changes for version 0.11 - 2026-08-06

  • Connection detach, the protocol-upgrade seam: Hyperman::detach($env) hands a live HTTP/1 socket to the application. The server stops watching the fd, forgets the connection and does not close it, so the app's own psgix.loop watchers on that fd fire. The app writes its own upgrade response and returns a discarded sentinel ([101, [], []]). This is what a WebSocket layer needs; before it, a hijacked socket kept racing the server's own read watcher.
  • $env->{'psgix.hyperman.conn'} = [ fd, generation id ] - the ticket detach works from, and the way an app detects that detaching is possible (HTTP/2 streams and other servers do not provide it).
  • Detach is refused, with a specific message, for HTTP/2 and TLS connections, a stale ticket, a response still draining, and a second detach of the same connection.
  • 1xx and 426 responses now carry their real reason phrase: a 101 serialised as "HTTP/1.1 101 OK" before this.

Modules

an event-loop PSGI server
epoll readiness backend for Hyperman::Loop
io_uring backend for Hyperman::Loop
kqueue readiness backend for Hyperman::Loop
portable poll(2) backend for Hyperman::Loop
a fast, native, Future-compatible async result
the per-worker event loop
Plack/PSGI adapter for the Hyperman server