use log::info;
use crate::communication::messages::{IdentificableMessage, SimpleCodifier, Messages, ControlMessage};
use crate::communication::service::GenericCommunicationService;
use crate::membership::client::{MembershipClient, MembershipManager};
use crate::membership::metadata::{BasicMetadata, NodeMetadata};
use crate::nodes::CommunicationSDK;
use crate::properties::{EncodedMetadata, init_buffer, SystemBufferVec};
pub type SystemCommunicationService<CommsSDK> = GenericCommunicationService<
<CommsSDK as CommunicationSDK>::Connection,
<CommsSDK as CommunicationSDK>::Address,
<CommsSDK as CommunicationSDK>::Factory,
<CommsSDK as CommunicationSDK>::Router,
>;
pub fn connect_with_members<
Msg: IdentificableMessage,
CommsSDK: CommunicationSDK,
CoordMetadata: BasicMetadata,
Membership: MembershipManager<SIZE, NodeMetadata = NodeMetadata<CoordMetadata, CommsSDK::Metadata>>,
MsgCod: SimpleCodifier<Data= Messages<Msg>>,
const SIZE: usize,
>(
metadata: EncodedMetadata,
membership: &mut Membership,
communication: &mut SystemCommunicationService<CommsSDK>,
codifier: &mut MsgCod,
) where
Membership: MembershipClient<Address = CommsSDK::Address>,
{
info!("Connecting to network members.");
let message: Messages<Msg> = Messages::System(ControlMessage::GetMetadata(metadata));
let (removed_members, new_members) = membership.find_members();
info!(
"There are {} new members and {} removed members in the network.",
new_members.len(),
removed_members.len()
);
for removed_member in removed_members {
if let Some(old_id) = communication.unpeer(removed_member) {
membership.unregister_member(old_id);
}
}
let mut buffer = init_buffer();
let codified = codifier.encode(&message, &mut buffer).unwrap();
if let Ok(bytes) = SystemBufferVec::from_slice(&buffer[..codified]) {
for new_member in new_members {
info!("Establishing handshake with node at {}.", new_member);
communication.handshake(new_member, bytes.clone())
}
}
}