pub struct VoiceCallRecord {Show 15 fields
pub source_id: String,
pub account_id: String,
pub direction: VoiceCallDirection,
pub party: String,
pub ring_at: String,
pub answer_at: Option<String>,
pub end_at: String,
pub duration_ms: Option<i64>,
pub disposition: VoiceCallDisposition,
pub end_reason: VoiceCallEndReason,
pub error: Option<String>,
pub share_visibility: Option<ShareVisibility>,
pub transfer_target: Option<String>,
pub codec: Option<VoiceCallCodec>,
pub envelope: SyncEnvelope,
}Expand description
One historical call as it crosses the wire from the daemon up to the platform.
Mirrors the daemon’s local CallRecord (see
wavekat-voice/crates/wavekat-voice/src/db.rs) with one rename:
the daemon’s local primary key (id) is shipped as source_id
because the platform allocates its own row id and treats the
daemon-side UUID as the idempotency key.
Fields§
§source_id: StringDaemon-generated UUID. The platform’s (user_id, source_id)
upsert key — re-syncing the same id is a no-op.
account_id: StringSIP account UUID on the daemon side. Opaque to the platform.
direction: VoiceCallDirection§party: StringSIP From: (inbound) or To: (outbound). Free text — caller
IDs, display names, and SIP URIs all land here.
ring_at: StringRFC 3339. First ring (inbound) or first dial-out (outbound).
answer_at: Option<String>RFC 3339. Present only when the call reached the answered state.
end_at: StringRFC 3339. Terminal timestamp; the platform uses this as the list cursor.
duration_ms: Option<i64>answer_at → end_at in milliseconds. None for calls that
were never answered.
disposition: VoiceCallDisposition§end_reason: VoiceCallEndReason§error: Option<String>Free-text error, populated only when disposition == Failed.
Visibility tier of any active (not revoked / expired) share on this
call’s recording, or None when it isn’t shared. Read-only: the
platform sets it on list (GET /api/voice/calls) and detail responses
so a consumer can badge the row “Public” / “Invited only”; it is
skipped on serialize, so syncing a call never sends it. Private never
appears here — an unshared call is None.
transfer_target: Option<String>Where a transferred call was sent — the number or SIP address the
far end was asked to call (RFC 3515 Refer-To). Set only when
end_reason == TransferredLocal; None for every other call.
Unlike share_visibility this is daemon-owned data, so it is
sent on sync (serialized when present) and echoed back on read.
codec: Option<VoiceCallCodec>The negotiated audio codec, present when the call reached the
audio-flowing state on a daemon new enough to record it; None
for never-answered calls and rows synced by older daemons. Like
transfer_target this is daemon-owned data, so it is sent on
sync (serialized when present) and echoed back on read.
envelope: SyncEnvelopeVersion + forward-compat fields shared by every sync record.
Flattened so schemaVersion and extras sit at the top of
the JSON object alongside the other columns. See
SyncEnvelope and doc 21 §“Versioning and forward
compatibility”.
Trait Implementations§
Source§impl Clone for VoiceCallRecord
impl Clone for VoiceCallRecord
Source§fn clone(&self) -> VoiceCallRecord
fn clone(&self) -> VoiceCallRecord
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more