Rejected call flow¶
Signalling - flow-call-rejected
SIG-18 - status: draft - audio, video
Callee-decline flow: acknowledge the <offer>, then emit a single <reject> without entering preaccept, accept, media-keying, relay, or transport.
Composes call-offer, call-ack, and call-reject into a terminal sequence. Per-stanza wire layouts are defined by those parts.
Callee side — on inbound <offer>, to decline, in order:
-
Acknowledge per call-ack: send the generic transport
<ack>keyed to the<call>stanzaid, and the offer<receipt>echoing<offer call-id call-creator/>. Both MUST be sent regardless of the decision to reject. -
Send a
<call>stanza whose single action child is<reject>per call-reject: -
toMUST be the JID the<offer>was received from. call-idandcall-creatorMUST be copied verbatim from the<offer>.<reject>MUST be empty.
MUST NOT on this path:
- MUST NOT send
<preaccept>or<accept>for the samecall-id;<reject>is terminal for that offer from that device. - MUST NOT decrypt or derive media keys from the offer's
<enc>callKey, and MUST NOT perform relay allocation, candidate exchange (<transport>), or relay-latency probing (<relaylatency>). - MUST NOT send
<terminate>for a call that never progressed past the offer.
Caller side. The caller MUST treat a received <reject> for an outstanding
offer as a decline by that device. The <reject> arrives wrapped in an inbound
<call> and is acknowledged by the generic <call> ack only; no offer receipt
is emitted in response to a <reject>.
Multi-device. Each offered device decides independently and MAY emit its own
<reject> carrying the same call-id/call-creator. Cross-device fan-out is
unspecified.
Requires: call-offer, call-ack, call-reject, call-preaccept, call-accept, call-terminate, flow-incoming-1to1
Implemented by
| Flavor | Status | Source | Notes |
|---|---|---|---|
whatsapp-rust |
working | history - blame - commits d68af6c |
listen mode default-rejects: acks the offer, then sends |
zapo-caller |
working | — | reject builder ported from zapo-caller signaling.ts |
Annotation wacrg:SIG-18 — a flavor marks its implementation site in source with this comment; a script clones the source, finds it, and attaches the commit blame/permalink.
Contributors
| Contributor | Role |
|---|---|
| wrote initial spec |
protocol history / diff - blame
Open questions
- Whether the caller emits a terminate or notice to the callee's sibling devices once one device rejects, or whether each device rejects independently with no cross-device fan-out.
- Whether a rejecting device must wait for the offer receipt to be sent before emitting
References - RFC 2119 — Key words for use in RFCs
Changelog¶
- 2026-06-21 — Initial spec entry.