Thanks to visit codestin.com
Credit goes to github.com

Skip to content

feat: send 100 Trying + 180 Ringing inbound#51

Merged
wavekat-eason merged 1 commit into
mainfrom
feat/inbound-ringing-provisional
Jul 4, 2026
Merged

feat: send 100 Trying + 180 Ringing inbound#51
wavekat-eason merged 1 commit into
mainfrom
feat/inbound-ringing-provisional

Conversation

@wavekat-eason

Copy link
Copy Markdown
Contributor

Why

An inbound INVITE drew no provisional response: the server INVITE transaction only delivered the request to the TU, and the consumer had no way to alert the caller. Per RFC 3261 §9.1 a caller may not send CANCEL until it has received a provisional — so a peer that hung up before pickup sent nothing at all (the call rang forever on both ends), and callers heard no ringback.

What

  • Auto 100 Trying from the inbound router the moment a fresh INVITE lands (§17.2.1): quenches INVITE retransmits and unblocks the caller's CANCEL.
  • IncomingCall::ring() sends 180 Ringing. It shares a per-call UAS To tag with the eventual 200/reject final (§12.1.1), so the early and confirmed dialogs are the same dialog; accept/reject now reuse that stored tag instead of minting a fresh one each.
  • RFC-COVERAGE.md updated — it previously claimed an automatic 100 that was never actually sent.

Tests

New integration tests in tests/end_to_end_call.rs: the automatic 100, and the 180/200 tag match. Full suite green (229 lib + 10 e2e + doc).

Consumer

wavekat-voice calls ring() on the inbound path (wavekat/wavekat-voice draft PR). Publish a new minor so that consumer can drop its local [patch.crates-io] and pin the release.

🤖 Generated with Claude Code

An inbound INVITE drew no provisional response: the server INVITE
transaction only delivered the request to the TU, and the consumer had no
way to alert. Per RFC 3261 §9.1 a caller may not send CANCEL until it has
received a provisional, so a peer that hung up before pickup sent nothing
at all — the call rang forever — and callers heard no ringback.

- Auto-send `100 Trying` from the inbound router the moment a fresh INVITE
  lands (§17.2.1): quenches INVITE retransmits and unblocks the caller's
  CANCEL.
- Add `IncomingCall::ring()` to send `180 Ringing`. It shares a per-call
  UAS `To` tag with the eventual `200`/reject final (§12.1.1), so the
  early and confirmed dialogs are the same dialog; `accept`/`reject` now
  reuse that stored tag instead of minting a fresh one each.

Integration tests cover the automatic 100 and the 180/200 tag match; the
RFC-COVERAGE table now reflects the real behavior (it previously claimed
an automatic 100 that was never actually sent).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@wavekat-eason wavekat-eason marked this pull request as ready for review July 4, 2026 07:31
@wavekat-eason wavekat-eason merged commit bf05595 into main Jul 4, 2026
1 check passed
@wavekat-eason wavekat-eason deleted the feat/inbound-ringing-provisional branch July 4, 2026 07:33
@github-actions github-actions Bot mentioned this pull request Jul 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant