jevsnes.git / third-party / rust / Cargo.toml
1[package]
2name = "rust-third-party"
3version = "0.0.0"
4edition = "2024"
5publish = false
6
7[lib]
8path = "top/lib.rs"

reindeer reads this manifest to generate the Buck2 third-party graph.

11[dependencies]

bot.log rotation (apps/native): a dedicated pipe-reading thread owns the file, so rotation can never race the C bot's own printf.

14file-rotate = "0.7"
15snes-core = { path = "jgenesis/backend/snes-core" }
16jgenesis-common = { path = "jgenesis/common/jgenesis-common" }
17snes-config = { path = "jgenesis/config/snes-config" }

SaveWriter's serialized methods are generic over bincode's traits, so an implementor names them. Same major as jgenesis, so one copy in the graph.

2.0.1 is the last bincode that compiles. 3.0.0 on crates.io is a tombstone: a README announcing the crate is unmaintained and a lib.rs that is one compile_error! (downloaded and read 2026-09-20). Leaving bincode means jgenesis leaving it first, since these are ITS trait bounds.

25bincode = "2"

The native window (and later the web page): one immediate-mode UI that builds for both. wgpu rather than glow so the picture path is the same API on desktop (Vulkan/GL) and in the browser (WebGPU/WebGL2).

30eframe = { version = "0.36", default-features = false, features = ["wgpu", "default_fonts", "wayland", "x11"] }
31egui = "0.36"

Audio out. pulseaudio is cpal's pure-Rust PulseAudio client, and cpal prefers it over ALSA when it answers: WSLg's sound server IS PulseAudio ($PULSE_SERVER), and nothing on this host routes ALSA into it.

35cpal = { version = "0.18", features = ["pulseaudio"] }

The emulator thread of control fills this and cpal's realtime callback drains it; a callback must never block, so the queue is lock-free. This is the crate cpal's own feedback example uses.

39ringbuf = "0.5"

Color is repr(C) and Pod, so a frame IS its RGBA bytes; this is how that gets said without a copy. Already in the graph through jgenesis.

42bytemuck = "1"

The core's own CRC crate, for naming the cartridge a snapshot belongs to.

44crc = "3.4.0"

Server: the window, over HTTP, and native mcp, over stdio. Client: what native mcp reaches the window with. reqwest comes in without a TLS stack, which loopback does not need.

48rmcp = { version = "3.4.0", default-features = false, features = ["server", "client", "macros", "transport-streamable-http-server", "transport-streamable-http-client-reqwest", "transport-io"] }

SessionStore is an async trait in rmcp's terms. Already in the graph through rmcp.

51async-trait = "0.1.92"
52tokio = { version = "1.53.1", features = ["rt", "net", "sync", "macros", "time", "io-util"] }
53axum = { version = "0.8.9", default-features = false, features = ["http1", "tokio"] }

Jev: ~/jevcrates, as the git submodule beside this file, pinned by its gitlink. jev-http speaks HTTP/2 itself over rustls with the RustCrypto provider - pure Rust, no C, no cmake, the same choice ~/dashboard's HTTPS transport makes - and the compiled-in Mozilla roots, not /etc/ssl. packages/mcp names rustls and the provider directly as well.

59jev-protocol = { path = "jevcrates/jev-protocol" }
60jev-client = { path = "jevcrates/jev-client" }
61jev-http = { path = "jevcrates/jev-http" }
62rustls = { version = "0.23", default-features = false, features = ["std", "tls12"] }
63rustls-rustcrypto = { git = "https://github.com/RustCrypto/rustls-rustcrypto", branch = "master" }
65serde = { version = "1.0.229", features = ["derive"] }
66serde_json = "1.0.151"
67schemars = "1.2.2"
68png = "0.18.1"

zstd over packages/replay's XOR keyframe deltas. ruzstd is a pure-Rust zstd (real zstd frames), so no C and no cmake, the same reasoning as the TLS stack above. Its encoder implements only Fastest (about zstd level 1), which is enough on deltas that are mostly zero. Already in the graph through object, so this adds no crate.

74ruzstd = "0.8"
75base64 = "0.23.1"

Subsecond hot-patching (see research/subsecond-patch-build.md): subsecond is what a patched-in-place binary links (call/try_call/apply_patch/ aslr_reference); subsecond-types is the JumpTable the patch tool serializes and the running binary deserializes. Pinned to the newest 0.7.x (0.8 is alpha-only on crates.io as of 2026-09-20).

82subsecond = "0.7.10"
83subsecond-types = "0.7.10"

tools/hotpatch builds the stub object + jump table with these: object for reading/writing ELF symbol tables (same crate dx itself uses, packages/cli/Cargo.toml), ar for pulling .o members out of a .rlib when a patch spans more than the tip crate, libc to reset SIGPIPE (code-rust.md's CLI hygiene rule) - already in the graph transitively via subsecond, named here directly so it gets a plain third-party alias.

90object = { version = "0.37", features = ["read", "write"] }
91ar = "0.9"
92libc = "0.2"

Path dependencies inside a workspace root become its members automatically, which would make cargo resolve jgenesis's workspace = true keys against THIS manifest. Excluding the trees leaves them under their own workspace roots.

97[workspace]
98exclude = ["jgenesis", "jevcrates"]