Skip to main content

transport_local/
session.rs

1use std::collections::VecDeque;
2
3use core_types::{ErrorCode, ErrorDomain, RtError, SessionId};
4use data_model::Packet;
5use transport_core::{SendReceipt, TransportSession};
6
7pub struct LocalSession {
8    session_id: SessionId,
9    sequence: u64,
10    inbox: VecDeque<Packet>,
11    closed: bool,
12}
13
14impl LocalSession {
15    pub fn new(session_id: SessionId) -> Self {
16        Self {
17            session_id,
18            sequence: 0,
19            inbox: VecDeque::new(),
20            closed: false,
21        }
22    }
23}
24
25impl TransportSession for LocalSession {
26    fn session_id(&self) -> SessionId {
27        self.session_id
28    }
29
30    fn send(&mut self, packet: Packet) -> Result<SendReceipt, RtError> {
31        if self.closed {
32            return Err(RtError::new(
33                ErrorCode::Disconnected,
34                ErrorDomain::Transport,
35                true,
36                "local session is closed",
37            ));
38        }
39        self.sequence += 1;
40        self.inbox.push_back(packet);
41        Ok(SendReceipt {
42            session_id: self.session_id,
43            sequence: self.sequence,
44            accepted: true,
45            duplicate: false,
46            retry_count: 0,
47            acked_sequence: None,
48        })
49    }
50
51    fn recv(&mut self) -> Result<Option<Packet>, RtError> {
52        if self.closed {
53            return Ok(None);
54        }
55        Ok(self.inbox.pop_front())
56    }
57
58    fn tick_retransmit(
59        &mut self,
60        _now: core_types::Timestamp,
61        _timeout: core_types::RtDuration,
62    ) -> Result<usize, RtError> {
63        Ok(0)
64    }
65
66    fn close(&mut self) -> Result<(), RtError> {
67        self.closed = true;
68        Ok(())
69    }
70}