use std::time::Duration;
use pb_mapper::{
Client, ClientConfig, ConnectOptions, ConnectRequest, PathPolicy, RegisterOptions,
RegisterRequest, Transport,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let local_service = std::env::args()
.nth(1)
.unwrap_or_else(|| "127.0.0.1:8080".to_string());
let client = Client::new(ClientConfig {
server: std::env::var("PB_MAPPER_SERVER")?,
credential: std::env::var("MSG_HEADER_KEY")?,
keep_alive: true,
namespace: None,
})?;
let request = |key: &str| RegisterRequest {
key: key.into(),
local_addr: local_service.clone(),
transport: Transport::Tcp,
codec: true,
force_namespace: false,
};
let audited = client
.register_with_options(
request("audited"),
RegisterOptions {
allow_direct: false,
idle_timeout: Some(Duration::from_secs(90)),
},
)
.await?;
let default_with_idle = client
.register_with_idle_timeout(request("default-idle"), Duration::from_secs(90))
.await?;
let explicit_default = client
.register_with_options(request("default"), RegisterOptions::default())
.await?;
for registration in [&audited, &default_with_idle, &explicit_default] {
registration.wait_ready().await?;
println!("registered `{}`", registration.key());
}
let relayed = client
.connect_with_options(
ConnectRequest {
key: "default".into(),
local_addr: "127.0.0.1:9091".into(),
transport: Transport::Tcp,
},
ConnectOptions {
path: PathPolicy::RelayOnly,
},
)
.await?;
let auto = client
.connect_with_options(
ConnectRequest {
key: "default".into(),
local_addr: "127.0.0.1:9092".into(),
transport: Transport::Tcp,
},
ConnectOptions {
path: PathPolicy::Auto,
},
)
.await?;
relayed.wait_ready().await?;
auto.wait_ready().await?;
println!("relay only at 127.0.0.1:9091, direct first at 127.0.0.1:9092");
tokio::signal::ctrl_c().await?;
for connection in [relayed, auto] {
connection.stop().await?;
}
for registration in [audited, default_with_idle, explicit_default] {
registration.stop().await?;
}
Ok(())
}