translator_sv2 0.2.3

SV1 to SV2 translation proxy
use async_channel::{unbounded, Receiver, Sender};
use std::{collections::HashMap, sync::Arc};
use stratum_apps::{
    custom_mutex::Mutex,
    stratum_core::parsers_sv2::{Mining, Tlv},
};

use stratum_apps::{stratum_core::sv1_api::json_rpc, utils::types::DownstreamId};

#[derive(Clone)]
pub struct Sv1ServerChannelState {
    pub sv1_server_to_downstream_sender:
        Arc<Mutex<HashMap<DownstreamId, Sender<json_rpc::Message>>>>,
    pub downstream_to_sv1_server_sender: Sender<(DownstreamId, json_rpc::Message)>,
    pub downstream_to_sv1_server_receiver: Receiver<(DownstreamId, json_rpc::Message)>,
    pub channel_manager_receiver: Receiver<(Mining<'static>, Option<Vec<Tlv>>)>,
    pub channel_manager_sender: Sender<(Mining<'static>, Option<Vec<Tlv>>)>,
}

#[cfg_attr(not(test), hotpath::measure_all)]
impl Sv1ServerChannelState {
    pub fn new(
        channel_manager_receiver: Receiver<(Mining<'static>, Option<Vec<Tlv>>)>,
        channel_manager_sender: Sender<(Mining<'static>, Option<Vec<Tlv>>)>,
    ) -> Self {
        let (downstream_to_sv1_server_sender, downstream_to_sv1_server_receiver) = unbounded();

        Self {
            sv1_server_to_downstream_sender: Arc::new(Mutex::new(HashMap::new())),
            downstream_to_sv1_server_receiver,
            downstream_to_sv1_server_sender,
            channel_manager_receiver,
            channel_manager_sender,
        }
    }

    pub fn drop(&self) {
        self.channel_manager_receiver.close();
        self.channel_manager_sender.close();
        self.downstream_to_sv1_server_receiver.close();
        self.downstream_to_sv1_server_sender.close();
    }
}