feat(dev-server): add development-only HTTP API for programmatic access

feat(Cargo.toml): add axum as a dependency with dev-server feature
fix(package.json): update tauri script to include dev-server option
This commit is contained in:
cloudwithax 2026-02-15 12:37:42 -05:00
parent 1940bb3fbf
commit 718bd9557e
5 changed files with 1183 additions and 1 deletions

View File

@ -7,7 +7,8 @@
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"preview": "vite preview", "preview": "vite preview",
"tauri": "WEBKIT_DISABLE_DMABUF_RENDERER=1 GDK_BACKEND=x11 tauri" "tauri": "WEBKIT_DISABLE_DMABUF_RENDERER=1 GDK_BACKEND=x11 tauri",
"tauri:dev-server": "WEBKIT_DISABLE_DMABUF_RENDERER=1 GDK_BACKEND=x11 tauri dev -- -- --features dev-server"
}, },
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

94
src-tauri/Cargo.lock generated
View File

@ -300,6 +300,61 @@ dependencies = [
"uuid", "uuid",
] ]
[[package]]
name = "axum"
version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
dependencies = [
"async-trait",
"axum-core",
"bytes",
"futures-util",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"hyper 1.8.1",
"hyper-util",
"itoa",
"matchit",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"rustversion",
"serde",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tower",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "axum-core"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
dependencies = [
"async-trait",
"bytes",
"futures-util",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"mime",
"pin-project-lite",
"rustversion",
"sync_wrapper",
"tower-layer",
"tower-service",
"tracing",
]
[[package]] [[package]]
name = "base-x" name = "base-x"
version = "0.2.11" version = "0.2.11"
@ -1107,6 +1162,7 @@ name = "dusk-chat"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"automerge", "automerge",
"axum",
"bs58", "bs58",
"directories", "directories",
"dotenvy", "dotenvy",
@ -2056,6 +2112,7 @@ dependencies = [
"http 1.4.0", "http 1.4.0",
"http-body 1.0.1", "http-body 1.0.1",
"httparse", "httparse",
"httpdate",
"itoa", "itoa",
"pin-project-lite", "pin-project-lite",
"pin-utils", "pin-utils",
@ -3193,6 +3250,12 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
[[package]]
name = "matchit"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.8.0" version = "2.8.0"
@ -4751,6 +4814,12 @@ dependencies = [
"static_assertions", "static_assertions",
] ]
[[package]]
name = "ryu"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]] [[package]]
name = "same-file" name = "same-file"
version = "1.0.6" version = "1.0.6"
@ -4911,6 +4980,17 @@ dependencies = [
"zmij", "zmij",
] ]
[[package]]
name = "serde_path_to_error"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
dependencies = [
"itoa",
"serde",
"serde_core",
]
[[package]] [[package]]
name = "serde_repr" name = "serde_repr"
version = "0.1.20" version = "0.1.20"
@ -4940,6 +5020,18 @@ dependencies = [
"serde_core", "serde_core",
] ]
[[package]]
name = "serde_urlencoded"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
dependencies = [
"form_urlencoded",
"itoa",
"ryu",
"serde",
]
[[package]] [[package]]
name = "serde_with" name = "serde_with"
version = "3.16.1" version = "3.16.1"
@ -5924,6 +6016,7 @@ dependencies = [
"tokio", "tokio",
"tower-layer", "tower-layer",
"tower-service", "tower-service",
"tracing",
] ]
[[package]] [[package]]
@ -5962,6 +6055,7 @@ version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [ dependencies = [
"log",
"pin-project-lite", "pin-project-lite",
"tracing-attributes", "tracing-attributes",
"tracing-core", "tracing-core",

View File

@ -58,6 +58,12 @@ dotenvy = "0.15"
# async utilities # async utilities
futures = "0.3" futures = "0.3"
# dev-only http api (behind feature flag, never in production)
axum = { version = "0.7", optional = true }
[features]
dev-server = ["axum"]
# platform-specific: webview media permissions on linux # platform-specific: webview media permissions on linux
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(target_os = "linux")'.dependencies]
webkit2gtk = "2.0" webkit2gtk = "2.0"

1062
src-tauri/src/dev_server.rs Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,7 @@
mod commands; mod commands;
mod crdt; mod crdt;
#[cfg(feature = "dev-server")]
mod dev_server;
mod node; mod node;
mod protocol; mod protocol;
mod storage; mod storage;
@ -74,6 +76,23 @@ pub fn run() {
.ok(); .ok();
} }
} }
// launch the dev http server when compiled with the dev-server feature
// available at http://127.0.0.1:3333 (or DUSK_DEV_PORT)
#[cfg(feature = "dev-server")]
{
use tauri::Manager;
let state = app.state::<AppState>();
let dev_state = dev_server::DevState {
identity: std::sync::Arc::clone(&state.identity),
crdt_engine: std::sync::Arc::clone(&state.crdt_engine),
storage: std::sync::Arc::clone(&state.storage),
node_handle: std::sync::Arc::clone(&state.node_handle),
voice_channels: std::sync::Arc::clone(&state.voice_channels),
app_handle: app.handle().clone(),
};
tauri::async_runtime::spawn(dev_server::start(dev_state));
}
Ok(()) Ok(())
}) })
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![