Introduce the swactor engine: a swactor-owned composite that retains a selected execution substrate, drives the core runtime, and hosts the async/blocking/timer work that backs actors. Integrations receive one cloneable EngineHandle and never construct or borrow a raw Tokio runtime/handle. Engine crate (crates/engine): - The contract: spawn / spawn_blocking / timer / interval / now, a per-implementation capability model with construction-time binding (require()), and engine-owned time. The engine owns all progression; actor handlers stay synchronous and never .await. - TokioBackend owns the Tokio runtime and schedules core ticks and supporting futures on it; SteppingBackend is a single-threaded deterministic scheduler with virtual time (the non-Tokio portability proof). Core is driven through its existing tick() surface; a self-rescheduling CoreDriver is installed at construction and is the sole place permitted to call try_tick. iroh-driver: - Receives an EngineHandle instead of a raw Tokio Handle. Accepts, reads, dials, writes, endpoint construction, and teardown schedule through it; required capabilities (tasks/timers/io) are validated before the endpoint binds. Engine-hosted interval pumps drive actor-bridge, datastream, and edge ingress. myelin: - One node/orchestrator engine owns core, protocol tick injection, and transport progression; the application loop only drains integration-owned queues. Stage-shard process readers, delayed actor messages, helper stdout/stderr, prompt RPC, and CPU sampling all schedule through the engine (spawn_blocking / engine tasks / timers). - Removed the split-engine APIs: install_actor_bridge_pump(period) and spawn_protocol_ticker(period) use each component's stored engine; deleted the no-op pump_network callback and its plumbing; deleted the dashboard raw-Tokio/standalone-runtime conveniences. Enforcement: - A clippy disallowed-methods boundary forbids direct runtime/scheduling/ time/core-driving bypasses, denied in swactor-engine, iroh-driver, and myelin. Retained excluded uses (VastAI provider, provider process supervision/log capture, OS-signal/stdin/process-control sequencing) carry narrow allowances with reasons. Verification: - Engine contract + unit tests (incl. the SteppingBackend portability proof), iroh integration tests (capability rejection before binding, multi-node actor behavior), and a production execution-composition smoke test that observes engine-driven actor progress with no ambient Tokio runtime and no manual tick/pump. Workspace all-target/all-feature clippy and tests are green. Specs co-located with their crates: ENGINE_SPEC.md in crates/engine, IROH_DRIVER_SPEC.md in crates/iroh-driver. VastAI remains explicitly out of scope pending its separate redesign.
80 lines
2.2 KiB
TOML
80 lines
2.2 KiB
TOML
[workspace]
|
|
members = [
|
|
".",
|
|
"crates/engine",
|
|
"crates/bindings/python",
|
|
"crates/bindings/wasm-runtime",
|
|
"crates/process",
|
|
"crates/provisioning",
|
|
"crates/transport",
|
|
"crates/distribution",
|
|
"crates/iroh-driver",
|
|
"crates/datastream",
|
|
"crates/data-plane",
|
|
"crates/dashboard",
|
|
"apps/myelin",
|
|
"xtask",
|
|
"tools/vastai",
|
|
]
|
|
default-members = [
|
|
".",
|
|
"crates/engine",
|
|
"crates/process",
|
|
"crates/provisioning",
|
|
"crates/transport",
|
|
"crates/distribution",
|
|
"crates/iroh-driver",
|
|
"crates/datastream",
|
|
"crates/data-plane",
|
|
"crates/dashboard",
|
|
"apps/myelin",
|
|
"tools/vastai",
|
|
]
|
|
# The language bindings (python, wasm) and xtask are built on demand
|
|
# (-p / --workspace / cargo-xtask), not during normal native iteration.
|
|
exclude = ["crates/bindings/wasm-crypto", "examples"]
|
|
[workspace.dependencies]
|
|
# Centralized so every member resolves tokio with the SAME feature set.
|
|
# Without this, members declared tokio with different features, so building
|
|
# one member vs another (or `run` vs `test`) recompiled tokio each time.
|
|
tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros", "process", "io-util", "sync", "time", "net", "signal"] }
|
|
|
|
[package]
|
|
name = "swactor"
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
license = "AGPL-3.0-only"
|
|
autobenches = false
|
|
|
|
[profile.bench]
|
|
debug = true
|
|
strip = false
|
|
|
|
[lib]
|
|
crate-type = ["rlib"]
|
|
|
|
[features]
|
|
default = ["getrandom", "std"]
|
|
std = [] # OTP patterns: supervisors, registries, timers, routers
|
|
getrandom = ["dep:getrandom"]
|
|
serde = ["dep:serde"]
|
|
tracing = ["dep:tracing"]
|
|
no_random = [] # compile without access to a source of randomness
|
|
transport = [
|
|
] # transport-agnostic messaging (no mandatory deps; codec is user-provided)
|
|
wasm = ["no_random", "dep:web-time"] # browser/wasm32 target support
|
|
|
|
[dependencies]
|
|
getrandom = { version = "0.2", optional = true }
|
|
serde = { version = "1", features = ["derive"], optional = true }
|
|
tracing = { version = "0.1", optional = true }
|
|
web-time = { version = "0.2", optional = true }
|
|
crossbeam-queue = "0.3.12"
|
|
crossbeam-utils = "0.8.21"
|
|
parking_lot = "0.12"
|
|
|
|
[dev-dependencies]
|
|
criterion = { version = "0.5", features = ["html_reports"] }
|
|
proptest = "1"
|
|
proptest-state-machine = "0.3"
|
|
|