use crate::iam::file::extract_allowed_paths;
use std::path::PathBuf;
use std::sync::LazyLock;
pub const ID_CHARS: [char; 36] = [
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
];
pub const SERVER_NAME: &str = "SurrealDB";
pub const PROTECTED_PARAM_NAMES: &[&str] = &["access", "auth", "token", "session"];
#[cfg(not(target_family = "wasm"))]
pub static MAX_CONCURRENT_TASKS: LazyLock<usize> =
lazy_env_parse!("SURREAL_MAX_CONCURRENT_TASKS", usize, 64);
pub static MAX_COMPUTATION_DEPTH: LazyLock<u32> =
lazy_env_parse!("SURREAL_MAX_COMPUTATION_DEPTH", u32, 120);
pub static MAX_OBJECT_PARSING_DEPTH: LazyLock<u32> =
lazy_env_parse!("SURREAL_MAX_OBJECT_PARSING_DEPTH", u32, 100);
pub static MAX_QUERY_PARSING_DEPTH: LazyLock<u32> =
lazy_env_parse!("SURREAL_MAX_QUERY_PARSING_DEPTH", u32, 20);
pub static REGEX_CACHE_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_REGEX_CACHE_SIZE", usize, 1_000);
pub static TRANSACTION_CACHE_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_TRANSACTION_CACHE_SIZE", usize, 10_000);
pub static DATASTORE_CACHE_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_DATASTORE_CACHE_SIZE", usize, 1_000);
pub static NORMAL_FETCH_SIZE: LazyLock<u32> =
lazy_env_parse!("SURREAL_NORMAL_FETCH_SIZE", u32, 500);
pub static EXPORT_BATCH_SIZE: LazyLock<u32> =
lazy_env_parse!("SURREAL_EXPORT_BATCH_SIZE", u32, 1000);
pub static COUNT_BATCH_SIZE: LazyLock<u32> =
lazy_env_parse!("SURREAL_COUNT_BATCH_SIZE", u32, 10_000);
pub static MAX_ORDER_LIMIT_PRIORITY_QUEUE_SIZE: LazyLock<u32> =
lazy_env_parse!("SURREAL_MAX_ORDER_LIMIT_PRIORITY_QUEUE_SIZE", u32, 1000);
pub static INDEXING_BATCH_SIZE: LazyLock<u32> =
lazy_env_parse!("SURREAL_INDEXING_BATCH_SIZE", u32, 250);
pub static SCRIPTING_MAX_STACK_SIZE: LazyLock<usize> =
lazy_env_parse!("SURREAL_SCRIPTING_MAX_STACK_SIZE", usize, 256 * 1024);
pub static SCRIPTING_MAX_MEMORY_LIMIT: LazyLock<usize> =
lazy_env_parse!("SURREAL_SCRIPTING_MAX_MEMORY_LIMIT", usize, 2 << 20);
pub static SCRIPTING_MAX_TIME_LIMIT: LazyLock<usize> =
lazy_env_parse!("SURREAL_SCRIPTING_MAX_TIME_LIMIT", usize, 1000 * 5);
pub static MAX_HTTP_IDLE_CONNECTIONS_PER_HOST: LazyLock<usize> =
lazy_env_parse!("SURREAL_MAX_HTTP_IDLE_CONNECTIONS_PER_HOST", usize, 128);
pub static MAX_HTTP_IDLE_CONNECTIONS: LazyLock<usize> =
lazy_env_parse!("SURREAL_MAX_HTTP_IDLE_CONNECTIONS", usize, 1000);
pub static HTTP_IDLE_TIMEOUT_SECS: LazyLock<u64> =
lazy_env_parse!("SURREAL_HTTP_IDLE_TIMEOUT_SECS", u64, 90);
pub static HTTP_CONNECT_TIMEOUT_SECS: LazyLock<u64> =
lazy_env_parse!("SURREAL_HTTP_CONNECT_TIMEOUT_SECS", u64, 30);
pub static INSECURE_FORWARD_ACCESS_ERRORS: LazyLock<bool> =
lazy_env_parse!("SURREAL_INSECURE_FORWARD_ACCESS_ERRORS", bool, false);
#[cfg(storage)]
pub static EXTERNAL_SORTING_BUFFER_LIMIT: LazyLock<usize> =
lazy_env_parse!("SURREAL_EXTERNAL_SORTING_BUFFER_LIMIT", usize, 50_000);
pub static GENERATION_ALLOCATION_LIMIT: LazyLock<usize> = LazyLock::new(|| {
let n = std::env::var("SURREAL_GENERATION_ALLOCATION_LIMIT")
.map(|s| s.parse::<u32>().unwrap_or(20))
.unwrap_or(20);
2usize.pow(n)
});
pub static REGEX_SIZE_LIMIT: LazyLock<usize> = LazyLock::new(|| {
std::env::var("SURREAL_REGEX_SIZE_LIMIT")
.map(|s| s.parse::<usize>().unwrap_or(10_485_760))
.unwrap_or(10_485_760)
});
pub static MAX_HTTP_REDIRECTS: LazyLock<usize> =
lazy_env_parse!("SURREAL_MAX_HTTP_REDIRECTS", usize, 10);
pub static IDIOM_RECURSION_LIMIT: LazyLock<usize> = LazyLock::new(|| {
std::env::var("SURREAL_IDIOM_RECURSION_LIMIT")
.map(|s| s.parse::<usize>().unwrap_or(256))
.unwrap_or(256)
});
pub static MEMORY_THRESHOLD: LazyLock<usize> = LazyLock::new(|| {
std::env::var("SURREAL_MEMORY_THRESHOLD")
.map(|input| {
let input = input.trim();
let split = input.find(|c: char| !c.is_ascii_digit());
let parts = match split {
Some(index) => input.split_at(index),
None => (input, ""),
};
let number = parts.0.parse::<usize>().unwrap_or_default();
let suffix = match parts.1.trim().to_lowercase().as_str() {
"" | "b" => 1,
"k" | "kb" | "kib" => 1024,
"m" | "mb" | "mib" => 1024 * 1024,
"g" | "gb" | "gib" => 1024 * 1024 * 1024,
_ => 1,
};
let bytes = number.checked_mul(suffix).unwrap_or_default();
debug!("Memory threshold guide: {input} ({bytes} bytes)");
bytes
})
.unwrap_or(0)
});
pub static FILE_ALLOWLIST: LazyLock<Vec<PathBuf>> = LazyLock::new(|| {
std::env::var("SURREAL_FILE_ALLOWLIST")
.map(|input| extract_allowed_paths(&input))
.unwrap_or_default()
});
pub static SKIP_IMPORT_SUCCESS_RESULTS: LazyLock<bool> =
LazyLock::new(|| std::env::var("SURREAL_SKIP_IMPORT_SUCCESS_RESULTS").is_ok());
pub static SURREALDB_USER_AGENT: LazyLock<String> =
LazyLock::new(|| std::env::var("SURREAL_USER_AGENT").unwrap_or("SurrealDB".to_string()));
pub static MIGRATION_TABLE_PROBE_COUNT: LazyLock<usize> =
lazy_env_parse!("SURREAL_MIGRATION_TABLE_PROBE_COUNT", usize, 1024);