Nocter v0.42.0 Release Notes
Nocter v0.42.0 completes an asynchronous HTTP/1.1 client for structured single-threaded programs. Applications can construct and send an owned request, await the final response without blocking the executor, consume its decoded body incrementally or completely, and rely on deterministic timeout, cancellation, and connection cleanup. The only implemented host and native target remains arm64-darwin.
Asynchronous HTTP Requests
Client.send_async returns (async Response!)!. Request validation, encoding, and synchronous host resolution finish before the outer result succeeds. The resulting lazy computation connects, transmits the complete request, and receives the final response head through asynchronous TCP:
let pending = client.send_async(move request)?
var response = await move pending?
This split keeps blocking name resolution outside executor polling and distinguishes immediate request failure from deferred network failure. Destroying an unstarted or suspended computation cancels its owned connector or stream through the ordinary async lifecycle.
One Protocol and Response Authority
Synchronous and asynchronous clients share request normalization, generated-field policy, informational-response handling, status-101 rejection, HTTP syntax, body framing, limits, and decoded cursor progression. Their adapters differ only in whether transport progress blocks or suspends.
One Response uniquely owns its connection, final head, decoder, pending input, cursor, and terminal state. Synchronous and asynchronous reads advance that same cursor. Completion, explicit close, failure, or destruction releases the connection exactly once.
Practical Request and Body APIs
Request.get, Request.head, and Request.post derive from the general validated constructor. Applications can append textual headers and copy a UTF-8 body without constructing intermediate wire values or relying on inferred content metadata.
Response.read_async supports bounded incremental input. Complete collectors return owned Vec<u8> or validated String values. A cancelled collector discards only its independently owned prefix; the response remains at its one advanced cursor and is never rewound.
Timeouts and Cancellation
send_async_with_timeout applies one connection deadline and the selected duration to each request write and response-head input wait. Response-read timeout operations apply a fresh idle timeout whenever more transport input is needed. These are operation and idle timeouts, not a hidden whole-response deadline.
HTTP adds no timer, reactor, scheduler, or descriptor-registration state. It delegates readiness, deadline races, and cancellation to async TCP and the structured-computation runtime.
Example and Editor Support
The async-http example joins an asynchronous client with a repository-owned loopback peer, transmits a complete request, selects the final response after an informational head, and collects a fragmented UTF-8 body with an idle timeout. It requires no external Internet service.
Hover, completion, signature help, definition, references, rename, semantic tokens, and inlay hints consume the same checked HTTP and async declarations used by compilation, including the nested (async Response!)! result.
Compatibility and Non-goals
v0.42.0 does not add TLS or HTTPS transport, redirects, retries, request replay, decompression, connection pooling, asynchronous DNS, HTTP/2, HTTP/3, WebSocket, an HTTP server, detached tasks, multiple executor threads, or another native target.
Release Qualification
Release-content commit a2b6156bc1db715804218cbab3a0f68a3a6aad72 passed two independent complete compiler gates, the explicit public-HTTPS dependency-acquisition test, and two independent optimized package builds. The resulting archives and installed homes were identical. Fresh extraction passed the installed CLI, compilation of every public example, selected exact process contracts, native execution, framed LSP analysis, installed-home immutability, and compiler and standard-library tamper rejection. Both complete compiler gates independently executed every registered public example and its process contract.
The nocter-v0.42.0-arm64-darwin.tar.gz release is the exact retained qualified archive. It is 8,828,166 bytes with SHA-256 7968b14b7171cc35ceed716480556200114409e9b98c0d5aff3e6090ae155c42; publication did not rebuild it.