diff --git a/Cargo.lock b/Cargo.lock index 115bf815..1fb6c32f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,7 +23,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", "version_check", "zerocopy", @@ -260,7 +260,7 @@ checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", @@ -417,6 +417,12 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -446,7 +452,7 @@ checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.3", ] [[package]] @@ -514,6 +520,7 @@ dependencies = [ "hardened_malloc-rs", "hickory-resolver", "hmac", + "hot-lib-reloader", "http", "http-body-util", "hyper", @@ -609,7 +616,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -643,7 +650,7 @@ version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "curve25519-dalek-derive", "digest", @@ -798,9 +805,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +checksum = "38793c55593b33412e3ae40c2c9781ffaa6f438f6f8c10f24e71846fbd7ae01e" [[package]] name = "figment" @@ -816,6 +823,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "windows-sys 0.52.0", +] + [[package]] name = "findshlibs" version = "0.10.2" @@ -825,7 +844,7 @@ dependencies = [ "cc", "lazy_static", "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -853,6 +872,41 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fsevent" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" +dependencies = [ + "bitflags 1.3.2", + "fsevent-sys", +] + +[[package]] +name = "fsevent-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +dependencies = [ + "libc", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags 1.3.2", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + [[package]] name = "futf" version = "0.1.5" @@ -952,7 +1006,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "libc", "wasi", @@ -1080,7 +1134,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" dependencies = [ "async-trait", - "cfg-if", + "cfg-if 1.0.0", "data-encoding", "enum-as-inner", "futures-channel", @@ -1103,7 +1157,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "futures-util", "hickory-proto", "ipconfig", @@ -1135,7 +1189,7 @@ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ "libc", "match_cfg", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1144,11 +1198,36 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "windows", ] +[[package]] +name = "hot-lib-reloader" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7767568f2f3adb7ce2926a261fd838f161f3549c1b7e64a4c67a8a4c574e8c" +dependencies = [ + "crc32fast", + "hot-lib-reloader-macro", + "libloading 0.7.4", + "log", + "notify", + "thiserror", +] + +[[package]] +name = "hot-lib-reloader-macro" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5551f8a39fa95a6b6d0cc0a8a7ccf8df4d62cc12731d5153eb64e1405e77762" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "html5ever" version = "0.26.0" @@ -1331,12 +1410,41 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "inotify" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "integer-encoding" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + [[package]] name = "ipaddress" version = "0.1.3" @@ -1395,9 +1503,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -1444,6 +1552,16 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "konst" version = "0.3.9" @@ -1482,13 +1600,23 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + [[package]] name = "libloading" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-targets 0.52.5", ] @@ -1647,6 +1775,25 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + [[package]] name = "mio" version = "0.8.11" @@ -1658,6 +1805,41 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log", + "mio 0.6.23", + "slab", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -1671,7 +1853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ "bitflags 2.5.0", - "cfg-if", + "cfg-if 1.0.0", "cfg_aliases", "libc", ] @@ -1686,6 +1868,24 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "notify" +version = "4.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" +dependencies = [ + "bitflags 1.3.2", + "filetime", + "fsevent", + "fsevent-sys", + "inotify", + "libc", + "mio 0.6.23", + "mio-extras", + "walkdir", + "winapi 0.3.9", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1693,7 +1893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1922,7 +2122,7 @@ version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", @@ -2302,7 +2502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "getrandom", "libc", "spin", @@ -2586,7 +2786,7 @@ dependencies = [ "log", "ring", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.3", "subtle", "zeroize", ] @@ -2632,9 +2832,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "f3bce581c0dd41bce533ce695a1437fa16a7ab5ac3ccfa99fe1a620a7885eabf" dependencies = [ "ring", "rustls-pki-types", @@ -2653,6 +2853,15 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.23" @@ -2952,7 +3161,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -2963,7 +3172,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -2974,7 +3183,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -3189,7 +3398,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] @@ -3301,7 +3510,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 0.8.11", "num_cpus", "pin-project-lite", "signal-hook-registry", @@ -3644,7 +3853,7 @@ dependencies = [ "once_cell", "rustls 0.22.4", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki 0.102.3", "url", "webpki-roots 0.26.1", ] @@ -3701,6 +3910,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -3722,7 +3941,7 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -3747,7 +3966,7 @@ version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -3857,6 +4076,12 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "939e59c1bc731542357fdaad98b209ef78c8743d652bb61439d16b16a79eb025" +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -3867,12 +4092,27 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -4052,7 +4292,7 @@ version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-sys 0.48.0", ] @@ -4062,10 +4302,20 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-sys 0.48.0", ] +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "xml5ever" version = "0.17.0" diff --git a/Cargo.toml b/Cargo.toml index fcfbebc2..fe565bdb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,8 @@ rust-version = "1.75.0" [dependencies] +hot-lib-reloader = { version = "^0.6", optional = true } + # Used for secure identifiers rand = "0.8.5" @@ -371,6 +373,8 @@ perf_measurements = [ "opentelemetry-jaeger", ] +hot_reload = ["dep:hot-lib-reloader"] + hardened_malloc = ["hardened_malloc-rs"] # client/server interopability hacks @@ -379,14 +383,6 @@ hardened_malloc = ["hardened_malloc-rs"] element_hacks = [] -[[bin]] -name = "conduit" -path = "src/main.rs" - -[lib] -name = "conduit" -path = "src/lib.rs" - [package.metadata.deb] name = "matrix-conduit" maintainer = "strawberry " diff --git a/src/api/server_server.rs b/src/api/server_server.rs index 12de8d45..5dda87d3 100644 --- a/src/api/server_server.rs +++ b/src/api/server_server.rs @@ -214,7 +214,7 @@ pub fn parse_incoming_pdu(pdu: &RawJsonValue) -> Result<(OwnedEventId, Canonical .ok_or(Error::BadRequest(ErrorKind::InvalidParam, "Invalid room id in pdu"))?; let Ok(room_version_id) = services().rooms.state.get_room_version(&room_id) else { - return Err(Error::Error(format!("Server is not in room {room_id}"))); + return Err(Error::Err(format!("Server is not in room {room_id}"))); }; let Ok((event_id, value)) = gen_event_id_canonical_json(pdu, &room_version_id) else { diff --git a/src/database/mod.rs b/src/database/mod.rs index 6c656426..8609bbc5 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -544,6 +544,7 @@ impl KeyValueDatabase { } } + #[allow(dead_code)] pub fn flush(&self) -> Result<()> { let start = std::time::Instant::now(); diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index e287f1cb..00000000 --- a/src/lib.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub mod api; -pub mod clap; -mod config; -mod database; -mod service; -mod utils; - -// Not async due to services() being used in many closures, and async closures -// are not stable as of writing This is the case for every other occurence of -// sync Mutex/RwLock, except for database related ones, where the current -// maintainer (Timo) has asked to not modify those -use std::sync::RwLock; - -pub use api::ruma_wrapper::{Ruma, RumaResponse}; -pub use config::Config; -pub use database::KeyValueDatabase; -pub use service::{pdu::PduEvent, Services}; -pub use utils::error::{Error, Result}; - -pub static SERVICES: RwLock>> = RwLock::new(None); - -pub fn services() -> &'static Services<'static> { - SERVICES - .read() - .unwrap() - .expect("SERVICES should be initialized when this is called") -} diff --git a/src/main.rs b/src/main.rs index 0fb161b8..89d4a341 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,8 +3,13 @@ use std::fs::Permissions; // not unix specific, just only for UNIX sockets stuff #[cfg(unix)] use std::os::unix::fs::PermissionsExt as _; /* not unix specific, just only for UNIX sockets stuff and *nix * container checks */ +// Not async due to services() being used in many closures, and async closures +// are not stable as of writing This is the case for every other occurence of +// sync Mutex/RwLock, except for database related ones +use std::sync::RwLock; use std::{any::Any, io, net::SocketAddr, sync::atomic, time::Duration}; +use api::ruma_wrapper::{Ruma, RumaResponse}; use axum::{ extract::{DefaultBodyLimit, MatchedPath}, response::IntoResponse, @@ -13,7 +18,8 @@ use axum::{ use axum_server::{bind, bind_rustls, tls_rustls::RustlsConfig, Handle as ServerHandle}; #[cfg(feature = "axum_dual_protocol")] use axum_server_dual_protocol::ServerExt; -pub use conduit::*; // Re-export everything from the library crate +use config::Config; +use database::KeyValueDatabase; use http::{ header::{self, HeaderName}, Method, StatusCode, @@ -23,6 +29,7 @@ use ruma::api::client::{ error::{Error as RumaError, ErrorBody, ErrorKind}, uiaa::UiaaResponse, }; +use service::{pdu::PduEvent, Services}; use tokio::{ signal, sync::oneshot::{self, Sender}, @@ -37,8 +44,25 @@ use tower_http::{ }; use tracing::{debug, error, info, warn, Level}; use tracing_subscriber::{prelude::*, reload, EnvFilter, Registry}; +use utils::error::{Error, Result}; +mod api; +mod clap; +mod config; +mod database; mod routes; +mod service; +mod utils; + +pub static SERVICES: RwLock>> = RwLock::new(None); + +#[must_use] +pub fn services() -> &'static Services<'static> { + SERVICES + .read() + .unwrap() + .expect("SERVICES should be initialized when this is called") +} #[cfg(all(not(target_env = "msvc"), feature = "jemalloc", not(feature = "hardened_malloc")))] #[global_allocator] @@ -71,17 +95,17 @@ fn main() -> Result<(), Error> { async fn async_main(server: &Server) -> Result<(), Error> { if let Err(error) = start(server).await { error!("Critical error starting server: {error}"); - return Err(Error::Error(format!("{error}"))); + return Err(Error::Err(format!("{error}"))); } if let Err(error) = run(server).await { error!("Critical error running server: {error}"); - return Err(Error::Error(format!("{error}"))); + return Err(Error::Err(format!("{error}"))); } if let Err(error) = stop(server).await { error!("Critical error stopping server: {error}"); - return Err(Error::Error(format!("{error}"))); + return Err(Error::Err(format!("{error}"))); } Ok(()) diff --git a/src/routes.rs b/src/routes.rs index a29cacd3..f4334da1 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -6,14 +6,15 @@ use axum::{ routing::{any, get, on, post, MethodFilter}, Router, }; -use conduit::{ - api::{client_server, server_server}, - Config, Error, Result, Ruma, RumaResponse, -}; use http::{Method, Uri}; use ruma::api::{client::error::ErrorKind, IncomingRequest}; use tracing::{info, warn}; +use crate::{ + api::{client_server, server_server}, + Config, Error, Result, Ruma, RumaResponse, +}; + pub fn routes(config: &Config) -> Router { let router = Router::new() .ruma_route(client_server::get_supported_versions_route) @@ -208,6 +209,9 @@ pub fn routes(config: &Config) -> Router { .ruma_route(server_server::get_event_authorization_route) .ruma_route(server_server::get_room_state_route) .ruma_route(server_server::get_room_state_ids_route) + .ruma_route(server_server::create_leave_event_template_route) + .ruma_route(server_server::create_leave_event_v1_route) + .ruma_route(server_server::create_leave_event_v2_route) .ruma_route(server_server::create_join_event_template_route) .ruma_route(server_server::create_join_event_v1_route) .ruma_route(server_server::create_join_event_v2_route) diff --git a/src/service/pdu.rs b/src/service/pdu.rs index d8f020e6..b63e12a9 100644 --- a/src/service/pdu.rs +++ b/src/service/pdu.rs @@ -61,7 +61,7 @@ impl PduEvent { let mut content = serde_json::from_str(self.content.get()) .map_err(|_| Error::bad_database("PDU in db has invalid content."))?; redact_content_in_place(&mut content, &room_version_id, self.kind.to_string()) - .map_err(|e| Error::RedactionError(self.sender.server_name().to_owned(), e))?; + .map_err(|e| Error::Redaction(self.sender.server_name().to_owned(), e))?; self.unsigned = Some( to_raw_value(&json!({ diff --git a/src/service/sending/send.rs b/src/service/sending/send.rs index 09d7f7e0..9c292a82 100644 --- a/src/service/sending/send.rs +++ b/src/service/sending/send.rs @@ -116,7 +116,7 @@ where debug!("Got {status:?} for {method} {url}"); if !status.is_success() { - return Err(Error::FederationError( + return Err(Error::Federation( destination.to_owned(), RumaError::from_http_response(http_response), )); @@ -423,7 +423,7 @@ fn handle_resolve_error(e: &ResolveError) -> Result<()> { }, _ => { error!("{e}"); - Err(Error::Error(e.to_string())) + Err(Error::Err(e.to_string())) }, } } diff --git a/src/utils/error.rs b/src/utils/error.rs index fb48b792..cd106035 100644 --- a/src/utils/error.rs +++ b/src/utils/error.rs @@ -23,35 +23,35 @@ pub type Result = std::result::Result; pub enum Error { #[cfg(feature = "sqlite")] #[error("There was a problem with the connection to the sqlite database: {source}")] - SqliteError { + Sqlite { #[from] source: rusqlite::Error, }, #[cfg(feature = "rocksdb")] #[error("There was a problem with the connection to the rocksdb database: {source}")] - RocksDbError { + RocksDb { #[from] source: rust_rocksdb::Error, }, #[error("Could not generate an image.")] - ImageError { + Image { #[from] source: image::error::ImageError, }, #[error("Could not connect to server: {source}")] - ReqwestError { + Reqwest { #[from] source: reqwest::Error, }, #[error("Could build regular expression: {source}")] - RegexError { + Regex { #[from] source: regex::Error, }, #[error("{0}")] - FederationError(OwnedServerName, RumaError), + Federation(OwnedServerName, RumaError), #[error("Could not do this io: {source}")] - IoError { + Io { #[from] source: std::io::Error, }, @@ -69,17 +69,17 @@ pub enum Error { #[error("{0}")] Conflict(&'static str), // This is only needed for when a room alias already exists #[error("{0}")] - ExtensionError(#[from] axum::extract::rejection::ExtensionRejection), + Extension(#[from] axum::extract::rejection::ExtensionRejection), #[error("{0}")] - PathError(#[from] axum::extract::rejection::PathRejection), + Path(#[from] axum::extract::rejection::PathRejection), #[error("from {0}: {1}")] - RedactionError(OwnedServerName, ruma::canonical_json::RedactionError), + Redaction(OwnedServerName, ruma::canonical_json::RedactionError), #[error("{0} in {1}")] InconsistentRoomState(&'static str, ruma::OwnedRoomId), #[error("{0}")] AdminCommand(&'static str), #[error("{0}")] - Error(String), + Err(String), } impl Error { @@ -100,7 +100,7 @@ impl Error { return RumaResponse(UiaaResponse::AuthResponse(uiaainfo.clone())); } - if let Self::FederationError(origin, error) = self { + if let Self::Federation(origin, error) = self { let mut error = error.clone(); error.body = ErrorBody::Standard { kind: error.error_kind().unwrap_or(&Unknown).clone(), @@ -153,7 +153,7 @@ impl Error { /// Returns the Matrix error code / error kind pub fn error_code(&self) -> ErrorKind { - if let Self::FederationError(_, error) = self { + if let Self::Federation(_, error) = self { return error.error_kind().unwrap_or(&Unknown).clone(); } @@ -169,14 +169,14 @@ impl Error { match self { #[cfg(feature = "sqlite")] - Self::SqliteError { + Self::Sqlite { .. } => db_error, #[cfg(feature = "rocksdb")] - Self::RocksDbError { + Self::RocksDb { .. } => db_error, - Self::IoError { + Self::Io { .. } => db_error, Self::BadConfig {