| Crates.io | fusabi-host |
| lib.rs | fusabi-host |
| version | 0.1.0 |
| created_at | 2025-12-05 23:02:56.331045+00 |
| updated_at | 2025-12-05 23:02:56.331045+00 |
| description | Shared host/runtime utilities for Fusabi across Scarab/Tolaria/Hibana/Phage |
| homepage | |
| repository | https://github.com/fusabi-lang/fusabi-host |
| max_upload_size | |
| id | 1969367 |
| size | 198,709 |
Shared host/runtime utilities for Fusabi across Scarab, Tolaria, Hibana, and Phage.
use fusabi_host::{EnginePool, PoolConfig, Capabilities, Limits};
fn main() -> fusabi_host::Result<()> {
// Create a pool with 4 engines
let config = PoolConfig::new(4)
.with_limits(Limits::default())
.with_capabilities(Capabilities::safe_defaults());
let pool = EnginePool::new(config)?;
// Execute a script
let result = pool.execute("1 + 2")?;
println!("Result: {}", result);
Ok(())
}
| Feature | Description |
|---|---|
serde-support (default) |
Enable Value↔Serde conversion helpers |
async-runtime-tokio |
Async execution support via Tokio |
async-runtime-async-std |
Async execution support via async-std |
metrics-prometheus |
Prometheus metrics integration |
Scripts must be granted explicit capabilities for privileged operations:
use fusabi_host::{Capabilities, Capability};
// No capabilities (fully sandboxed)
let none = Capabilities::none();
// Safe defaults (time, random, stdout, logging)
let safe = Capabilities::safe_defaults();
// Full access (use with trusted code only)
let all = Capabilities::all();
// Custom capability set
let custom = Capabilities::none()
.with(Capability::FsRead)
.with(Capability::NetRequest);
Control resource consumption with configurable limits:
use fusabi_host::Limits;
use std::time::Duration;
let limits = Limits::default()
.with_timeout(Duration::from_secs(5))
.with_memory_mb(32)
.with_max_instructions(1_000_000);
// Strict limits for untrusted code
let strict = Limits::strict();
// No limits (trusted code only)
let unlimited = Limits::unlimited();
Control filesystem and network access:
use fusabi_host::sandbox::{SandboxConfig, PathPolicy, NetPolicy};
let sandbox = SandboxConfig::locked()
.with_read_paths(["/app/data"])
.with_allowed_hosts(["api.example.com", "*.trusted.org"]);
Register host functions with automatic argument conversion:
use fusabi_host::{host_fn, Engine, EngineConfig};
let mut engine = Engine::new(EngineConfig::default())?;
// Register a simple function
engine.registry_mut().register("add", host_fn!(add(a: i64, b: i64) -> i64 {
a + b
}));
// Register with context access
engine.registry_mut().register("log", host_fn!(ctx, log(msg: String) -> () {
ctx.record_output(msg.len())?;
println!("{}", msg);
Ok(())
}));
Compile Fusabi source to bytecode:
use fusabi_host::compile::{compile_source, compile_file, CompileOptions};
// Compile source string
let result = compile_source("fn main() { 42 }", &CompileOptions::default())?;
println!("Bytecode size: {} bytes", result.bytecode.len());
// Compile from file
let result = compile_file("script.fsx".as_ref(), &CompileOptions::production())?;
// Access metadata
for export in &result.metadata.exports {
println!("Export: {}", export.name);
}
This crate is aligned with Fusabi LTS releases:
| fusabi-host | Fusabi |
|---|---|
| 0.1.x | 0.18.x - 0.19.x |
See compat.md for detailed compatibility information.
Licensed under either of:
at your option.