Skip to content

Commit f1ccc41

Browse files
committed
Add wasm pre-compilation and move plugins to server #73
1 parent e1a29b9 commit f1ccc41

29 files changed

+339
-193
lines changed

Cargo.lock

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Cargo.toml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ rmp-serde = { version = "1.3.0", optional = true }
2121
# Needed for migration to messagepack
2222
bincode1 = { package = "bincode", version = "1", optional = true }
2323
directories = { version = ">= 2, < 5", optional = true }
24-
html2md = { version = "0.2.14", optional = true }
25-
kuchikiki = { version = "0.8.2", optional = true }
26-
lol_html = { version = "1", optional = true }
2724
rand = { version = "0.8" }
2825
regex = "1"
2926
ring = "0.17.14"
@@ -40,11 +37,6 @@ url = "2"
4037
urlencoding = "2"
4138
ulid = "1.1.3"
4239
yrs = "0.24.0"
43-
wasmtime = { version = "39.0.1", optional = true, features = [
44-
"component-model",
45-
] }
46-
wasmtime-wasi = { version = "39.0.1", optional = true, features = ["p2"] }
47-
wasmtime-wasi-http = "39.0.1"
4840
tokio = { version = "1", features = ["rt", "macros"] }
4941
async-trait = "0.1.89"
5042
futures = "0.3.31"
@@ -57,7 +49,5 @@ ntest = "0.9"
5749

5850
[features]
5951
config = ["directories", "toml"]
60-
db = ["sled", "rmp-serde", "bincode1", "wasm-plugins"]
61-
html = ["kuchikiki", "lol_html", "html2md"]
52+
db = ["sled", "rmp-serde", "bincode1"]
6253
rdf = ["rio_api", "rio_turtle"]
63-
wasm-plugins = ["wasmtime", "wasmtime-wasi"]

lib/src/db.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ use crate::{
3030
},
3131
endpoints::{Endpoint, HandleGetContext},
3232
errors::{AtomicError, AtomicResult},
33-
plugins::{plugins, wasm},
3433
resources::PropVals,
3534
storelike::{Query, QueryResult, ResourceResponse, Storelike},
3635
values::SortableValue,
@@ -74,7 +73,7 @@ pub struct Db {
7473
/// Try not to use this directly, but use the Trees.
7574
db: sled::Db,
7675
default_agent: Arc<Mutex<Option<crate::agents::Agent>>>,
77-
/// Stores all resources. The Key is the Subject as a `string.as_bytes()`, the value a [PropVals]. Propvals must be serialized using [bincode].
76+
/// Stores all resources. The Key is the Subject as a `string.as_bytes()`, the value a [PropVals]. Propvals must be serialized using messagepack.
7877
resources: sled::Tree,
7978
/// [Tree::ValPropSub]
8079
reference_index: sled::Tree,
@@ -109,9 +108,8 @@ impl Db {
109108
let query_index = db.open_tree(Tree::QueryMembers)?;
110109
let prop_val_sub_index = db.open_tree(Tree::PropValSub)?;
111110
let watched_queries = db.open_tree(Tree::WatchedQueries)?;
112-
let class_extenders = plugins::default_class_extenders();
113111

114-
let mut store = Db {
112+
let store = Db {
115113
path: path.into(),
116114
db,
117115
default_agent: Arc::new(Mutex::new(None)),
@@ -121,14 +119,11 @@ impl Db {
121119
prop_val_sub_index,
122120
server_url,
123121
watched_queries,
124-
endpoints: plugins::default_endpoints(),
125-
class_extenders,
122+
endpoints: vec![],
123+
class_extenders: vec![],
126124
on_commit: None,
127125
};
128126

129-
let extenders = wasm::load_wasm_class_extenders(path, &store).await;
130-
store.class_extenders.extend(extenders);
131-
132127
migrate_maybe(&store).map(|e| format!("Error during migration of database: {:?}", e))?;
133128
crate::populate::populate_base_models(&store)
134129
.await
@@ -152,6 +147,20 @@ impl Db {
152147
Ok(store)
153148
}
154149

150+
pub fn add_class_extender(&mut self, class_extender: ClassExtender) -> AtomicResult<()> {
151+
self.class_extenders.push(class_extender);
152+
Ok(())
153+
}
154+
155+
pub fn add_endpoint(&mut self, endpoint: Endpoint) -> AtomicResult<()> {
156+
self.endpoints.push(endpoint);
157+
Ok(())
158+
}
159+
160+
pub fn get_endpoints(&self) -> &Vec<Endpoint> {
161+
&self.endpoints
162+
}
163+
155164
#[instrument(skip(self))]
156165
fn add_atom_to_index(
157166
&self,

lib/src/errors.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -203,17 +203,6 @@ impl From<std::string::FromUtf8Error> for AtomicError {
203203
}
204204
}
205205

206-
#[cfg(feature = "wasm-plugins")]
207-
impl From<wasmtime::Error> for AtomicError {
208-
fn from(error: wasmtime::Error) -> Self {
209-
AtomicError {
210-
message: error.to_string(),
211-
error_type: AtomicErrorType::OtherError,
212-
subject: None,
213-
}
214-
}
215-
}
216-
217206
impl From<ParseFloatError> for AtomicError {
218207
fn from(error: ParseFloatError) -> Self {
219208
AtomicError {

lib/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ pub mod errors;
7777
pub mod hierarchy;
7878
pub mod mapping;
7979
pub mod parse;
80-
#[cfg(feature = "db")]
81-
pub mod plugins;
80+
8281
pub mod populate;
8382
pub mod resources;
8483
pub mod schema;

lib/src/plugins/plugins.rs

Lines changed: 0 additions & 28 deletions
This file was deleted.

lib/src/populate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ pub async fn populate_collections(store: &impl Storelike) -> AtomicResult<()> {
318318
/// Adds default Endpoints (versioning) to the Db.
319319
/// Makes sure they are fetchable
320320
pub async fn populate_endpoints(store: &crate::Db) -> AtomicResult<()> {
321-
let endpoints = crate::plugins::plugins::default_endpoints();
321+
let endpoints = store.get_endpoints();
322322
let endpoints_collection = format!("{}/endpoints", store.get_server_url()?);
323323
for endpoint in endpoints {
324324
let mut resource = endpoint.to_resource(store).await?;

server/Cargo.toml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ ureq = "2"
5454
urlencoding = "2"
5555
ring = "0.17.14"
5656
yrs = "0.24.0"
57+
wasmtime = { version = "39.0.1", optional = true, features = [
58+
"component-model",
59+
] }
60+
wasmtime-wasi = { version = "39.0.1", optional = true, features = ["p2"] }
61+
wasmtime-wasi-http = { version = "39.0.1", optional = true }
62+
url = "2.5.7"
63+
html2md = { version = "0.2.14" }
64+
kuchikiki = { version = "0.8.2" }
65+
lol_html = { version = "1" }
5766

5867
[dependencies.instant-acme]
5968
optional = true
@@ -95,7 +104,7 @@ version = "4.4"
95104
version = ">= 4.0.1"
96105

97106
[dependencies.atomic_lib]
98-
features = ["config", "db", "rdf", "html"]
107+
features = ["config", "db", "rdf"]
99108
path = "../lib"
100109
version = "0.40.0"
101110

@@ -135,6 +144,7 @@ actix-rt = "2"
135144
assert_cmd = "2"
136145

137146
[features]
147+
default = ["https", "telemetry", "img", "wasm-plugins"]
138148
telemetry = [
139149
"tracing-opentelemetry",
140150
"opentelemetry",
@@ -144,8 +154,8 @@ telemetry = [
144154
"opentelemetry_sdk/rt-tokio", # 👈 important for batching
145155
]
146156
img = ["webp", "image"]
147-
default = ["https", "telemetry", "img"]
148157
https = ["rustls", "instant-acme", "rcgen", "rustls-pemfile"]
158+
wasm-plugins = ["wasmtime", "wasmtime-wasi", "wasmtime-wasi-http"]
149159

150160
[lib]
151161
name = "atomic_server_lib"

server/src/appstate.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::{
33
commit_monitor::CommitMonitor,
44
config::Config,
55
errors::AtomicServerResult,
6+
plugins,
67
search::SearchState,
78
y_sync_broadcaster::{self, YSyncBroadcaster},
89
};
@@ -13,6 +14,7 @@ use atomic_lib::{
1314
Storelike,
1415
};
1516

17+
use crate::plugins::wasm;
1618
/// The AppState contains all the relevant Context for the server.
1719
/// This data object is available to all handlers and actors.
1820
/// Contains the store, configuration and addresses for Actix Actors, such as for the [CommitMonitor].
@@ -47,6 +49,36 @@ impl AppState {
4749
}
4850

4951
let mut store = atomic_lib::Db::init(&config.store_path, config.server_url.clone()).await?;
52+
53+
// Register all built-in class extenders
54+
store.add_class_extender(plugins::collections::build_collection_extender())?;
55+
store.add_class_extender(plugins::chatroom::build_chatroom_extender())?;
56+
store.add_class_extender(plugins::chatroom::build_message_extender())?;
57+
store.add_class_extender(plugins::invite::build_invite_extender())?;
58+
59+
// Register all built-in endpoints
60+
store.add_endpoint(plugins::versioning::version_endpoint())?;
61+
store.add_endpoint(plugins::versioning::all_versions_endpoint())?;
62+
store.add_endpoint(plugins::bookmark::bookmark_endpoint())?;
63+
store.add_endpoint(plugins::files::upload_endpoint())?;
64+
store.add_endpoint(plugins::files::download_endpoint())?;
65+
store.add_endpoint(plugins::export::export_endpoint())?;
66+
store.add_endpoint(plugins::path::path_endpoint())?;
67+
store.add_endpoint(plugins::importer::import_endpoint())?;
68+
#[cfg(debug_assertions)]
69+
store.add_endpoint(plugins::prunetests::prune_tests_endpoint())?;
70+
store.add_endpoint(plugins::query::query_endpoint())?;
71+
store.add_endpoint(plugins::search::search_endpoint())?;
72+
73+
// Get and register Wasm class extender plugins
74+
let extenders =
75+
wasm::load_wasm_class_extenders(&config.plugin_path, &config.plugin_cache_path, &store)
76+
.await;
77+
78+
for extender in extenders {
79+
store.add_class_extender(extender)?;
80+
}
81+
5082
let no_server_resource = store.get_resource(&config.server_url).await.is_err();
5183
if no_server_resource {
5284
tracing::warn!("Server URL resource not found. This is likely because the server URL has changed. Initializing a new database...");

server/src/bin.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ mod helpers;
1313
#[cfg(feature = "https")]
1414
mod https;
1515
mod jsonerrors;
16+
pub mod plugins;
1617
mod routes;
1718
pub mod serve;
1819
mod y_sync_broadcaster;

0 commit comments

Comments
 (0)