use std::time::Duration;
use tinysandbox::sandbox::{Limits, Sandbox};
#[tokio::main]
async fn main() {
let sandbox = Sandbox::builder()
.persist_session(true)
.limits(Limits {
wasm_memory_bytes: 32 * 1024 * 1024,
..Limits::default()
})
.build();
sandbox
.exec(concat!(
"mkdir -p /app && cd /app && ",
r#"echo 'exports.stats = (text) => {
const words = text.split(/\s+/).filter(Boolean)
return { words: words.length, unique: new Set(words).size }
}' > helper.js"#,
))
.await;
sandbox
.exec(
r#"echo 'const fs = require("fs")
const { stats } = require("./helper.js")
const text = fs.readFileSync(process.argv[2], "utf8")
const result = stats(text)
console.log(JSON.stringify(result))
fs.writeFileSync("/app/stats.json", JSON.stringify(result))' > main.js"#,
)
.await;
sandbox
.exec("echo 'the quick brown fox jumps over the lazy dog' > input.txt")
.await;
let result = sandbox.exec("js main.js input.txt").await;
print!("stdout: {}", result.stdout);
assert_eq!(result.exit_code, 0);
assert_eq!(result.stdout, "{\"words\":9,\"unique\":8}\n");
let result = sandbox.exec("cat /app/stats.json | wc -c").await;
print!("stats.json bytes: {}", result.stdout);
let result = sandbox.exec("js -e 'console.log(6 * 7)'").await;
println!(
"js -e output: {}peak wasm memory: {:?} bytes",
result.stdout, result.metrics.peak_wasm_memory_bytes
);
let impatient = Sandbox::builder()
.limits(Limits {
wall_time: Duration::from_secs(2),
..Limits::default()
})
.build();
let result = impatient.exec("js -e 'while (true) {}'").await;
println!("runaway script exit code: {}", result.exit_code);
assert_eq!(result.exit_code, 124);
}