1#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
6pub struct PluginManifest {
7 pub name: String,
8 pub version: String,
9 #[serde(default)]
10 pub description: String,
11 #[serde(default)]
12 pub capabilities: Vec<PluginCapability>,
13 #[serde(default)]
15 pub requires_capabilities: Vec<PluginCapability>,
16 #[serde(default)]
17 pub provides_capabilities: Vec<PluginCapability>,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
22#[serde(rename_all = "snake_case")]
23pub enum PluginCapability {
24 Transform,
25 Middleware,
26 CacheBackend,
27 Lifecycle,
28 Auth,
29 Session,
30 Mailer,
31 Tracer,
32 Scheduled,
33 Webhook,
34 FeatureFlag,
35 Locking,
36 I18n,
37 StorageClient,
38 SearchClient,
39 AuthzPolicy,
40}
41
42#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
44pub struct WasmPluginPermissions {
45 #[serde(default)]
47 pub allowed_urls: Vec<String>,
48 #[serde(default = "default_storage_quota")]
50 pub storage_quota_kb: u64,
51 #[serde(default = "default_max_fetch")]
53 pub max_fetch_per_minute: u32,
54 #[serde(default)]
56 pub kv_namespaces: Vec<String>,
57 #[serde(default)]
59 pub queue_names: Vec<String>,
60}
61
62fn default_storage_quota() -> u64 {
63 1024
64}
65
66fn default_max_fetch() -> u32 {
67 30
68}
69
70impl Default for WasmPluginPermissions {
71 fn default() -> Self {
72 Self {
73 allowed_urls: Vec::new(),
74 storage_quota_kb: default_storage_quota(),
75 max_fetch_per_minute: default_max_fetch(),
76 kv_namespaces: Vec::new(),
77 queue_names: Vec::new(),
78 }
79 }
80}
81
82pub mod priority {
89 pub const CORS: u32 = 100;
91 pub const RATE_LIMIT: u32 = 200;
93 pub const AUTH: u32 = 300;
95 pub const TENANT: u32 = 400;
97 pub const TRACING: u32 = 500;
99 pub const PLUGIN_DEFAULT: u32 = 600;
101}
102
103pub mod transform_priority {
105 pub const FLOW_EXTRACT: u32 = 100;
106 pub const BARREL_OPTIMIZE: u32 = 200;
107 pub const FONT_OPTIMIZE: u32 = 250;
108 pub const IMPORT_STRIP: u32 = 300;
109 pub const SHIM_INJECT: u32 = 350;
110 pub const CSS_MODULE: u32 = 400;
111 pub const ENV_INLINE: u32 = 500;
112 pub const SERVER_BOUNDARY: u32 = 600;
113 pub const CACHE_DIRECTIVE: u32 = 700;
114 pub const PLUGIN_DEFAULT: u32 = 1000;
116}
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
120#[serde(rename_all = "snake_case")]
121pub enum SandboxType {
122 Wasm,
125 QuickJs,
129 Nsjail,
134}
135
136#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
138pub struct SandboxPermissions {
139 #[serde(default)]
141 pub allowed_urls: Vec<String>,
142 #[serde(default = "default_storage_quota")]
144 pub storage_quota_kb: u64,
145 #[serde(default = "default_max_fetch")]
147 pub max_fetch_per_minute: u32,
148 #[serde(default = "default_max_memory_mb")]
150 pub max_memory_mb: u64,
151 #[serde(default = "default_max_time_secs")]
153 pub max_time_secs: u64,
154}
155
156fn default_max_memory_mb() -> u64 {
157 64
158}
159fn default_max_time_secs() -> u64 {
160 10
161}
162
163impl Default for SandboxPermissions {
164 fn default() -> Self {
165 Self {
166 allowed_urls: Vec::new(),
167 storage_quota_kb: default_storage_quota(),
168 max_fetch_per_minute: default_max_fetch(),
169 max_memory_mb: default_max_memory_mb(),
170 max_time_secs: default_max_time_secs(),
171 }
172 }
173}
174
175pub mod fuel {
177 pub const ON_REQUEST_COMPLETE: u64 = 100_000_000;
178 pub const ON_CACHE_WRITE: u64 = 50_000_000;
179 pub const ON_CACHE_INVALIDATE: u64 = 50_000_000;
180 pub const ON_RELOAD: u64 = 200_000_000;
181 pub const ON_SERVER_START: u64 = 500_000_000;
182 pub const CLEANUP: u64 = 100_000_000;
183}