mod icon;
mod kubernetes;
mod machine;
mod sandbox;
mod snapshot;
pub use icon::IconServiceImpl;
pub use kubernetes::KubernetesServiceImpl;
pub use machine::MachineServiceImpl;
pub use sandbox::SandboxServiceImpl;
pub use snapshot::SandboxSnapshotServiceImpl;
use std::sync::{Arc, OnceLock};
use arcbox_core::Runtime;
use tonic::Status;
pub type SharedRuntime = Arc<OnceLock<Arc<Runtime>>>;
trait SharedRuntimeExt {
fn ready(&self) -> Result<&Arc<Runtime>, Status>;
}
impl SharedRuntimeExt for SharedRuntime {
fn ready(&self) -> Result<&Arc<Runtime>, Status> {
self.get()
.ok_or_else(|| Status::unavailable("daemon is starting, runtime not ready yet"))
}
}
trait RequestExt {
fn machine_id(&self) -> Result<String, Status>;
}
impl<T> RequestExt for tonic::Request<T> {
fn machine_id(&self) -> Result<String, Status> {
match self.metadata().get("x-machine") {
None => Err(Status::invalid_argument(
"missing x-machine metadata header",
)),
Some(value) => match value.to_str() {
Ok(s) => Ok(s.to_string()),
Err(_) => Err(Status::invalid_argument(
"invalid x-machine metadata header: must be valid UTF-8",
)),
},
}
}
}