transport_local/
session.rs1use 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}