Skip to content

0.5.0

Latest

Choose a tag to compare

@shenjinti shenjinti released this 04 Sep 00:54
· 259 commits to main since this release

What's New

Media & Codecs

  • Zero-copy fast-path relay for all same-codec transport combinations, with transcode fallback (40dd791a);
  • New codecs: Opus and G.729, 48 kHz telephone-event DTMF (cafcec33, 1753ced3, 719de07b);
  • Video SDP negotiation, proxy video re-INVITE, and payload passthrough (5902a71b, e59e70d3, ee15b87e);
  • WebRTC↔RTP SDP bridging and per-leg negotiated media profiles (d7eda01d, b2e0a473).

Queue & Contact Center

  • Escalation plans with skill-group routing; per-call overflow overrides via transfer URI query params (804594df, 9728227e);
  • Supervisor listen/whisper/barge/takeover with cross-session takeover (0ecfca32);
  • 3-way conference RTP bridging and conference room SIP dial-in (debb0539, 2868c09a);
  • RFC 7433 UUI session_id call correlation (c2a4cc10);
  • Queues/IVR/trunks/routes/ACL can now be stored in the database and edited from the console (generated_db).

IVR

  • Unified app orchestration (StartApp) with builtin IVR flows (8d54c211);
  • Step-mode IVR driven by an external HTTP provider — your service becomes the IVR brain (31ce1dc2);
  • Session-level IVR fallback recovery, mid-call recording segments, session artifacts API (717badb6);
  • IVR route points resolved through the call-routing engine (07fccc0f).

Cluster

  • Distributed session registry wired end-to-end; media anchored to the call-owning node (723e29e4, cc53bd8e, cd7feacf);
  • Cluster-aware AMI: active-call query GET /calls, per-session lookup, remote reload status (10de0d06, 660b74c4);
  • Cluster log viewer and subject-scoped event broadcast (fe4ddeb6).

RWI

  • Early-media recording and recording start-point control (early media vs answer) (9ef05682, 69108b98);
  • New commands: session.resume, call.transfer.replace, call.set_var/get_var, call.send_dtmf, dtmf.collect, call.leg_add/leg_remove, app.chain, conference.end/merge;
  • All call-scoped events carry a root call identity block; broadcast events enriched with full call context (f084bde9, 93ccae5f);
  • Originate out a named carrier trunk, with agent attribution for agent-to-customer dials (963397f0, a5c0c1b8).

SipFlow & Recording

  • High-throughput SipFlow: async flush, multi-threaded remote send, MTU batching, SSRC loss reports (403dcd3d, 44d0f07e);
  • Deterministic flush so post-call queries see the tail messages (bc522f81);
  • Unified recording pipeline with signaling opt-out JSONL sidecar (5ce4c500);
  • Call records / CDR JSON / signaling JSONL upload to S3 or HTTP; manual archive with progress tracking (c78256a5, 6a38e55f);
  • Recording waveform visualization and playback controls in the console (d0a0ca2e).

Console

  • Call trace timeline and unified call-error registry with a reference page (3cef29d1, 6fb719e4);
  • Bilingual UI (English/中文) and a notification system (1dbe4a70, 30f8a971);
  • Routing strategy stack view with runtime ordering and PATCH API (c7ca2e0f, 4c8353b2);
  • Built-in web dialer and JsSIP softphone (800ce250, c5c3876c);
  • REST endpoints for extensions (with import), sip-trunks, routing, settings, and diagnostics.

Auth & SSO

  • OAuth2-style SSO login broker for native apps (3e48ac63);
  • JWT fast registration — REGISTER without the 401/407 challenge round-trip (d4fa436c, [proxy.jwt_auth]);
  • HTTP token-based user backends, in-dialog auth caching, AMI CIDR allowlists (fd9e52b5, d1197f72).

Routing & Trunks

  • parallel_fork with max_ring_time; weighted trunk selection (fdd7288b, 8ac66da1);
  • Trunk health checks (OPTIONS probes) and per-trunk external_ip/bind_ip with network profiles (511ae09c, 7254b495, 4c469f81);
  • Original-INVITE custom header passthrough onto callee legs (c448a0f1, b7df087e);
  • Per-trunk CPS and concurrent-call limiters (4fa4f04d).

Transfers & Outbound

  • REFER blind-transfer B2BUA fallback; interactive transfers on resilient media bridges (0ecfca32, 8ce6cd9f);
  • Configurable call forwarding and voicemail transfer targets (9d5bdb46, 7c5627bc);
  • Queue transfers carry business context (UUI/custom headers) so agents inherit context (8cb20a54).

NAT & SIP Core

  • NATed Contact rewriting on inbound INVITE/REGISTER (310c2224);
  • New knobs: sip_external_ip, auto_sip_external_ip, local_networks, [[network_profile]];
  • Standardized SIP error codes across routing with call-trace events (3509757d).

Ops & AMI

  • Graceful drain-then-exit for SIGTERM/SIGINT plus AMI /shutdown (c3bd892a);
  • Hot reload for ACL, trunks, routes, queues, IVR, and TLS certificates (4a83164d, ea1fd22a, 5679cc03);
  • Console diagnostics toolbox: active dialogs, trunk test calls, route evaluator (preview routing decisions before changing routes), extension locator;
  • Health endpoint exposing tokio runtime metrics; /metrics Prometheus text format and /healthz probes.

Performance

  • 5k-CC recording collapse fixed (7c37af8c): recorder queue sizing, dedicated media runtime for recording tasks, SIP workers scaled to cores/2 — from 17.7% packet loss at 3.3k concurrent to 4,943 concurrent recorded calls at 0% loss;
  • SIP signaling and RTP media now run on isolated tokio runtimes (7b82ba88);
  • ~130 hot-path heap allocations removed; RWI memory leak fixed (c72bf042);
  • Memory locator switched from tokio::Mutex to DashMap; faster registration sweeps (49262229, e0345b94);
  • SipFlow ingest/flusher throughput + jemalloc by default (f0429cb0, c841228f);
  • Faster proxy failover: earlier 100 Trying and no-trying timeout (3c005717).

Full benchmarks: tests/bench/bench.md, docs/capacity-planning.md, and the README benchmark section.


Notable Fixes

NAT / Contact

  • Inbound INVITE/REGISTER Contact rewritten so in-dialog ACK/BYE/OPTIONS route correctly behind NAT (310c2224);
  • Contact URI derived from the inbound transaction, fixing WebRTC registrations (f2465792, #251).

re-INVITE / SDP

  • B2BUA re-INVITE relay with refreshed SDP snapshots (03cdfa2e);
  • RTP bridge rebuilt after re-INVITE; codec-change renegotiation handled (dfeee606, 94b01d0e, #183).

DTMF

  • First DTMF and first inbound packets no longer dropped (746ac8cd);
  • Duplicate DTMF events eliminated (5f1e6b49, #158).

CDR

  • Missing ring time and incorrect durations fixed (4967c057);
  • status_code locked to the INVITE final response (58d15aed).

WebRTC

  • Cluster-routed BYE no longer swallowed by .invalid addresses (5075d5d4);
  • One-way audio from unstripped RTP header extensions fixed (a2fd4ff2);
  • Callee WS BYE black hole fixed via client-role dialog flow affinity (fdd624a1).

Registration / Locator

  • Agent lifecycle preserved across registration races (a7cd2cff);
  • Agent presence ownership survives restarts (065d50b0).

Queue / CC

  • Agent logout no longer leaves the CC panel stuck on idle (7f26b911);
  • queue_joined strictly ordered before ACD events (53055bd0).

Media

  • One-way audio on PCMA↔G722 mismatch fixed (963e4d88);
  • G.722 decoding and jitter-buffer fixes (2994b59f);
  • RTP continuity preserved across bridge segments and transfers (335fb933, 840e4b09).

SIP core

  • Orphan BYE now answered with 200 instead of hanging the peer (d927c332, #245);
  • CANCEL tears down immediately with 487 — no 2-second delay (5dc10a70);
  • Session-timer refresher role and missing header fixed (edd81a47).

Memory leaks

  • WebRTC/P2P per-call media leaks (19ff5184, 6b6f2663);
  • RWI originate/transfer dialog guards and REFER NOTIFY listeners (0953126a, fec6c2b8).

Breaking Changes & Upgrade Guide

Recording & SipFlow

  • [sipflow] alone no longer captures RTP. RTP capture now requires an explicit recording config:

    [recording]
    enabled = true
    type = "sipflow"   # signaling-only capture is unchanged
  • callrecord storage now defaults to type = "database" (previously local JSON files in examples). Configure [callrecord] explicitly for local files, S3, or HTTP upload.

  • Recording auto-start point is configurable (early media vs answer).

SIP behavior

  • session_timer now defaults to true (RFC 4028, Supported mode);
  • video_codecs defaults to ["H264", "VP8"]; new video_policy option (pass_through / strip / transcode);
  • New NAT/network controls: sip_external_ip, auto_sip_external_ip, local_networks, [[network_profile]] — review your NAT setup if you relied on implicit defaults.

RWI protocol (the biggest changes)

  • Event rename: call_incoming → call_created;
  • Removed commands: media.stream_start / media.stream_stop / inject_start / inject_stop — use call.transfer to a voip_bridge:/bridge: WebSocket endpoint (binary PCM16 frames) for real-time audio; record.mask_segment removed;
  • Removed events: dn_state_changed / dn_registered / dn_unregistered, call_metadata_updated, ivr_flow_transitioned, queue_overflowed, parallel_originate_*, session_resumed, media_stream_started/stopped, record.segment_masked;
  • record_stopped no longer carries the recording URL — listen for record_end / recording_metadata_available;
  • Renamed event: supervisor.takeover.completed → supervisor.takeover.started;
  • Parameter changes: call.originate (no hold_music/hold_music_target), queue.enqueue (no skills/max_wait_secs), conference.create (no backend/record);
  • Event field changes: ani/dnis/root_call_id/operation_id removed; caller/caller_name/callee_name/trace_id/hangup_by/duration_secs/transfer_target added;
  • Config keys [rwi].enabled and [rwi].contexts removed;
  • [rwi.smart_routing], [rwi.local_rules], [rwi.sip_header_passthrough] are now explicitly documented as design proposals, not implemented — don't rely on them.

Console / HTTP API

  • All console JSON endpoints are unified under the /api prefix behind an auth middleware with a CSRF guard; new static Bearer token auth via [console].api_tokens with scopes;
  • The /licenses list route was removed (/licenses/verify remains);
  • Locator/registration payloads changed: aor is now a full IP:port address, destination carries a transport prefix, and new fields were added (home_proxy, supports_webrtc, transport, user_agent, expires).

Removed components & config

  • Addons removed: endpoint_manager, enterprise_auth, sbc;
  • Config keys removed: [proxy].sip_flow_max_items, media_cache_path;
  • verify-i18n binary removed; new rustpbx dump subcommand exports the DB DDL;
  • The opus Cargo feature was removed — Opus is always available via audio-codec.

Deployment

  • Source builds now require submodules: git clone --recurse-submodules (addons cc, wholesale, ivr_editor, telemetry, voicemail are submodules now);
  • Docker image: base moved to debian:trixie-slim, libopus0 no longer needed, sounds moved to /app/config/sounds (a compat symlink at /app/sounds is kept);
  • New environment variables: DEEPGRAM_API_KEY (remote transcription), CC_PHONE_AUTH_SECRET (phone auth).

Database

  • Migrations run automatically on startup (disable with --skip-migrate); this release adds three: outbound_sip_trunk_id column on call records, config_entries table (DB-backed config), cluster_sessions table (cluster session registry);
  • Stale migration records are pruned and self-healed at startup;
  • Stack upgrades: sqlx 0.8 → 0.9, sea-orm 1.1 → 2.0.

Dependencies

Crate 0.4.6 0.5.0
rsipstack 0.5.12 0.6.7
rustrtc 0.3.66 0.3.132
audio-codec 0.3.38 0.4.5
sea-orm 1.1.20 2.0
sqlx 0.8.6 0.9.0

New Contributors

Thanks to everyone who contributed code, reviews, and bug reports. First-time contributors in this release:

  • @autopeasant
  • @themooer1 (git author: Eugene Wolffe / Cream Crumpets) — Contact URI fixes (#240)
  • @v0l (Kieran) — SDES-SRTP negotiation (#227) and queue-target fix
  • @tgeorge06 (Tyson George) — originate out a named carrier trunk

Continuing from previous releases: @shenjinti (maintainer), @yeoleobun, @dengxiayehu (elliottjiang), @zen2do (liu zhen), @rgon (Gonzalo Ruiz), @zhouhailin, @davidcforbes, @deweydb, @umran — and everyone who filed issues and tested release candidates.


Upgrading

docker pull ghcr.io/restsend/rustpbx:latest
# or from source:
git clone --recurse-submodules https://github.com/restsend/rustpbx.git

Review the Breaking Changes above — in particular the RWI event renames and the recording configuration — then start the new binary; database migrations run automatically.

Full Changelog

0.4.6...0.5.0