Skip to main content

fips_core/endpoint/
service_receiver.rs

1use super::*;
2
3impl FipsEndpointServiceReceiver {
4    /// Receive one datagram for this service, then drain ready follow-ons.
5    pub async fn recv_batch_into(
6        &self,
7        datagrams: &mut Vec<FipsEndpointServiceDatagram>,
8        max: usize,
9    ) -> Option<usize> {
10        let max = max.clamp(1, ENDPOINT_RECV_BATCH_MAX);
11        datagrams.clear();
12
13        let mut state = self.state.lock().await;
14        state.drain_pending_into(datagrams, max);
15        while datagrams.len() < max {
16            let event = if datagrams.is_empty() {
17                state.rx.recv().await?
18            } else {
19                match state.rx.try_recv() {
20                    Ok(event) => event,
21                    Err(_) => break,
22                }
23            };
24            state.push_event_into(event, datagrams, max);
25        }
26        Some(datagrams.len())
27    }
28}