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};