use std::net::SocketAddr;
use std::sync::Arc;
use std::time::Instant;
use tokio::net::TcpStream;
use tokio::sync::OwnedSemaphorePermit;
use crate::config::auth::AuthMode;
use crate::control::planner::context::QueryContext;
use crate::control::security::identity::AuthenticatedIdentity;
use crate::control::server::admission::{AdmissionRegistry, ConnectionPermit};
use crate::control::server::conn_stream::ConnStream;
use crate::control::server::shared::session::SessionStore;
use crate::control::state::SharedState;
use super::codec::{self, FrameFormat};
use super::dispatch;
mod auth;
mod request;
mod run;
mod session_chunk;
mod session_stream;
#[cfg(test)]
mod tests;
use session_chunk::chunk_large_response;
pub struct NativeSession {
stream: ConnStream,
peer_addr: SocketAddr,
state: Arc<SharedState>,
auth_mode: AuthMode,
identity: Option<AuthenticatedIdentity>,
auth_context: Option<crate::control::security::auth_context::AuthContext>,
format: Option<FrameFormat>,
query_ctx: QueryContext,
sessions: SessionStore,
connected_at: Instant,
pub proto_ver: u16,
admission_registry: Arc<AdmissionRegistry>,
global_permit: Option<OwnedSemaphorePermit>,
connection_permit: Option<ConnectionPermit>,
}
impl NativeSession {
fn with_stream(
stream: ConnStream,
peer_addr: SocketAddr,
state: Arc<SharedState>,
auth_mode: AuthMode,
admission_registry: Arc<AdmissionRegistry>,
global_permit: OwnedSemaphorePermit,
) -> Self {
let query_ctx = QueryContext::for_state(&state);
Self {
stream,
peer_addr,
state,
auth_mode,
identity: None,
auth_context: None,
format: None,
query_ctx,
sessions: SessionStore::new(),
connected_at: Instant::now(),
proto_ver: 0,
admission_registry,
global_permit: Some(global_permit),
connection_permit: None,
}
}
pub fn new(
stream: TcpStream,
peer_addr: SocketAddr,
state: Arc<SharedState>,
auth_mode: AuthMode,
admission_registry: Arc<AdmissionRegistry>,
global_permit: OwnedSemaphorePermit,
) -> Self {
Self::with_stream(
ConnStream::plain(stream),
peer_addr,
state,
auth_mode,
admission_registry,
global_permit,
)
}
pub fn new_tls(
stream: tokio_rustls::server::TlsStream<TcpStream>,
peer_addr: SocketAddr,
state: Arc<SharedState>,
auth_mode: AuthMode,
admission_registry: Arc<AdmissionRegistry>,
global_permit: OwnedSemaphorePermit,
) -> Self {
Self::with_stream(
ConnStream::tls(stream),
peer_addr,
state,
auth_mode,
admission_registry,
global_permit,
)
}
}