rsocket_rust/
lib.rs

1#![allow(dead_code)]
2#![allow(unused_imports)]
3#![allow(unused_variables)]
4#![allow(clippy::type_complexity)]
5#![allow(clippy::from_over_into)]
6#![doc(test(
7    no_crate_inject,
8    attr(deny(warnings, rust_2018_idioms), allow(dead_code, unused_variables))
9))]
10
11//! Official RSocket Rust implementation using Tokio.
12//!
13//! RSocket is an application protocol providing Reactive Streams semantics.
14//!
15//! It is a binary protocol for use on byte stream transports such as TCP, WebSockets, and Aeron.
16//!
17//! It enables the following symmetric interaction models via async message passing over a single connection:
18//! - request/response (stream of 1)
19//! - request/stream (finite stream of many)
20//! - fire-and-forget (no response)
21//! - channel (bi-directional streams)
22//!
23//! # A Tour of RSocket
24//!
25//! The easiest way to get started is to use RSocket. Do this by enabling TCP transport support.
26//!
27//! ```toml
28//! rsocket_rust = "0.5.1"
29//! rsocket_rust_transport_tcp = "0.5.1"
30//!
31//! # If you want to use websocket transport instead.
32//! # rsocket_rust_transport_websocket = "0.5.1"
33//! ```
34//!
35//! # Examples
36//!
37//! A simple TCP echo server:
38//!
39//! ```no_run,ignore
40//! use rsocket_rust::prelude::*;
41//! use rsocket_rust::utils::EchoRSocket;
42//! use rsocket_rust::Result;
43//! use rsocket_rust_transport_tcp::TcpServerTransport;
44//!
45//! #[tokio::main]
46//! async fn main() -> Result<()> {
47//!     RSocketFactory::receive()
48//!         .transport(TcpServerTransport::from("127.0.0.1:7878"))
49//!         .acceptor(Box::new(|setup, socket| {
50//!             println!("socket establish: setup={:?}", setup);
51//!             tokio::spawn(async move {
52//!                 let req = Payload::builder().set_data_utf8("Hello World!").build();
53//!                 let res = socket.request_response(req).await.unwrap();
54//!                 println!("SERVER request CLIENT success: response={:?}", res);
55//!             });
56//!             // Return a responder.
57//!             // You can write you own responder by implementing `RSocket` trait.
58//!             Ok(Box::new(EchoRSocket))
59//!         }))
60//!         .on_start(Box::new(|| println!("echo server start success!")))
61//!         .serve()
62//!         .await
63//! }
64//! ```
65//!
66//! Connect to echo server above:
67//!
68//! ```no_run,ignore
69//! use rsocket_rust::prelude::*;
70//! use rsocket_rust::utils::EchoRSocket;
71//! use rsocket_rust::Result;
72//! use rsocket_rust_transport_tcp::TcpClientTransport;
73//!
74//! #[tokio::main]
75//! async fn main() -> Result<()> {
76//!     let client = RSocketFactory::connect()
77//!         .transport(TcpClientTransport::from("127.0.0.1:7878"))
78//!         .acceptor(Box::new(|| {
79//!             // Return a responder.
80//!             Box::new(EchoRSocket)
81//!         }))
82//!         .start()
83//!         .await
84//!         .expect("Connect failed!");
85//!
86//!     let req = Payload::builder().set_data_utf8("Ping!").build();
87//!     let res = client.request_response(req).await.expect("Requet failed!");
88//!     println!("request success: response={:?}", res);
89//!
90//!     Ok(())
91//! }
92//! ```
93//!
94
95/// A re-export of [`async-stream`](https://docs.rs/async-stream) for creating a Stream.
96pub use async_stream::stream;
97/// A re-export of [`async-trait`](https://docs.rs/async-trait) for use with RSocket trait implementation.
98pub use async_trait::async_trait;
99
100#[macro_use]
101extern crate anyhow;
102#[macro_use]
103extern crate log;
104#[macro_use]
105extern crate cfg_if;
106
107#[macro_use]
108#[doc(hidden)]
109pub mod macros;
110
111pub mod error;
112pub mod extension;
113pub mod prelude;
114pub mod runtime;
115pub mod transport;
116pub mod utils;
117
118cfg_if! {
119    if #[cfg(feature = "frame")]{
120        pub mod frame;
121    }else{
122        mod frame;
123    }
124}
125
126mod core;
127mod payload;
128mod spi;
129
130pub type Error = Box<dyn std::error::Error + Sync + Send>;
131pub type Result<T> = anyhow::Result<T>;
132
133pub use crate::core::{Client, ClientBuilder, ServerBuilder};