couchbase_core/memdx/
dispatcher.rs1use std::sync::Arc;
20
21use crate::memdx::client::ResponseContext;
22use crate::memdx::connection::ConnectionType;
23use crate::memdx::error::Result;
24use crate::memdx::packet::{RequestPacket, ResponsePacket};
25use crate::memdx::pendingop::ClientPendingOp;
26use crate::orphan_reporter::OrphanContext;
27use async_trait::async_trait;
28use futures::future::BoxFuture;
29use tokio::sync::oneshot;
30
31pub type UnsolicitedPacketHandler =
32 Arc<dyn Fn(ResponsePacket) -> BoxFuture<'static, ()> + Send + Sync>;
33pub type OrphanResponseHandler = Arc<dyn Fn(ResponsePacket, OrphanContext) + Send + Sync>;
34pub type OnReadLoopCloseHandler = oneshot::Sender<()>;
35
36pub struct DispatcherOptions {
37 pub unsolicited_packet_handler: UnsolicitedPacketHandler,
38 pub orphan_handler: Option<OrphanResponseHandler>,
39 pub on_read_close_tx: OnReadLoopCloseHandler,
40 pub disable_decompression: bool,
41 pub id: String,
42}
43
44#[async_trait]
45pub trait Dispatcher: Send + Sync {
46 fn new(conn: ConnectionType, opts: DispatcherOptions) -> Self;
47 async fn dispatch<'a>(
48 &self,
49 packet: RequestPacket<'a>,
50 is_persistent: bool,
51 response_context: Option<ResponseContext>,
52 ) -> Result<ClientPendingOp>;
53 async fn close(&self) -> Result<()>;
54}