use std::env;
use std::sync::LazyLock;
use std::time::Duration;
use surrealdb_core::lazy_env_parse;
pub const LOGO: &str = "
.d8888b. 888 8888888b. 888888b.
d88P Y88b 888 888 'Y88b 888 '88b
Y88b. 888 888 888 888 .88P
'Y888b. 888 888 888d888 888d888 .d88b. 8888b. 888 888 888 8888888K.
'Y88b. 888 888 888P' 888P' d8P Y8b '88b 888 888 888 888 'Y88b
'888 888 888 888 888 88888888 .d888888 888 888 888 888 888
Y88b d88P Y88b 888 888 888 Y8b. 888 888 888 888 .d88P 888 d88P
'Y8888P' 'Y88888 888 888 'Y8888 'Y888888 888 8888888P' 8888888P'
";
#[cfg(debug_assertions)]
pub const DEBUG_BUILD_WARNING: &str = "\
┌─────────────────────────────────────────────────────────────────────────────┐
│ !!! THIS IS A DEVELOPMENT BUILD !!! │
│ Development builds are not intended for production use and include │
│ tooling and features that may affect the performance of the database. │
└─────────────────────────────────────────────────────────────────────────────┘";
pub const PKG_NAME: &str = "surrealdb";
pub const APP_ENDPOINT: &str = "https://surrealdb.com/surrealist";
pub static NET_MAX_CONCURRENT_REQUESTS: LazyLock<usize> =
lazy_env_parse!("SURREAL_NET_MAX_CONCURRENT_REQUESTS", usize, 1 << 20);
pub static HTTP_MAX_ML_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_ML_BODY_SIZE", usize, 4 << 30);
pub static HTTP_MAX_SQL_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_SQL_BODY_SIZE", usize, 1 << 20);
pub static HTTP_MAX_API_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_API_BODY_SIZE", usize, 4 << 20);
pub static HTTP_MAX_RPC_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_RPC_BODY_SIZE", usize, 4 << 20);
pub static HTTP_MAX_KEY_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_KEY_BODY_SIZE", usize, 16 << 10);
pub static HTTP_MAX_SIGNUP_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_SIGNUP_BODY_SIZE", usize, 1 << 10);
pub static HTTP_MAX_SIGNIN_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_SIGNIN_BODY_SIZE", usize, 1 << 10);
pub static HTTP_MAX_IMPORT_BODY_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_HTTP_MAX_IMPORT_BODY_SIZE", usize, 4 << 30);
pub const WEBSOCKET_PING_FREQUENCY: Duration = Duration::from_secs(5);
pub static WEBSOCKET_MAX_MESSAGE_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_WEBSOCKET_MAX_MESSAGE_SIZE", usize, 128 << 20);
pub static WEBSOCKET_READ_BUFFER_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_WEBSOCKET_READ_BUFFER_SIZE", usize, 128 * 1024);
pub static WEBSOCKET_WRITE_BUFFER_SIZE: LazyLock<usize> =
lazy_env_parse!(bytes, "SURREAL_WEBSOCKET_WRITE_BUFFER_SIZE", usize, 128 * 1024);
pub static WEBSOCKET_MAX_WRITE_BUFFER_SIZE: LazyLock<usize> = LazyLock::new(|| {
let buffer_size = || {
let var = env::var("SURREAL_WEBSOCKET_MAX_WRITE_BUFFER_SIZE").ok()?;
let size = var.parse().ok()?;
if size > *WEBSOCKET_WRITE_BUFFER_SIZE {
Some(size)
} else {
None
}
};
buffer_size().unwrap_or(usize::MAX)
});
pub static WEBSOCKET_RESPONSE_CHANNEL_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_WEBSOCKET_RESPONSE_CHANNEL_SIZE", usize, 100);
pub static WEBSOCKET_RESPONSE_BUFFER_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_WEBSOCKET_RESPONSE_BUFFER_SIZE", usize, 0);
pub static WEBSOCKET_RESPONSE_FLUSH_PERIOD: LazyLock<u64> =
lazy_env_parse!("SURREAL_WEBSOCKET_RESPONSE_FLUSH_PERIOD", u64, 3);
#[cfg(feature = "graphql")]
pub static GQL_SUBSCRIPTION_CHANNEL_CAPACITY: LazyLock<usize> =
lazy_env_parse!("SURREAL_GQL_SUBSCRIPTION_CHANNEL_CAPACITY", usize, 1024);
pub static RUNTIME_WORKER_THREADS: LazyLock<usize> =
lazy_env_parse!("SURREAL_RUNTIME_WORKER_THREADS", usize, || {
std::cmp::max(4, num_cpus::get())
});
pub static RUNTIME_STACK_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_RUNTIME_STACK_SIZE", usize, || {
if cfg!(debug_assertions) {
20 * 1024 * 1024 } else {
10 * 1024 * 1024 }
});
pub static RUNTIME_MAX_BLOCKING_THREADS: LazyLock<usize> =
lazy_env_parse!("SURREAL_RUNTIME_MAX_BLOCKING_THREADS", usize, 512);
pub static TELEMETRY_PROVIDER: LazyLock<String> =
lazy_env_parse!("SURREAL_TELEMETRY_PROVIDER", String);
pub static TELEMETRY_NAMESPACE: LazyLock<Option<String>> =
lazy_env_parse!("SURREAL_TELEMETRY_NAMESPACE", Option<String>);
pub static TELEMETRY_DISABLE_TRACING: LazyLock<bool> =
lazy_env_parse!("SURREAL_TELEMETRY_DISABLE_TRACING", bool);
pub static TELEMETRY_DISABLE_METRICS: LazyLock<bool> =
lazy_env_parse!("SURREAL_TELEMETRY_DISABLE_METRICS", bool);
pub static PKG_VERSION: LazyLock<String> = LazyLock::new(|| {
let version = option_env!("SURREAL_BUILD_VERSION")
.filter(|v| !v.trim().is_empty())
.unwrap_or(env!("CARGO_PKG_VERSION"));
match option_env!("SURREAL_BUILD_METADATA") {
Some(metadata) if !metadata.trim().is_empty() => {
format!("{version}+{metadata}")
}
_ => version.to_owned(),
}
});
pub static ENABLE_TOKIO_CONSOLE: LazyLock<bool> =
lazy_env_parse!("SURREAL_TOKIO_CONSOLE_ENABLED", bool, false);
pub static TOKIO_CONSOLE_SOCKET_ADDR: LazyLock<Option<String>> =
lazy_env_parse!("SURREAL_TOKIO_CONSOLE_SOCKET_ADDR", Option<String>);
pub static TOKIO_CONSOLE_RETENTION: LazyLock<u64> =
lazy_env_parse!("SURREAL_TOKIO_CONSOLE_RETENTION", u64, 60);