diff --git a/.gitignore b/.gitignore
index 1f5f395f..f5e9505b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -57,7 +57,6 @@ $RECYCLE.BIN/
*.lnk
# Conduit
-Rocket.toml
conduit.toml
conduit.db
diff --git a/Cargo.lock b/Cargo.lock
index 632b4cea..f84c9829 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,6 +2,12 @@
# It is not intended for manual editing.
version = 3
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
[[package]]
name = "adler32"
version = "1.2.0"
@@ -28,6 +34,21 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "alloc-no-stdlib"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
[[package]]
name = "ansi_term"
version = "0.12.1"
@@ -56,24 +77,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002"
[[package]]
-name = "async-stream"
-version = "0.3.2"
+name = "async-compression"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625"
+checksum = "5443ccbb270374a2b1055fc72da40e1f237809cd6bb0e97e66d264cd138473a6"
dependencies = [
- "async-stream-impl",
+ "brotli",
+ "flate2",
"futures-core",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
]
[[package]]
@@ -96,17 +110,6 @@ dependencies = [
"autocfg",
]
-[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi",
- "libc",
- "winapi",
-]
-
[[package]]
name = "autocfg"
version = "1.0.1"
@@ -114,10 +117,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
-name = "base-x"
-version = "0.2.8"
+name = "axum"
+version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
+checksum = "310a147401c66e79fc78636e4db63ac68cd6acb9ece056de806ea173a15bce32"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "bitflags",
+ "bytes",
+ "futures-util",
+ "headers",
+ "http",
+ "http-body",
+ "hyper",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tokio-util",
+ "tower",
+ "tower-http",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ca6c0b218388a7ed6a8d25e94f7dea5498daaa4fd8c711fb3ff166041b06fda"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+]
[[package]]
name = "base64"
@@ -131,12 +174,6 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
-[[package]]
-name = "binascii"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72"
-
[[package]]
name = "bincode"
version = "1.3.3"
@@ -191,6 +228,27 @@ dependencies = [
"generic-array",
]
+[[package]]
+name = "brotli"
+version = "3.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
[[package]]
name = "bumpalo"
version = "3.9.1"
@@ -254,7 +312,7 @@ dependencies = [
"libc",
"num-integer",
"num-traits",
- "time 0.1.43",
+ "time",
"winapi",
]
@@ -306,18 +364,21 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
name = "conduit"
version = "0.3.0"
dependencies = [
+ "axum",
"base64 0.13.0",
"bytes",
"clap",
"crossbeam",
"directories",
+ "figment",
+ "futures-util",
"heed",
"hmac",
"http",
+ "hyper",
"image",
"jsonwebtoken",
"lru-cache",
- "maplit",
"num_cpus",
"opentelemetry",
"opentelemetry-jaeger",
@@ -327,7 +388,6 @@ dependencies = [
"regex",
"reqwest",
"ring",
- "rocket",
"rocksdb",
"ruma",
"rusqlite",
@@ -343,9 +403,11 @@ dependencies = [
"tikv-jemalloc-ctl",
"tikv-jemallocator",
"tokio",
+ "tower",
+ "tower-http",
"tracing",
"tracing-flame",
- "tracing-subscriber 0.2.25",
+ "tracing-subscriber",
"trust-dns-resolver",
]
@@ -355,29 +417,12 @@ version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d6f2aa4d0537bcc1c74df8755072bd31c1ef1a3a1b85a68e8404a8c353b7b8b"
-[[package]]
-name = "const_fn"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935"
-
[[package]]
name = "constant_time_eq"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
-[[package]]
-name = "cookie"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d"
-dependencies = [
- "percent-encoding",
- "time 0.2.27",
- "version_check",
-]
-
[[package]]
name = "cpufeatures"
version = "0.2.1"
@@ -546,39 +591,6 @@ dependencies = [
"const-oid",
]
-[[package]]
-name = "devise"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595"
-dependencies = [
- "devise_codegen",
- "devise_core",
-]
-
-[[package]]
-name = "devise_codegen"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2"
-dependencies = [
- "devise_core",
- "quote",
-]
-
-[[package]]
-name = "devise_core"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0"
-dependencies = [
- "bitflags",
- "proc-macro2",
- "proc-macro2-diagnostics",
- "quote",
- "syn",
-]
-
[[package]]
name = "digest"
version = "0.9.0"
@@ -608,12 +620,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "discard"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
-
[[package]]
name = "ed25519"
version = "1.3.0"
@@ -676,15 +682,6 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
-[[package]]
-name = "fastrand"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2"
-dependencies = [
- "instant",
-]
-
[[package]]
name = "figment"
version = "0.10.6"
@@ -699,6 +696,18 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "flate2"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crc32fast",
+ "libc",
+ "miniz_oxide 0.4.4",
+]
+
[[package]]
name = "fnv"
version = "1.0.7"
@@ -829,19 +838,6 @@ dependencies = [
"byteorder",
]
-[[package]]
-name = "generator"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee"
-dependencies = [
- "cc",
- "libc",
- "log",
- "rustversion",
- "winapi",
-]
-
[[package]]
name = "generic-array"
version = "0.14.5"
@@ -927,6 +923,31 @@ dependencies = [
"hashbrown",
]
+[[package]]
+name = "headers"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4c4eb0471fcb85846d8b0690695ef354f9afb11cb03cac2e1d7c9253351afb0"
+dependencies = [
+ "base64 0.13.0",
+ "bitflags",
+ "bytes",
+ "headers-core",
+ "http",
+ "httpdate",
+ "mime",
+ "sha-1",
+]
+
+[[package]]
+name = "headers-core"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
+dependencies = [
+ "http",
+]
+
[[package]]
name = "heck"
version = "0.3.3"
@@ -1030,6 +1051,12 @@ dependencies = [
"pin-project-lite",
]
+[[package]]
+name = "http-range-header"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
+
[[package]]
name = "httparse"
version = "1.5.1"
@@ -1074,9 +1101,9 @@ checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac"
dependencies = [
"http",
"hyper",
- "rustls 0.20.2",
+ "rustls",
"tokio",
- "tokio-rustls 0.23.2",
+ "tokio-rustls",
]
[[package]]
@@ -1320,21 +1347,6 @@ dependencies = [
"cfg-if 1.0.0",
]
-[[package]]
-name = "loom"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309"
-dependencies = [
- "cfg-if 1.0.0",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
- "tracing",
- "tracing-subscriber 0.3.6",
-]
-
[[package]]
name = "lru-cache"
version = "0.1.2"
@@ -1365,21 +1377,18 @@ dependencies = [
"regex-automata",
]
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata",
-]
-
[[package]]
name = "matches"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
+[[package]]
+name = "matchit"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58b6f41fdfbec185dd3dff58b51e323f5bc61692c0de38419a957b0dcfccca3c"
+
[[package]]
name = "memchr"
version = "2.4.1"
@@ -1416,6 +1425,16 @@ dependencies = [
"adler32",
]
+[[package]]
+name = "miniz_oxide"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
[[package]]
name = "mio"
version = "0.7.14"
@@ -1438,26 +1457,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "multer"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f8f35e687561d5c1667590911e6698a8cb714a134a7505718a182e7bc9d3836"
-dependencies = [
- "bytes",
- "encoding_rs",
- "futures-util",
- "http",
- "httparse",
- "log",
- "memchr",
- "mime",
- "spin 0.9.2",
- "tokio",
- "tokio-util",
- "version_check",
-]
-
[[package]]
name = "nom"
version = "7.1.0"
@@ -1774,7 +1773,7 @@ dependencies = [
"bitflags",
"crc32fast",
"deflate",
- "miniz_oxide",
+ "miniz_oxide 0.3.7",
]
[[package]]
@@ -1817,12 +1816,6 @@ dependencies = [
"version_check",
]
-[[package]]
-name = "proc-macro-hack"
-version = "0.5.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
-
[[package]]
name = "proc-macro2"
version = "1.0.36"
@@ -1960,26 +1953,6 @@ dependencies = [
"redox_syscall",
]
-[[package]]
-name = "ref-cast"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
[[package]]
name = "regex"
version = "1.5.4"
@@ -2006,15 +1979,6 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
-[[package]]
-name = "remove_dir_all"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
-dependencies = [
- "winapi",
-]
-
[[package]]
name = "reqwest"
version = "0.11.9"
@@ -2037,13 +2001,13 @@ dependencies = [
"mime",
"percent-encoding",
"pin-project-lite",
- "rustls 0.20.2",
+ "rustls",
"rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
"tokio",
- "tokio-rustls 0.23.2",
+ "tokio-rustls",
"tokio-socks",
"url",
"wasm-bindgen",
@@ -2072,95 +2036,12 @@ dependencies = [
"cc",
"libc",
"once_cell",
- "spin 0.5.2",
+ "spin",
"untrusted",
"web-sys",
"winapi",
]
-[[package]]
-name = "rocket"
-version = "0.5.0-rc.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a71c18c42a0eb15bf3816831caf0dad11e7966f2a41aaf486a701979c4dd1f2"
-dependencies = [
- "async-stream",
- "async-trait",
- "atomic",
- "atty",
- "binascii",
- "bytes",
- "either",
- "figment",
- "futures",
- "indexmap",
- "log",
- "memchr",
- "multer",
- "num_cpus",
- "parking_lot",
- "pin-project-lite",
- "rand 0.8.4",
- "ref-cast",
- "rocket_codegen",
- "rocket_http",
- "serde",
- "state",
- "tempfile",
- "time 0.2.27",
- "tokio",
- "tokio-stream",
- "tokio-util",
- "ubyte",
- "version_check",
- "yansi",
-]
-
-[[package]]
-name = "rocket_codegen"
-version = "0.5.0-rc.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66f5fa462f7eb958bba8710c17c5d774bbbd59809fa76fb1957af7e545aea8bb"
-dependencies = [
- "devise",
- "glob",
- "indexmap",
- "proc-macro2",
- "quote",
- "rocket_http",
- "syn",
- "unicode-xid",
-]
-
-[[package]]
-name = "rocket_http"
-version = "0.5.0-rc.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23c8b7d512d2fcac2316ebe590cde67573844b99e6cc9ee0f53375fa16e25ebd"
-dependencies = [
- "cookie",
- "either",
- "http",
- "hyper",
- "indexmap",
- "log",
- "memchr",
- "mime",
- "parking_lot",
- "pear",
- "percent-encoding",
- "pin-project-lite",
- "ref-cast",
- "serde",
- "smallvec",
- "stable-pattern",
- "state",
- "time 0.2.27",
- "tokio",
- "tokio-rustls 0.22.0",
- "uncased",
-]
-
[[package]]
name = "rocksdb"
version = "0.17.0"
@@ -2465,28 +2346,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-[[package]]
-name = "rustc_version"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustls"
-version = "0.19.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7"
-dependencies = [
- "base64 0.13.0",
- "log",
- "ring",
- "sct 0.6.1",
- "webpki 0.21.4",
-]
-
[[package]]
name = "rustls"
version = "0.20.2"
@@ -2495,8 +2354,8 @@ checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84"
dependencies = [
"log",
"ring",
- "sct 0.7.0",
- "webpki 0.22.0",
+ "sct",
+ "webpki",
]
[[package]]
@@ -2508,40 +2367,18 @@ dependencies = [
"base64 0.13.0",
]
-[[package]]
-name = "rustversion"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f"
-
[[package]]
name = "ryu"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
-[[package]]
-name = "scoped-tls"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
-
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-[[package]]
-name = "sct"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce"
-dependencies = [
- "ring",
- "untrusted",
-]
-
[[package]]
name = "sct"
version = "0.7.0"
@@ -2552,21 +2389,6 @@ dependencies = [
"untrusted",
]
-[[package]]
-name = "semver"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
-dependencies = [
- "semver-parser",
-]
-
-[[package]]
-name = "semver-parser"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
-
[[package]]
name = "serde"
version = "1.0.134"
@@ -2635,21 +2457,6 @@ dependencies = [
"opaque-debug",
]
-[[package]]
-name = "sha1"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770"
-dependencies = [
- "sha1_smol",
-]
-
-[[package]]
-name = "sha1_smol"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
-
[[package]]
name = "sha2"
version = "0.9.9"
@@ -2760,12 +2567,6 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
-[[package]]
-name = "spin"
-version = "0.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5"
-
[[package]]
name = "spki"
version = "0.4.1"
@@ -2775,82 +2576,6 @@ dependencies = [
"der",
]
-[[package]]
-name = "stable-pattern"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "standback"
-version = "0.2.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff"
-dependencies = [
- "version_check",
-]
-
-[[package]]
-name = "state"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5"
-dependencies = [
- "loom",
-]
-
-[[package]]
-name = "stdweb"
-version = "0.4.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
-dependencies = [
- "discard",
- "rustc_version",
- "stdweb-derive",
- "stdweb-internal-macros",
- "stdweb-internal-runtime",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "stdweb-derive"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
-dependencies = [
- "proc-macro2",
- "quote",
- "serde",
- "serde_derive",
- "syn",
-]
-
-[[package]]
-name = "stdweb-internal-macros"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
-dependencies = [
- "base-x",
- "proc-macro2",
- "quote",
- "serde",
- "serde_derive",
- "serde_json",
- "sha1",
- "syn",
-]
-
-[[package]]
-name = "stdweb-internal-runtime"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
-
[[package]]
name = "subtle"
version = "2.4.1"
@@ -2868,6 +2593,12 @@ dependencies = [
"unicode-xid",
]
+[[package]]
+name = "sync_wrapper"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
+
[[package]]
name = "synchronoise"
version = "1.0.0"
@@ -2889,20 +2620,6 @@ dependencies = [
"unicode-xid",
]
-[[package]]
-name = "tempfile"
-version = "3.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
-dependencies = [
- "cfg-if 1.0.0",
- "fastrand",
- "libc",
- "redox_syscall",
- "remove_dir_all",
- "winapi",
-]
-
[[package]]
name = "textwrap"
version = "0.14.2"
@@ -3002,44 +2719,6 @@ dependencies = [
"winapi",
]
-[[package]]
-name = "time"
-version = "0.2.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242"
-dependencies = [
- "const_fn",
- "libc",
- "standback",
- "stdweb",
- "time-macros",
- "version_check",
- "winapi",
-]
-
-[[package]]
-name = "time-macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1"
-dependencies = [
- "proc-macro-hack",
- "time-macros-impl",
-]
-
-[[package]]
-name = "time-macros-impl"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f"
-dependencies = [
- "proc-macro-hack",
- "proc-macro2",
- "quote",
- "standback",
- "syn",
-]
-
[[package]]
name = "tinyvec"
version = "1.5.1"
@@ -3084,26 +2763,15 @@ dependencies = [
"syn",
]
-[[package]]
-name = "tokio-rustls"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6"
-dependencies = [
- "rustls 0.19.1",
- "tokio",
- "webpki 0.21.4",
-]
-
[[package]]
name = "tokio-rustls"
version = "0.23.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a27d5f2b839802bd8267fa19b0530f5a08b9c08cd417976be2a65d130fe1c11b"
dependencies = [
- "rustls 0.20.2",
+ "rustls",
"tokio",
- "webpki 0.22.0",
+ "webpki",
]
[[package]]
@@ -3152,6 +2820,52 @@ dependencies = [
"serde",
]
+[[package]]
+name = "tower"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5651b5f6860a99bd1adb59dbfe1db8beb433e73709d9032b413a77e2fb7c066a"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03650267ad175b51c47d02ed9547fc7d4ba2c7e5cb76df0bed67edd1825ae297"
+dependencies = [
+ "async-compression",
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
+
[[package]]
name = "tower-service"
version = "0.3.1"
@@ -3165,6 +2879,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105"
dependencies = [
"cfg-if 1.0.0",
+ "log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@@ -3198,7 +2913,7 @@ checksum = "bd520fe41c667b437952383f3a1ec14f1fa45d653f719a77eedd6e6a02d8fa54"
dependencies = [
"lazy_static",
"tracing",
- "tracing-subscriber 0.2.25",
+ "tracing-subscriber",
]
[[package]]
@@ -3231,7 +2946,7 @@ dependencies = [
"ansi_term",
"chrono",
"lazy_static",
- "matchers 0.0.1",
+ "matchers",
"regex",
"serde",
"serde_json",
@@ -3244,24 +2959,6 @@ dependencies = [
"tracing-serde",
]
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77be66445c4eeebb934a7340f227bfe7b338173d3f8c00a60a5a58005c9faecf"
-dependencies = [
- "ansi_term",
- "lazy_static",
- "matchers 0.1.0",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
-]
-
[[package]]
name = "trust-dns-proto"
version = "0.20.3"
@@ -3319,22 +3016,12 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
-[[package]]
-name = "ubyte"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42756bb9e708855de2f8a98195643dff31a97f0485d90d8467b39dc24be9e8fe"
-dependencies = [
- "serde",
-]
-
[[package]]
name = "uncased"
version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0"
dependencies = [
- "serde",
"version_check",
]
@@ -3514,16 +3201,6 @@ dependencies = [
"wasm-bindgen",
]
-[[package]]
-name = "webpki"
-version = "0.21.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
-dependencies = [
- "ring",
- "untrusted",
-]
-
[[package]]
name = "webpki"
version = "0.22.0"
@@ -3540,7 +3217,7 @@ version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552ceb903e957524388c4d3475725ff2c8b7960922063af6ce53c9a43da07449"
dependencies = [
- "webpki 0.22.0",
+ "webpki",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 7f843435..5fb75dcb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,10 +13,11 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-# Used to handle requests
-# TODO: This can become optional as soon as proper configs are supported
-# rocket = { git = "https://github.com/SergioBenitez/Rocket.git", rev = "801e04bd5369eb39e126c75f6d11e1e9597304d8", features = ["tls"] } # Used to handle requests
-rocket = { version = "0.5.0-rc.1", features = ["tls"] } # Used to handle requests
+# Web framework
+axum = { version = "0.4.4", features = ["headers"], optional = true }
+hyper = "0.14.16"
+tower = { version = "0.4.11", features = ["util"] }
+tower-http = { version = "0.2.1", features = ["add-extension", "cors", "compression-full", "sensitive-headers", "trace", "util"] }
# Used for matrix spec type definitions and helpers
#ruma = { version = "0.4.0", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
@@ -24,8 +25,8 @@ ruma = { git = "https://github.com/ruma/ruma", rev = "f7a10a7e471b59d3096be2695c
#ruma = { git = "https://github.com/timokoesters/ruma", rev = "50c1db7e0a3a21fc794b0cce3b64285a4c750c71", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
#ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
-# Used for long polling and federation sender, should be the same as rocket::tokio
-tokio = "1.11.0"
+# Async runtime and utilities
+tokio = { version = "1.11.0", features = ["fs", "macros", "signal", "sync"] }
# Used for storing data permanently
sled = { version = "0.34.6", features = ["compression", "no_metrics"], optional = true }
#sled = { git = "https://github.com/spacejam/sled.git", rev = "e4640e0773595229f398438886f19bca6f7326a2", features = ["compression"] }
@@ -33,7 +34,6 @@ persy = { version = "1.2" , optional = true, features=["background_ops"] }
# Used for the http request / response body type for Ruma endpoints used with reqwest
bytes = "1.1.0"
-# Used for rocket<->ruma conversions
http = "0.2.4"
# Used to find data directory for default db path
directories = "3.0.2"
@@ -84,7 +84,9 @@ hmac = "0.11.0"
sha-1 = "0.9.8"
# used for conduit's CLI and admin room command parsing
clap = { version = "3.0.10", default-features = false, features = ["std", "derive"] }
-maplit = "1.0.2"
+futures-util = { version = "0.3.19", default-features = false }
+# Used for reading the configuration from conduit.toml & environment variables
+figment = { version = "0.10.6", features = ["env", "toml"] }
tikv-jemalloc-ctl = { version = "0.4.2", features = ["use_std"], optional = true }
tikv-jemallocator = { version = "0.4.1", features = ["unprefixed_malloc_on_supported_platforms"], optional = true }
@@ -98,7 +100,7 @@ backend_heed = ["heed", "crossbeam"]
backend_rocksdb = ["rocksdb"]
jemalloc = ["tikv-jemalloc-ctl", "tikv-jemallocator"]
sqlite = ["rusqlite", "parking_lot", "tokio/signal"]
-conduit_bin = [] # TODO: add rocket to this when it is optional
+conduit_bin = ["axum"]
[[bin]]
name = "conduit"
diff --git a/README.md b/README.md
index a4f09298..45b16fd5 100644
--- a/README.md
+++ b/README.md
@@ -54,7 +54,7 @@ Thanks to Famedly, Prototype Fund (DLR and German BMBF) and all other individual
Thanks to the contributors to Conduit and all libraries we use, for example:
- Ruma: A clean library for the Matrix Spec in Rust
-- Rocket: A flexible web framework
+- axum: A modular web framework
#### Donate
diff --git a/conduit-example.toml b/conduit-example.toml
index f1578078..c22c8622 100644
--- a/conduit-example.toml
+++ b/conduit-example.toml
@@ -42,7 +42,7 @@ allow_registration = true
trusted_servers = ["matrix.org"]
#max_concurrent_requests = 100 # How many requests Conduit sends to other servers at the same time
-#log = "info,state_res=warn,rocket=off,_=off,sled=off"
+#log = "info,state_res=warn,_=off,sled=off"
#workers = 4 # default: cpu core count * 2
address = "127.0.0.1" # This makes sure Conduit can only be reached using the reverse proxy
diff --git a/debian/postinst b/debian/postinst
index 6bd1a3a7..29a93676 100644
--- a/debian/postinst
+++ b/debian/postinst
@@ -74,7 +74,7 @@ allow_registration = true
#allow_jaeger = false
#max_concurrent_requests = 100 # How many requests Conduit sends to other servers at the same time
-#log = "info,state_res=warn,rocket=off,_=off,sled=off"
+#log = "info,state_res=warn,_=off,sled=off"
#workers = 4 # default: cpu core count * 2
# The total amount of memory that the database will use.
diff --git a/docker-compose.yml b/docker-compose.yml
index 530fc198..88d5c3f6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -33,7 +33,7 @@ services:
# CONDUIT_PORT: 6167
# CONDUIT_CONFIG: '/srv/conduit/conduit.toml' # if you want to configure purely by env vars, set this to an empty string ''
# Available levels are: error, warn, info, debug, trace - more info at: https://docs.rs/env_logger/*/env_logger/#enabling-logging
- # CONDUIT_LOG: info # default is: "info,rocket=off,_=off,sled=off"
+ # CONDUIT_LOG: info # default is: "info,_=off,sled=off"
# CONDUIT_ALLOW_JAEGER: 'false'
# CONDUIT_ALLOW_ENCRYPTION: 'false'
# CONDUIT_ALLOW_FEDERATION: 'false'
diff --git a/docker/docker-compose.traefik.yml b/docker/docker-compose.traefik.yml
index 392b3828..f625080a 100644
--- a/docker/docker-compose.traefik.yml
+++ b/docker/docker-compose.traefik.yml
@@ -33,7 +33,7 @@ services:
# CONDUIT_PORT: 6167
# CONDUIT_CONFIG: '/srv/conduit/conduit.toml' # if you want to configure purely by env vars, set this to an empty string ''
# Available levels are: error, warn, info, debug, trace - more info at: https://docs.rs/env_logger/*/env_logger/#enabling-logging
- # CONDUIT_LOG: info # default is: "info,rocket=off,_=off,sled=off"
+ # CONDUIT_LOG: info # default is: "info,_=off,sled=off"
# CONDUIT_ALLOW_JAEGER: 'false'
# CONDUIT_ALLOW_ENCRYPTION: 'false'
# CONDUIT_ALLOW_FEDERATION: 'false'
diff --git a/src/client_server/account.rs b/src/client_server/account.rs
index a210e8ae..bf1a74dd 100644
--- a/src/client_server/account.rs
+++ b/src/client_server/account.rs
@@ -27,8 +27,6 @@ use serde_json::value::to_raw_value;
use tracing::{info, warn};
use register::RegistrationKind;
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
const GUEST_NAME_LENGTH: usize = 10;
@@ -42,10 +40,6 @@ const GUEST_NAME_LENGTH: usize = 10;
/// - No user or appservice on this server already claimed this username
///
/// Note: This will not reserve the username, so the username might become invalid when trying to register
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/register/available", data = "
")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_register_available_route(
db: DatabaseGuard,
@@ -90,10 +84,6 @@ pub async fn get_register_available_route(
/// - If type is not guest and no username is given: Always fails after UIAA check
/// - Creates a new account and populates it with default account data
/// - If `inhibit_login` is false: Creates a device and returns device id and access_token
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/register", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn register_route(
db: DatabaseGuard,
@@ -279,10 +269,6 @@ pub async fn register_route(
/// - Deletes device metadata (device id, device display name, last seen ip, last seen ts)
/// - Forgets to-device events
/// - Triggers device list updates
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/account/password", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn change_password_route(
db: DatabaseGuard,
@@ -348,10 +334,6 @@ pub async fn change_password_route(
/// Get user_id of the sender user.
///
/// Note: Also works for Application Services
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/account/whoami", data = "")
-)]
#[tracing::instrument(skip(body))]
pub async fn whoami_route(body: Ruma) -> ConduitResult {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
@@ -371,10 +353,6 @@ pub async fn whoami_route(body: Ruma) -> ConduitResult,
) -> ConduitResult {
diff --git a/src/client_server/alias.rs b/src/client_server/alias.rs
index 129ac166..6e1b43e8 100644
--- a/src/client_server/alias.rs
+++ b/src/client_server/alias.rs
@@ -12,16 +12,9 @@ use ruma::{
RoomAliasId,
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{delete, get, put};
-
/// # `PUT /_matrix/client/r0/directory/room/{roomAlias}`
///
/// Creates a new room alias on this server.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/directory/room/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn create_alias_route(
db: DatabaseGuard,
@@ -52,10 +45,6 @@ pub async fn create_alias_route(
///
/// - TODO: additional access control checks
/// - TODO: Update canonical alias event
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/r0/directory/room/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_alias_route(
db: DatabaseGuard,
@@ -82,10 +71,6 @@ pub async fn delete_alias_route(
/// Resolve an alias locally or over federation.
///
/// - TODO: Suggest more servers to join via
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/directory/room/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_alias_route(
db: DatabaseGuard,
diff --git a/src/client_server/backup.rs b/src/client_server/backup.rs
index bbb86726..cc2d7c46 100644
--- a/src/client_server/backup.rs
+++ b/src/client_server/backup.rs
@@ -9,16 +9,9 @@ use ruma::api::client::{
},
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{delete, get, post, put};
-
/// # `POST /_matrix/client/r0/room_keys/version`
///
/// Creates a new backup.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/unstable/room_keys/version", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn create_backup_route(
db: DatabaseGuard,
@@ -37,10 +30,6 @@ pub async fn create_backup_route(
/// # `PUT /_matrix/client/r0/room_keys/version/{version}`
///
/// Update information about an existing backup. Only `auth_data` can be modified.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/unstable/room_keys/version/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn update_backup_route(
db: DatabaseGuard,
@@ -58,10 +47,6 @@ pub async fn update_backup_route(
/// # `GET /_matrix/client/r0/room_keys/version`
///
/// Get information about the latest backup version.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/unstable/room_keys/version", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_latest_backup_route(
db: DatabaseGuard,
@@ -89,10 +74,6 @@ pub async fn get_latest_backup_route(
/// # `GET /_matrix/client/r0/room_keys/version`
///
/// Get information about an existing backup.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/unstable/room_keys/version/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_backup_route(
db: DatabaseGuard,
@@ -121,10 +102,6 @@ pub async fn get_backup_route(
/// Delete an existing key backup.
///
/// - Deletes both information about the backup, as well as all key data related to the backup
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/unstable/room_keys/version/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_backup_route(
db: DatabaseGuard,
@@ -146,10 +123,6 @@ pub async fn delete_backup_route(
/// - Only manipulating the most recently created version of the backup is allowed
/// - Adds the keys to the backup
/// - Returns the new number of keys in this backup and the etag
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/unstable/room_keys/keys", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn add_backup_keys_route(
db: DatabaseGuard,
@@ -198,10 +171,6 @@ pub async fn add_backup_keys_route(
/// - Only manipulating the most recently created version of the backup is allowed
/// - Adds the keys to the backup
/// - Returns the new number of keys in this backup and the etag
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/unstable/room_keys/keys/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn add_backup_key_sessions_route(
db: DatabaseGuard,
@@ -248,10 +217,6 @@ pub async fn add_backup_key_sessions_route(
/// - Only manipulating the most recently created version of the backup is allowed
/// - Adds the keys to the backup
/// - Returns the new number of keys in this backup and the etag
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/unstable/room_keys/keys/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn add_backup_key_session_route(
db: DatabaseGuard,
@@ -292,10 +257,6 @@ pub async fn add_backup_key_session_route(
/// # `GET /_matrix/client/r0/room_keys/keys`
///
/// Retrieves all keys from the backup.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/unstable/room_keys/keys", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_backup_keys_route(
db: DatabaseGuard,
@@ -311,10 +272,6 @@ pub async fn get_backup_keys_route(
/// # `GET /_matrix/client/r0/room_keys/keys/{roomId}`
///
/// Retrieves all keys from the backup for a given room.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/unstable/room_keys/keys/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_backup_key_sessions_route(
db: DatabaseGuard,
@@ -332,10 +289,6 @@ pub async fn get_backup_key_sessions_route(
/// # `GET /_matrix/client/r0/room_keys/keys/{roomId}/{sessionId}`
///
/// Retrieves a key from the backup.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/unstable/room_keys/keys/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_backup_key_session_route(
db: DatabaseGuard,
@@ -357,10 +310,6 @@ pub async fn get_backup_key_session_route(
/// # `DELETE /_matrix/client/r0/room_keys/keys`
///
/// Delete the keys from the backup.
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/unstable/room_keys/keys", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_backup_keys_route(
db: DatabaseGuard,
@@ -382,10 +331,6 @@ pub async fn delete_backup_keys_route(
/// # `DELETE /_matrix/client/r0/room_keys/keys/{roomId}`
///
/// Delete the keys from the backup for a given room.
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/unstable/room_keys/keys/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_backup_key_sessions_route(
db: DatabaseGuard,
@@ -408,10 +353,6 @@ pub async fn delete_backup_key_sessions_route(
/// # `DELETE /_matrix/client/r0/room_keys/keys/{roomId}/{sessionId}`
///
/// Delete a key from the backup.
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/unstable/room_keys/keys/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_backup_key_session_route(
db: DatabaseGuard,
diff --git a/src/client_server/capabilities.rs b/src/client_server/capabilities.rs
index c69b7cb2..8da6855b 100644
--- a/src/client_server/capabilities.rs
+++ b/src/client_server/capabilities.rs
@@ -7,16 +7,9 @@ use ruma::{
};
use std::collections::BTreeMap;
-#[cfg(feature = "conduit_bin")]
-use rocket::get;
-
/// # `GET /_matrix/client/r0/capabilities`
///
/// Get information on the supported feature set and other relevent capabilities of this server.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/capabilities", data = "<_body>")
-)]
#[tracing::instrument(skip(_body))]
pub async fn get_capabilities_route(
_body: Ruma,
diff --git a/src/client_server/config.rs b/src/client_server/config.rs
index 0c668ff1..0df0decf 100644
--- a/src/client_server/config.rs
+++ b/src/client_server/config.rs
@@ -13,16 +13,9 @@ use ruma::{
use serde::Deserialize;
use serde_json::{json, value::RawValue as RawJsonValue};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, put};
-
/// # `PUT /_matrix/client/r0/user/{userId}/account_data/{type}`
///
/// Sets some account data for the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/user/<_>/account_data/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_global_account_data_route(
db: DatabaseGuard,
@@ -54,13 +47,6 @@ pub async fn set_global_account_data_route(
/// # `PUT /_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}`
///
/// Sets some room account data for the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- put(
- "/_matrix/client/r0/user/<_>/rooms/<_>/account_data/<_>",
- data = ""
- )
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_room_account_data_route(
db: DatabaseGuard,
@@ -92,10 +78,6 @@ pub async fn set_room_account_data_route(
/// # `GET /_matrix/client/r0/user/{userId}/account_data/{type}`
///
/// Gets some account data for the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/user/<_>/account_data/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_global_account_data_route(
db: DatabaseGuard,
@@ -118,13 +100,6 @@ pub async fn get_global_account_data_route(
/// # `GET /_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}`
///
/// Gets some room account data for the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- get(
- "/_matrix/client/r0/user/<_>/rooms/<_>/account_data/<_>",
- data = ""
- )
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_room_account_data_route(
db: DatabaseGuard,
diff --git a/src/client_server/context.rs b/src/client_server/context.rs
index 02148f41..1fbfee99 100644
--- a/src/client_server/context.rs
+++ b/src/client_server/context.rs
@@ -9,19 +9,12 @@ use ruma::{
use std::{collections::HashSet, convert::TryFrom};
use tracing::error;
-#[cfg(feature = "conduit_bin")]
-use rocket::get;
-
/// # `GET /_matrix/client/r0/rooms/{roomId}/context`
///
/// Allows loading room history around an event.
///
/// - Only works if the user is joined (TODO: always allow, but only show events if the user was
/// joined, depending on history_visibility)
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/context/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_context_route(
db: DatabaseGuard,
diff --git a/src/client_server/device.rs b/src/client_server/device.rs
index f240f2e7..82d11682 100644
--- a/src/client_server/device.rs
+++ b/src/client_server/device.rs
@@ -8,16 +8,10 @@ use ruma::api::client::{
};
use super::SESSION_ID_LENGTH;
-#[cfg(feature = "conduit_bin")]
-use rocket::{delete, get, post, put};
/// # `GET /_matrix/client/r0/devices`
///
/// Get metadata on all devices of the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/devices", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_devices_route(
db: DatabaseGuard,
@@ -37,10 +31,6 @@ pub async fn get_devices_route(
/// # `GET /_matrix/client/r0/devices/{deviceId}`
///
/// Get metadata on a single device of the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/devices/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_device_route(
db: DatabaseGuard,
@@ -59,10 +49,6 @@ pub async fn get_device_route(
/// # `PUT /_matrix/client/r0/devices/{deviceId}`
///
/// Updates the metadata on a given device of the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/devices/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn update_device_route(
db: DatabaseGuard,
@@ -94,10 +80,6 @@ pub async fn update_device_route(
/// - Deletes device metadata (device id, device display name, last seen ip, last seen ts)
/// - Forgets to-device events
/// - Triggers device list updates
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/r0/devices/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_device_route(
db: DatabaseGuard,
@@ -157,10 +139,6 @@ pub async fn delete_device_route(
/// - Deletes device metadata (device id, device display name, last seen ip, last seen ts)
/// - Forgets to-device events
/// - Triggers device list updates
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/delete_devices", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_devices_route(
db: DatabaseGuard,
diff --git a/src/client_server/directory.rs b/src/client_server/directory.rs
index 719d9af4..06d7a270 100644
--- a/src/client_server/directory.rs
+++ b/src/client_server/directory.rs
@@ -29,18 +29,11 @@ use ruma::{
};
use tracing::{info, warn};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post, put};
-
/// # `POST /_matrix/client/r0/publicRooms`
///
/// Lists the public rooms on this server.
///
/// - Rooms are ordered by the number of joined members
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/publicRooms", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_public_rooms_filtered_route(
db: DatabaseGuard,
@@ -62,10 +55,6 @@ pub async fn get_public_rooms_filtered_route(
/// Lists the public rooms on this server.
///
/// - Rooms are ordered by the number of joined members
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/publicRooms", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_public_rooms_route(
db: DatabaseGuard,
@@ -96,10 +85,6 @@ pub async fn get_public_rooms_route(
/// Sets the visibility of a given room in the room directory.
///
/// - TODO: Access control checks
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/directory/list/room/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_room_visibility_route(
db: DatabaseGuard,
@@ -129,10 +114,6 @@ pub async fn set_room_visibility_route(
/// # `GET /_matrix/client/r0/directory/list/room/{roomId}`
///
/// Gets the visibility of a given room in the room directory.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/directory/list/room/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_room_visibility_route(
db: DatabaseGuard,
diff --git a/src/client_server/filter.rs b/src/client_server/filter.rs
index f8845f1e..6c42edd3 100644
--- a/src/client_server/filter.rs
+++ b/src/client_server/filter.rs
@@ -4,18 +4,11 @@ use ruma::api::client::{
r0::filter::{create_filter, get_filter},
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
-
/// # `GET /_matrix/client/r0/user/{userId}/filter/{filterId}`
///
/// Loads a filter that was previously created.
///
/// - A user can only access their own filters
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/user/<_>/filter/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_filter_route(
db: DatabaseGuard,
@@ -33,10 +26,6 @@ pub async fn get_filter_route(
/// # `PUT /_matrix/client/r0/user/{userId}/filter`
///
/// Creates a new filter to be used by other endpoints.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/user/<_>/filter", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn create_filter_route(
db: DatabaseGuard,
diff --git a/src/client_server/keys.rs b/src/client_server/keys.rs
index e7aec26b..9a7a4e7f 100644
--- a/src/client_server/keys.rs
+++ b/src/client_server/keys.rs
@@ -1,6 +1,6 @@
use super::SESSION_ID_LENGTH;
use crate::{database::DatabaseGuard, utils, ConduitResult, Database, Error, Result, Ruma};
-use rocket::futures::{prelude::*, stream::FuturesUnordered};
+use futures_util::{stream::FuturesUnordered, StreamExt};
use ruma::{
api::{
client::{
@@ -21,19 +21,12 @@ use ruma::{
use serde_json::json;
use std::collections::{BTreeMap, HashMap, HashSet};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
-
/// # `POST /_matrix/client/r0/keys/upload`
///
/// Publish end-to-end encryption keys for the sender device.
///
/// - Adds one time keys
/// - If there are no device keys yet: Adds device keys (TODO: merge with existing keys?)
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/keys/upload", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn upload_keys_route(
db: DatabaseGuard,
@@ -80,10 +73,6 @@ pub async fn upload_keys_route(
/// - Always fetches users from other servers over federation
/// - Gets master keys, self-signing keys, user signing keys and device keys.
/// - The master and self-signing keys contain signatures that the user is allowed to see
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/keys/query", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_keys_route(
db: DatabaseGuard,
@@ -105,10 +94,6 @@ pub async fn get_keys_route(
/// # `POST /_matrix/client/r0/keys/claim`
///
/// Claims one-time keys
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/keys/claim", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn claim_keys_route(
db: DatabaseGuard,
@@ -126,10 +111,6 @@ pub async fn claim_keys_route(
/// Uploads end-to-end key information for the sender user.
///
/// - Requires UIAA to verify password
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/unstable/keys/device_signing/upload", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn upload_signing_keys_route(
db: DatabaseGuard,
@@ -190,10 +171,6 @@ pub async fn upload_signing_keys_route(
/// # `POST /_matrix/client/r0/keys/signatures/upload`
///
/// Uploads end-to-end key signatures from the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/unstable/keys/signatures/upload", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn upload_signatures_route(
db: DatabaseGuard,
@@ -256,10 +233,6 @@ pub async fn upload_signatures_route(
/// Gets a list of users who have updated their device identity keys since the previous sync token.
///
/// - TODO: left users
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/keys/changes", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_key_changes_route(
db: DatabaseGuard,
diff --git a/src/client_server/media.rs b/src/client_server/media.rs
index deea319e..5eba17bc 100644
--- a/src/client_server/media.rs
+++ b/src/client_server/media.rs
@@ -10,18 +10,15 @@ use ruma::api::client::{
},
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
-
const MXC_LENGTH: usize = 32;
/// # `GET /_matrix/media/r0/config`
///
/// Returns max upload size.
-#[cfg_attr(feature = "conduit_bin", get("/_matrix/media/r0/config"))]
-#[tracing::instrument(skip(db))]
+#[tracing::instrument(skip(db, _body))]
pub async fn get_media_config_route(
db: DatabaseGuard,
+ _body: Ruma,
) -> ConduitResult {
Ok(get_media_config::Response {
upload_size: db.globals.max_request_size().into(),
@@ -35,10 +32,6 @@ pub async fn get_media_config_route(
///
/// - Some metadata will be saved in the database
/// - Media will be saved in the media/ directory
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/media/r0/upload", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn create_content_route(
db: DatabaseGuard,
@@ -110,10 +103,6 @@ pub async fn get_remote_content(
/// Load media from our server or over federation.
///
/// - Only allows federation if `allow_remote` is true
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/media/r0/download/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_content_route(
db: DatabaseGuard,
@@ -147,10 +136,6 @@ pub async fn get_content_route(
/// Load media from our server or over federation, permitting desired filename.
///
/// - Only allows federation if `allow_remote` is true
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/media/r0/download/<_>/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_content_as_filename_route(
db: DatabaseGuard,
@@ -190,10 +175,6 @@ pub async fn get_content_as_filename_route(
/// Load media thumbnail from our server or over federation.
///
/// - Only allows federation if `allow_remote` is true
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/media/r0/thumbnail/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_content_thumbnail_route(
db: DatabaseGuard,
diff --git a/src/client_server/membership.rs b/src/client_server/membership.rs
index e855dba2..c16065ef 100644
--- a/src/client_server/membership.rs
+++ b/src/client_server/membership.rs
@@ -36,19 +36,12 @@ use std::{
};
use tracing::{debug, error, warn};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
-
/// # `POST /_matrix/client/r0/rooms/{roomId}/join`
///
/// Tries to join the sender user into a room.
///
/// - If the server knowns about this room: creates the join event and does auth rules locally
/// - If the server does not know about the room: asks other servers over federation
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/join", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn join_room_by_id_route(
db: DatabaseGuard,
@@ -90,10 +83,6 @@ pub async fn join_room_by_id_route(
///
/// - If the server knowns about this room: creates the join event and does auth rules locally
/// - If the server does not know about the room: asks other servers over federation
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/join/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn join_room_by_id_or_alias_route(
db: DatabaseGuard,
@@ -148,10 +137,6 @@ pub async fn join_room_by_id_or_alias_route(
/// Tries to leave the sender user from a room.
///
/// - This should always work if the user is currently joined.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/leave", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn leave_room_route(
db: DatabaseGuard,
@@ -169,10 +154,6 @@ pub async fn leave_room_route(
/// # `POST /_matrix/client/r0/rooms/{roomId}/invite`
///
/// Tries to send an invite event into the room.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/invite", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn invite_user_route(
db: DatabaseGuard,
@@ -192,10 +173,6 @@ pub async fn invite_user_route(
/// # `POST /_matrix/client/r0/rooms/{roomId}/kick`
///
/// Tries to send a kick event into the room.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/kick", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn kick_user_route(
db: DatabaseGuard,
@@ -256,10 +233,6 @@ pub async fn kick_user_route(
/// # `POST /_matrix/client/r0/rooms/{roomId}/ban`
///
/// Tries to send a ban event into the room.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/ban", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn ban_user_route(
db: DatabaseGuard,
@@ -331,10 +304,6 @@ pub async fn ban_user_route(
/// # `POST /_matrix/client/r0/rooms/{roomId}/unban`
///
/// Tries to send an unban event into the room.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/unban", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn unban_user_route(
db: DatabaseGuard,
@@ -399,10 +368,6 @@ pub async fn unban_user_route(
///
/// Note: Other devices of the user have no way of knowing the room was forgotten, so this has to
/// be called from every device
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/forget", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn forget_room_route(
db: DatabaseGuard,
@@ -420,10 +385,6 @@ pub async fn forget_room_route(
/// # `POST /_matrix/client/r0/joined_rooms`
///
/// Lists all rooms the user has joined.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/joined_rooms", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn joined_rooms_route(
db: DatabaseGuard,
@@ -446,10 +407,6 @@ pub async fn joined_rooms_route(
/// Lists all joined users in a room (TODO: at a specific point in time, with a specific membership).
///
/// - Only works if the user is currently joined
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/members", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_member_events_route(
db: DatabaseGuard,
@@ -483,10 +440,6 @@ pub async fn get_member_events_route(
///
/// - The sender user must be in the room
/// - TODO: An appservice just needs a puppet joined
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/joined_members", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn joined_members_route(
db: DatabaseGuard,
diff --git a/src/client_server/message.rs b/src/client_server/message.rs
index cf4f0cb6..4fb87715 100644
--- a/src/client_server/message.rs
+++ b/src/client_server/message.rs
@@ -11,9 +11,6 @@ use std::{
sync::Arc,
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, put};
-
/// # `PUT /_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId}`
///
/// Send a message event into the room.
@@ -21,10 +18,6 @@ use rocket::{get, put};
/// - Is a NOOP if the txn id was already used before and returns the same event id again
/// - The only requirement for the content is that it has to be valid json
/// - Tries to send the event into the room, auth rules will determine if it is allowed
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/rooms/<_>/send/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn send_message_event_route(
db: DatabaseGuard,
@@ -110,10 +103,6 @@ pub async fn send_message_event_route(
///
/// - Only works if the user is joined (TODO: always allow, but only show events where the user was
/// joined, depending on history_visibility)
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/messages", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_message_events_route(
db: DatabaseGuard,
diff --git a/src/client_server/mod.rs b/src/client_server/mod.rs
index 115ddaf6..a7241b0d 100644
--- a/src/client_server/mod.rs
+++ b/src/client_server/mod.rs
@@ -62,23 +62,6 @@ pub use unversioned::*;
pub use user_directory::*;
pub use voip::*;
-#[cfg(not(feature = "conduit_bin"))]
-use super::State;
-#[cfg(feature = "conduit_bin")]
-use {
- crate::ConduitResult, rocket::options, ruma::api::client::r0::to_device::send_event_to_device,
-};
-
pub const DEVICE_ID_LENGTH: usize = 10;
pub const TOKEN_LENGTH: usize = 256;
pub const SESSION_ID_LENGTH: usize = 256;
-
-/// # `OPTIONS`
-///
-/// Web clients use this to get CORS headers.
-#[cfg(feature = "conduit_bin")]
-#[options("/<_..>")]
-#[tracing::instrument]
-pub async fn options_route() -> ConduitResult {
- Ok(send_event_to_device::Response {}.into())
-}
diff --git a/src/client_server/presence.rs b/src/client_server/presence.rs
index cdc1e1f5..0d58ebff 100644
--- a/src/client_server/presence.rs
+++ b/src/client_server/presence.rs
@@ -2,16 +2,9 @@ use crate::{database::DatabaseGuard, utils, ConduitResult, Ruma};
use ruma::api::client::r0::presence::{get_presence, set_presence};
use std::time::Duration;
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, put};
-
/// # `PUT /_matrix/client/r0/presence/{userId}/status`
///
/// Sets the presence state of the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/presence/<_>/status", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_presence_route(
db: DatabaseGuard,
@@ -54,10 +47,6 @@ pub async fn set_presence_route(
/// Gets the presence state of the given user.
///
/// - Only works if you share a room with the user
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/presence/<_>/status", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_presence_route(
db: DatabaseGuard,
diff --git a/src/client_server/profile.rs b/src/client_server/profile.rs
index ef58a980..bb13b448 100644
--- a/src/client_server/profile.rs
+++ b/src/client_server/profile.rs
@@ -14,18 +14,11 @@ use ruma::{
use serde_json::value::to_raw_value;
use std::sync::Arc;
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, put};
-
/// # `PUT /_matrix/client/r0/profile/{userId}/displayname`
///
/// Updates the displayname.
///
/// - Also makes sure other users receive the update using presence EDUs
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/profile/<_>/displayname", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_displayname_route(
db: DatabaseGuard,
@@ -124,10 +117,6 @@ pub async fn set_displayname_route(
/// Returns the displayname of the user.
///
/// - If user is on another server: Fetches displayname over federation
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/profile/<_>/displayname", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_displayname_route(
db: DatabaseGuard,
@@ -163,10 +152,6 @@ pub async fn get_displayname_route(
/// Updates the avatar_url and blurhash.
///
/// - Also makes sure other users receive the update using presence EDUs
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/profile/<_>/avatar_url", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_avatar_url_route(
db: DatabaseGuard,
@@ -267,10 +252,6 @@ pub async fn set_avatar_url_route(
/// Returns the avatar_url and blurhash of the user.
///
/// - If user is on another server: Fetches avatar_url and blurhash over federation
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/profile/<_>/avatar_url", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_avatar_url_route(
db: DatabaseGuard,
@@ -308,10 +289,6 @@ pub async fn get_avatar_url_route(
/// Returns the displayname, avatar_url and blurhash of the user.
///
/// - If user is on another server: Fetches profile over federation
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/profile/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_profile_route(
db: DatabaseGuard,
diff --git a/src/client_server/push.rs b/src/client_server/push.rs
index a8ba1a2a..322cf89a 100644
--- a/src/client_server/push.rs
+++ b/src/client_server/push.rs
@@ -12,16 +12,9 @@ use ruma::{
push::{ConditionalPushRuleInit, PatternedPushRuleInit, SimplePushRuleInit},
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{delete, get, post, put};
-
/// # `GET /_matrix/client/r0/pushrules`
///
/// Retrieves the push rules event for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/pushrules", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_pushrules_all_route(
db: DatabaseGuard,
@@ -46,10 +39,6 @@ pub async fn get_pushrules_all_route(
/// # `GET /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}`
///
/// Retrieves a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/pushrules/<_>/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_pushrule_route(
db: DatabaseGuard,
@@ -103,10 +92,6 @@ pub async fn get_pushrule_route(
/// # `PUT /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}`
///
/// Creates a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/pushrules/<_>/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_pushrule_route(
db: DatabaseGuard,
@@ -204,10 +189,6 @@ pub async fn set_pushrule_route(
/// # `GET /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/actions`
///
/// Gets the actions of a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/pushrules/<_>/<_>/<_>/actions", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_pushrule_actions_route(
db: DatabaseGuard,
@@ -266,10 +247,6 @@ pub async fn get_pushrule_actions_route(
/// # `PUT /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/actions`
///
/// Sets the actions of a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/pushrules/<_>/<_>/<_>/actions", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_pushrule_actions_route(
db: DatabaseGuard,
@@ -338,10 +315,6 @@ pub async fn set_pushrule_actions_route(
/// # `GET /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/enabled`
///
/// Gets the enabled status of a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/pushrules/<_>/<_>/<_>/enabled", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_pushrule_enabled_route(
db: DatabaseGuard,
@@ -402,10 +375,6 @@ pub async fn get_pushrule_enabled_route(
/// # `PUT /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/enabled`
///
/// Sets the enabled status of a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/pushrules/<_>/<_>/<_>/enabled", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_pushrule_enabled_route(
db: DatabaseGuard,
@@ -479,10 +448,6 @@ pub async fn set_pushrule_enabled_route(
/// # `DELETE /_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}`
///
/// Deletes a single specified push rule for this user.
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/r0/pushrules/<_>/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_pushrule_route(
db: DatabaseGuard,
@@ -546,10 +511,6 @@ pub async fn delete_pushrule_route(
/// # `GET /_matrix/client/r0/pushers`
///
/// Gets all currently active pushers for the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/pushers", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_pushers_route(
db: DatabaseGuard,
@@ -568,10 +529,6 @@ pub async fn get_pushers_route(
/// Adds a pusher for the sender user.
///
/// - TODO: Handle `append`
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/pushers/set", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_pushers_route(
db: DatabaseGuard,
diff --git a/src/client_server/read_marker.rs b/src/client_server/read_marker.rs
index 502a612e..c9480f00 100644
--- a/src/client_server/read_marker.rs
+++ b/src/client_server/read_marker.rs
@@ -10,19 +10,12 @@ use ruma::{
};
use std::collections::BTreeMap;
-#[cfg(feature = "conduit_bin")]
-use rocket::post;
-
/// # `POST /_matrix/client/r0/rooms/{roomId}/read_markers`
///
/// Sets different types of read markers.
///
/// - Updates fully-read account data event to `fully_read`
/// - If `read_receipt` is set: Update private marker and public read receipt EDU
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/read_markers", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn set_read_marker_route(
db: DatabaseGuard,
@@ -89,10 +82,6 @@ pub async fn set_read_marker_route(
/// # `POST /_matrix/client/r0/rooms/{roomId}/receipt/{receiptType}/{eventId}`
///
/// Sets private read marker and public read receipt EDU.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/receipt/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn create_receipt_route(
db: DatabaseGuard,
diff --git a/src/client_server/redact.rs b/src/client_server/redact.rs
index 85de2330..2b442fc4 100644
--- a/src/client_server/redact.rs
+++ b/src/client_server/redact.rs
@@ -6,8 +6,6 @@ use ruma::{
events::{room::redaction::RoomRedactionEventContent, EventType},
};
-#[cfg(feature = "conduit_bin")]
-use rocket::put;
use serde_json::value::to_raw_value;
/// # `PUT /_matrix/client/r0/rooms/{roomId}/redact/{eventId}/{txnId}`
@@ -15,10 +13,6 @@ use serde_json::value::to_raw_value;
/// Tries to send a redaction event into the room.
///
/// - TODO: Handle txn id
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/rooms/<_>/redact/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn redact_event_route(
db: DatabaseGuard,
diff --git a/src/client_server/report.rs b/src/client_server/report.rs
index 032e446c..441e33d7 100644
--- a/src/client_server/report.rs
+++ b/src/client_server/report.rs
@@ -1,21 +1,14 @@
-use crate::{database::DatabaseGuard, ConduitResult, Error, Ruma};
+use crate::{database::DatabaseGuard, utils::HtmlEscape, ConduitResult, Error, Ruma};
use ruma::{
api::client::{error::ErrorKind, r0::room::report_content},
events::room::message,
int,
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{http::RawStr, post};
-
/// # `POST /_matrix/client/r0/rooms/{roomId}/report/{eventId}`
///
/// Reports an inappropriate event to homeserver admins
///
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/report/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn report_event_route(
db: DatabaseGuard,
@@ -70,7 +63,7 @@ pub async fn report_event_route(
pdu.room_id,
pdu.sender,
body.score,
- RawStr::new(&body.reason).html_escape()
+ HtmlEscape(&body.reason)
),
));
diff --git a/src/client_server/room.rs b/src/client_server/room.rs
index 7ea31d8a..475c5b45 100644
--- a/src/client_server/room.rs
+++ b/src/client_server/room.rs
@@ -30,9 +30,6 @@ use serde_json::{json, value::to_raw_value};
use std::{cmp::max, collections::BTreeMap, sync::Arc};
use tracing::{info, warn};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
-
/// # `POST /_matrix/client/r0/createRoom`
///
/// Creates a new room.
@@ -49,10 +46,6 @@ use rocket::{get, post};
/// - Send events listed in initial state
/// - Send events implied by `name` and `topic`
/// - Send invite events
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/createRoom", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn create_room_route(
db: DatabaseGuard,
@@ -425,10 +418,6 @@ pub async fn create_room_route(
/// Gets a single event.
///
/// - You have to currently be joined to the room (TODO: Respect history visibility)
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/event/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_room_event_route(
db: DatabaseGuard,
@@ -458,10 +447,6 @@ pub async fn get_room_event_route(
/// Lists all aliases of the room.
///
/// - Only users joined to the room are allowed to call this TODO: Allow any user to call it if history_visibility is world readable
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/aliases", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_room_aliases_route(
db: DatabaseGuard,
@@ -496,10 +481,6 @@ pub async fn get_room_aliases_route(
/// - Transfers some state events
/// - Moves local aliases
/// - Modifies old room power levels to prevent users from speaking
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/rooms/<_>/upgrade", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn upgrade_room_route(
db: DatabaseGuard,
diff --git a/src/client_server/search.rs b/src/client_server/search.rs
index f492292c..3f8a7010 100644
--- a/src/client_server/search.rs
+++ b/src/client_server/search.rs
@@ -1,8 +1,6 @@
use crate::{database::DatabaseGuard, ConduitResult, Error, Ruma};
use ruma::api::client::{error::ErrorKind, r0::search::search_events};
-#[cfg(feature = "conduit_bin")]
-use rocket::post;
use search_events::{EventContextResult, ResultCategories, ResultRoomEvents, SearchResult};
use std::collections::BTreeMap;
@@ -11,10 +9,6 @@ use std::collections::BTreeMap;
/// Searches rooms for messages.
///
/// - Only works if the user is currently joined to the room (TODO: Respect history visibility)
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/search", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn search_events_route(
db: DatabaseGuard,
diff --git a/src/client_server/session.rs b/src/client_server/session.rs
index 61e5519a..264eac03 100644
--- a/src/client_server/session.rs
+++ b/src/client_server/session.rs
@@ -19,16 +19,14 @@ struct Claims {
exp: usize,
}
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, post};
-
/// # `GET /_matrix/client/r0/login`
///
/// Get the supported login types of this server. One of these should be used as the `type` field
/// when logging in.
-#[cfg_attr(feature = "conduit_bin", get("/_matrix/client/r0/login"))]
-#[tracing::instrument]
-pub async fn get_login_types_route() -> ConduitResult {
+#[tracing::instrument(skip(_body))]
+pub async fn get_login_types_route(
+ _body: Ruma,
+) -> ConduitResult {
Ok(
get_login_types::Response::new(vec![get_login_types::LoginType::Password(
Default::default(),
@@ -48,10 +46,6 @@ pub async fn get_login_types_route() -> ConduitResult
///
/// Note: You can use [`GET /_matrix/client/r0/login`](fn.get_supported_versions_route.html) to see
/// supported login types.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/login", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn login_route(
db: DatabaseGuard,
@@ -173,10 +167,6 @@ pub async fn login_route(
/// - Deletes device metadata (device id, device display name, last seen ip, last seen ts)
/// - Forgets to-device events
/// - Triggers device list updates
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/logout", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn logout_route(
db: DatabaseGuard,
@@ -203,10 +193,6 @@ pub async fn logout_route(
///
/// Note: This is equivalent to calling [`GET /_matrix/client/r0/logout`](fn.logout_route.html)
/// from each device of this user.
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/logout/all", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn logout_all_route(
db: DatabaseGuard,
diff --git a/src/client_server/state.rs b/src/client_server/state.rs
index c07d4825..96b2184c 100644
--- a/src/client_server/state.rs
+++ b/src/client_server/state.rs
@@ -19,9 +19,6 @@ use ruma::{
EventId, RoomId, UserId,
};
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, put};
-
/// # `PUT /_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}`
///
/// Sends a state event into the room.
@@ -29,10 +26,6 @@ use rocket::{get, put};
/// - The only requirement for the content is that it has to be valid json
/// - Tries to send the event into the room, auth rules will determine if it is allowed
/// - If event is new canonical_alias: Rejects if alias is incorrect
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/rooms/<_>/state/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn send_state_event_for_key_route(
db: DatabaseGuard,
@@ -63,10 +56,6 @@ pub async fn send_state_event_for_key_route(
/// - The only requirement for the content is that it has to be valid json
/// - Tries to send the event into the room, auth rules will determine if it is allowed
/// - If event is new canonical_alias: Rejects if alias is incorrect
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/rooms/<_>/state/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn send_state_event_for_empty_key_route(
db: DatabaseGuard,
@@ -103,10 +92,6 @@ pub async fn send_state_event_for_empty_key_route(
/// Get all state events for a room.
///
/// - If not joined: Only works if current room history visibility is world readable
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/state", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_state_events_route(
db: DatabaseGuard,
@@ -155,10 +140,6 @@ pub async fn get_state_events_route(
/// Get single state event of a room.
///
/// - If not joined: Only works if current room history visibility is world readable
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/state/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_state_events_for_key_route(
db: DatabaseGuard,
@@ -211,10 +192,6 @@ pub async fn get_state_events_for_key_route(
/// Get single state event of a room.
///
/// - If not joined: Only works if current room history visibility is world readable
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/rooms/<_>/state/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_state_events_for_empty_key_route(
db: DatabaseGuard,
diff --git a/src/client_server/sync.rs b/src/client_server/sync.rs
index 2b814f54..6ba68b0d 100644
--- a/src/client_server/sync.rs
+++ b/src/client_server/sync.rs
@@ -20,9 +20,6 @@ use std::{
use tokio::sync::watch::Sender;
use tracing::error;
-#[cfg(feature = "conduit_bin")]
-use rocket::{get, tokio};
-
/// # `GET /_matrix/client/r0/sync`
///
/// Synchronize the client's state with the latest state on the server.
@@ -57,10 +54,6 @@ use rocket::{get, tokio};
///
/// - Sync is handled in an async task, multiple requests from the same device with the same
/// `since` will be cached
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/sync", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn sync_events_route(
db: DatabaseGuard,
diff --git a/src/client_server/tag.rs b/src/client_server/tag.rs
index 42bad4cf..cad3421a 100644
--- a/src/client_server/tag.rs
+++ b/src/client_server/tag.rs
@@ -8,18 +8,11 @@ use ruma::{
};
use std::collections::BTreeMap;
-#[cfg(feature = "conduit_bin")]
-use rocket::{delete, get, put};
-
/// # `PUT /_matrix/client/r0/user/{userId}/rooms/{roomId}/tags/{tag}`
///
/// Adds a tag to the room.
///
/// - Inserts the tag into the tag event of the room account data.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/user/<_>/rooms/<_>/tags/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn update_tag_route(
db: DatabaseGuard,
@@ -58,10 +51,6 @@ pub async fn update_tag_route(
/// Deletes a tag from the room.
///
/// - Removes the tag from the tag event of the room account data.
-#[cfg_attr(
- feature = "conduit_bin",
- delete("/_matrix/client/r0/user/<_>/rooms/<_>/tags/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn delete_tag_route(
db: DatabaseGuard,
@@ -97,10 +86,6 @@ pub async fn delete_tag_route(
/// Returns tags on the room.
///
/// - Gets the tag event of the room account data.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/user/<_>/rooms/<_>/tags", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn get_tags_route(
db: DatabaseGuard,
diff --git a/src/client_server/thirdparty.rs b/src/client_server/thirdparty.rs
index 4305902f..d8b7972e 100644
--- a/src/client_server/thirdparty.rs
+++ b/src/client_server/thirdparty.rs
@@ -1,19 +1,15 @@
-use crate::ConduitResult;
+use crate::{ConduitResult, Ruma};
use ruma::api::client::r0::thirdparty::get_protocols;
-#[cfg(feature = "conduit_bin")]
-use rocket::get;
use std::collections::BTreeMap;
/// # `GET /_matrix/client/r0/thirdparty/protocols`
///
/// TODO: Fetches all metadata about protocols supported by the homeserver.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/thirdparty/protocols")
-)]
-#[tracing::instrument]
-pub async fn get_protocols_route() -> ConduitResult {
+#[tracing::instrument(skip(_body))]
+pub async fn get_protocols_route(
+ _body: Ruma,
+) -> ConduitResult {
// TODO
Ok(get_protocols::Response {
protocols: BTreeMap::new(),
diff --git a/src/client_server/to_device.rs b/src/client_server/to_device.rs
index e0aa9e91..12691185 100644
--- a/src/client_server/to_device.rs
+++ b/src/client_server/to_device.rs
@@ -10,16 +10,9 @@ use ruma::{
to_device::DeviceIdOrAllDevices,
};
-#[cfg(feature = "conduit_bin")]
-use rocket::put;
-
/// # `PUT /_matrix/client/r0/sendToDevice/{eventType}/{txnId}`
///
/// Send a to-device event to a set of client devices.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/sendToDevice/<_>/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn send_event_to_device_route(
db: DatabaseGuard,
diff --git a/src/client_server/typing.rs b/src/client_server/typing.rs
index 15e74b35..3a61c584 100644
--- a/src/client_server/typing.rs
+++ b/src/client_server/typing.rs
@@ -2,18 +2,11 @@ use crate::{database::DatabaseGuard, utils, ConduitResult, Ruma};
use create_typing_event::Typing;
use ruma::api::client::r0::typing::create_typing_event;
-#[cfg(feature = "conduit_bin")]
-use rocket::put;
-
/// # `PUT /_matrix/client/r0/rooms/{roomId}/typing/{userId}`
///
/// Sets the typing state of the sender user.
-#[cfg_attr(
- feature = "conduit_bin",
- put("/_matrix/client/r0/rooms/<_>/typing/<_>", data = "")
-)]
#[tracing::instrument(skip(db, body))]
-pub fn create_typing_event_route(
+pub async fn create_typing_event_route(
db: DatabaseGuard,
body: Ruma>,
) -> ConduitResult {
diff --git a/src/client_server/unversioned.rs b/src/client_server/unversioned.rs
index ea685b4b..8b1b66f2 100644
--- a/src/client_server/unversioned.rs
+++ b/src/client_server/unversioned.rs
@@ -1,11 +1,8 @@
use std::{collections::BTreeMap, iter::FromIterator};
-use crate::ConduitResult;
+use crate::{ConduitResult, Ruma};
use ruma::api::client::unversioned::get_supported_versions;
-#[cfg(feature = "conduit_bin")]
-use rocket::get;
-
/// # `GET /_matrix/client/versions`
///
/// Get the versions of the specification and unstable features supported by this server.
@@ -16,9 +13,10 @@ use rocket::get;
///
/// Note: Unstable features are used while developing new features. Clients should avoid using
/// unstable features in their stable releases
-#[cfg_attr(feature = "conduit_bin", get("/_matrix/client/versions"))]
-#[tracing::instrument]
-pub async fn get_supported_versions_route() -> ConduitResult {
+#[tracing::instrument(skip(_body))]
+pub async fn get_supported_versions_route(
+ _body: Ruma,
+) -> ConduitResult {
let resp = get_supported_versions::Response {
versions: vec!["r0.5.0".to_owned(), "r0.6.0".to_owned()],
unstable_features: BTreeMap::from_iter([("org.matrix.e2e_cross_signing".to_owned(), true)]),
diff --git a/src/client_server/user_directory.rs b/src/client_server/user_directory.rs
index cfcb9bb9..c923ceed 100644
--- a/src/client_server/user_directory.rs
+++ b/src/client_server/user_directory.rs
@@ -1,18 +1,11 @@
use crate::{database::DatabaseGuard, ConduitResult, Ruma};
use ruma::api::client::r0::user_directory::search_users;
-#[cfg(feature = "conduit_bin")]
-use rocket::post;
-
/// # `POST /_matrix/client/r0/user_directory/search`
///
/// Searches all known users for a match.
///
/// - TODO: Hide users that are not in any public rooms?
-#[cfg_attr(
- feature = "conduit_bin",
- post("/_matrix/client/r0/user_directory/search", data = "")
-)]
#[tracing::instrument(skip(db, body))]
pub async fn search_users_route(
db: DatabaseGuard,
diff --git a/src/client_server/voip.rs b/src/client_server/voip.rs
index 66a85f0f..6abebdcf 100644
--- a/src/client_server/voip.rs
+++ b/src/client_server/voip.rs
@@ -7,20 +7,13 @@ use std::time::{Duration, SystemTime};
type HmacSha1 = Hmac;
-#[cfg(feature = "conduit_bin")]
-use rocket::get;
-
/// # `GET /_matrix/client/r0/voip/turnServer`
///
/// TODO: Returns information about the recommended turn server.
-#[cfg_attr(
- feature = "conduit_bin",
- get("/_matrix/client/r0/voip/turnServer", data = "")
-)]
#[tracing::instrument(skip(body, db))]
pub async fn turn_server_route(
- body: Ruma,
db: DatabaseGuard,
+ body: Ruma,
) -> ConduitResult {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
diff --git a/src/config.rs b/src/config.rs
index 4c0fcc21..48ac9816 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -1,4 +1,7 @@
-use std::collections::BTreeMap;
+use std::{
+ collections::BTreeMap,
+ net::{IpAddr, Ipv4Addr},
+};
use ruma::ServerName;
use serde::{de::IgnoredAny, Deserialize};
@@ -10,6 +13,10 @@ use self::proxy::ProxyConfig;
#[derive(Clone, Debug, Deserialize)]
pub struct Config {
+ #[serde(default = "default_address")]
+ pub address: IpAddr,
+ #[serde(default = "default_port")]
+ pub port: u16,
pub server_name: Box,
#[serde(default = "default_database_backend")]
pub database_backend: String,
@@ -90,6 +97,14 @@ fn true_fn() -> bool {
true
}
+fn default_address() -> IpAddr {
+ Ipv4Addr::LOCALHOST.into()
+}
+
+fn default_port() -> u16 {
+ 8000
+}
+
fn default_database_backend() -> String {
"sqlite".to_owned()
}
@@ -123,7 +138,7 @@ fn default_max_concurrent_requests() -> u16 {
}
fn default_log() -> String {
- "info,state_res=warn,rocket=off,_=off,sled=off".to_owned()
+ "info,state_res=warn,_=off,sled=off".to_owned()
}
fn default_turn_ttl() -> u64 {
diff --git a/src/database.rs b/src/database.rs
index 2b1671cd..9eb8bd56 100644
--- a/src/database.rs
+++ b/src/database.rs
@@ -13,16 +13,12 @@ pub mod transaction_ids;
pub mod uiaa;
pub mod users;
+use self::admin::create_admin_room;
use crate::{utils, Config, Error, Result};
use abstraction::DatabaseEngine;
use directories::ProjectDirs;
+use futures_util::{stream::FuturesUnordered, StreamExt};
use lru_cache::LruCache;
-use rocket::{
- futures::{channel::mpsc, stream::FuturesUnordered, StreamExt},
- outcome::{try_outcome, IntoOutcome},
- request::{FromRequest, Request},
- Shutdown, State,
-};
use ruma::{DeviceId, EventId, RoomId, UserId};
use std::{
collections::{BTreeMap, HashMap, HashSet},
@@ -33,11 +29,9 @@ use std::{
path::Path,
sync::{Arc, Mutex, RwLock},
};
-use tokio::sync::{OwnedRwLockReadGuard, RwLock as TokioRwLock, Semaphore};
+use tokio::sync::{mpsc, OwnedRwLockReadGuard, RwLock as TokioRwLock, Semaphore};
use tracing::{debug, error, info, warn};
-use self::admin::create_admin_room;
-
pub struct Database {
_db: Arc,
pub globals: globals::Globals,
@@ -151,8 +145,8 @@ impl Database {
eprintln!("ERROR: Max request size is less than 1KB. Please increase it.");
}
- let (admin_sender, admin_receiver) = mpsc::unbounded();
- let (sending_sender, sending_receiver) = mpsc::unbounded();
+ let (admin_sender, admin_receiver) = mpsc::unbounded_channel();
+ let (sending_sender, sending_receiver) = mpsc::unbounded_channel();
let db = Arc::new(TokioRwLock::from(Self {
_db: builder.clone(),
@@ -764,14 +758,9 @@ impl Database {
}
#[cfg(feature = "conduit_bin")]
- pub async fn start_on_shutdown_tasks(db: Arc>, shutdown: Shutdown) {
- tokio::spawn(async move {
- shutdown.await;
-
- info!(target: "shutdown-sync", "Received shutdown notification, notifying sync helpers...");
-
- db.read().await.globals.rotate.fire();
- });
+ pub async fn on_shutdown(db: Arc>) {
+ info!(target: "shutdown-sync", "Received shutdown notification, notifying sync helpers...");
+ db.read().await.globals.rotate.fire();
}
pub async fn watch(&self, user_id: &UserId, device_id: &DeviceId) {
@@ -948,14 +937,23 @@ impl Deref for DatabaseGuard {
}
}
-#[rocket::async_trait]
-impl<'r> FromRequest<'r> for DatabaseGuard {
- type Error = ();
+#[cfg(feature = "conduit_bin")]
+#[axum::async_trait]
+impl axum::extract::FromRequest for DatabaseGuard
+where
+ B: Send,
+{
+ type Rejection = axum::extract::rejection::ExtensionRejection;
- async fn from_request(req: &'r Request<'_>) -> rocket::request::Outcome {
- let db = try_outcome!(req.guard::<&State>>>().await);
+ async fn from_request(
+ req: &mut axum::extract::RequestParts,
+ ) -> Result {
+ use axum::extract::Extension;
- Ok(DatabaseGuard(Arc::clone(db).read_owned().await)).or_forward(())
+ let Extension(db): Extension>> =
+ Extension::from_request(req).await?;
+
+ Ok(DatabaseGuard(db.read_owned().await))
}
}
diff --git a/src/database/admin.rs b/src/database/admin.rs
index 9bbfd4ea..e4b7e0f9 100644
--- a/src/database/admin.rs
+++ b/src/database/admin.rs
@@ -1,34 +1,41 @@
-use std::{collections::BTreeMap, convert::TryFrom, convert::TryInto, sync::Arc, time::Instant};
+use std::{
+ collections::BTreeMap,
+ convert::{TryFrom, TryInto},
+ sync::Arc,
+ time::Instant,
+};
use crate::{
error::{Error, Result},
pdu::PduBuilder,
- server_server, Database, PduEvent,
+ server_server,
+ utils::HtmlEscape,
+ Database, PduEvent,
};
use clap::Parser;
use regex::Regex;
-use rocket::{
- futures::{channel::mpsc, stream::StreamExt},
- http::RawStr,
-};
use ruma::{
- events::room::{
- canonical_alias::RoomCanonicalAliasEventContent,
- create::RoomCreateEventContent,
- guest_access::{GuestAccess, RoomGuestAccessEventContent},
- history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
- join_rules::{JoinRule, RoomJoinRulesEventContent},
- member::{MembershipState, RoomMemberEventContent},
- name::RoomNameEventContent,
- power_levels::RoomPowerLevelsEventContent,
- topic::RoomTopicEventContent,
+ events::{
+ room::{
+ canonical_alias::RoomCanonicalAliasEventContent,
+ create::RoomCreateEventContent,
+ guest_access::{GuestAccess, RoomGuestAccessEventContent},
+ history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
+ join_rules::{JoinRule, RoomJoinRulesEventContent},
+ member::{MembershipState, RoomMemberEventContent},
+ message::RoomMessageEventContent,
+ name::RoomNameEventContent,
+ power_levels::RoomPowerLevelsEventContent,
+ topic::RoomTopicEventContent,
+ },
+ EventType,
},
- events::{room::message::RoomMessageEventContent, EventType},
identifiers::{EventId, RoomAliasId, RoomId, RoomName, RoomVersionId, ServerName, UserId},
};
use serde_json::value::to_raw_value;
-use tokio::sync::{MutexGuard, RwLock, RwLockReadGuard};
+use tokio::sync::{mpsc, MutexGuard, RwLock, RwLockReadGuard};
+#[derive(Debug)]
pub enum AdminRoomEvent {
ProcessMessage(String),
SendMessage(RoomMessageEventContent),
@@ -91,7 +98,7 @@ impl Admin {
loop {
tokio::select! {
- Some(event) = receiver.next() => {
+ Some(event) = receiver.recv() => {
let guard = db.read().await;
let mutex_state = Arc::clone(
guard.globals
@@ -123,13 +130,13 @@ impl Admin {
pub fn process_message(&self, room_message: String) {
self.sender
- .unbounded_send(AdminRoomEvent::ProcessMessage(room_message))
+ .send(AdminRoomEvent::ProcessMessage(room_message))
.unwrap();
}
pub fn send_message(&self, message_content: RoomMessageEventContent) {
self.sender
- .unbounded_send(AdminRoomEvent::SendMessage(message_content))
+ .send(AdminRoomEvent::SendMessage(message_content))
.unwrap();
}
}
@@ -405,7 +412,7 @@ fn process_admin_command(
} else {
"PDU was accepted"
},
- RawStr::new(&json_text).html_escape()
+ HtmlEscape(&json_text)
),
)
}
diff --git a/src/database/sending.rs b/src/database/sending.rs
index 4a032855..2d64be15 100644
--- a/src/database/sending.rs
+++ b/src/database/sending.rs
@@ -9,11 +9,8 @@ use crate::{
appservice_server, database::pusher, server_server, utils, Database, Error, PduEvent, Result,
};
use federation::transactions::send_transaction_message;
+use futures_util::{stream::FuturesUnordered, StreamExt};
use ring::digest;
-use rocket::futures::{
- channel::mpsc,
- stream::{FuturesUnordered, StreamExt},
-};
use ruma::{
api::{
appservice,
@@ -33,7 +30,7 @@ use ruma::{
};
use tokio::{
select,
- sync::{RwLock, Semaphore},
+ sync::{mpsc, RwLock, Semaphore},
};
use tracing::{error, warn};
@@ -170,7 +167,7 @@ impl Sending {
Self::parse_servercurrentevent(&k, v).ok().map(|ev| (ev, k))
})
.take(30)
- .collect::<>();
+ .collect();
// TODO: find edus
@@ -207,7 +204,7 @@ impl Sending {
}
};
},
- Some((key, value)) = receiver.next() => {
+ Some((key, value)) = receiver.recv() => {
if let Ok((outgoing_kind, event)) = Self::parse_servercurrentevent(&key, value) {
let guard = db.read().await;
@@ -417,7 +414,7 @@ impl Sending {
key.push(0xff);
key.extend_from_slice(pdu_id);
self.servernameevent_data.insert(&key, &[])?;
- self.sender.unbounded_send((key, vec![])).unwrap();
+ self.sender.send((key, vec![])).unwrap();
Ok(())
}
@@ -433,7 +430,7 @@ impl Sending {
key.push(0xff);
key.extend_from_slice(pdu_id);
- self.sender.unbounded_send((key.clone(), vec![])).unwrap();
+ self.sender.send((key.clone(), vec![])).unwrap();
(key, Vec::new())
});
@@ -454,7 +451,7 @@ impl Sending {
key.push(0xff);
key.extend_from_slice(&id.to_be_bytes());
self.servernameevent_data.insert(&key, &serialized)?;
- self.sender.unbounded_send((key, serialized)).unwrap();
+ self.sender.send((key, serialized)).unwrap();
Ok(())
}
@@ -466,7 +463,7 @@ impl Sending {
key.push(0xff);
key.extend_from_slice(pdu_id);
self.servernameevent_data.insert(&key, &[])?;
- self.sender.unbounded_send((key, vec![])).unwrap();
+ self.sender.send((key, vec![])).unwrap();
Ok(())
}
diff --git a/src/error.rs b/src/error.rs
index 5ffe48c9..817ef50f 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,27 +1,20 @@
+use std::convert::Infallible;
+
+use http::StatusCode;
use ruma::{
api::client::{
error::{Error as RumaError, ErrorKind},
- r0::uiaa::UiaaInfo,
+ r0::uiaa::{UiaaInfo, UiaaResponse},
},
ServerName,
};
use thiserror::Error;
-use tracing::warn;
+use tracing::{error, warn};
#[cfg(feature = "persy")]
use persy::PersyError;
-#[cfg(feature = "conduit_bin")]
-use {
- crate::RumaResponse,
- http::StatusCode,
- rocket::{
- response::{self, Responder},
- Request,
- },
- ruma::api::client::r0::uiaa::UiaaResponse,
- tracing::error,
-};
+use crate::RumaResponse;
pub type Result = std::result::Result;
@@ -81,6 +74,9 @@ pub enum Error {
BadRequest(ErrorKind, &'static str),
#[error("{0}")]
Conflict(&'static str), // This is only needed for when a room alias already exists
+ #[cfg(feature = "conduit_bin")]
+ #[error("{0}")]
+ ExtensionError(#[from] axum::extract::rejection::ExtensionRejection),
}
impl Error {
@@ -139,16 +135,6 @@ impl Error {
}
}
-#[cfg(feature = "conduit_bin")]
-impl<'r, 'o> Responder<'r, 'o> for Error
-where
- 'o: 'r,
-{
- fn respond_to(self, r: &'r Request<'_>) -> response::Result<'o> {
- self.to_response().respond_to(r)
- }
-}
-
#[cfg(feature = "persy")]
impl> From> for Error {
fn from(err: persy::PE) -> Self {
@@ -157,3 +143,16 @@ impl> From> for Error {
}
}
}
+
+impl From for Error {
+ fn from(i: Infallible) -> Self {
+ match i {}
+ }
+}
+
+#[cfg(feature = "conduit_bin")]
+impl axum::response::IntoResponse for Error {
+ fn into_response(self) -> axum::response::Response {
+ self.to_response().into_response()
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 030dfc3a..135ab854 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,8 +7,6 @@
#![allow(clippy::suspicious_else_formatting)]
#![deny(clippy::dbg_macro)]
-use std::ops::Deref;
-
mod config;
mod database;
mod error;
@@ -24,16 +22,4 @@ pub use config::Config;
pub use database::Database;
pub use error::{Error, Result};
pub use pdu::PduEvent;
-pub use rocket::Config as RocketConfig;
pub use ruma_wrapper::{ConduitResult, Ruma, RumaResponse};
-
-pub struct State<'r, T: Send + Sync + 'static>(pub &'r T);
-
-impl<'r, T: Send + Sync + 'static> Deref for State<'r, T> {
- type Target = T;
-
- #[inline(always)]
- fn deref(&self) -> &T {
- self.0
- }
-}
diff --git a/src/main.rs b/src/main.rs
index ea09dd5b..3ab12941 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,24 +7,37 @@
#![allow(clippy::suspicious_else_formatting)]
#![deny(clippy::dbg_macro)]
-use std::sync::Arc;
+use std::{future::Future, net::SocketAddr, sync::Arc, time::Duration};
-use maplit::hashset;
-use opentelemetry::trace::{FutureExt, Tracer};
-use rocket::{
- catch, catchers,
- figment::{
- providers::{Env, Format, Toml},
- Figment,
- },
- routes, Request,
+use axum::{
+ extract::{FromRequest, MatchedPath},
+ handler::Handler,
+ routing::{get, on, MethodFilter},
+ Router,
+};
+use figment::{
+ providers::{Env, Format, Toml},
+ Figment,
+};
+use http::{
+ header::{self, HeaderName},
+ Method,
+};
+use opentelemetry::trace::{FutureExt, Tracer};
+use ruma::{
+ api::{IncomingRequest, Metadata},
+ Outgoing,
+};
+use tokio::{signal, sync::RwLock};
+use tower::ServiceBuilder;
+use tower_http::{
+ cors::{self, CorsLayer},
+ trace::TraceLayer,
+ ServiceBuilderExt as _,
};
-use ruma::api::client::error::ErrorKind;
-use tokio::sync::RwLock;
use tracing_subscriber::{prelude::*, EnvFilter};
pub use conduit::*; // Re-export everything from the library crate
-pub use rocket::State;
#[cfg(all(not(target_env = "msvc"), feature = "jemalloc"))]
use tikv_jemallocator::Jemalloc;
@@ -33,160 +46,10 @@ use tikv_jemallocator::Jemalloc;
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;
-fn setup_rocket(config: Figment, data: Arc>) -> rocket::Rocket {
- rocket::custom(config)
- .manage(data)
- .mount(
- "/",
- routes![
- client_server::get_supported_versions_route,
- client_server::get_register_available_route,
- client_server::register_route,
- client_server::get_login_types_route,
- client_server::login_route,
- client_server::whoami_route,
- client_server::logout_route,
- client_server::logout_all_route,
- client_server::change_password_route,
- client_server::deactivate_route,
- client_server::third_party_route,
- client_server::get_capabilities_route,
- client_server::get_pushrules_all_route,
- client_server::set_pushrule_route,
- client_server::get_pushrule_route,
- client_server::set_pushrule_enabled_route,
- client_server::get_pushrule_enabled_route,
- client_server::get_pushrule_actions_route,
- client_server::set_pushrule_actions_route,
- client_server::delete_pushrule_route,
- client_server::get_room_event_route,
- client_server::get_room_aliases_route,
- client_server::get_filter_route,
- client_server::create_filter_route,
- client_server::set_global_account_data_route,
- client_server::set_room_account_data_route,
- client_server::get_global_account_data_route,
- client_server::get_room_account_data_route,
- client_server::set_displayname_route,
- client_server::get_displayname_route,
- client_server::set_avatar_url_route,
- client_server::get_avatar_url_route,
- client_server::get_profile_route,
- client_server::set_presence_route,
- client_server::get_presence_route,
- client_server::upload_keys_route,
- client_server::get_keys_route,
- client_server::claim_keys_route,
- client_server::create_backup_route,
- client_server::update_backup_route,
- client_server::delete_backup_route,
- client_server::get_latest_backup_route,
- client_server::get_backup_route,
- client_server::add_backup_key_sessions_route,
- client_server::add_backup_keys_route,
- client_server::delete_backup_key_session_route,
- client_server::delete_backup_key_sessions_route,
- client_server::delete_backup_keys_route,
- client_server::get_backup_key_session_route,
- client_server::get_backup_key_sessions_route,
- client_server::get_backup_keys_route,
- client_server::set_read_marker_route,
- client_server::create_receipt_route,
- client_server::create_typing_event_route,
- client_server::create_room_route,
- client_server::redact_event_route,
- client_server::report_event_route,
- client_server::create_alias_route,
- client_server::delete_alias_route,
- client_server::get_alias_route,
- client_server::join_room_by_id_route,
- client_server::join_room_by_id_or_alias_route,
- client_server::joined_members_route,
- client_server::leave_room_route,
- client_server::forget_room_route,
- client_server::joined_rooms_route,
- client_server::kick_user_route,
- client_server::ban_user_route,
- client_server::unban_user_route,
- client_server::invite_user_route,
- client_server::set_room_visibility_route,
- client_server::get_room_visibility_route,
- client_server::get_public_rooms_route,
- client_server::get_public_rooms_filtered_route,
- client_server::search_users_route,
- client_server::get_member_events_route,
- client_server::get_protocols_route,
- client_server::send_message_event_route,
- client_server::send_state_event_for_key_route,
- client_server::send_state_event_for_empty_key_route,
- client_server::get_state_events_route,
- client_server::get_state_events_for_key_route,
- client_server::get_state_events_for_empty_key_route,
- client_server::sync_events_route,
- client_server::get_context_route,
- client_server::get_message_events_route,
- client_server::search_events_route,
- client_server::turn_server_route,
- client_server::send_event_to_device_route,
- client_server::get_media_config_route,
- client_server::create_content_route,
- client_server::get_content_as_filename_route,
- client_server::get_content_route,
- client_server::get_content_thumbnail_route,
- client_server::get_devices_route,
- client_server::get_device_route,
- client_server::update_device_route,
- client_server::delete_device_route,
- client_server::delete_devices_route,
- client_server::get_tags_route,
- client_server::update_tag_route,
- client_server::delete_tag_route,
- client_server::options_route,
- client_server::upload_signing_keys_route,
- client_server::upload_signatures_route,
- client_server::get_key_changes_route,
- client_server::get_pushers_route,
- client_server::set_pushers_route,
- // client_server::third_party_route,
- client_server::upgrade_room_route,
- server_server::get_server_version_route,
- server_server::get_server_keys_route,
- server_server::get_server_keys_deprecated_route,
- server_server::get_public_rooms_route,
- server_server::get_public_rooms_filtered_route,
- server_server::send_transaction_message_route,
- server_server::get_event_route,
- server_server::get_missing_events_route,
- server_server::get_event_authorization_route,
- server_server::get_room_state_route,
- server_server::get_room_state_ids_route,
- server_server::create_join_event_template_route,
- server_server::create_join_event_v1_route,
- server_server::create_join_event_v2_route,
- server_server::create_invite_route,
- server_server::get_devices_route,
- server_server::get_room_information_route,
- server_server::get_profile_information_route,
- server_server::get_keys_route,
- server_server::claim_keys_route,
- ],
- )
- .register(
- "/",
- catchers![
- not_found_catcher,
- forbidden_catcher,
- unknown_token_catcher,
- missing_token_catcher,
- bad_json_catcher
- ],
- )
-}
-
-#[rocket::main]
+#[tokio::main]
async fn main() {
let raw_config =
- Figment::from(default_config())
+ Figment::new()
.merge(
Toml::file(Env::var("CONDUIT_CONFIG").expect(
"The CONDUIT_CONFIG env var needs to be set. Example: /etc/conduit.toml",
@@ -217,14 +80,7 @@ async fn main() {
}
};
- let rocket = setup_rocket(raw_config, Arc::clone(&db))
- .ignite()
- .await
- .unwrap();
-
- Database::start_on_shutdown_tasks(db, rocket.shutdown()).await;
-
- rocket.launch().await.unwrap();
+ run_server(&config, db).await.unwrap();
};
if config.allow_jaeger {
@@ -264,55 +120,282 @@ async fn main() {
}
}
-#[catch(404)]
-fn not_found_catcher(_: &Request<'_>) -> String {
- "404 Not Found".to_owned()
+async fn run_server(config: &Config, db: Arc>) -> hyper::Result<()> {
+ let listen_addr = SocketAddr::from((config.address, config.port));
+
+ let x_requested_with = HeaderName::from_static("x-requested-with");
+
+ let middlewares = ServiceBuilder::new()
+ .sensitive_headers([header::AUTHORIZATION])
+ .layer(
+ TraceLayer::new_for_http().make_span_with(|request: &http::Request<_>| {
+ let path = if let Some(path) = request.extensions().get::() {
+ path.as_str()
+ } else {
+ request.uri().path()
+ };
+
+ tracing::info_span!("http_request", %path)
+ }),
+ )
+ .compression()
+ .layer(
+ CorsLayer::new()
+ .allow_origin(cors::any())
+ .allow_methods([
+ Method::GET,
+ Method::POST,
+ Method::PUT,
+ Method::DELETE,
+ Method::OPTIONS,
+ ])
+ .allow_headers([
+ header::ORIGIN,
+ x_requested_with,
+ header::CONTENT_TYPE,
+ header::ACCEPT,
+ header::AUTHORIZATION,
+ ])
+ .max_age(Duration::from_secs(86400)),
+ )
+ .add_extension(db.clone());
+
+ axum::Server::bind(&listen_addr)
+ .serve(routes().layer(middlewares).into_make_service())
+ .with_graceful_shutdown(shutdown_signal())
+ .await?;
+
+ // After serve exits and before exiting, shutdown the DB
+ Database::on_shutdown(db).await;
+
+ Ok(())
}
-#[catch(580)]
-fn forbidden_catcher() -> Result<()> {
- Err(Error::BadRequest(ErrorKind::Forbidden, "Forbidden."))
+fn routes() -> Router {
+ Router::new()
+ .ruma_route(client_server::get_supported_versions_route)
+ .ruma_route(client_server::get_register_available_route)
+ .ruma_route(client_server::register_route)
+ .ruma_route(client_server::get_login_types_route)
+ .ruma_route(client_server::login_route)
+ .ruma_route(client_server::whoami_route)
+ .ruma_route(client_server::logout_route)
+ .ruma_route(client_server::logout_all_route)
+ .ruma_route(client_server::change_password_route)
+ .ruma_route(client_server::deactivate_route)
+ .ruma_route(client_server::third_party_route)
+ .ruma_route(client_server::get_capabilities_route)
+ .ruma_route(client_server::get_pushrules_all_route)
+ .ruma_route(client_server::set_pushrule_route)
+ .ruma_route(client_server::get_pushrule_route)
+ .ruma_route(client_server::set_pushrule_enabled_route)
+ .ruma_route(client_server::get_pushrule_enabled_route)
+ .ruma_route(client_server::get_pushrule_actions_route)
+ .ruma_route(client_server::set_pushrule_actions_route)
+ .ruma_route(client_server::delete_pushrule_route)
+ .ruma_route(client_server::get_room_event_route)
+ .ruma_route(client_server::get_room_aliases_route)
+ .ruma_route(client_server::get_filter_route)
+ .ruma_route(client_server::create_filter_route)
+ .ruma_route(client_server::set_global_account_data_route)
+ .ruma_route(client_server::set_room_account_data_route)
+ .ruma_route(client_server::get_global_account_data_route)
+ .ruma_route(client_server::get_room_account_data_route)
+ .ruma_route(client_server::set_displayname_route)
+ .ruma_route(client_server::get_displayname_route)
+ .ruma_route(client_server::set_avatar_url_route)
+ .ruma_route(client_server::get_avatar_url_route)
+ .ruma_route(client_server::get_profile_route)
+ .ruma_route(client_server::set_presence_route)
+ .ruma_route(client_server::get_presence_route)
+ .ruma_route(client_server::upload_keys_route)
+ .ruma_route(client_server::get_keys_route)
+ .ruma_route(client_server::claim_keys_route)
+ .ruma_route(client_server::create_backup_route)
+ .ruma_route(client_server::update_backup_route)
+ .ruma_route(client_server::delete_backup_route)
+ .ruma_route(client_server::get_latest_backup_route)
+ .ruma_route(client_server::get_backup_route)
+ .ruma_route(client_server::add_backup_key_sessions_route)
+ .ruma_route(client_server::add_backup_keys_route)
+ .ruma_route(client_server::delete_backup_key_session_route)
+ .ruma_route(client_server::delete_backup_key_sessions_route)
+ .ruma_route(client_server::delete_backup_keys_route)
+ .ruma_route(client_server::get_backup_key_session_route)
+ .ruma_route(client_server::get_backup_key_sessions_route)
+ .ruma_route(client_server::get_backup_keys_route)
+ .ruma_route(client_server::set_read_marker_route)
+ .ruma_route(client_server::create_receipt_route)
+ .ruma_route(client_server::create_typing_event_route)
+ .ruma_route(client_server::create_room_route)
+ .ruma_route(client_server::redact_event_route)
+ .ruma_route(client_server::report_event_route)
+ .ruma_route(client_server::create_alias_route)
+ .ruma_route(client_server::delete_alias_route)
+ .ruma_route(client_server::get_alias_route)
+ .ruma_route(client_server::join_room_by_id_route)
+ .ruma_route(client_server::join_room_by_id_or_alias_route)
+ .ruma_route(client_server::joined_members_route)
+ .ruma_route(client_server::leave_room_route)
+ .ruma_route(client_server::forget_room_route)
+ .ruma_route(client_server::joined_rooms_route)
+ .ruma_route(client_server::kick_user_route)
+ .ruma_route(client_server::ban_user_route)
+ .ruma_route(client_server::unban_user_route)
+ .ruma_route(client_server::invite_user_route)
+ .ruma_route(client_server::set_room_visibility_route)
+ .ruma_route(client_server::get_room_visibility_route)
+ .ruma_route(client_server::get_public_rooms_route)
+ .ruma_route(client_server::get_public_rooms_filtered_route)
+ .ruma_route(client_server::search_users_route)
+ .ruma_route(client_server::get_member_events_route)
+ .ruma_route(client_server::get_protocols_route)
+ .ruma_route(client_server::send_message_event_route)
+ .ruma_route(client_server::send_state_event_for_key_route)
+ .ruma_route(client_server::send_state_event_for_empty_key_route)
+ .ruma_route(client_server::get_state_events_route)
+ .ruma_route(client_server::get_state_events_for_key_route)
+ .ruma_route(client_server::get_state_events_for_empty_key_route)
+ .route(
+ "/_matrix/client/r0/sync",
+ get(client_server::sync_events_route),
+ )
+ .ruma_route(client_server::get_context_route)
+ .ruma_route(client_server::get_message_events_route)
+ .ruma_route(client_server::search_events_route)
+ .ruma_route(client_server::turn_server_route)
+ .ruma_route(client_server::send_event_to_device_route)
+ .ruma_route(client_server::get_media_config_route)
+ .ruma_route(client_server::create_content_route)
+ .ruma_route(client_server::get_content_route)
+ .ruma_route(client_server::get_content_as_filename_route)
+ .ruma_route(client_server::get_content_thumbnail_route)
+ .ruma_route(client_server::get_devices_route)
+ .ruma_route(client_server::get_device_route)
+ .ruma_route(client_server::update_device_route)
+ .ruma_route(client_server::delete_device_route)
+ .ruma_route(client_server::delete_devices_route)
+ .ruma_route(client_server::get_tags_route)
+ .ruma_route(client_server::update_tag_route)
+ .ruma_route(client_server::delete_tag_route)
+ .ruma_route(client_server::upload_signing_keys_route)
+ .ruma_route(client_server::upload_signatures_route)
+ .ruma_route(client_server::get_key_changes_route)
+ .ruma_route(client_server::get_pushers_route)
+ .ruma_route(client_server::set_pushers_route)
+ // .ruma_route(client_server::third_party_route)
+ .ruma_route(client_server::upgrade_room_route)
+ .ruma_route(server_server::get_server_version_route)
+ .route(
+ "/_matrix/key/v2/server",
+ get(server_server::get_server_keys_route),
+ )
+ .route(
+ "/_matrix/key/v2/server/:key_id",
+ get(server_server::get_server_keys_deprecated_route),
+ )
+ .ruma_route(server_server::get_public_rooms_route)
+ .ruma_route(server_server::get_public_rooms_filtered_route)
+ .ruma_route(server_server::send_transaction_message_route)
+ .ruma_route(server_server::get_event_route)
+ .ruma_route(server_server::get_missing_events_route)
+ .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_join_event_template_route)
+ .ruma_route(server_server::create_join_event_v1_route)
+ .ruma_route(server_server::create_join_event_v2_route)
+ .ruma_route(server_server::create_invite_route)
+ .ruma_route(server_server::get_devices_route)
+ .ruma_route(server_server::get_room_information_route)
+ .ruma_route(server_server::get_profile_information_route)
+ .ruma_route(server_server::get_keys_route)
+ .ruma_route(server_server::claim_keys_route)
}
-#[catch(581)]
-fn unknown_token_catcher() -> Result<()> {
- Err(Error::BadRequest(
- ErrorKind::UnknownToken { soft_logout: false },
- "Unknown token.",
- ))
-}
+async fn shutdown_signal() {
+ let ctrl_c = async {
+ signal::ctrl_c()
+ .await
+ .expect("failed to install Ctrl+C handler");
+ };
-#[catch(582)]
-fn missing_token_catcher() -> Result<()> {
- Err(Error::BadRequest(ErrorKind::MissingToken, "Missing token."))
-}
+ #[cfg(unix)]
+ let terminate = async {
+ signal::unix::signal(signal::unix::SignalKind::terminate())
+ .expect("failed to install signal handler")
+ .recv()
+ .await;
+ };
-#[catch(583)]
-fn bad_json_catcher() -> Result<()> {
- Err(Error::BadRequest(ErrorKind::BadJson, "Bad json."))
-}
+ #[cfg(not(unix))]
+ let terminate = std::future::pending::<()>();
-fn default_config() -> rocket::Config {
- use rocket::config::{LogLevel, Shutdown, Sig};
-
- rocket::Config {
- // Disable rocket's logging to get only tracing-subscriber's log output
- log_level: LogLevel::Off,
- shutdown: Shutdown {
- // Once shutdown is triggered, this is the amount of seconds before rocket
- // will forcefully start shutting down connections, this gives enough time to /sync
- // requests and the like (which havent gotten the memo, somehow) to still complete gracefully.
- grace: 35,
-
- // After the grace period, rocket starts shutting down connections, and waits at least this
- // many seconds before forcefully shutting all of them down.
- mercy: 10,
-
- #[cfg(unix)]
- signals: hashset![Sig::Term, Sig::Int],
-
- ..Shutdown::default()
- },
- ..rocket::Config::release_default()
+ tokio::select! {
+ _ = ctrl_c => {},
+ _ = terminate => {},
}
}
+
+trait RouterExt {
+ fn ruma_route(self, handler: H) -> Self
+ where
+ H: RumaHandler,
+ T: 'static;
+}
+
+impl RouterExt for Router {
+ fn ruma_route(self, handler: H) -> Self
+ where
+ H: RumaHandler,
+ T: 'static,
+ {
+ let meta = H::METADATA;
+ let method_filter = match meta.method {
+ Method::DELETE => MethodFilter::DELETE,
+ Method::GET => MethodFilter::GET,
+ Method::HEAD => MethodFilter::HEAD,
+ Method::OPTIONS => MethodFilter::OPTIONS,
+ Method::PATCH => MethodFilter::PATCH,
+ Method::POST => MethodFilter::POST,
+ Method::PUT => MethodFilter::PUT,
+ Method::TRACE => MethodFilter::TRACE,
+ _ => panic!(""),
+ };
+
+ self.route(meta.path, on(method_filter, handler))
+ }
+}
+
+pub trait RumaHandler: Handler {
+ const METADATA: Metadata;
+}
+
+macro_rules! impl_ruma_handler {
+ ( $($ty:ident),* $(,)? ) => {
+ #[axum::async_trait]
+ #[allow(non_snake_case)]
+ impl RumaHandler<($($ty,)* Ruma,)> for F
+ where
+ Req: Outgoing,
+ Req::Incoming: IncomingRequest + Send,
+ F: FnOnce($($ty,)* Ruma) -> Fut + Clone + Send + 'static,
+ Fut: Future