use super::SharedState;
use p2p::{
context::ServiceContext as P2PServiceContext, service::ServiceError as P2PServiceError,
service::ServiceEvent as P2PServiceEvent, traits::ServiceHandle as P2PServiceHandle,
};
use std::sync::{Arc, RwLock};
#[derive(Clone)]
pub struct SimpleServiceHandler {
shared: Arc<RwLock<SharedState>>,
}
impl SimpleServiceHandler {
pub fn new(shared: Arc<RwLock<SharedState>>) -> Self {
Self { shared }
}
}
impl P2PServiceHandle for SimpleServiceHandler {
fn handle_error(&mut self, _control: &mut P2PServiceContext, error: P2PServiceError) {
crate::error!("TestServiceHandler detect error: {:?}", error);
}
fn handle_event(&mut self, _control: &mut P2PServiceContext, event: P2PServiceEvent) {
match event {
P2PServiceEvent::SessionOpen {
session_context: session,
} => {
crate::debug!("TestServiceHandler open session: {:?}", session);
let _ = self
.shared
.write()
.map(|mut shared| shared.add_session(session.as_ref().to_owned()));
}
P2PServiceEvent::SessionClose {
session_context: session,
} => {
crate::debug!("TestServiceHandler close session: {:?}", session);
let _ = self
.shared
.write()
.map(|mut shared| shared.remove_session(&session.id));
}
_ => {
unimplemented!()
}
}
}
}