use crate::codec::{CodecError, FramedIo, IntoEngineWriter, Message};
use crate::endpoint::Endpoint;
#[allow(unused_imports)]
use crate::io_compat::AsyncVectoredWrite;
use crate::socket::{SocketEvent, SocketOptions, SocketType};
use crate::PeerIdentity;
use crate::{ZmqMessage, ZmqResult};
use futures::channel::mpsc;
use futures::{Sink, Stream};
use parking_lot::Mutex;
use std::sync::Arc;
pub trait MultiPeerBackend: SocketBackend {
fn peer_connected<R, W>(
self: Arc<Self>,
peer_id: &PeerIdentity,
io: FramedIo<R, W>,
endpoint: Option<Endpoint>,
) -> impl std::future::Future<Output = ()> + Send
where
R: Stream<Item = Result<Message, CodecError>> + Unpin + Send + 'static,
W: Sink<Message, Error = CodecError> + Unpin + Send + IntoEngineWriter + 'static,
W::Writer: Send + 'static;
#[cfg(feature = "inproc")]
#[allow(private_interfaces)]
fn peer_connected_inproc(
self: Arc<Self>,
peer_id: &PeerIdentity,
peer: crate::transport::inproc::InprocPeer,
endpoint: Option<Endpoint>,
) -> impl std::future::Future<Output = ZmqResult<()>> + Send;
fn peer_disconnected(&self, peer_id: &PeerIdentity);
fn on_reconnect(&self, _peer_id: &PeerIdentity) {}
}
pub trait SocketBackend: Send + Sync {
fn socket_type(&self) -> SocketType;
fn socket_options(&self) -> &SocketOptions;
fn shutdown(&self);
fn monitor(&self) -> &Mutex<Option<mpsc::Sender<SocketEvent>>>;
}
pub trait SocketRecv {
fn recv(&mut self) -> impl std::future::Future<Output = ZmqResult<ZmqMessage>> + Send;
}
pub trait SocketSend {
fn send(
&mut self,
message: impl Into<ZmqMessage> + Send,
) -> impl std::future::Future<Output = ZmqResult<()>> + Send;
}
pub trait CaptureSocket: SocketSend {}