#![doc = include_str!("../README.md")]
#![forbid(unsafe_op_in_unsafe_fn)]
#[doc(hidden)]
pub mod rapace {
pub use crate::*;
}
pub use rapace_macros::service;
#[doc(hidden)]
pub extern crate rapace_core;
pub use rapace_core::{
DecodeError,
EncodeError,
ErrorCode,
Frame,
FrameFlags,
MsgDescHot,
RpcError,
RpcSession,
Streaming,
Transport,
TransportError,
ValidationError,
parse_error_payload,
};
#[cfg(not(target_arch = "wasm32"))]
pub use rapace_core::{TunnelHandle, TunnelStream};
pub use facet;
#[doc(hidden)]
pub extern crate facet_core;
pub use facet_postcard;
#[doc(hidden)]
pub extern crate tracing;
#[doc(hidden)]
pub extern crate futures;
pub use rapace_registry as registry;
pub mod prelude {
pub use crate::{ErrorCode, RpcError, Streaming, Transport, service};
pub use facet::Facet;
pub use rapace_registry::ServiceRegistry;
}
pub mod transport {
#[cfg(feature = "mem")]
pub use rapace_core::mem::MemTransport;
#[cfg(feature = "stream")]
pub use rapace_core::stream::StreamTransport;
#[cfg(feature = "websocket")]
pub use rapace_core::websocket::WebSocketTransport;
#[cfg(feature = "shm")]
pub mod shm {
pub use rapace_core::shm::*;
}
}
#[doc(hidden)]
pub mod helper_binary;
pub mod session;
#[cfg(feature = "mem")]
pub use transport::MemTransport;
#[cfg(feature = "stream")]
pub use transport::StreamTransport;
#[cfg(feature = "websocket")]
pub use transport::WebSocketTransport;
#[cfg(feature = "stream")]
pub mod server {
use std::sync::Arc;
use tokio::net::{TcpListener, TcpStream};
pub fn serve_connection(stream: TcpStream) -> Arc<crate::StreamTransport> {
Arc::new(crate::StreamTransport::new(stream))
}
pub async fn run_tcp_server<S, F>(addr: &str, make_server: F) -> Result<(), std::io::Error>
where
F: Fn() -> S + Send + Sync + 'static,
S: TcpServable + Send + 'static,
{
let listener = TcpListener::bind(addr).await?;
println!("Listening on {}", addr);
loop {
let (socket, peer_addr) = listener.accept().await?;
println!("Accepted connection from {}", peer_addr);
let server = make_server();
tokio::spawn(async move {
let transport = serve_connection(socket);
if let Err(e) = server.serve_tcp(transport).await {
eprintln!("Connection error from {}: {}", peer_addr, e);
}
});
}
}
pub trait TcpServable {
fn serve_tcp(
self,
transport: Arc<crate::StreamTransport>,
) -> impl std::future::Future<Output = Result<(), crate::RpcError>> + Send;
}
}