use massa_channel::MassaChannel;
use massa_versioning::versioning::MipStore;
use parking_lot::RwLock;
use std::sync::Arc;
use crate::{
block_factory::BlockFactoryWorker, endorsement_factory::EndorsementFactoryWorker,
manager::FactoryManagerImpl,
};
use massa_factory_exports::{FactoryChannels, FactoryConfig, FactoryManager};
use massa_wallet::Wallet;
pub fn start_factory(
cfg: FactoryConfig,
wallet: Arc<RwLock<Wallet>>,
channels: FactoryChannels,
mip_store: MipStore,
) -> Box<dyn FactoryManager> {
let (block_worker_tx, block_worker_rx) =
MassaChannel::new("factory_block_worker".to_string(), None);
let (endorsement_worker_tx, endorsement_worker_rx) =
MassaChannel::new("factory_endorsement_worker".to_string(), None);
let block_worker_handle = BlockFactoryWorker::spawn(
cfg.clone(),
wallet.clone(),
channels.clone(),
block_worker_rx,
mip_store,
);
let endorsement_worker_handle =
EndorsementFactoryWorker::spawn(cfg, wallet, channels, endorsement_worker_rx);
let manager = FactoryManagerImpl {
block_worker: Some((block_worker_tx, block_worker_handle)),
endorsement_worker: Some((endorsement_worker_tx, endorsement_worker_handle)),
};
Box::new(manager)
}