use super::IrohEndpoint;
impl IrohEndpoint {
pub async fn close(&self) {
let handle = self
.inner
.session
.serve_handle
.lock()
.unwrap_or_else(|e| e.into_inner())
.take();
if let Some(h) = handle {
h.drain().await;
}
self.inner.transport.ep.close().await;
let _ = self.inner.session.closed_tx.send(true);
}
pub async fn close_force(&self) {
let handle = self
.inner
.session
.serve_handle
.lock()
.unwrap_or_else(|e| e.into_inner())
.take();
if let Some(h) = handle {
h.abort();
}
self.inner.transport.ep.close().await;
let _ = self.inner.session.closed_tx.send(true);
}
pub async fn wait_closed(&self) {
let mut rx = self.inner.session.closed_rx.clone();
let _ = rx.wait_for(|v| *v).await;
}
pub fn set_serve_handle(&self, handle: crate::http::server::ServeHandle) {
*self
.inner
.session
.serve_done_rx
.lock()
.unwrap_or_else(|e| e.into_inner()) = Some(handle.subscribe_done());
*self
.inner
.session
.serve_handle
.lock()
.unwrap_or_else(|e| e.into_inner()) = Some(handle);
}
pub fn stop_serve(&self) {
if let Some(h) = self
.inner
.session
.serve_handle
.lock()
.unwrap_or_else(|e| e.into_inner())
.as_ref()
{
h.shutdown();
}
}
pub async fn wait_serve_stop(&self) {
let rx = self
.inner
.session
.serve_done_rx
.lock()
.unwrap_or_else(|e| e.into_inner())
.clone();
if let Some(mut rx) = rx {
let _ = rx.wait_for(|v| *v).await;
}
}
pub fn subscribe_events(
&self,
) -> Option<tokio::sync::mpsc::Receiver<crate::http::events::TransportEvent>> {
self.inner
.session
.event_rx
.lock()
.unwrap_or_else(|e| e.into_inner())
.take()
}
}