use std::future::Future; use std::net::{IpAddr, Ipv6Addr}; use futures::future::{self}; use futures::StreamExt; use tarpc::{ server::{Channel}, tokio_serde::formats::Json, }; use tarpc::server::incoming::Incoming; use tarpc::server::BaseChannel; use realm_server::server::RealmChatServer; use realm_server::types::RealmChat; async fn spawn(fut: impl Future + Send + 'static) { tokio::spawn(fut); } #[tokio::main] async fn main() -> anyhow::Result<()> { let server_addr = (IpAddr::V6(Ipv6Addr::LOCALHOST), 5051); // JSON transport is provided by the json_transport tarpc module. It makes it easy // to start up a serde-powered json serialization strategy over TCP. let mut listener = tarpc::serde_transport::tcp::listen(&server_addr, Json::default).await?; tracing::info!("Listening on port {}", listener.local_addr().port()); listener.config_mut().max_frame_length(usize::MAX); listener // Ignore accept errors. .filter_map(|r| future::ready(r.ok())) .map(BaseChannel::with_defaults) // Limit channels to 1 per IP. .max_channels_per_key(1, |t| t.transport().peer_addr().unwrap().ip()) // serve is generated by the service attribute. It takes as input any type implementing // the generated World trait. .map(|channel| { let server = RealmChatServer(channel.transport().peer_addr().unwrap()); channel.execute(server.serve()).for_each(spawn) }) // Max 10 channels. .buffer_unordered(10) .for_each(|_| async {}) .await; Ok(()) }