Skip to content

Releases: thatsme/phi_accrual_udp

v1.0.0 — stable release

17 May 16:54

Choose a tag to compare

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_id required — non-zero u64. Becomes the default node identity at the receiver, decoupling from ephemeral source port / NAT / container IP.
  • 3-arity :node_resolver with {:reject, reason} contract. Default node identity is now tagged: {:sender_id, id} for v2, {:peer, ip, port} for v1.
  • Parallel per-tick sends in Sender via Task.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 :tick gains :timeouts and :duration.
  • :sample, :rejected telemetry for resolver-rejected packets. :wire_version metadata on :received and :rejected for fleet-migration tracking.
  • IPv6 and interface binding (:inet6, :ip) on both Listener and Sender, with explicit {:ipv6_v6only, true} for cross-platform predictability.
  • child_spec/1 overrides on both modules honor :id / :restart / :shutdown directly 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.