Skip to main content

cookie_agent_protocol/session/
transport.rs

1use std::fmt;
2
3use async_trait::async_trait;
4use serde_json::Value;
5use thiserror::Error;
6
7/// One complete JSON-RPC message exchanged by a protocol transport.
8#[derive(Clone, PartialEq)]
9pub enum MessageFrame {
10    Text(String),
11    Value(Value),
12}
13
14impl fmt::Debug for MessageFrame {
15    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
16        match self {
17            Self::Text(_) => formatter.write_str("MessageFrame::Text(<redacted>)"),
18            Self::Value(_) => formatter.write_str("MessageFrame::Value(<redacted>)"),
19        }
20    }
21}
22
23/// Frame-level channel with no JSON-RPC semantics.
24#[async_trait]
25pub trait Transport: Send {
26    async fn send(&mut self, frame: MessageFrame) -> Result<(), TransportError>;
27    async fn recv(&mut self) -> Result<Option<MessageFrame>, TransportError>;
28}
29
30pub use Transport as MessageStream;
31
32#[derive(Debug, Error)]
33pub enum TransportError {
34    #[error("transport closed")]
35    Closed,
36    #[error("invalid transport frame: {0}")]
37    InvalidFrame(#[from] serde_json::Error),
38    #[error("transport error: {0}")]
39    Other(String),
40}