mod listeners;
mod messaging;
use crate::messaging::{
data::{CmdError, OperationId, QueryResponse},
signature_aggregator::SignatureAggregator,
MessageId,
};
use crate::prefix_map::NetworkPrefixMap;
use crate::types::PublicKey;
use bls::PublicKey as BlsPublicKey;
use bytes::Bytes;
pub(crate) use messaging::SAFE_CLIENT_DIR;
use qp2p::Endpoint;
use std::path::PathBuf;
use std::{collections::HashMap, net::SocketAddr, sync::Arc};
use tokio::sync::{mpsc::Sender, RwLock};
use tokio::time::Duration;
use uluru::LRUCache;
type QueryResponseSender = Sender<QueryResponse>;
type PendingQueryResponses = Arc<RwLock<HashMap<OperationId, QueryResponseSender>>>;
#[derive(Debug)]
pub(crate) struct QueryResult {
pub(super) response: QueryResponse,
pub(super) operation_id: OperationId,
}
pub(crate) type AeCache = LRUCache<(Vec<SocketAddr>, BlsPublicKey, Bytes), 100>;
#[derive(Clone, Debug)]
pub(super) struct Session {
client_pk: PublicKey,
endpoint: Endpoint,
pending_queries: PendingQueryResponses,
incoming_err_sender: Arc<Sender<CmdError>>,
network: Arc<NetworkPrefixMap>,
ae_redirect_cache: Arc<RwLock<AeCache>>,
ae_retry_cache: Arc<RwLock<AeCache>>,
aggregator: Arc<RwLock<SignatureAggregator>>,
genesis_key: bls::PublicKey,
initial_connection_check_msg_id: Arc<RwLock<Option<MessageId>>>,
standard_wait: Duration,
root_dir: PathBuf,
}