Mount the writable world root for every actor
ci / check (push) Successful in 3m9s

This commit is contained in:
Sausage Agent
2026-10-22 13:29:38 +00:00
parent 3d3f6f35fb
commit f932ab9719
6 changed files with 103 additions and 42 deletions
+13 -8
View File
@@ -3,13 +3,14 @@
//! watches the folder (`watch.rs`).
//!
//! ```text
//! <world>/
//! <world>/ mounted at /, readable and writable by every actor
//! config/ global configuration by convention (no secrets)
//! actor/<id>/
//! actor.wasm the current version
//! actor.json version, running, subscriptions, tapped, watches (broker)
//! source/ source of the current version
//! public/ written by the actor, read-only for others
//! data/ state, writable only by the actor
//! public/ published files, readable and writable by everyone
//! data/ state, readable and writable by everyone
//! stderr.log stderr of the actor and notes of the broker
//! versions/<n>/ every version that was installed: actor.wasm, source/, meta.json
//! ```
@@ -131,6 +132,7 @@ impl World {
for id in NATIVE {
world.ensure_actor_dirs(id)?;
}
std::fs::create_dir_all(world.root.join("config"))?;
Ok(world)
}
@@ -191,8 +193,8 @@ impl World {
/// Map a path in an actor's namespace to a host path.
///
/// - `/actor/<id>/...` is the global filesystem.
/// - `/public/...` and `/data/...` belong to `sender`.
/// - Absolute paths are relative to the world root.
/// - `/public/...` and `/data/...` alias `sender`'s folders.
/// - Native senders (the console) can also give absolute host paths.
pub fn resolve(&self, sender: &str, path: &str) -> Result<PathBuf> {
let under = |base: PathBuf, rest: &str| -> Result<PathBuf> {
@@ -221,13 +223,16 @@ impl World {
if NATIVE.contains(&sender) && Path::new(path).is_absolute() {
return Ok(PathBuf::from(path));
}
bail!("cannot resolve path {path} for {sender}: use /actor/<id>/..., /public/... or /data/...")
if Path::new(path).is_absolute() {
return under(self.root.clone(), path);
}
bail!("cannot resolve path {path} for {sender}: use an absolute world path")
}
/// The path of a host file in the global filesystem, if it has one.
pub fn global_path(&self, host: &Path) -> Option<String> {
let rel = host.strip_prefix(self.actors_root()).ok()?;
Some(format!("/actor/{}", rel.display()))
let rel = host.strip_prefix(&self.root).ok()?;
Some(format!("/{}", rel.display()))
}
}