#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct PluginManifest {
pub name: String,
pub version: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub capabilities: Vec<PluginCapability>,
#[serde(default)]
pub requires_capabilities: Vec<PluginCapability>,
#[serde(default)]
pub provides_capabilities: Vec<PluginCapability>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PluginCapability {
Transform,
Middleware,
CacheBackend,
Lifecycle,
Auth,
Session,
Mailer,
Tracer,
Scheduled,
Webhook,
FeatureFlag,
Locking,
I18n,
StorageClient,
SearchClient,
AuthzPolicy,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct WasmPluginPermissions {
#[serde(default)]
pub allowed_urls: Vec<String>,
#[serde(default = "default_storage_quota")]
pub storage_quota_kb: u64,
#[serde(default = "default_max_fetch")]
pub max_fetch_per_minute: u32,
#[serde(default)]
pub kv_namespaces: Vec<String>,
#[serde(default)]
pub queue_names: Vec<String>,
}
fn default_storage_quota() -> u64 {
1024
}
fn default_max_fetch() -> u32 {
30
}
impl Default for WasmPluginPermissions {
fn default() -> Self {
Self {
allowed_urls: Vec::new(),
storage_quota_kb: default_storage_quota(),
max_fetch_per_minute: default_max_fetch(),
kv_namespaces: Vec::new(),
queue_names: Vec::new(),
}
}
}
pub mod priority {
pub const CORS: u32 = 100;
pub const RATE_LIMIT: u32 = 200;
pub const AUTH: u32 = 300;
pub const TENANT: u32 = 400;
pub const TRACING: u32 = 500;
pub const PLUGIN_DEFAULT: u32 = 600;
}
pub mod transform_priority {
pub const FLOW_EXTRACT: u32 = 100;
pub const BARREL_OPTIMIZE: u32 = 200;
pub const FONT_OPTIMIZE: u32 = 250;
pub const IMPORT_STRIP: u32 = 300;
pub const SHIM_INJECT: u32 = 350;
pub const CSS_MODULE: u32 = 400;
pub const ENV_INLINE: u32 = 500;
pub const SERVER_BOUNDARY: u32 = 600;
pub const CACHE_DIRECTIVE: u32 = 700;
pub const PLUGIN_DEFAULT: u32 = 1000;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SandboxType {
Wasm,
QuickJs,
Nsjail,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SandboxPermissions {
#[serde(default)]
pub allowed_urls: Vec<String>,
#[serde(default = "default_storage_quota")]
pub storage_quota_kb: u64,
#[serde(default = "default_max_fetch")]
pub max_fetch_per_minute: u32,
#[serde(default = "default_max_memory_mb")]
pub max_memory_mb: u64,
#[serde(default = "default_max_time_secs")]
pub max_time_secs: u64,
}
fn default_max_memory_mb() -> u64 {
64
}
fn default_max_time_secs() -> u64 {
10
}
impl Default for SandboxPermissions {
fn default() -> Self {
Self {
allowed_urls: Vec::new(),
storage_quota_kb: default_storage_quota(),
max_fetch_per_minute: default_max_fetch(),
max_memory_mb: default_max_memory_mb(),
max_time_secs: default_max_time_secs(),
}
}
}
pub mod fuel {
pub const ON_REQUEST_COMPLETE: u64 = 100_000_000;
pub const ON_CACHE_WRITE: u64 = 50_000_000;
pub const ON_CACHE_INVALIDATE: u64 = 50_000_000;
pub const ON_RELOAD: u64 = 200_000_000;
pub const ON_SERVER_START: u64 = 500_000_000;
pub const CLEANUP: u64 = 100_000_000;
}