PingKit 0.3.0
New
Receive ordering guarantee
Socket receive callbacks now flow through a single AsyncStream pipeline consumed by one task, so replies reach Pinger/Tracer in socket delivery order. Previously each datagram was dispatched in its own unstructured Task, which could reorder bursts of replies before they reached the actor. A 100-reply burst regression test covers the new behavior.
Breaking (0.x)
- Public API narrowed:
PingSocket,MonotonicTimestamp,Pinger.SocketFactory, andPinger.HostResolverare now internal. They existed only for internal test injection; a redesigned, stable socket-injection API is a 0.4 candidate driven by real-world demand (see PLAN.md §6.3). PingError.responsesAlreadyConsumedrenamed tosequenceAlreadyConsumed: the single-consumer error now applies uniformly toPinger.responsesandTracer.hops, with a message that no longer wrongly refers toPingerwhen thrown byTracer.
CI
The Linux matrix now also verifies Swift 6.0, keeping the declared minimum toolchain continuously tested alongside 6.1.
Known limitations
Unchanged from 0.2.0: on Linux, ICMP errors go to the socket error queue (MSG_ERRQUEUE), which PingKit doesn't read yet — traceroute intermediate hops show as timeouts there.
🤖 Generated with Claude Code