TransactionTimer

Enum TransactionTimer 

Source
pub enum TransactionTimer {
    TimerA(TransactionKey, Duration),
    TimerB(TransactionKey),
    TimerC(TransactionKey),
    TimerD(TransactionKey),
    TimerK(TransactionKey),
    TimerG(TransactionKey, Duration),
    TimerCleanup(TransactionKey),
}
Expand description

SIP Transaction Timers

TransactionTimer represents the various timers used in SIP transactions as defined in RFC 3261. These timers ensure reliable message delivery and proper transaction cleanup.

§Timer Types

  • TimerA - Retransmission timer for client transactions (unreliable transport)
  • TimerB - Transaction timeout timer for client transactions
  • TimerD - Wait timer for response retransmissions (client)
  • TimerE - Retransmission timer for non-INVITE server transactions
  • TimerF - Transaction timeout timer for non-INVITE server transactions
  • TimerK - Wait timer for ACK (server INVITE transactions)
  • TimerG - Retransmission timer for INVITE server transactions
  • TimerCleanup - Internal cleanup timer for transaction removal

§Timer Values (RFC 3261)

  • T1 = 500ms (RTT estimate)
  • T2 = 4s (maximum retransmit interval)
  • T4 = 5s (maximum duration a message will remain in the network)

§Timer Calculations

  • Timer A: starts at T1, doubles each retransmission up to T2
  • Timer B: 64*T1 (32 seconds)
  • Timer D: 32 seconds for unreliable, 0 for reliable transports
  • Timer E: starts at T1, doubles up to T2
  • Timer F: 64*T1 (32 seconds)
  • Timer G: starts at T1, doubles up to T2
  • Timer K: T4 for unreliable, 0 for reliable transports

§Examples

use ftth_rsipstack::transaction::{TransactionTimer, key::{TransactionKey, TransactionRole}};
use std::time::Duration;

// Create a mock request to generate a transaction key
let request = rsip::Request {
    method: rsip::Method::Register,
    uri: rsip::Uri::try_from("sip:example.com")?,
    headers: vec![
        rsip::Header::Via("SIP/2.0/UDP example.com:5060;branch=z9hG4bKnashds".into()),
        rsip::Header::CSeq("1 REGISTER".into()),
        rsip::Header::From("Alice <sip:alice@example.com>;tag=1928301774".into()),
        rsip::Header::CallId("a84b4c76e66710@pc33.atlanta.com".into()),
    ].into(),
    version: rsip::Version::V2,
    body: Default::default(),
};
let key = TransactionKey::from_request(&request, TransactionRole::Client)?;

let timer = TransactionTimer::TimerA(key.clone(), Duration::from_millis(500));
match timer {
    TransactionTimer::TimerA(key, duration) => {
        println!("Timer A fired for transaction {}", key);
    },
    TransactionTimer::TimerB(key) => {
        println!("Transaction {} timed out", key);
    },
    _ => {}
}

§Usage

Timers are automatically managed by the transaction layer:

  • Started when entering appropriate states
  • Cancelled when leaving states or receiving responses
  • Fire events that drive state machine transitions
  • Handle retransmissions and timeouts

Variants§

Implementations§

Trait Implementations§

Source§

impl Display for TransactionTimer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more