1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use async_channel::{Receiver, Sender};
use tracing::error;
use crate::error::MqttError;
#[derive(Debug, Clone)]
pub struct AvailablePacketIds {
sender: Sender<u16>,
}
impl AvailablePacketIds {
pub fn new(max_inflight: u16) -> (Self, Receiver<u16>) {
let (s, r) = async_channel::bounded(max_inflight as usize);
for pkid in 1..=max_inflight {
s.send_blocking(pkid).unwrap();
}
let apkid = Self { sender: s };
(apkid, r)
}
// pub fn try_mark_available(&self, pkid: u16) -> Result<(), MqttError> {
// match self.sender.try_send(pkid) {
// Ok(_) => {
// Ok(())
// // debug!("Marked packet id as available: {}", pkid);
// }
// Err(err) => {
// error!(
// "Encountered an error while marking an packet id as available. Error: {}",
// err
// );
// Err(MqttError::PacketIdError(err.into_inner()))
// }
// }
// }
pub async fn mark_available(&self, pkid: u16) -> Result<(), MqttError> {
match self.sender.send(pkid).await {
Ok(_) => {
Ok(())
// debug!("Marked packet id as available: {}", pkid);
}
Err(err) => {
error!(
"Encountered an error while marking an packet id as available. Error: {}",
err
);
Err(MqttError::PacketIdError(err.0))
}
}
}
}