[package] name = "echoircd" version = "5.0.0" edition = "2021" description = "A small, dependency-light IRC daemon in Rust with a modular command/mode/module API." license = "MIT" [[bin]] name = "echoircd" path = "src/main.rs" [lib] name = "echoircd" path = "src/lib.rs" [dependencies] # SIGHUP → config rehash, without unsafe (the crate keeps signal setup internal). signal-hook = "0.3" # TLS backend: openssl. The crate keeps all `unsafe` internal, so the daemon # stays `#![forbid(unsafe_code)]`. A pure-Rust `rustls` backend can slot in beside it. openssl = "0.10" # epoll/kqueue reactor for the client socket engine — a minimal readiness layer # (no async runtime). Lets one thread drive tens of thousands of connections # instead of 2 OS threads per client. Its `unsafe` stays internal (like openssl). mio = { version = "1", features = ["os-poll", "net"] } # aHash — DoS-resistant (random-seeded) hasher, ~2-3x faster than SipHash on the # small keys the router hammers (uid/nick/channel lookups). See crate::map. ahash = "0.8" # mimalloc — global allocator; big throughput win on the many-small-String churn # of per-message formatting. `unsafe` stays internal to the crate. mimalloc = "0.1" # SIMD byte search — accelerates the newline scan in the line framer. memchr = "2" # Pure-Rust TLS backend, opt-in via `tls_backend = rustls` (default stays openssl). # ring provider (no aws-lc-rs); its `unsafe` stays internal like every other crate. rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12", "logging"] } rustls-pemfile = "2" [dev-dependencies] # integration tests spawn the built binary and act as a TLS client against it openssl = "0.10" # property-based fuzzing (parsers) + deterministic S2S simulation (convergence). proptest = "1" [profile.release] opt-level = 3 lto = "fat" # cross-crate inlining — the router/format hot paths inline through mio/openssl codegen-units = 1 # one unit = best optimisation (slower build, faster binary) panic = "unwind" # REQUIRED: the core isolates handler panics with catch_unwind