use std::str::FromStr;
use async_trait::async_trait;
use rings_transport::core::callback::Callback;
use rings_transport::core::transport::WebrtcConnectionState;
use crate::channels::Channel;
use crate::dht::Did;
use crate::types::channel::Channel as ChannelTrait;
use crate::types::channel::TransportEvent;
type TransportEventSender = <Channel<TransportEvent> as ChannelTrait<TransportEvent>>::Sender;
pub struct SwarmCallback {
transport_event_sender: TransportEventSender,
}
impl SwarmCallback {
pub fn new(transport_event_sender: TransportEventSender) -> Self {
Self {
transport_event_sender,
}
}
}
#[cfg_attr(feature = "wasm", async_trait(?Send))]
#[cfg_attr(not(feature = "wasm"), async_trait)]
impl Callback for SwarmCallback {
async fn on_message(&self, _cid: &str, msg: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
Channel::send(
&self.transport_event_sender,
TransportEvent::DataChannelMessage(msg.into()),
)
.await
.map_err(|e| e.into())
}
async fn on_peer_connection_state_change(
&self,
cid: &str,
s: WebrtcConnectionState,
) -> Result<(), Box<dyn std::error::Error>> {
let Ok(did) = Did::from_str(cid) else {
tracing::warn!("on_peer_connection_state_change parse did failed: {}", cid);
return Ok(());
};
match s {
WebrtcConnectionState::Connected => {
Channel::send(&self.transport_event_sender, TransportEvent::Connected(did)).await
}
WebrtcConnectionState::Failed
| WebrtcConnectionState::Disconnected
| WebrtcConnectionState::Closed => {
Channel::send(&self.transport_event_sender, TransportEvent::Closed(did)).await
}
_ => Ok(()),
}
.map_err(|e| e.into())
}
}