Tags: true-async/server
Tags
release: 0.16.0 (#325) * docs(stubs): carry the current API into the IDE stubs The hand-kept mirror lacked Room, RoomDeliveryException and 14 methods (HttpServer rooms, the reliable-send retry settings, tryWriteMessage(), trySseEvent()), and 15 docblocks had fallen behind the stubs since the last full pass at 0.11.0: setHeader(), setStatusCode(), write(), getRuntimeStats() among them. Signatures now match the stubs one for one. readBody() names the HttpException a refused body throws. * release: 0.16.0
release: 0.15.0 (#316) * docs(stubs): carry this release's API into the IDE stubs The mirror is hand-maintained and lagged behind two changes shipping in 0.15.0: hide() documented two of the five pattern shapes it reads, and getBoundListeners() was absent along with what port 0 means for addListener(). * release: 0.15.0
Two fixes, both visible to a handler, and both about an answer the se… …rver gave that was not the one it meant. No breaking change; a build on 0.13.0 upgrades without touching a line. - **`awaitWritable()` waits for the stream window on HTTP/3 (#265).** `h3_stream_ops` declared no `wait_writable`, and `awaitWritable()` answers false for a transport that cannot wait — the answer that keeps a handler from being told "go ahead" and spinning without yielding. It was the wrong answer here: the HTTP/3 stream already owned the wake path, and HTTP/1, HTTP/2 and the reactor-pool worker all park on theirs. A handler was left with a sleep-and-retry loop or a blocking `write()`, and on a pool worker that loop holds the thread carrying the other requests. The wait is bounded by the shorter of the caller's timeout and the connection's write deadline, the rule HTTP/2 already followed. - **An aborted response is labelled by the call that finished it (#267).** One field answered two questions. `abort()` on a stream the transport had put no byte of — `sseStart()` with no event is the ordinary way there — left the response in the state a clean `end()` leaves, because the label was set only where the transport reported a reset. So the second `abort()`, documented as a no-op, threw "the body was already finished cleanly", and a later `write()` named `end()` instead of `abort()`. The natural call site for `abort()` is a `catch` or a `finally`, where a throw replaces the diagnosis the handler is carrying. The label now records which call finished the response; a separate flag records what the peer saw, so the access record and `responses_aborted_total` still count only a body that stopped short. 354 of 374 phpt (20 skipped, 0 failed) and 18 of 18 unit cases, against php-src `true-async` with php-async `main`, PHP 8.6.0-dev ZTS, TrueAsync ABI 0.26.0. Each fix lands with the test that fails without it: `h3/069` reads `room=0` against 0.13.0, and `core/063` gains the third state a started stream can be in and disagrees with 0.13.0 on all three of its new lines.
PreviousNext