3 pub async fn new<S: UdpSender, R: UdpReceiver>(
8 ) -> io::Result<(RudpSender<S>, RudpReceiver<S>)> {
9 let (pkt_tx, pkt_rx) = mpsc::unbounded_channel();
10 let (close_tx, close_rx) = watch::channel(false);
12 let share = Arc::new(RudpShare {
14 remote_id: RwLock::new(remote_id),
25 tasks: Mutex::new(JoinSet::new()),
28 let mut tasks = share.tasks.lock().await;
30 let recv_share = Arc::clone(&share);
31 let recv_close = close_rx.clone();
36 let worker = recv::RecvWorker::new(udp_rx, recv_share, recv_close, pkt_tx);
40 let resend_share = Arc::clone(&share);
41 let mut resend_close = close_rx.clone();
46 ticker!(Duration::from_millis(500), resend_close, {
47 for chan in resend_share.chans.iter() {
48 for (_, ack) in chan.lock().await.acks.iter() {
49 resend_share.send_raw(&ack.data).await.ok(); // TODO: handle error (?)
55 let ping_share = Arc::clone(&share);
56 let mut ping_close = close_rx.clone();
61 ticker!(Duration::from_secs(PING_TIMEOUT), ping_close, {
68 data: &[CtlType::Ping as u8],
80 share: Arc::clone(&share),
82 RudpReceiver { share, pkt_rx },