use crate::{
marshal::ingress::handler::{self, Handler},
Block,
};
use commonware_cryptography::PublicKey;
use commonware_p2p::{Blocker, Manager, Receiver, Sender};
use commonware_resolver::p2p;
use commonware_runtime::{Clock, Metrics, Spawner};
use futures::channel::mpsc;
use rand::Rng;
use std::time::Duration;
pub struct Config<P: PublicKey, C: Manager<PublicKey = P>, B: Blocker<PublicKey = P>> {
pub public_key: P,
pub manager: C,
pub blocker: B,
pub mailbox_size: usize,
pub initial: Duration,
pub timeout: Duration,
pub fetch_retry_timeout: Duration,
pub priority_requests: bool,
pub priority_responses: bool,
}
pub fn init<E, C, Bl, B, S, R, P>(
ctx: &E,
config: Config<P, C, Bl>,
backfill: (S, R),
) -> (
mpsc::Receiver<handler::Message<B>>,
p2p::Mailbox<handler::Request<B>, P>,
)
where
E: Rng + Spawner + Clock + Metrics,
C: Manager<PublicKey = P>,
Bl: Blocker<PublicKey = P>,
B: Block,
S: Sender<PublicKey = P>,
R: Receiver<PublicKey = P>,
P: PublicKey,
{
let (handler, receiver) = mpsc::channel(config.mailbox_size);
let handler = Handler::new(handler);
let (resolver_engine, resolver) = p2p::Engine::new(
ctx.with_label("resolver"),
p2p::Config {
manager: config.manager,
blocker: config.blocker,
consumer: handler.clone(),
producer: handler,
mailbox_size: config.mailbox_size,
me: Some(config.public_key),
initial: config.initial,
timeout: config.timeout,
fetch_retry_timeout: config.fetch_retry_timeout,
priority_requests: config.priority_requests,
priority_responses: config.priority_responses,
},
);
resolver_engine.start(backfill);
(receiver, resolver)
}