mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
aquatic_ws: announce handler fixes, related changes elsewhere
This commit is contained in:
parent
7ebbb311e1
commit
a39c7a5950
3 changed files with 55 additions and 8 deletions
|
|
@ -14,7 +14,7 @@ pub struct ValidUntil(pub Instant);
|
|||
|
||||
|
||||
pub struct Peer {
|
||||
pub peer_id: PeerId,
|
||||
pub peer_id: PeerId, // FIXME: maybe this field can be removed
|
||||
pub complete: bool,
|
||||
pub valid_until: ValidUntil,
|
||||
pub connection_meta: ConnectionMeta,
|
||||
|
|
@ -31,6 +31,17 @@ pub struct TorrentData {
|
|||
}
|
||||
|
||||
|
||||
impl Default for TorrentData {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
peers: IndexMap::new(),
|
||||
seeders: 0,
|
||||
leechers: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub type TorrentMap = HashMap<InfoHash, TorrentData>;
|
||||
|
||||
|
||||
|
|
@ -48,6 +59,7 @@ impl Default for State {
|
|||
}
|
||||
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct ConnectionMeta {
|
||||
/// Index of socket worker responsible for this connection. Required for
|
||||
/// sending back response through correct channel to correct worker.
|
||||
|
|
|
|||
|
|
@ -86,9 +86,42 @@ pub fn handle_announce_requests(
|
|||
messages_out: &mut Vec<(ConnectionMeta, OutMessage)>,
|
||||
requests: Drain<(ConnectionMeta, AnnounceRequest)>,
|
||||
){
|
||||
// if offers are set, fetch same number of peers, send offers to all of them
|
||||
// if answer is set, fetch that peer, send answer to it
|
||||
// finally, return announce response, I think
|
||||
for (sender_meta, request) in requests {
|
||||
let torrent_data = torrents.entry(request.info_hash)
|
||||
.or_default();
|
||||
|
||||
if let Some(offers) = request.offers {
|
||||
// if offers are set, fetch same number of peers, send offers to all of them
|
||||
}
|
||||
|
||||
match (request.answer, request.to_peer_id, request.offer_id){
|
||||
(Some(answer), Some(to_peer_id), Some(offer_id)) => {
|
||||
if let Some(to_peer) = torrent_data.peers.get(&to_peer_id){
|
||||
let middleman_answer = MiddlemanAnswerToPeer {
|
||||
peer_id: request.peer_id,
|
||||
info_hash: request.info_hash,
|
||||
answer,
|
||||
offer_id,
|
||||
};
|
||||
|
||||
messages_out.push((
|
||||
to_peer.connection_meta,
|
||||
OutMessage::Answer(middleman_answer)
|
||||
));
|
||||
}
|
||||
},
|
||||
_ => (),
|
||||
}
|
||||
|
||||
let response = OutMessage::AnnounceResponse(AnnounceResponse {
|
||||
info_hash: request.info_hash,
|
||||
complete: torrent_data.seeders,
|
||||
incomplete: torrent_data.leechers,
|
||||
announce_interval: 120,
|
||||
});
|
||||
|
||||
messages_out.push((sender_meta, response));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,19 +3,19 @@ use serde::{Serialize, Deserialize};
|
|||
|
||||
|
||||
/// FIXME: This is really just string with 20 length
|
||||
#[derive(Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[derive(Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct PeerId(pub [u8; 20]);
|
||||
|
||||
|
||||
/// FIXME: This is really just string with 20 length
|
||||
#[derive(Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[derive(Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct InfoHash(pub [u8; 20]);
|
||||
|
||||
|
||||
/// FIXME: This is really just string with 20 length
|
||||
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(transparent)]
|
||||
pub struct OfferId(pub [u8; 20]);
|
||||
|
||||
|
|
@ -107,8 +107,10 @@ pub struct AnnounceRequest {
|
|||
/// I think using Option is good, it seems like this isn't always set
|
||||
/// (same as `offers`)
|
||||
pub answer: Option<JsonValue>,
|
||||
/// Only parsed to hex if answer == true, probably undefined otherwise
|
||||
/// Likely undefined if !(answer == true)
|
||||
pub to_peer_id: Option<PeerId>,
|
||||
/// Sent if answer is set
|
||||
pub offer_id: Option<OfferId>,
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue