use tokio::sync::{
broadcast,
mpsc::{Receiver, Sender, channel},
oneshot::Sender as OneShotSender,
};
use crate::{peer_explorer::Peer, wire_protocol::Bitfield};
const CHANNEL_SIZE: usize = 256;
const EVENT_CHANNEL_SIZE: usize = 512;
pub enum PieceManagerMessage {
HasPiece {
piece_index: u32,
response_sender: OneShotSender<bool>,
},
GetBitfield {
response_sender: OneShotSender<BitfieldSnapshot>,
},
IsInteresting {
bitfield: Bitfield,
response_sender: OneShotSender<bool>,
},
ClaimPiece {
bitfield: Bitfield,
peer: Peer,
response_sender: OneShotSender<Option<Claim>>,
},
Release {
piece_index: u32,
peer: Peer,
},
PieceVerified {
piece_index: u32,
peer: Peer,
},
PieceFailed {
piece_index: u32,
peer: Peer,
},
TotalPieces {
response_sender: OneShotSender<u32>,
},
IsCompleted {
response_sender: OneShotSender<bool>,
},
}
#[derive(Clone, Copy, Debug)]
pub enum PieceEvent {
PieceComplete { piece_index: u32 },
}
#[derive(Debug)]
pub struct BitfieldSnapshot {
pub bitfield: Bitfield,
pub events: PieceEventReceiver,
}
pub type PieceEventSender = broadcast::Sender<PieceEvent>;
pub type PieceEventReceiver = broadcast::Receiver<PieceEvent>;
pub fn new_piece_event_channel() -> PieceEventSender {
broadcast::channel(EVENT_CHANNEL_SIZE).0
}
#[derive(Debug)]
pub struct Claim {
pub piece_index: u32,
pub hash: [u8; 20],
pub piece_length: u64,
}
pub type PieceManagerChannelSender = Sender<PieceManagerMessage>;
pub type PieceManagerChannelReceiver = Receiver<PieceManagerMessage>;
pub fn new_piece_manager_channel() -> (PieceManagerChannelSender, PieceManagerChannelReceiver) {
channel(CHANNEL_SIZE)
}