Просмотр исходного кода

feat: Add online request from webclient

lejianwen 1 год назад
Родитель
Сommit
e5ac30e2bc
1 измененных файлов с 21 добавлено и 0 удалено
  1. 21 0
      src/rendezvous_server.rs

+ 21 - 0
src/rendezvous_server.rs

@@ -602,6 +602,27 @@ impl RendezvousServer {
602 602
                         }
603 603
                     }
604 604
                 }
605
+                Some(rendezvous_message::Union::OnlineRequest(or)) => {
606
+                    let mut states = BytesMut::zeroed((or.peers.len() + 7) / 8);
607
+                    for (i, peer_id) in or.peers.iter().enumerate() {
608
+                        if let Some(peer) = self.pm.get_in_memory(peer_id).await {
609
+                            let elapsed = peer.read().await.last_reg_time.elapsed().as_millis() as i32;
610
+                            // bytes index from left to right
611
+                            let states_idx = i / 8;
612
+                            let bit_idx = 7 - i % 8;
613
+                            if elapsed < REG_TIMEOUT {
614
+                                states[states_idx] |= 0x01 << bit_idx;
615
+                            }
616
+                        }
617
+                    }
618
+
619
+                    let mut msg_out = RendezvousMessage::new();
620
+                    msg_out.set_online_response(OnlineResponse {
621
+                        states: states.into(),
622
+                        ..Default::default()
623
+                    });
624
+                    Self::send_to_sink(sink, msg_out).await;
625
+                }
605 626
                 _ => {}
606 627
             }
607 628
         }