use std::sync::Arc;
use std::time::Duration;
use std::time::Instant;
use crate::client::DynInvoke;
use crate::client::Invoke;
use crate::credentials::client::ClientHandshakeInfo;
use crate::credentials::client::DynClientConnectionSecurityInfo;
use crate::credentials::common::Authority;
use crate::credentials::dyn_wrapper::DynChannelCredentials;
use crate::rt::GrpcRuntime;
mod registry;
#[cfg(feature = "_runtime-tokio")]
pub(crate) mod tonic;
use ::tonic::async_trait;
pub(crate) use registry::GLOBAL_TRANSPORT_REGISTRY;
pub(crate) use registry::TransportRegistry;
use tokio::sync::oneshot;
#[derive(Default, Clone)]
pub(crate) struct TransportOptions {
pub(crate) init_stream_window_size: Option<u32>,
pub(crate) init_connection_window_size: Option<u32>,
pub(crate) http2_keep_alive_interval: Option<Duration>,
pub(crate) http2_keep_alive_timeout: Option<Duration>,
pub(crate) http2_keep_alive_while_idle: Option<bool>,
pub(crate) http2_max_header_list_size: Option<u32>,
pub(crate) http2_adaptive_window: Option<bool>,
pub(crate) concurrency_limit: Option<usize>,
pub(crate) rate_limit: Option<(u64, Duration)>,
pub(crate) tcp_keepalive: Option<Duration>,
pub(crate) tcp_nodelay: bool,
pub(crate) connect_deadline: Option<Instant>,
}
#[trait_variant::make(Send)]
pub(crate) trait Transport: Sync {
type Service: Invoke + 'static;
async fn connect(
&self,
address: String,
runtime: GrpcRuntime,
security_opts: &SecurityOpts,
opts: &TransportOptions,
) -> Result<
(
Self::Service,
DynClientConnectionSecurityInfo,
oneshot::Receiver<Result<(), String>>,
),
String,
>;
}
#[async_trait]
pub(crate) trait DynTransport: Send + Sync {
async fn dyn_connect(
&self,
address: String,
runtime: GrpcRuntime,
security_opts: &SecurityOpts,
opts: &TransportOptions,
) -> Result<
(
Box<dyn DynInvoke>,
DynClientConnectionSecurityInfo,
oneshot::Receiver<Result<(), String>>,
),
String,
>;
}
#[async_trait]
impl<T: Transport> DynTransport for T {
async fn dyn_connect(
&self,
address: String,
runtime: GrpcRuntime,
security_opts: &SecurityOpts,
opts: &TransportOptions,
) -> Result<
(
Box<dyn DynInvoke>,
DynClientConnectionSecurityInfo,
oneshot::Receiver<Result<(), String>>,
),
String,
> {
let (i, sc, rx) = self.connect(address, runtime, security_opts, opts).await?;
Ok((Box::new(i), sc, rx))
}
}
#[derive(Clone)]
pub(crate) struct SecurityOpts {
pub(crate) credentials: Arc<dyn DynChannelCredentials>,
pub(crate) authority: Authority,
pub(crate) handshake_info: ClientHandshakeInfo,
}