use std::{collections::HashSet, path::PathBuf};
use serde::{Deserialize, Serialize};
use crate::Size;
const DEFAULT_MEMORY_LIMIT: u32 = 512; const DEFAULT_TABLE_SIZE_LIMIT: u32 = 2500;
const DEFAULT_MAX_IMPORTS: usize = 100;
const DEFAULT_MAX_FUNCTIONS: usize = 20_000;
const DEFAULT_MAX_FUNCTION_PARAMS: usize = 100;
const DEFAULT_MAX_TOTAL_FUNCTION_PARAMS: usize = 10_000;
const DEFAULT_MAX_FUNCTION_RESULTS: usize = 1;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Config {
pub wasm_limits: WasmLimits,
pub cache: CacheOptions,
}
impl Config {
pub fn new(cache: CacheOptions) -> Self {
Self {
wasm_limits: WasmLimits::default(),
cache,
}
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct WasmLimits {
pub initial_memory_limit_pages: Option<u32>,
pub table_size_limit_elements: Option<u32>,
pub max_imports: Option<usize>,
pub max_functions: Option<usize>,
pub max_function_params: Option<usize>,
pub max_total_function_params: Option<usize>,
pub max_function_results: Option<usize>,
}
impl WasmLimits {
pub fn initial_memory_limit_pages(&self) -> u32 {
self.initial_memory_limit_pages
.unwrap_or(DEFAULT_MEMORY_LIMIT)
}
pub fn table_size_limit_elements(&self) -> u32 {
self.table_size_limit_elements
.unwrap_or(DEFAULT_TABLE_SIZE_LIMIT)
}
pub fn max_imports(&self) -> usize {
self.max_imports.unwrap_or(DEFAULT_MAX_IMPORTS)
}
pub fn max_functions(&self) -> usize {
self.max_functions.unwrap_or(DEFAULT_MAX_FUNCTIONS)
}
pub fn max_function_params(&self) -> usize {
self.max_function_params
.unwrap_or(DEFAULT_MAX_FUNCTION_PARAMS)
}
pub fn max_total_function_params(&self) -> usize {
self.max_total_function_params
.unwrap_or(DEFAULT_MAX_TOTAL_FUNCTION_PARAMS)
}
pub fn max_function_results(&self) -> usize {
self.max_function_results
.unwrap_or(DEFAULT_MAX_FUNCTION_RESULTS)
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[non_exhaustive]
pub struct CacheOptions {
pub base_dir: PathBuf,
pub available_capabilities: HashSet<String>,
pub memory_cache_size_bytes: Size,
pub instance_memory_limit_bytes: Size,
}
impl CacheOptions {
pub fn new(
base_dir: impl Into<PathBuf>,
available_capabilities: impl Into<HashSet<String>>,
memory_cache_size_bytes: Size,
instance_memory_limit_bytes: Size,
) -> Self {
Self {
base_dir: base_dir.into(),
available_capabilities: available_capabilities.into(),
memory_cache_size_bytes,
instance_memory_limit_bytes,
}
}
}