trueno/brick/patterns/
stream_capacity.rs1#![allow(missing_docs)]
2#[derive(Debug, Clone)]
8pub struct StreamCapacity {
9 connection_send: i32,
11 stream_send: i32,
13 receive_window: i32,
15 initial_window: i32,
17 is_blocked: bool,
19}
20
21impl StreamCapacity {
22 pub const DEFAULT_WINDOW: i32 = 65535;
24
25 pub fn new() -> Self {
27 Self {
28 connection_send: Self::DEFAULT_WINDOW,
29 stream_send: Self::DEFAULT_WINDOW,
30 receive_window: Self::DEFAULT_WINDOW,
31 initial_window: Self::DEFAULT_WINDOW,
32 is_blocked: false,
33 }
34 }
35
36 pub fn with_initial_window(initial: i32) -> Self {
38 Self {
39 connection_send: initial,
40 stream_send: initial,
41 receive_window: initial,
42 initial_window: initial,
43 is_blocked: false,
44 }
45 }
46
47 pub fn reserve_send(&mut self, bytes: i32) -> Result<(), FlowControlError> {
49 if bytes < 0 {
50 return Err(FlowControlError::NegativeReservation);
51 }
52
53 let available = self.available_send();
54 if bytes > available {
55 self.is_blocked = true;
56 return Err(FlowControlError::InsufficientCapacity { requested: bytes, available });
57 }
58
59 self.stream_send -= bytes;
60 self.connection_send -= bytes;
61 self.is_blocked = false;
62 Ok(())
63 }
64
65 pub fn release_send(&mut self, bytes: i32) {
67 self.stream_send += bytes;
68 self.connection_send += bytes;
69 if self.available_send() > 0 {
70 self.is_blocked = false;
71 }
72 }
73
74 pub fn consume_receive(&mut self, bytes: i32) {
76 self.receive_window -= bytes;
77 }
78
79 pub fn replenish_receive(&mut self, bytes: i32) {
81 self.receive_window += bytes;
82 }
83
84 #[must_use]
86 pub fn available_send(&self) -> i32 {
87 self.stream_send.min(self.connection_send).max(0)
88 }
89
90 #[must_use]
92 pub fn available_receive(&self) -> i32 {
93 self.receive_window.max(0)
94 }
95
96 #[must_use]
98 pub fn is_blocked(&self) -> bool {
99 self.is_blocked
100 }
101
102 #[must_use]
104 pub fn needs_window_update(&self) -> bool {
105 self.receive_window < self.initial_window / 2
106 }
107}
108
109impl Default for StreamCapacity {
110 fn default() -> Self {
111 Self::new()
112 }
113}
114
115#[derive(Debug, Clone, PartialEq, Eq)]
117pub enum FlowControlError {
118 NegativeReservation,
120 InsufficientCapacity { requested: i32, available: i32 },
122}