mod codec;
mod stdio;
mod tcp;
use std::io;
use async_trait::async_trait;
pub use codec::FrameCodec;
pub use stdio::StdioTransport;
pub use tcp::{TcpTransport, TcpListener, REGISTRY_PORT, CALLBACK_PORT};
use crate::matrixrpc::protocol::JsonRpcMessage;
#[async_trait]
pub trait Transport: Send {
async fn send(&mut self, message: &JsonRpcMessage) -> io::Result<()>;
async fn receive(&mut self) -> io::Result<Option<JsonRpcMessage>>;
async fn close(&mut self) -> io::Result<()>;
fn is_closed(&self) -> bool;
}
#[derive(Debug, Clone)]
pub struct TransportConfig {
pub max_message_size: usize,
pub read_timeout_ms: u64,
pub write_timeout_ms: u64,
}
impl Default for TransportConfig {
fn default() -> Self {
Self {
max_message_size: 16 * 1024 * 1024, read_timeout_ms: 30_000, write_timeout_ms: 30_000, }
}
}
impl TransportConfig {
pub fn new() -> Self {
Self::default()
}
pub fn max_message_size(mut self, size: usize) -> Self {
self.max_message_size = size;
self
}
pub fn read_timeout(mut self, ms: u64) -> Self {
self.read_timeout_ms = ms;
self
}
pub fn write_timeout(mut self, ms: u64) -> Self {
self.write_timeout_ms = ms;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transport_config_defaults() {
let config = TransportConfig::default();
assert_eq!(config.max_message_size, 16 * 1024 * 1024);
assert_eq!(config.read_timeout_ms, 30_000);
assert_eq!(config.write_timeout_ms, 30_000);
}
#[test]
fn test_transport_config_builder() {
let config = TransportConfig::new()
.max_message_size(1024)
.read_timeout(5000)
.write_timeout(10000);
assert_eq!(config.max_message_size, 1024);
assert_eq!(config.read_timeout_ms, 5000);
assert_eq!(config.write_timeout_ms, 10000);
}
}