Nocter v0.54.0 Release Notes
Nocter v0.54.0 makes long-running HTTP/1.1 services practical with bounded streaming bodies, transport backpressure, sequential persistent connections, and explicit graceful shutdown. The service lifecycle keeps one framing authority and one uniquely owned connection through every request and response state.
One Incremental Body Model
Client responses and incoming server requests now use the same private body cursor. It owns the selected decoder, pending input, transport scratch storage, completion, failure, and bytes read beyond the current message. Server handlers receive an IncomingRequest before its body is collected and consume it through ordinary asynchronous Reader and TimedReader contracts.
Finishing an incoming body is a consuming transition. It drains unread content, preserves safe overread, and returns the only Responder; malformed or failed input cannot be converted into response authority. Large bodies therefore remain bounded by fixed transport and application buffers instead of message size.
Streaming Response Writers
ResponseHead is the shared validated response metadata value. Beginning a response freezes one fixed-length or chunked plan before output starts. ResponseWriter then implements ordinary and timed writer contracts with transport backpressure and rejects overflow, premature completion, forbidden payload statuses, reserved framing fields, and excessive chunked output.
The complete owned-body response API remains available as a convenience, but it now drives the same planner and writer transitions. There is no second complete-response encoder or framing decision.
Sequential Persistent Connections
HTTP/1.1 persistence is selected once from validated request fields and explicit response policy. Finishing a response returns ServerConnection?: presence transfers the exact stream, retained input, and scratch allocation for another sequential request; absence records successful terminal closure. Failure never publishes a reusable connection.
A peer may send later request bytes early, but the server does not parse or execute them until the previous response has completed. Applications can force terminal policy through Responder.close_after_response without maintaining a second reuse flag.
Graceful Structured Services
Closing a Server stops listener admission without invalidating accepted connection owners. Applications retain handler computations in TaskGroup, then drain that group under one explicit deadline. Successful shutdown observes every outcome; deadline cancellation structurally destroys the remaining children and the unique request, responder, writer, or connection state each owns.
The http-service example sends a 32 KiB request and a later request in one transport write. The handler reads and writes through 1 KiB buffers, emits a 32 KiB chunked response, reuses the returned connection for the retained request, forces closure, and also exercises malformed connection framing, idle timeout, bounded admission, and shutdown with active handlers.
Installed Editor Qualification
Release qualification now drives the packaged nocter lsp process through the same interactive protocol shape used by an editor. It verifies initialization, dynamic capability registration, installed standard-library and user-source analysis, hover, completion, declaration and implementation navigation, edited-source diagnostics, diagnostic recovery, and clean shutdown.
Compatibility and Non-goals
Existing complete-body client and server conveniences remain source-compatible. The service still executes requests sequentially per connection and does not add HTTP/2, HTTP/3, protocol upgrade, CONNECT tunnels, WebSocket framing, routing, middleware, automatic serialization, connection pooling, or concurrent pipelined execution. Those features require separate public contracts rather than hidden state inside the HTTP/1.1 lifecycle.
Release Qualification
Release-content commit 95df987f5f775be0faf9a1e49e7e0ac38a599403 passed the complete disposable compiler gate. Two independent optimized builds produced byte-identical archives and recursively identical installed homes. The retained archive is 9,207,843 bytes with SHA-256 e686ac6736aaa0132b37baf869cd9f371d6e600cad987339f918ca78b02ac234 and contains exactly 318 standard-library files. A fresh extraction passed version and installation diagnosis, locked/offline package workflows, native build and execution, every public example, the complete streaming and persistent HTTP service, interactive LSP analysis and edit recovery, immutability checks, and compiler and standard-library tamper rejection. The published release reused this exact retained archive without rebuilding it.