Releases: thatsme/phi_accrual_udp
Releases · thatsme/phi_accrual_udp
v1.0.0 — stable release
Upgrade receivers before senders. 0.1.x receivers reject the new wire format with :unsupported_version. See UPGRADING.md for the full migration playbook.
This is the 1.0 consolidation release — public API, wire format, telemetry schema, and default node-term shape are the committed 1.0 contract under the Versioning policy.
Highlights
- Wire format v2 (20 bytes) with operator-supplied
:sender_id; v1 (12 bytes) dual-decoded throughout 1.x for graceful migration, removed in 2.0. Sender:sender_idrequired — non-zerou64. Becomes the default node identity at the receiver, decoupling from ephemeral source port / NAT / container IP.- 3-arity
:node_resolverwith{:reject, reason}contract. Default node identity is now tagged:{:sender_id, id}for v2,{:peer, ip, port}for v1. - Parallel per-tick sends in
SenderviaTask.async_stream/3. New options:max_send_concurrency(default 64) and:send_timeout_ms. - Three split per-target telemetry events:
[:sender, :send, :ok | :error | :timeout]. Aggregate:tickgains:timeoutsand:duration. :sample, :rejectedtelemetry for resolver-rejected packets.:wire_versionmetadata on:receivedand:rejectedfor fleet-migration tracking.- IPv6 and interface binding (
:inet6,:ip) on bothListenerandSender, with explicit{:ipv6_v6only, true}for cross-platform predictability. child_spec/1overrides on both modules honor:id/:restart/:shutdowndirectly in the keyword list.- CI matrix: three Ubuntu jobs (Elixir 1.15+1.19 across OTP 26+28) plus a macOS canary for BSD socket coverage. Strict dialyzer + credo on every job.
See CHANGELOG.md for the complete change list.