mlua-batteries
Batteries-included standard library modules for mlua.
Lua 5.4 scripts gain access to JSON, environment variables, filesystem, HTTP, hashing, LLM chat completion, structured async tasks, and SQLite-backed storage — all behind a configurable policy layer that can sandbox untrusted code.
Core modules (json, env, path, time, fs, http, hash, llm, string, regex, validate, log, uuid, base64, schema, sandbox) are synchronous (blocking) and require no async runtime. The optional task / sql / kv modules require a tokio current-thread runtime driving a LocalSet (see the Async modules section).
Modules
| Module | Feature flag | Description |
|---|---|---|
json |
json |
JSON encode / decode (serde_json) |
env |
env |
Environment variable access (overlay-safe set) |
path |
path |
Path manipulation (pure computation + absolute) |
time |
time |
Timestamps, sleep, measure |
string |
string |
String utilities beyond Lua's built-ins |
regex |
regex |
Regex match / replace (regex crate) |
validate |
validate |
Lightweight value validation helpers |
log |
log |
Bridge to the host's log facade |
uuid |
uuid |
UUID v4 / v7 generation |
base64 |
base64 |
Base64 encode / decode |
fs |
fs |
File I/O, walk, glob, rename, symlink (Unix) (walkdir + globset) |
http |
http |
HTTP client (ureq) |
hash |
hash |
SHA-256 hashing (sha2) |
llm |
llm |
Chat completion — OpenAI, Anthropic, Ollama |
schema |
schema |
JSON Schema validation (schema-bridge) |
sandbox |
sandbox |
Capability-based filesystem sandbox (cap-std) |
proc |
proc |
Typed argv pipeline spawn — no shell involved |
watch |
watch |
Filesystem versioning watcher — content-addressed store + JSONL journal (notify) |
task |
task |
Structured async tasks with cooperative cancellation (requires tokio) |
sql |
sql |
SQLite bridge via rusqlite-isle (thread-isolated connection) |
kv |
kv |
SQLite-backed key-value store (namespace-scoped) |
Default features: json, env, path, time, string, validate, sqlite-bundled (inert unless sql is enabled).
Enable everything: full.
Quick start
[]
= "0.3"
use *;
let lua = new;
register_all.unwrap;
lua.load.exec.unwrap;
Per-module registration
For integration with mlua-pkg or custom loaders:
for in module_entries
Sandboxing
The default configuration uses Unrestricted policies — Lua scripts can access any file, URL, and env var. For untrusted scripts, use Sandboxed (requires the sandbox feature):
[]
= { = "0.3", = ["full"] }
use *;
use Config;
use Sandboxed;
let lua = new;
let config = builder
.path_policy
.max_walk_depth
.build
.expect;
register_all_with.unwrap;
Policy layers
| Policy | Controls | Built-in options |
|---|---|---|
PathPolicy |
Filesystem access | Unrestricted, Sandboxed (cap-std) |
HttpPolicy |
Outbound URLs | Unrestricted |
EnvPolicy |
Env var read/write | Unrestricted |
LlmPolicy |
LLM provider/model access | Unrestricted |
All policies are trait objects — implement the trait to create custom policies.
LLM module
Built-in providers: OpenAI, Anthropic, Ollama. API keys are read from environment variables (OPENAI_API_KEY, ANTHROPIC_API_KEY).
local resp = std..
print
-- Batch parallel requests
local results = std..
Custom providers can be registered via mlua_batteries::llm::register_provider.
Async modules
task, sql, and kv are async-first and require a tokio current-thread runtime driving a LocalSet. They are not part of the default feature set — opt in explicitly.
[]
= { = "0.4", = ["task", "sql", "kv"] }
= { = "1", = ["rt", "macros"] }
taskprovides structured concurrency primitives (spawn,scope,with_timeout,sleep,checkpoint) with cooperative, level-triggered cancellation.with_timeoutapplies a 3-stage graceful-abort pattern (deadline → drain undergrace_ms→ hard-abort).sqlis a SQLite bridge overrusqlite-isle. The host owns theAsyncIsle(and theAsyncIsleDriverthat shuts its thread down) and passes a clone of the handle; statements run on the isle's connection thread, and cancel integrates with the enclosing scope by dropping the job, which the isle turns intosqlite3_interrupt.kvis a namespace-scoped key-value store backed by a SQLite table on a host-supplied isle. Writes run underBEGIN IMMEDIATE; durability and atomicity come from SQLite's WAL journal. Registration isasyncbecause the__kvtable is created through the isle.
use AsyncIsle;
let = open_in_memory.await?;
register?;
register.await?;
SQLite version track
libsqlite3-sys declares links = "sqlite3", so a build graph can hold exactly one of its major versions — and cargo enforces that when it resolves dependencies, so no crate can offer several clusters behind mutually exclusive features. Each release line of this crate therefore tracks one cluster, the same way rusqlite-isle does:
mlua-batteries |
rusqlite-isle |
rusqlite |
libsqlite3-sys |
|---|---|---|---|
0.4 |
0.5 | 0.37 | 0.35 |
Pick the line whose cluster your other rusqlite-dependent crates already sit on. The bridges name the stack only through mlua_batteries::sqlite_backend, which re-exports the active rusqlite and rusqlite_isle — hosts can wire everything through that re-export instead of declaring a second, separately-versioned dependency.
sqlite-bundled (on by default) forwards to rusqlite/bundled; use default-features = false to link the system SQLite instead.
See the module-level rustdoc on src/task/mod.rs, src/sql.rs, and src/kv.rs for the full API and wiring contract.
Configuration
Config::builder() exposes all tunable limits:
| Setting | Default | Description |
|---|---|---|
max_walk_depth |
256 | Max directory depth for fs.walk |
max_walk_entries |
10,000 | Max entries from fs.walk / fs.glob |
max_json_depth |
128 | Max nesting depth for JSON |
http_timeout |
30s | Default HTTP request timeout |
max_response_bytes |
10 MiB | Max HTTP response body size |
max_sleep_secs |
86,400 | Max time.sleep duration |
llm_default_timeout_secs |
120 | Default LLM request timeout |
llm_max_response_bytes |
10 MiB | Max LLM response body size |
llm_max_batch_concurrency |
8 | Max threads for llm.batch |
Platform support
Unix only (Linux, macOS). Windows is not a supported target.
All path arguments are UTF-8. Non-UTF-8 Lua strings are rejected at the FromLua boundary.
MSRV
Rust 1.77 or later.
Contributing
Bug reports and feature requests are welcome — please open an issue. Pull requests are also appreciated.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.