mirror of
https://gitlab.com/famedly/conduit.git
synced 2025-06-27 16:35:59 +00:00
Merge branch 'upgrade-ruma' into 'next'
Draft: chore: upgrade ruma Closes #487 See merge request famedly/conduit!735
This commit is contained in:
commit
cff72b57b6
30 changed files with 173 additions and 818 deletions
2
.cargo/config.toml
Normal file
2
.cargo/config.toml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
[build]
|
||||||
|
rustflags = ["--cfg=ruma_unstable_exhaustive_types"]
|
181
Cargo.lock
generated
181
Cargo.lock
generated
|
@ -514,7 +514,6 @@ dependencies = [
|
||||||
"opentelemetry-otlp",
|
"opentelemetry-otlp",
|
||||||
"opentelemetry_sdk",
|
"opentelemetry_sdk",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"persy",
|
|
||||||
"rand",
|
"rand",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
@ -529,7 +528,7 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
"sha-1",
|
"sha-1",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"thread_local",
|
"thread_local",
|
||||||
"threadpool",
|
"threadpool",
|
||||||
"tikv-jemallocator",
|
"tikv-jemallocator",
|
||||||
|
@ -587,21 +586,6 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crc"
|
|
||||||
version = "3.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
|
|
||||||
dependencies = [
|
|
||||||
"crc-catalog",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crc-catalog"
|
|
||||||
version = "2.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crc32fast"
|
name = "crc32fast"
|
||||||
version = "1.4.2"
|
version = "1.4.2"
|
||||||
|
@ -842,16 +826,6 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fs2"
|
|
||||||
version = "0.4.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-channel"
|
name = "futures-channel"
|
||||||
version = "0.3.30"
|
version = "0.3.30"
|
||||||
|
@ -1088,7 +1062,7 @@ dependencies = [
|
||||||
"ipnet",
|
"ipnet",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rand",
|
"rand",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"tinyvec",
|
"tinyvec",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
|
@ -1111,7 +1085,7 @@ dependencies = [
|
||||||
"rand",
|
"rand",
|
||||||
"resolv-conf",
|
"resolv-conf",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
@ -1749,7 +1723,7 @@ dependencies = [
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"urlencoding",
|
"urlencoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1776,7 +1750,7 @@ dependencies = [
|
||||||
"opentelemetry-semantic-conventions",
|
"opentelemetry-semantic-conventions",
|
||||||
"opentelemetry_sdk",
|
"opentelemetry_sdk",
|
||||||
"prost",
|
"prost",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tonic",
|
"tonic",
|
||||||
]
|
]
|
||||||
|
@ -1816,7 +1790,7 @@ dependencies = [
|
||||||
"ordered-float",
|
"ordered-float",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"rand",
|
"rand",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
]
|
]
|
||||||
|
@ -1904,22 +1878,6 @@ version = "2.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "persy"
|
|
||||||
version = "1.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9ef4b7250ab3a90ded0e284b2633469c23ef01ea868fe7cbb64e2f0a7d6f6d02"
|
|
||||||
dependencies = [
|
|
||||||
"crc",
|
|
||||||
"data-encoding",
|
|
||||||
"fs2",
|
|
||||||
"linked-hash-map",
|
|
||||||
"rand",
|
|
||||||
"thiserror",
|
|
||||||
"unsigned-varint",
|
|
||||||
"zigzag",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project"
|
name = "pin-project"
|
||||||
version = "1.1.5"
|
version = "1.1.5"
|
||||||
|
@ -2010,9 +1968,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.85"
|
version = "1.0.93"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
|
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
@ -2115,7 +2073,7 @@ checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"libredox",
|
"libredox",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2231,8 +2189,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma"
|
name = "ruma"
|
||||||
version = "0.10.1"
|
version = "0.12.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assign",
|
"assign",
|
||||||
"js_int",
|
"js_int",
|
||||||
|
@ -2242,7 +2200,6 @@ dependencies = [
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
"ruma-events",
|
"ruma-events",
|
||||||
"ruma-federation-api",
|
"ruma-federation-api",
|
||||||
"ruma-identity-service-api",
|
|
||||||
"ruma-push-gateway-api",
|
"ruma-push-gateway-api",
|
||||||
"ruma-server-util",
|
"ruma-server-util",
|
||||||
"ruma-signatures",
|
"ruma-signatures",
|
||||||
|
@ -2252,8 +2209,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-appservice-api"
|
name = "ruma-appservice-api"
|
||||||
version = "0.10.0"
|
version = "0.12.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
|
@ -2264,8 +2221,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-client-api"
|
name = "ruma-client-api"
|
||||||
version = "0.18.0"
|
version = "0.20.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"assign",
|
"assign",
|
||||||
|
@ -2280,20 +2237,21 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_html_form",
|
"serde_html_form",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
"url",
|
"url",
|
||||||
"web-time",
|
"web-time",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-common"
|
name = "ruma-common"
|
||||||
version = "0.13.0"
|
version = "0.15.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"bytes",
|
"bytes",
|
||||||
"form_urlencoded",
|
"form_urlencoded",
|
||||||
|
"getrandom",
|
||||||
"http 1.1.0",
|
"http 1.1.0",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.2.6",
|
||||||
"js_int",
|
"js_int",
|
||||||
|
@ -2306,7 +2264,7 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
"serde_html_form",
|
"serde_html_form",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
"time",
|
"time",
|
||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
|
@ -2317,8 +2275,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-events"
|
name = "ruma-events"
|
||||||
version = "0.28.1"
|
version = "0.30.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"indexmap 2.2.6",
|
"indexmap 2.2.6",
|
||||||
|
@ -2331,7 +2289,7 @@ dependencies = [
|
||||||
"ruma-macros",
|
"ruma-macros",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
"web-time",
|
"web-time",
|
||||||
|
@ -2340,8 +2298,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-federation-api"
|
name = "ruma-federation-api"
|
||||||
version = "0.9.0"
|
version = "0.11.0"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"http 1.1.0",
|
"http 1.1.0",
|
||||||
|
@ -2358,30 +2316,19 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-identifiers-validation"
|
name = "ruma-identifiers-validation"
|
||||||
version = "0.9.5"
|
version = "0.10.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ruma-identity-service-api"
|
|
||||||
version = "0.9.0"
|
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
|
||||||
dependencies = [
|
|
||||||
"js_int",
|
|
||||||
"ruma-common",
|
|
||||||
"serde",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-macros"
|
name = "ruma-macros"
|
||||||
version = "0.13.0"
|
version = "0.15.1"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"once_cell",
|
|
||||||
"proc-macro-crate",
|
"proc-macro-crate",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -2393,8 +2340,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-push-gateway-api"
|
name = "ruma-push-gateway-api"
|
||||||
version = "0.9.0"
|
version = "0.11.0"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
|
@ -2405,21 +2352,21 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-server-util"
|
name = "ruma-server-util"
|
||||||
version = "0.3.0"
|
version = "0.5.0"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"headers",
|
"headers",
|
||||||
"http 1.1.0",
|
"http 1.1.0",
|
||||||
"http-auth",
|
"http-auth",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-signatures"
|
name = "ruma-signatures"
|
||||||
version = "0.15.0"
|
version = "0.17.0"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"ed25519-dalek",
|
"ed25519-dalek",
|
||||||
|
@ -2429,21 +2376,20 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sha2",
|
"sha2",
|
||||||
"subslice",
|
"subslice",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-state-res"
|
name = "ruma-state-res"
|
||||||
version = "0.11.0"
|
version = "0.13.0"
|
||||||
source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9"
|
source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools",
|
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
"ruma-events",
|
"ruma-events",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror 2.0.11",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2835,7 +2781,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"time",
|
"time",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2897,9 +2843,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.66"
|
version = "2.0.98"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
|
checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -2924,7 +2870,16 @@ version = "1.0.61"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
|
checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl 1.0.61",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "2.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl 2.0.11",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2938,6 +2893,17 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "2.0.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread_local"
|
name = "thread_local"
|
||||||
version = "1.1.8"
|
version = "1.1.8"
|
||||||
|
@ -3091,7 +3057,7 @@ checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"either",
|
"either",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"thiserror",
|
"thiserror 1.0.61",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3395,12 +3361,6 @@ version = "0.2.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unsigned-varint"
|
|
||||||
version = "0.8.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "untrusted"
|
name = "untrusted"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
|
@ -3802,15 +3762,6 @@ version = "1.8.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
|
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "zigzag"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "70b40401a28d86ce16a330b863b86fd7dbee4d7c940587ab09ab8c019f9e3fdf"
|
|
||||||
dependencies = [
|
|
||||||
"num-traits",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zstd-sys"
|
name = "zstd-sys"
|
||||||
version = "2.0.10+zstd.1.5.6"
|
version = "2.0.10+zstd.1.5.6"
|
||||||
|
|
28
Cargo.toml
28
Cargo.toml
|
@ -19,7 +19,7 @@ repository = "https://gitlab.com/famedly/conduit"
|
||||||
version = "0.10.0-alpha"
|
version = "0.10.0-alpha"
|
||||||
|
|
||||||
# See also `rust-toolchain.toml`
|
# See also `rust-toolchain.toml`
|
||||||
rust-version = "1.79.0"
|
rust-version = "1.80.0"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
@ -49,10 +49,6 @@ tower-service = "0.3"
|
||||||
|
|
||||||
# Async runtime and utilities
|
# Async runtime and utilities
|
||||||
tokio = { version = "1.28.1", features = ["fs", "macros", "signal", "sync"] }
|
tokio = { version = "1.28.1", features = ["fs", "macros", "signal", "sync"] }
|
||||||
# Used for storing data permanently
|
|
||||||
#sled = { version = "0.34.7", features = ["compression", "no_metrics"], optional = true }
|
|
||||||
#sled = { git = "https://github.com/spacejam/sled.git", rev = "e4640e0773595229f398438886f19bca6f7326a2", features = ["compression"] }
|
|
||||||
persy = { version = "1.4.4", optional = true, features = ["background_ops"] }
|
|
||||||
|
|
||||||
# Used for the http request / response body type for Ruma endpoints used with reqwest
|
# Used for the http request / response body type for Ruma endpoints used with reqwest
|
||||||
bytes = "1.4.0"
|
bytes = "1.4.0"
|
||||||
|
@ -116,7 +112,6 @@ rusqlite = { version = "0.31", optional = true, features = ["bundled"] }
|
||||||
# crossbeam = { version = "0.8.2", optional = true }
|
# crossbeam = { version = "0.8.2", optional = true }
|
||||||
num_cpus = "1.15.0"
|
num_cpus = "1.15.0"
|
||||||
threadpool = "1.8.1"
|
threadpool = "1.8.1"
|
||||||
# heed = { git = "https://github.com/timokoesters/heed.git", rev = "f6f825da7fb2c758867e05ad973ef800a6fe1d5d", optional = true }
|
|
||||||
# Used for ruma wrapper
|
# Used for ruma wrapper
|
||||||
serde_html_form = "0.2.0"
|
serde_html_form = "0.2.0"
|
||||||
|
|
||||||
|
@ -152,19 +147,25 @@ sd-notify = { version = "0.4.1", optional = true }
|
||||||
features = [
|
features = [
|
||||||
"appservice-api-c",
|
"appservice-api-c",
|
||||||
"client-api",
|
"client-api",
|
||||||
"compat",
|
"compat-empty-string-null",
|
||||||
|
"compat-get-3pids",
|
||||||
|
"compat-null",
|
||||||
|
"compat-optional",
|
||||||
|
"compat-optional-txn-pdus",
|
||||||
|
"compat-server-signing-key-version",
|
||||||
|
"compat-signature-id",
|
||||||
|
"compat-tag-info",
|
||||||
|
"compat-unset-avatar",
|
||||||
"federation-api",
|
"federation-api",
|
||||||
"push-gateway-api-c",
|
"push-gateway-api-c",
|
||||||
"rand",
|
"rand",
|
||||||
"ring-compat",
|
"ring-compat",
|
||||||
"server-util",
|
"server-util",
|
||||||
"state-res",
|
"state-res",
|
||||||
"unstable-exhaustive-types",
|
|
||||||
"unstable-msc2448",
|
"unstable-msc2448",
|
||||||
"unstable-msc3575",
|
"unstable-msc3575",
|
||||||
"unstable-unspecified",
|
|
||||||
]
|
]
|
||||||
git = "https://github.com/ruma/ruma"
|
git = "https://github.com/ruma/ruma.git"
|
||||||
|
|
||||||
[dependencies.rocksdb]
|
[dependencies.rocksdb]
|
||||||
features = ["lz4", "multi-threaded-cf", "zstd"]
|
features = ["lz4", "multi-threaded-cf", "zstd"]
|
||||||
|
@ -176,13 +177,10 @@ version = "0.25"
|
||||||
nix = { version = "0.28", features = ["resource"] }
|
nix = { version = "0.28", features = ["resource"] }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["backend_rocksdb", "backend_sqlite", "conduit_bin", "systemd"]
|
|
||||||
#backend_sled = ["sled"]
|
|
||||||
backend_persy = ["parking_lot", "persy"]
|
|
||||||
backend_sqlite = ["sqlite"]
|
|
||||||
#backend_heed = ["heed", "crossbeam"]
|
|
||||||
backend_rocksdb = ["rocksdb"]
|
backend_rocksdb = ["rocksdb"]
|
||||||
|
backend_sqlite = ["sqlite"]
|
||||||
conduit_bin = ["axum"]
|
conduit_bin = ["axum"]
|
||||||
|
default = ["backend_rocksdb", "backend_sqlite", "conduit_bin", "systemd"]
|
||||||
jemalloc = ["tikv-jemallocator"]
|
jemalloc = ["tikv-jemallocator"]
|
||||||
sqlite = ["parking_lot", "rusqlite", "tokio/signal"]
|
sqlite = ["parking_lot", "rusqlite", "tokio/signal"]
|
||||||
systemd = ["sd-notify"]
|
systemd = ["sd-notify"]
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM rust:1.79.0
|
FROM rust:1.80.0
|
||||||
|
|
||||||
WORKDIR /workdir
|
WORKDIR /workdir
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
file = ./rust-toolchain.toml;
|
file = ./rust-toolchain.toml;
|
||||||
|
|
||||||
# See also `rust-toolchain.toml`
|
# See also `rust-toolchain.toml`
|
||||||
sha256 = "sha256-Ngiz76YP4HTY75GGdH2P+APE/DEIx2R/Dn+BwwOyzZU=";
|
sha256 = "sha256-6eN/GKzjVSjEhGO9FhWObkRFaE1Jf+uqMSdQnb8lcB4=";
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
in
|
in
|
||||||
|
|
|
@ -52,6 +52,7 @@ let
|
||||||
|
|
||||||
# Keep sorted
|
# Keep sorted
|
||||||
include = [
|
include = [
|
||||||
|
".cargo"
|
||||||
"Cargo.lock"
|
"Cargo.lock"
|
||||||
"Cargo.toml"
|
"Cargo.toml"
|
||||||
"src"
|
"src"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
# If you're having trouble making the relevant changes, bug a maintainer.
|
# If you're having trouble making the relevant changes, bug a maintainer.
|
||||||
|
|
||||||
[toolchain]
|
[toolchain]
|
||||||
channel = "1.79.0"
|
channel = "1.80.0"
|
||||||
components = [
|
components = [
|
||||||
# For rust-analyzer
|
# For rust-analyzer
|
||||||
"rust-src",
|
"rust-src",
|
||||||
|
|
|
@ -305,7 +305,7 @@ pub async fn register_route(body: Ruma<register::v3::Request>) -> Result<registe
|
||||||
/// - Requires UIAA to verify user password
|
/// - Requires UIAA to verify user password
|
||||||
/// - Changes the password of the sender user
|
/// - Changes the password of the sender user
|
||||||
/// - The password hash is calculated using argon2 with 32 character salt, the plain password is
|
/// - The password hash is calculated using argon2 with 32 character salt, the plain password is
|
||||||
/// not saved
|
/// not saved
|
||||||
///
|
///
|
||||||
/// If logout_devices is true it does the following for each device except the sender device:
|
/// If logout_devices is true it does the following for each device except the sender device:
|
||||||
/// - Invalidates access token
|
/// - Invalidates access token
|
||||||
|
|
|
@ -11,7 +11,7 @@ use tracing::error;
|
||||||
/// Allows loading room history around an event.
|
/// 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
|
/// - Only works if the user is joined (TODO: always allow, but only show events if the user was
|
||||||
/// joined, depending on history_visibility)
|
/// joined, depending on history_visibility)
|
||||||
pub async fn get_context_route(
|
pub async fn get_context_route(
|
||||||
body: Ruma<get_context::v3::Request>,
|
body: Ruma<get_context::v3::Request>,
|
||||||
) -> Result<get_context::v3::Response> {
|
) -> Result<get_context::v3::Response> {
|
||||||
|
|
|
@ -14,7 +14,7 @@ use ruma::{
|
||||||
federation,
|
federation,
|
||||||
},
|
},
|
||||||
serde::Raw,
|
serde::Raw,
|
||||||
DeviceKeyAlgorithm, OwnedDeviceId, OwnedUserId, UserId,
|
OneTimeKeyAlgorithm, OwnedDeviceId, OwnedUserId, UserId,
|
||||||
};
|
};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::{
|
use std::{
|
||||||
|
@ -465,7 +465,7 @@ fn add_unsigned_device_display_name(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn claim_keys_helper(
|
pub(crate) async fn claim_keys_helper(
|
||||||
one_time_keys_input: &BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, DeviceKeyAlgorithm>>,
|
one_time_keys_input: &BTreeMap<OwnedUserId, BTreeMap<OwnedDeviceId, OneTimeKeyAlgorithm>>,
|
||||||
) -> Result<claim_keys::v3::Response> {
|
) -> Result<claim_keys::v3::Response> {
|
||||||
let mut one_time_keys = BTreeMap::new();
|
let mut one_time_keys = BTreeMap::new();
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,11 @@ async fn get_content_as_filename(
|
||||||
pub async fn get_content_thumbnail_route(
|
pub async fn get_content_thumbnail_route(
|
||||||
body: Ruma<media::get_content_thumbnail::v3::Request>,
|
body: Ruma<media::get_content_thumbnail::v3::Request>,
|
||||||
) -> Result<media::get_content_thumbnail::v3::Response> {
|
) -> Result<media::get_content_thumbnail::v3::Response> {
|
||||||
let get_content_thumbnail::v1::Response { file, content_type } = get_content_thumbnail(
|
let get_content_thumbnail::v1::Response {
|
||||||
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
|
} = get_content_thumbnail(
|
||||||
&body.server_name,
|
&body.server_name,
|
||||||
body.media_id.clone(),
|
body.media_id.clone(),
|
||||||
body.height,
|
body.height,
|
||||||
|
@ -316,6 +320,7 @@ pub async fn get_content_thumbnail_route(
|
||||||
file,
|
file,
|
||||||
content_type,
|
content_type,
|
||||||
cross_origin_resource_policy: Some("cross-origin".to_owned()),
|
cross_origin_resource_policy: Some("cross-origin".to_owned()),
|
||||||
|
content_disposition,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,7 +354,9 @@ async fn get_content_thumbnail(
|
||||||
let mxc = format!("mxc://{}/{}", server_name, media_id);
|
let mxc = format!("mxc://{}/{}", server_name, media_id);
|
||||||
|
|
||||||
if let Some(FileMeta {
|
if let Some(FileMeta {
|
||||||
file, content_type, ..
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
}) = services()
|
}) = services()
|
||||||
.media
|
.media
|
||||||
.get_thumbnail(
|
.get_thumbnail(
|
||||||
|
@ -363,7 +370,11 @@ async fn get_content_thumbnail(
|
||||||
)
|
)
|
||||||
.await?
|
.await?
|
||||||
{
|
{
|
||||||
Ok(get_content_thumbnail::v1::Response { file, content_type })
|
Ok(get_content_thumbnail::v1::Response {
|
||||||
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition: Some(content_disposition),
|
||||||
|
})
|
||||||
} else if server_name != services().globals.server_name() && allow_remote {
|
} else if server_name != services().globals.server_name() && allow_remote {
|
||||||
let thumbnail_response = match services()
|
let thumbnail_response = match services()
|
||||||
.sending
|
.sending
|
||||||
|
@ -386,6 +397,7 @@ async fn get_content_thumbnail(
|
||||||
}) => get_content_thumbnail::v1::Response {
|
}) => get_content_thumbnail::v1::Response {
|
||||||
file: content.file,
|
file: content.file,
|
||||||
content_type: content.content_type,
|
content_type: content.content_type,
|
||||||
|
content_disposition: content.content_disposition,
|
||||||
},
|
},
|
||||||
|
|
||||||
Ok(federation_media::get_content_thumbnail::v1::Response {
|
Ok(federation_media::get_content_thumbnail::v1::Response {
|
||||||
|
@ -393,14 +405,23 @@ async fn get_content_thumbnail(
|
||||||
content: FileOrLocation::Location(url),
|
content: FileOrLocation::Location(url),
|
||||||
}) => {
|
}) => {
|
||||||
let get_content::v1::Response {
|
let get_content::v1::Response {
|
||||||
file, content_type, ..
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
} = get_location_content(url).await?;
|
} = get_location_content(url).await?;
|
||||||
|
|
||||||
get_content_thumbnail::v1::Response { file, content_type }
|
get_content_thumbnail::v1::Response {
|
||||||
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(Error::BadRequest(ErrorKind::Unrecognized, _)) => {
|
Err(Error::BadRequest(ErrorKind::Unrecognized, _)) => {
|
||||||
let media::get_content_thumbnail::v3::Response {
|
let media::get_content_thumbnail::v3::Response {
|
||||||
file, content_type, ..
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
|
..
|
||||||
} = services()
|
} = services()
|
||||||
.sending
|
.sending
|
||||||
.send_federation_request(
|
.send_federation_request(
|
||||||
|
@ -419,7 +440,11 @@ async fn get_content_thumbnail(
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
get_content_thumbnail::v1::Response { file, content_type }
|
get_content_thumbnail::v1::Response {
|
||||||
|
file,
|
||||||
|
content_type,
|
||||||
|
content_disposition,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Err(e) => return Err(e),
|
Err(e) => return Err(e),
|
||||||
};
|
};
|
||||||
|
|
|
@ -115,7 +115,7 @@ pub async fn send_message_event_route(
|
||||||
/// Allows paginating through room history.
|
/// Allows paginating through room history.
|
||||||
///
|
///
|
||||||
/// - Only works if the user is joined (TODO: always allow, but only show events where the user was
|
/// - Only works if the user is joined (TODO: always allow, but only show events where the user was
|
||||||
/// joined, depending on history_visibility)
|
/// joined, depending on history_visibility)
|
||||||
pub async fn get_message_events_route(
|
pub async fn get_message_events_route(
|
||||||
body: Ruma<get_message_events::v3::Request>,
|
body: Ruma<get_message_events::v3::Request>,
|
||||||
) -> Result<get_message_events::v3::Response> {
|
) -> Result<get_message_events::v3::Response> {
|
||||||
|
|
|
@ -5,7 +5,7 @@ use ruma::{
|
||||||
push::{
|
push::{
|
||||||
delete_pushrule, get_pushers, get_pushrule, get_pushrule_actions, get_pushrule_enabled,
|
delete_pushrule, get_pushers, get_pushrule, get_pushrule_actions, get_pushrule_enabled,
|
||||||
get_pushrules_all, set_pusher, set_pushrule, set_pushrule_actions,
|
get_pushrules_all, set_pusher, set_pushrule, set_pushrule_actions,
|
||||||
set_pushrule_enabled, RuleScope,
|
set_pushrule_enabled,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
events::{push_rules::PushRulesEvent, GlobalAccountDataEventType},
|
events::{push_rules::PushRulesEvent, GlobalAccountDataEventType},
|
||||||
|
@ -89,13 +89,6 @@ pub async fn set_pushrule_route(
|
||||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
let body = body.body;
|
let body = body.body;
|
||||||
|
|
||||||
if body.scope != RuleScope::Global {
|
|
||||||
return Err(Error::BadRequest(
|
|
||||||
ErrorKind::InvalidParam,
|
|
||||||
"Scopes other than 'global' are not supported.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let event = services()
|
let event = services()
|
||||||
.account_data
|
.account_data
|
||||||
.get(
|
.get(
|
||||||
|
@ -161,13 +154,6 @@ pub async fn get_pushrule_actions_route(
|
||||||
) -> Result<get_pushrule_actions::v3::Response> {
|
) -> Result<get_pushrule_actions::v3::Response> {
|
||||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
|
|
||||||
if body.scope != RuleScope::Global {
|
|
||||||
return Err(Error::BadRequest(
|
|
||||||
ErrorKind::InvalidParam,
|
|
||||||
"Scopes other than 'global' are not supported.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let event = services()
|
let event = services()
|
||||||
.account_data
|
.account_data
|
||||||
.get(
|
.get(
|
||||||
|
@ -204,13 +190,6 @@ pub async fn set_pushrule_actions_route(
|
||||||
) -> Result<set_pushrule_actions::v3::Response> {
|
) -> Result<set_pushrule_actions::v3::Response> {
|
||||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
|
|
||||||
if body.scope != RuleScope::Global {
|
|
||||||
return Err(Error::BadRequest(
|
|
||||||
ErrorKind::InvalidParam,
|
|
||||||
"Scopes other than 'global' are not supported.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let event = services()
|
let event = services()
|
||||||
.account_data
|
.account_data
|
||||||
.get(
|
.get(
|
||||||
|
@ -256,13 +235,6 @@ pub async fn get_pushrule_enabled_route(
|
||||||
) -> Result<get_pushrule_enabled::v3::Response> {
|
) -> Result<get_pushrule_enabled::v3::Response> {
|
||||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
|
|
||||||
if body.scope != RuleScope::Global {
|
|
||||||
return Err(Error::BadRequest(
|
|
||||||
ErrorKind::InvalidParam,
|
|
||||||
"Scopes other than 'global' are not supported.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let event = services()
|
let event = services()
|
||||||
.account_data
|
.account_data
|
||||||
.get(
|
.get(
|
||||||
|
@ -298,13 +270,6 @@ pub async fn set_pushrule_enabled_route(
|
||||||
) -> Result<set_pushrule_enabled::v3::Response> {
|
) -> Result<set_pushrule_enabled::v3::Response> {
|
||||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
|
|
||||||
if body.scope != RuleScope::Global {
|
|
||||||
return Err(Error::BadRequest(
|
|
||||||
ErrorKind::InvalidParam,
|
|
||||||
"Scopes other than 'global' are not supported.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let event = services()
|
let event = services()
|
||||||
.account_data
|
.account_data
|
||||||
.get(
|
.get(
|
||||||
|
@ -350,13 +315,6 @@ pub async fn delete_pushrule_route(
|
||||||
) -> Result<delete_pushrule::v3::Response> {
|
) -> Result<delete_pushrule::v3::Response> {
|
||||||
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
|
||||||
|
|
||||||
if body.scope != RuleScope::Global {
|
|
||||||
return Err(Error::BadRequest(
|
|
||||||
ErrorKind::InvalidParam,
|
|
||||||
"Scopes other than 'global' are not supported.",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let event = services()
|
let event = services()
|
||||||
.account_data
|
.account_data
|
||||||
.get(
|
.get(
|
||||||
|
|
|
@ -37,7 +37,7 @@ use tracing::{error, info};
|
||||||
/// Synchronize the client's state with the latest state on the server.
|
/// Synchronize the client's state with the latest state on the server.
|
||||||
///
|
///
|
||||||
/// - This endpoint takes a `since` parameter which should be the `next_batch` value from a
|
/// - This endpoint takes a `since` parameter which should be the `next_batch` value from a
|
||||||
/// previous request for incremental syncs.
|
/// previous request for incremental syncs.
|
||||||
///
|
///
|
||||||
/// Calling this endpoint without a `since` parameter returns:
|
/// Calling this endpoint without a `since` parameter returns:
|
||||||
/// - Some of the most recent events of each timeline
|
/// - Some of the most recent events of each timeline
|
||||||
|
@ -49,9 +49,9 @@ use tracing::{error, info};
|
||||||
/// For joined rooms:
|
/// For joined rooms:
|
||||||
/// - Some of the most recent events of each timeline that happened after since
|
/// - Some of the most recent events of each timeline that happened after since
|
||||||
/// - If user joined the room after since: All state events (unless lazy loading is activated) and
|
/// - If user joined the room after since: All state events (unless lazy loading is activated) and
|
||||||
/// all device list updates in that room
|
/// all device list updates in that room
|
||||||
/// - If the user was already in the room: A list of all events that are in the state now, but were
|
/// - If the user was already in the room: A list of all events that are in the state now, but were
|
||||||
/// not in the state at `since`
|
/// not in the state at `since`
|
||||||
/// - If the state we send contains a member event: Joined and invited member counts, heroes
|
/// - If the state we send contains a member event: Joined and invited member counts, heroes
|
||||||
/// - Device list updates that happened after `since`
|
/// - Device list updates that happened after `since`
|
||||||
/// - If there are events in the timeline we send or the user send updated his read mark: Notification counts
|
/// - If there are events in the timeline we send or the user send updated his read mark: Notification counts
|
||||||
|
@ -65,7 +65,7 @@ use tracing::{error, info};
|
||||||
/// - If the user left after `since`: prev_batch token, empty state (TODO: subset of the state at the point of the leave)
|
/// - If the user left after `since`: prev_batch token, empty state (TODO: subset of the state at the point of the leave)
|
||||||
///
|
///
|
||||||
/// - Sync is handled in an async task, multiple requests from the same device with the same
|
/// - Sync is handled in an async task, multiple requests from the same device with the same
|
||||||
/// `since` will be cached
|
/// `since` will be cached
|
||||||
pub async fn sync_events_route(
|
pub async fn sync_events_route(
|
||||||
body: Ruma<sync_events::v3::Request>,
|
body: Ruma<sync_events::v3::Request>,
|
||||||
) -> Result<sync_events::v3::Response, RumaResponse<UiaaResponse>> {
|
) -> Result<sync_events::v3::Response, RumaResponse<UiaaResponse>> {
|
||||||
|
|
|
@ -12,7 +12,7 @@ use ruma::{
|
||||||
/// Searches all known users for a match.
|
/// Searches all known users for a match.
|
||||||
///
|
///
|
||||||
/// - Hides any local users that aren't in any public rooms (i.e. those that have the join rule set to public)
|
/// - Hides any local users that aren't in any public rooms (i.e. those that have the join rule set to public)
|
||||||
/// and don't share a room with the sender
|
/// and don't share a room with the sender
|
||||||
pub async fn search_users_route(
|
pub async fn search_users_route(
|
||||||
body: Ruma<search_users::v3::Request>,
|
body: Ruma<search_users::v3::Request>,
|
||||||
) -> Result<search_users::v3::Response> {
|
) -> Result<search_users::v3::Response> {
|
||||||
|
|
|
@ -56,7 +56,7 @@ use ruma::{
|
||||||
to_device::DeviceIdOrAllDevices,
|
to_device::DeviceIdOrAllDevices,
|
||||||
uint, user_id, CanonicalJsonObject, CanonicalJsonValue, EventId, MilliSecondsSinceUnixEpoch,
|
uint, user_id, CanonicalJsonObject, CanonicalJsonValue, EventId, MilliSecondsSinceUnixEpoch,
|
||||||
OwnedEventId, OwnedRoomId, OwnedServerName, OwnedServerSigningKeyId, OwnedUserId, RoomId,
|
OwnedEventId, OwnedRoomId, OwnedServerName, OwnedServerSigningKeyId, OwnedUserId, RoomId,
|
||||||
ServerName,
|
ServerName, Signatures,
|
||||||
};
|
};
|
||||||
use serde_json::value::{to_raw_value, RawValue as RawJsonValue};
|
use serde_json::value::{to_raw_value, RawValue as RawJsonValue};
|
||||||
use std::{
|
use std::{
|
||||||
|
@ -696,7 +696,7 @@ pub async fn get_server_version_route(
|
||||||
/// Gets the public signing keys of this server.
|
/// Gets the public signing keys of this server.
|
||||||
///
|
///
|
||||||
/// - Matrix does not support invalidating public keys, so the key returned by this will be valid
|
/// - Matrix does not support invalidating public keys, so the key returned by this will be valid
|
||||||
/// forever.
|
/// forever.
|
||||||
// Response type for this endpoint is Json because we need to calculate a signature for the response
|
// Response type for this endpoint is Json because we need to calculate a signature for the response
|
||||||
pub async fn get_server_keys_route() -> Result<impl IntoResponse> {
|
pub async fn get_server_keys_route() -> Result<impl IntoResponse> {
|
||||||
let mut verify_keys: BTreeMap<OwnedServerSigningKeyId, VerifyKey> = BTreeMap::new();
|
let mut verify_keys: BTreeMap<OwnedServerSigningKeyId, VerifyKey> = BTreeMap::new();
|
||||||
|
@ -714,7 +714,7 @@ pub async fn get_server_keys_route() -> Result<impl IntoResponse> {
|
||||||
server_name: services().globals.server_name().to_owned(),
|
server_name: services().globals.server_name().to_owned(),
|
||||||
verify_keys,
|
verify_keys,
|
||||||
old_verify_keys: BTreeMap::new(),
|
old_verify_keys: BTreeMap::new(),
|
||||||
signatures: BTreeMap::new(),
|
signatures: Signatures::new(),
|
||||||
valid_until_ts: MilliSecondsSinceUnixEpoch::from_system_time(
|
valid_until_ts: MilliSecondsSinceUnixEpoch::from_system_time(
|
||||||
SystemTime::now() + Duration::from_secs(86400 * 7),
|
SystemTime::now() + Duration::from_secs(86400 * 7),
|
||||||
)
|
)
|
||||||
|
@ -743,7 +743,7 @@ pub async fn get_server_keys_route() -> Result<impl IntoResponse> {
|
||||||
/// Gets the public signing keys of this server.
|
/// Gets the public signing keys of this server.
|
||||||
///
|
///
|
||||||
/// - Matrix does not support invalidating public keys, so the key returned by this will be valid
|
/// - Matrix does not support invalidating public keys, so the key returned by this will be valid
|
||||||
/// forever.
|
/// forever.
|
||||||
pub async fn get_server_keys_deprecated_route() -> impl IntoResponse {
|
pub async fn get_server_keys_deprecated_route() -> impl IntoResponse {
|
||||||
get_server_keys_route().await
|
get_server_keys_route().await
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,27 +3,13 @@ use crate::Result;
|
||||||
|
|
||||||
use std::{future::Future, pin::Pin, sync::Arc};
|
use std::{future::Future, pin::Pin, sync::Arc};
|
||||||
|
|
||||||
#[cfg(feature = "sled")]
|
|
||||||
pub mod sled;
|
|
||||||
|
|
||||||
#[cfg(feature = "sqlite")]
|
#[cfg(feature = "sqlite")]
|
||||||
pub mod sqlite;
|
pub mod sqlite;
|
||||||
|
|
||||||
#[cfg(feature = "heed")]
|
|
||||||
pub mod heed;
|
|
||||||
|
|
||||||
#[cfg(feature = "rocksdb")]
|
#[cfg(feature = "rocksdb")]
|
||||||
pub mod rocksdb;
|
pub mod rocksdb;
|
||||||
|
|
||||||
#[cfg(feature = "persy")]
|
#[cfg(any(feature = "sqlite", feature = "rocksdb"))]
|
||||||
pub mod persy;
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
feature = "sqlite",
|
|
||||||
feature = "rocksdb",
|
|
||||||
feature = "heed",
|
|
||||||
feature = "persy"
|
|
||||||
))]
|
|
||||||
pub mod watchers;
|
pub mod watchers;
|
||||||
|
|
||||||
pub trait KeyValueDatabaseEngine: Send + Sync {
|
pub trait KeyValueDatabaseEngine: Send + Sync {
|
||||||
|
|
|
@ -1,194 +0,0 @@
|
||||||
use super::{super::Config, watchers::Watchers};
|
|
||||||
use crossbeam::channel::{bounded, Sender as ChannelSender};
|
|
||||||
use threadpool::ThreadPool;
|
|
||||||
|
|
||||||
use crate::{Error, Result};
|
|
||||||
use std::{
|
|
||||||
future::Future,
|
|
||||||
pin::Pin,
|
|
||||||
sync::{Arc, Mutex},
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::{DatabaseEngine, Tree};
|
|
||||||
|
|
||||||
type TupleOfBytes = (Vec<u8>, Vec<u8>);
|
|
||||||
|
|
||||||
pub struct Engine {
|
|
||||||
env: heed::Env,
|
|
||||||
iter_pool: Mutex<ThreadPool>,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct EngineTree {
|
|
||||||
engine: Arc<Engine>,
|
|
||||||
tree: Arc<heed::UntypedDatabase>,
|
|
||||||
watchers: Watchers,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn convert_error(error: heed::Error) -> Error {
|
|
||||||
Error::HeedError {
|
|
||||||
error: error.to_string(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl DatabaseEngine for Engine {
|
|
||||||
fn open(config: &Config) -> Result<Arc<Self>> {
|
|
||||||
let mut env_builder = heed::EnvOpenOptions::new();
|
|
||||||
env_builder.map_size(1024 * 1024 * 1024 * 1024); // 1 Terabyte
|
|
||||||
env_builder.max_readers(126);
|
|
||||||
env_builder.max_dbs(128);
|
|
||||||
unsafe {
|
|
||||||
env_builder.flag(heed::flags::Flags::MdbWriteMap);
|
|
||||||
env_builder.flag(heed::flags::Flags::MdbMapAsync);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Arc::new(Engine {
|
|
||||||
env: env_builder
|
|
||||||
.open(&config.database_path)
|
|
||||||
.map_err(convert_error)?,
|
|
||||||
iter_pool: Mutex::new(ThreadPool::new(10)),
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn open_tree(self: &Arc<Self>, name: &'static str) -> Result<Arc<dyn Tree>> {
|
|
||||||
// Creates the db if it doesn't exist already
|
|
||||||
Ok(Arc::new(EngineTree {
|
|
||||||
engine: Arc::clone(self),
|
|
||||||
tree: Arc::new(
|
|
||||||
self.env
|
|
||||||
.create_database(Some(name))
|
|
||||||
.map_err(convert_error)?,
|
|
||||||
),
|
|
||||||
watchers: Default::default(),
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(self: &Arc<Self>) -> Result<()> {
|
|
||||||
self.env.force_sync().map_err(convert_error)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EngineTree {
|
|
||||||
fn iter_from_thread(
|
|
||||||
&self,
|
|
||||||
tree: Arc<heed::UntypedDatabase>,
|
|
||||||
from: Vec<u8>,
|
|
||||||
backwards: bool,
|
|
||||||
) -> Box<dyn Iterator<Item = TupleOfBytes> + Send + Sync> {
|
|
||||||
let (s, r) = bounded::<TupleOfBytes>(100);
|
|
||||||
let engine = Arc::clone(&self.engine);
|
|
||||||
|
|
||||||
let lock = self.engine.iter_pool.lock().await;
|
|
||||||
if lock.active_count() < lock.max_count() {
|
|
||||||
lock.execute(move || {
|
|
||||||
iter_from_thread_work(tree, &engine.env.read_txn().unwrap(), from, backwards, &s);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
std::thread::spawn(move || {
|
|
||||||
iter_from_thread_work(tree, &engine.env.read_txn().unwrap(), from, backwards, &s);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Box::new(r.into_iter())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter_from_thread_work(
|
|
||||||
tree: Arc<heed::UntypedDatabase>,
|
|
||||||
txn: &heed::RoTxn<'_>,
|
|
||||||
from: Vec<u8>,
|
|
||||||
backwards: bool,
|
|
||||||
s: &ChannelSender<(Vec<u8>, Vec<u8>)>,
|
|
||||||
) {
|
|
||||||
if backwards {
|
|
||||||
for (k, v) in tree.rev_range(txn, ..=&*from).unwrap().map(|r| r.unwrap()) {
|
|
||||||
if s.send((k.to_vec(), v.to_vec())).is_err() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if from.is_empty() {
|
|
||||||
for (k, v) in tree.iter(txn).unwrap().map(|r| r.unwrap()) {
|
|
||||||
if s.send((k.to_vec(), v.to_vec())).is_err() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (k, v) in tree.range(txn, &*from..).unwrap().map(|r| r.unwrap()) {
|
|
||||||
if s.send((k.to_vec(), v.to_vec())).is_err() {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Tree for EngineTree {
|
|
||||||
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
|
||||||
let txn = self.engine.env.read_txn().map_err(convert_error)?;
|
|
||||||
Ok(self
|
|
||||||
.tree
|
|
||||||
.get(&txn, &key)
|
|
||||||
.map_err(convert_error)?
|
|
||||||
.map(|s| s.to_vec()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> {
|
|
||||||
let mut txn = self.engine.env.write_txn().map_err(convert_error)?;
|
|
||||||
self.tree
|
|
||||||
.put(&mut txn, &key, &value)
|
|
||||||
.map_err(convert_error)?;
|
|
||||||
txn.commit().map_err(convert_error)?;
|
|
||||||
self.watchers.wake(key);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove(&self, key: &[u8]) -> Result<()> {
|
|
||||||
let mut txn = self.engine.env.write_txn().map_err(convert_error)?;
|
|
||||||
self.tree.delete(&mut txn, &key).map_err(convert_error)?;
|
|
||||||
txn.commit().map_err(convert_error)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + Send + 'a> {
|
|
||||||
self.iter_from(&[], false)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter_from(
|
|
||||||
&self,
|
|
||||||
from: &[u8],
|
|
||||||
backwards: bool,
|
|
||||||
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + Send> {
|
|
||||||
self.iter_from_thread(Arc::clone(&self.tree), from.to_vec(), backwards)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn increment(&self, key: &[u8]) -> Result<Vec<u8>> {
|
|
||||||
let mut txn = self.engine.env.write_txn().map_err(convert_error)?;
|
|
||||||
|
|
||||||
let old = self.tree.get(&txn, &key).map_err(convert_error)?;
|
|
||||||
let new =
|
|
||||||
crate::utils::increment(old.as_deref()).expect("utils::increment always returns Some");
|
|
||||||
|
|
||||||
self.tree
|
|
||||||
.put(&mut txn, &key, &&*new)
|
|
||||||
.map_err(convert_error)?;
|
|
||||||
|
|
||||||
txn.commit().map_err(convert_error)?;
|
|
||||||
|
|
||||||
Ok(new)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn scan_prefix<'a>(
|
|
||||||
&'a self,
|
|
||||||
prefix: Vec<u8>,
|
|
||||||
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + Send + 'a> {
|
|
||||||
Box::new(
|
|
||||||
self.iter_from(&prefix, false)
|
|
||||||
.take_while(move |(key, _)| key.starts_with(&prefix)),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> {
|
|
||||||
self.watchers.watch(prefix)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,197 +0,0 @@
|
||||||
use crate::{
|
|
||||||
database::{
|
|
||||||
abstraction::{watchers::Watchers, KeyValueDatabaseEngine, KvTree},
|
|
||||||
Config,
|
|
||||||
},
|
|
||||||
Result,
|
|
||||||
};
|
|
||||||
use persy::{ByteVec, OpenOptions, Persy, Transaction, TransactionConfig, ValueMode};
|
|
||||||
|
|
||||||
use std::{future::Future, pin::Pin, sync::Arc};
|
|
||||||
|
|
||||||
use tracing::warn;
|
|
||||||
|
|
||||||
pub struct Engine {
|
|
||||||
persy: Persy,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl KeyValueDatabaseEngine for Arc<Engine> {
|
|
||||||
fn open(config: &Config) -> Result<Self> {
|
|
||||||
let mut cfg = persy::Config::new();
|
|
||||||
cfg.change_cache_size((config.db_cache_capacity_mb * 1024.0 * 1024.0) as u64);
|
|
||||||
|
|
||||||
let persy = OpenOptions::new()
|
|
||||||
.create(true)
|
|
||||||
.config(cfg)
|
|
||||||
.open(&format!("{}/db.persy", config.database_path))?;
|
|
||||||
Ok(Arc::new(Engine { persy }))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn open_tree(&self, name: &'static str) -> Result<Arc<dyn KvTree>> {
|
|
||||||
// Create if it doesn't exist
|
|
||||||
if !self.persy.exists_index(name)? {
|
|
||||||
let mut tx = self.persy.begin()?;
|
|
||||||
tx.create_index::<ByteVec, ByteVec>(name, ValueMode::Replace)?;
|
|
||||||
tx.prepare()?.commit()?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Arc::new(PersyTree {
|
|
||||||
persy: self.persy.clone(),
|
|
||||||
name: name.to_owned(),
|
|
||||||
watchers: Watchers::default(),
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(&self) -> Result<()> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct PersyTree {
|
|
||||||
persy: Persy,
|
|
||||||
name: String,
|
|
||||||
watchers: Watchers,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PersyTree {
|
|
||||||
fn begin(&self) -> Result<Transaction> {
|
|
||||||
Ok(self
|
|
||||||
.persy
|
|
||||||
.begin_with(TransactionConfig::new().set_background_sync(true))?)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl KvTree for PersyTree {
|
|
||||||
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
|
||||||
let result = self
|
|
||||||
.persy
|
|
||||||
.get::<ByteVec, ByteVec>(&self.name, &ByteVec::from(key))?
|
|
||||||
.next()
|
|
||||||
.map(|v| (*v).to_owned());
|
|
||||||
Ok(result)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> {
|
|
||||||
self.insert_batch(&mut Some((key.to_owned(), value.to_owned())).into_iter())?;
|
|
||||||
self.watchers.wake(key);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn insert_batch<'a>(&self, iter: &mut dyn Iterator<Item = (Vec<u8>, Vec<u8>)>) -> Result<()> {
|
|
||||||
let mut tx = self.begin()?;
|
|
||||||
for (key, value) in iter {
|
|
||||||
tx.put::<ByteVec, ByteVec>(
|
|
||||||
&self.name,
|
|
||||||
ByteVec::from(key.clone()),
|
|
||||||
ByteVec::from(value),
|
|
||||||
)?;
|
|
||||||
}
|
|
||||||
tx.prepare()?.commit()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn increment_batch<'a>(&self, iter: &mut dyn Iterator<Item = Vec<u8>>) -> Result<()> {
|
|
||||||
let mut tx = self.begin()?;
|
|
||||||
for key in iter {
|
|
||||||
let old = tx
|
|
||||||
.get::<ByteVec, ByteVec>(&self.name, &ByteVec::from(key.clone()))?
|
|
||||||
.next()
|
|
||||||
.map(|v| (*v).to_owned());
|
|
||||||
let new = crate::utils::increment(old.as_deref()).unwrap();
|
|
||||||
tx.put::<ByteVec, ByteVec>(&self.name, ByteVec::from(key), ByteVec::from(new))?;
|
|
||||||
}
|
|
||||||
tx.prepare()?.commit()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove(&self, key: &[u8]) -> Result<()> {
|
|
||||||
let mut tx = self.begin()?;
|
|
||||||
tx.remove::<ByteVec, ByteVec>(&self.name, ByteVec::from(key), None)?;
|
|
||||||
tx.prepare()?.commit()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
|
|
||||||
let iter = self.persy.range::<ByteVec, ByteVec, _>(&self.name, ..);
|
|
||||||
match iter {
|
|
||||||
Ok(iter) => Box::new(iter.filter_map(|(k, v)| {
|
|
||||||
v.into_iter()
|
|
||||||
.map(|val| ((*k).to_owned(), (*val).to_owned()))
|
|
||||||
.next()
|
|
||||||
})),
|
|
||||||
Err(e) => {
|
|
||||||
warn!("error iterating {:?}", e);
|
|
||||||
Box::new(std::iter::empty())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter_from<'a>(
|
|
||||||
&'a self,
|
|
||||||
from: &[u8],
|
|
||||||
backwards: bool,
|
|
||||||
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
|
|
||||||
let range = if backwards {
|
|
||||||
self.persy
|
|
||||||
.range::<ByteVec, ByteVec, _>(&self.name, ..=ByteVec::from(from))
|
|
||||||
} else {
|
|
||||||
self.persy
|
|
||||||
.range::<ByteVec, ByteVec, _>(&self.name, ByteVec::from(from)..)
|
|
||||||
};
|
|
||||||
match range {
|
|
||||||
Ok(iter) => {
|
|
||||||
let map = iter.filter_map(|(k, v)| {
|
|
||||||
v.into_iter()
|
|
||||||
.map(|val| ((*k).to_owned(), (*val).to_owned()))
|
|
||||||
.next()
|
|
||||||
});
|
|
||||||
if backwards {
|
|
||||||
Box::new(map.rev())
|
|
||||||
} else {
|
|
||||||
Box::new(map)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
warn!("error iterating with prefix {:?}", e);
|
|
||||||
Box::new(std::iter::empty())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn increment(&self, key: &[u8]) -> Result<Vec<u8>> {
|
|
||||||
self.increment_batch(&mut Some(key.to_owned()).into_iter())?;
|
|
||||||
Ok(self.get(key)?.unwrap())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn scan_prefix<'a>(
|
|
||||||
&'a self,
|
|
||||||
prefix: Vec<u8>,
|
|
||||||
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
|
|
||||||
let range_prefix = ByteVec::from(prefix.clone());
|
|
||||||
let range = self
|
|
||||||
.persy
|
|
||||||
.range::<ByteVec, ByteVec, _>(&self.name, range_prefix..);
|
|
||||||
|
|
||||||
match range {
|
|
||||||
Ok(iter) => {
|
|
||||||
let owned_prefix = prefix.clone();
|
|
||||||
Box::new(
|
|
||||||
iter.take_while(move |(k, _)| (*k).starts_with(&owned_prefix))
|
|
||||||
.filter_map(|(k, v)| {
|
|
||||||
v.into_iter()
|
|
||||||
.map(|val| ((*k).to_owned(), (*val).to_owned()))
|
|
||||||
.next()
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
warn!("error scanning prefix {:?}", e);
|
|
||||||
Box::new(std::iter::empty())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> {
|
|
||||||
self.watchers.watch(prefix)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,127 +0,0 @@
|
||||||
use super::super::Config;
|
|
||||||
use crate::{utils, Result};
|
|
||||||
use std::{future::Future, pin::Pin, sync::Arc};
|
|
||||||
use tracing::warn;
|
|
||||||
|
|
||||||
use super::{DatabaseEngine, Tree};
|
|
||||||
|
|
||||||
pub struct Engine(sled::Db);
|
|
||||||
|
|
||||||
pub struct SledEngineTree(sled::Tree);
|
|
||||||
|
|
||||||
impl DatabaseEngine for Engine {
|
|
||||||
fn open(config: &Config) -> Result<Arc<Self>> {
|
|
||||||
Ok(Arc::new(Engine(
|
|
||||||
sled::Config::default()
|
|
||||||
.path(&config.database_path)
|
|
||||||
.cache_capacity((config.db_cache_capacity_mb * 1024.0 * 1024.0) as u64)
|
|
||||||
.use_compression(true)
|
|
||||||
.open()?,
|
|
||||||
)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn open_tree(self: &Arc<Self>, name: &'static str) -> Result<Arc<dyn Tree>> {
|
|
||||||
Ok(Arc::new(SledEngineTree(self.0.open_tree(name)?)))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(self: &Arc<Self>) -> Result<()> {
|
|
||||||
Ok(()) // noop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Tree for SledEngineTree {
|
|
||||||
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
|
||||||
Ok(self.0.get(key)?.map(|v| v.to_vec()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> {
|
|
||||||
self.0.insert(key, value)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn insert_batch<'a>(&self, iter: &mut dyn Iterator<Item = (Vec<u8>, Vec<u8>)>) -> Result<()> {
|
|
||||||
for (key, value) in iter {
|
|
||||||
self.0.insert(key, value)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove(&self, key: &[u8]) -> Result<()> {
|
|
||||||
self.0.remove(key)?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
|
|
||||||
Box::new(
|
|
||||||
self.0
|
|
||||||
.iter()
|
|
||||||
.filter_map(|r| {
|
|
||||||
if let Err(e) = &r {
|
|
||||||
warn!("Error: {}", e);
|
|
||||||
}
|
|
||||||
r.ok()
|
|
||||||
})
|
|
||||||
.map(|(k, v)| (k.to_vec().into(), v.to_vec().into())),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn iter_from(
|
|
||||||
&self,
|
|
||||||
from: &[u8],
|
|
||||||
backwards: bool,
|
|
||||||
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)>> {
|
|
||||||
let iter = if backwards {
|
|
||||||
self.0.range(..=from)
|
|
||||||
} else {
|
|
||||||
self.0.range(from..)
|
|
||||||
};
|
|
||||||
|
|
||||||
let iter = iter
|
|
||||||
.filter_map(|r| {
|
|
||||||
if let Err(e) = &r {
|
|
||||||
warn!("Error: {}", e);
|
|
||||||
}
|
|
||||||
r.ok()
|
|
||||||
})
|
|
||||||
.map(|(k, v)| (k.to_vec().into(), v.to_vec().into()));
|
|
||||||
|
|
||||||
if backwards {
|
|
||||||
Box::new(iter.rev())
|
|
||||||
} else {
|
|
||||||
Box::new(iter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn increment(&self, key: &[u8]) -> Result<Vec<u8>> {
|
|
||||||
Ok(self
|
|
||||||
.0
|
|
||||||
.update_and_fetch(key, utils::increment)
|
|
||||||
.map(|o| o.expect("increment always sets a value").to_vec())?)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn scan_prefix<'a>(
|
|
||||||
&'a self,
|
|
||||||
prefix: Vec<u8>,
|
|
||||||
) -> Box<dyn Iterator<Item = (Vec<u8>, Vec<u8>)> + 'a> {
|
|
||||||
let iter = self
|
|
||||||
.0
|
|
||||||
.scan_prefix(prefix)
|
|
||||||
.filter_map(|r| {
|
|
||||||
if let Err(e) = &r {
|
|
||||||
warn!("Error: {}", e);
|
|
||||||
}
|
|
||||||
r.ok()
|
|
||||||
})
|
|
||||||
.map(|(k, v)| (k.to_vec().into(), v.to_vec().into()));
|
|
||||||
|
|
||||||
Box::new(iter)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> {
|
|
||||||
let prefix = prefix.to_vec();
|
|
||||||
Box::pin(async move {
|
|
||||||
self.0.watch_prefix(prefix).await;
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,3 @@
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
use ruma::{
|
use ruma::{
|
||||||
events::receipt::ReceiptEvent, serde::Raw, CanonicalJsonObject, OwnedUserId, RoomId, UserId,
|
events::receipt::ReceiptEvent, serde::Raw, CanonicalJsonObject, OwnedUserId, RoomId, UserId,
|
||||||
};
|
};
|
||||||
|
@ -73,12 +71,13 @@ impl service::rooms::edus::read_receipt::Data for KeyValueDatabase {
|
||||||
.iter_from(&first_possible_edu, false)
|
.iter_from(&first_possible_edu, false)
|
||||||
.take_while(move |(k, _)| k.starts_with(&prefix2))
|
.take_while(move |(k, _)| k.starts_with(&prefix2))
|
||||||
.map(move |(k, v)| {
|
.map(move |(k, v)| {
|
||||||
let count = utils::u64_from_bytes(
|
let count =
|
||||||
&k[prefix.len()..prefix.len() + mem::size_of::<u64>()],
|
utils::u64_from_bytes(&k[prefix.len()..prefix.len() + size_of::<u64>()])
|
||||||
)
|
.map_err(|_| {
|
||||||
.map_err(|_| Error::bad_database("Invalid readreceiptid count in db."))?;
|
Error::bad_database("Invalid readreceiptid count in db.")
|
||||||
|
})?;
|
||||||
let user_id = UserId::parse(
|
let user_id = UserId::parse(
|
||||||
utils::string_from_bytes(&k[prefix.len() + mem::size_of::<u64>() + 1..])
|
utils::string_from_bytes(&k[prefix.len() + size_of::<u64>() + 1..])
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
Error::bad_database("Invalid readreceiptid userid bytes in db.")
|
Error::bad_database("Invalid readreceiptid userid bytes in db.")
|
||||||
})?,
|
})?,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{mem, sync::Arc};
|
use std::sync::Arc;
|
||||||
|
|
||||||
use ruma::{EventId, RoomId, UserId};
|
use ruma::{EventId, RoomId, UserId};
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ impl service::rooms::pdu_metadata::Data for KeyValueDatabase {
|
||||||
.iter_from(¤t, true)
|
.iter_from(¤t, true)
|
||||||
.take_while(move |(k, _)| k.starts_with(&prefix))
|
.take_while(move |(k, _)| k.starts_with(&prefix))
|
||||||
.map(move |(tofrom, _data)| {
|
.map(move |(tofrom, _data)| {
|
||||||
let from = utils::u64_from_bytes(&tofrom[(mem::size_of::<u64>())..])
|
let from = utils::u64_from_bytes(&tofrom[(size_of::<u64>())..])
|
||||||
.map_err(|_| Error::bad_database("Invalid count in tofrom_relation."))?;
|
.map_err(|_| Error::bad_database("Invalid count in tofrom_relation."))?;
|
||||||
|
|
||||||
let mut pduid = shortroomid.to_be_bytes().to_vec();
|
let mut pduid = shortroomid.to_be_bytes().to_vec();
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
use ruma::{api::client::threads::get_threads::v1::IncludeThreads, OwnedUserId, RoomId, UserId};
|
use ruma::{api::client::threads::get_threads::v1::IncludeThreads, OwnedUserId, RoomId, UserId};
|
||||||
|
|
||||||
use crate::{database::KeyValueDatabase, service, services, utils, Error, PduEvent, Result};
|
use crate::{database::KeyValueDatabase, service, services, utils, Error, PduEvent, Result};
|
||||||
|
@ -28,7 +26,7 @@ impl service::rooms::threads::Data for KeyValueDatabase {
|
||||||
.iter_from(¤t, true)
|
.iter_from(¤t, true)
|
||||||
.take_while(move |(k, _)| k.starts_with(&prefix))
|
.take_while(move |(k, _)| k.starts_with(&prefix))
|
||||||
.map(move |(pduid, _users)| {
|
.map(move |(pduid, _users)| {
|
||||||
let count = utils::u64_from_bytes(&pduid[(mem::size_of::<u64>())..])
|
let count = utils::u64_from_bytes(&pduid[(size_of::<u64>())..])
|
||||||
.map_err(|_| Error::bad_database("Invalid pduid in threadid_userids."))?;
|
.map_err(|_| Error::bad_database("Invalid pduid in threadid_userids."))?;
|
||||||
let mut pdu = services()
|
let mut pdu = services()
|
||||||
.rooms
|
.rooms
|
||||||
|
|
|
@ -5,8 +5,8 @@ use ruma::{
|
||||||
encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
|
encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
|
||||||
events::{AnyToDeviceEvent, StateEventType},
|
events::{AnyToDeviceEvent, StateEventType},
|
||||||
serde::Raw,
|
serde::Raw,
|
||||||
DeviceId, DeviceKeyAlgorithm, DeviceKeyId, MilliSecondsSinceUnixEpoch, OwnedDeviceId,
|
DeviceId, MilliSecondsSinceUnixEpoch, OneTimeKeyAlgorithm, OwnedDeviceId, OwnedMxcUri,
|
||||||
OwnedDeviceKeyId, OwnedMxcUri, OwnedUserId, UInt, UserId,
|
OwnedOneTimeKeyId, OwnedUserId, UInt, UserId,
|
||||||
};
|
};
|
||||||
use tracing::warn;
|
use tracing::warn;
|
||||||
|
|
||||||
|
@ -308,7 +308,7 @@ impl service::users::Data for KeyValueDatabase {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
one_time_key_key: &DeviceKeyId,
|
one_time_key_key: &OwnedOneTimeKeyId,
|
||||||
one_time_key_value: &Raw<OneTimeKey>,
|
one_time_key_value: &Raw<OneTimeKey>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut key = user_id.as_bytes().to_vec();
|
let mut key = user_id.as_bytes().to_vec();
|
||||||
|
@ -356,8 +356,8 @@ impl service::users::Data for KeyValueDatabase {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
key_algorithm: &DeviceKeyAlgorithm,
|
key_algorithm: &OneTimeKeyAlgorithm,
|
||||||
) -> Result<Option<(OwnedDeviceKeyId, Raw<OneTimeKey>)>> {
|
) -> Result<Option<(OwnedOneTimeKeyId, Raw<OneTimeKey>)>> {
|
||||||
let mut prefix = user_id.as_bytes().to_vec();
|
let mut prefix = user_id.as_bytes().to_vec();
|
||||||
prefix.push(0xff);
|
prefix.push(0xff);
|
||||||
prefix.extend_from_slice(device_id.as_bytes());
|
prefix.extend_from_slice(device_id.as_bytes());
|
||||||
|
@ -395,7 +395,7 @@ impl service::users::Data for KeyValueDatabase {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
) -> Result<BTreeMap<DeviceKeyAlgorithm, UInt>> {
|
) -> Result<BTreeMap<OneTimeKeyAlgorithm, UInt>> {
|
||||||
let mut userdeviceid = user_id.as_bytes().to_vec();
|
let mut userdeviceid = user_id.as_bytes().to_vec();
|
||||||
userdeviceid.push(0xff);
|
userdeviceid.push(0xff);
|
||||||
userdeviceid.extend_from_slice(device_id.as_bytes());
|
userdeviceid.extend_from_slice(device_id.as_bytes());
|
||||||
|
@ -406,15 +406,12 @@ impl service::users::Data for KeyValueDatabase {
|
||||||
self.onetimekeyid_onetimekeys
|
self.onetimekeyid_onetimekeys
|
||||||
.scan_prefix(userdeviceid)
|
.scan_prefix(userdeviceid)
|
||||||
.map(|(bytes, _)| {
|
.map(|(bytes, _)| {
|
||||||
Ok::<_, Error>(
|
serde_json::from_slice::<OneTimeKeyAlgorithm>(
|
||||||
serde_json::from_slice::<OwnedDeviceKeyId>(
|
bytes.rsplit(|&b| b == 0xff).next().ok_or_else(|| {
|
||||||
bytes.rsplit(|&b| b == 0xff).next().ok_or_else(|| {
|
Error::bad_database("OneTimeKey ID in db is invalid.")
|
||||||
Error::bad_database("OneTimeKey ID in db is invalid.")
|
})?,
|
||||||
})?,
|
|
||||||
)
|
|
||||||
.map_err(|_| Error::bad_database("DeviceKeyId in db is invalid."))?
|
|
||||||
.algorithm(),
|
|
||||||
)
|
)
|
||||||
|
.map_err(|_| Error::bad_database("DeviceKeyId in db is invalid."))
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
*counts.entry(algorithm?).or_default() += UInt::from(1_u32);
|
*counts.entry(algorithm?).or_default() += UInt::from(1_u32);
|
||||||
|
|
|
@ -246,24 +246,10 @@ impl KeyValueDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
let builder: Arc<dyn KeyValueDatabaseEngine> = match &*config.database_backend {
|
let builder: Arc<dyn KeyValueDatabaseEngine> = match &*config.database_backend {
|
||||||
"sqlite" => {
|
#[cfg(feature = "sqlite")]
|
||||||
#[cfg(not(feature = "sqlite"))]
|
"sqlite" => Arc::new(Arc::<abstraction::sqlite::Engine>::open(&config)?),
|
||||||
return Err(Error::BadConfig("Database backend not found."));
|
#[cfg(feature = "rocksdb")]
|
||||||
#[cfg(feature = "sqlite")]
|
"rocksdb" => Arc::new(Arc::<abstraction::rocksdb::Engine>::open(&config)?),
|
||||||
Arc::new(Arc::<abstraction::sqlite::Engine>::open(&config)?)
|
|
||||||
}
|
|
||||||
"rocksdb" => {
|
|
||||||
#[cfg(not(feature = "rocksdb"))]
|
|
||||||
return Err(Error::BadConfig("Database backend not found."));
|
|
||||||
#[cfg(feature = "rocksdb")]
|
|
||||||
Arc::new(Arc::<abstraction::rocksdb::Engine>::open(&config)?)
|
|
||||||
}
|
|
||||||
"persy" => {
|
|
||||||
#[cfg(not(feature = "persy"))]
|
|
||||||
return Err(Error::BadConfig("Database backend not found."));
|
|
||||||
#[cfg(feature = "persy")]
|
|
||||||
Arc::new(Arc::<abstraction::persy::Engine>::open(&config)?)
|
|
||||||
}
|
|
||||||
_ => {
|
_ => {
|
||||||
return Err(Error::BadConfig("Database backend not found."));
|
return Err(Error::BadConfig("Database backend not found."));
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,7 +230,7 @@ impl Service {
|
||||||
let event_id_only = http.format == Some(PushFormat::EventIdOnly);
|
let event_id_only = http.format == Some(PushFormat::EventIdOnly);
|
||||||
|
|
||||||
let mut device = Device::new(pusher.ids.app_id.clone(), pusher.ids.pushkey.clone());
|
let mut device = Device::new(pusher.ids.app_id.clone(), pusher.ids.pushkey.clone());
|
||||||
device.data.default_payload = http.default_payload.clone();
|
device.data.data = http.data.clone();
|
||||||
device.data.format.clone_from(&http.format);
|
device.data.format.clone_from(&http.format);
|
||||||
|
|
||||||
// Tweaks are only added if the format is NOT event_id_only
|
// Tweaks are only added if the format is NOT event_id_only
|
||||||
|
|
|
@ -498,6 +498,8 @@ impl Service {
|
||||||
)
|
)
|
||||||
})?,
|
})?,
|
||||||
appservice::event::push_events::v1::Request {
|
appservice::event::push_events::v1::Request {
|
||||||
|
//TODO: ephemeral pushing
|
||||||
|
ephemeral: Vec::new(),
|
||||||
events: pdu_jsons,
|
events: pdu_jsons,
|
||||||
txn_id: (&*general_purpose::URL_SAFE_NO_PAD.encode(calculate_hash(
|
txn_id: (&*general_purpose::URL_SAFE_NO_PAD.encode(calculate_hash(
|
||||||
&events
|
&events
|
||||||
|
|
|
@ -4,8 +4,8 @@ use ruma::{
|
||||||
encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
|
encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
|
||||||
events::AnyToDeviceEvent,
|
events::AnyToDeviceEvent,
|
||||||
serde::Raw,
|
serde::Raw,
|
||||||
DeviceId, DeviceKeyAlgorithm, DeviceKeyId, OwnedDeviceId, OwnedDeviceKeyId, OwnedMxcUri,
|
DeviceId, OneTimeKeyAlgorithm, OwnedDeviceId, OwnedMxcUri, OwnedOneTimeKeyId, OwnedUserId,
|
||||||
OwnedUserId, UInt, UserId,
|
UInt, UserId,
|
||||||
};
|
};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ pub trait Data: Send + Sync {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
one_time_key_key: &DeviceKeyId,
|
one_time_key_key: &OwnedOneTimeKeyId,
|
||||||
one_time_key_value: &Raw<OneTimeKey>,
|
one_time_key_value: &Raw<OneTimeKey>,
|
||||||
) -> Result<()>;
|
) -> Result<()>;
|
||||||
|
|
||||||
|
@ -89,14 +89,14 @@ pub trait Data: Send + Sync {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
key_algorithm: &DeviceKeyAlgorithm,
|
key_algorithm: &OneTimeKeyAlgorithm,
|
||||||
) -> Result<Option<(OwnedDeviceKeyId, Raw<OneTimeKey>)>>;
|
) -> Result<Option<(OwnedOneTimeKeyId, Raw<OneTimeKey>)>>;
|
||||||
|
|
||||||
fn count_one_time_keys(
|
fn count_one_time_keys(
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
) -> Result<BTreeMap<DeviceKeyAlgorithm, UInt>>;
|
) -> Result<BTreeMap<OneTimeKeyAlgorithm, UInt>>;
|
||||||
|
|
||||||
fn add_device_keys(
|
fn add_device_keys(
|
||||||
&self,
|
&self,
|
||||||
|
|
|
@ -18,8 +18,8 @@ use ruma::{
|
||||||
encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
|
encryption::{CrossSigningKey, DeviceKeys, OneTimeKey},
|
||||||
events::AnyToDeviceEvent,
|
events::AnyToDeviceEvent,
|
||||||
serde::Raw,
|
serde::Raw,
|
||||||
DeviceId, DeviceKeyAlgorithm, DeviceKeyId, OwnedDeviceId, OwnedDeviceKeyId, OwnedMxcUri,
|
DeviceId, OneTimeKeyAlgorithm, OwnedDeviceId, OwnedMxcUri, OwnedOneTimeKeyId, OwnedRoomId,
|
||||||
OwnedRoomId, OwnedUserId, UInt, UserId,
|
OwnedUserId, UInt, UserId,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{services, Error, Result};
|
use crate::{services, Error, Result};
|
||||||
|
@ -373,7 +373,7 @@ impl Service {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
one_time_key_key: &DeviceKeyId,
|
one_time_key_key: &OwnedOneTimeKeyId,
|
||||||
one_time_key_value: &Raw<OneTimeKey>,
|
one_time_key_value: &Raw<OneTimeKey>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
self.db
|
self.db
|
||||||
|
@ -388,8 +388,8 @@ impl Service {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
key_algorithm: &DeviceKeyAlgorithm,
|
key_algorithm: &OneTimeKeyAlgorithm,
|
||||||
) -> Result<Option<(OwnedDeviceKeyId, Raw<OneTimeKey>)>> {
|
) -> Result<Option<(OwnedOneTimeKeyId, Raw<OneTimeKey>)>> {
|
||||||
self.db.take_one_time_key(user_id, device_id, key_algorithm)
|
self.db.take_one_time_key(user_id, device_id, key_algorithm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,7 +397,7 @@ impl Service {
|
||||||
&self,
|
&self,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
device_id: &DeviceId,
|
device_id: &DeviceId,
|
||||||
) -> Result<BTreeMap<DeviceKeyAlgorithm, UInt>> {
|
) -> Result<BTreeMap<OneTimeKeyAlgorithm, UInt>> {
|
||||||
self.db.count_one_time_keys(user_id, device_id)
|
self.db.count_one_time_keys(user_id, device_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,33 +11,18 @@ use ruma::{
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use tracing::{error, info};
|
use tracing::{error, info};
|
||||||
|
|
||||||
#[cfg(feature = "persy")]
|
|
||||||
use persy::PersyError;
|
|
||||||
|
|
||||||
use crate::RumaResponse;
|
use crate::RumaResponse;
|
||||||
|
|
||||||
pub type Result<T, E = Error> = std::result::Result<T, E>;
|
pub type Result<T, E = Error> = std::result::Result<T, E>;
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
#[cfg(feature = "sled")]
|
|
||||||
#[error("There was a problem with the connection to the sled database.")]
|
|
||||||
SledError {
|
|
||||||
#[from]
|
|
||||||
source: sled::Error,
|
|
||||||
},
|
|
||||||
#[cfg(feature = "sqlite")]
|
#[cfg(feature = "sqlite")]
|
||||||
#[error("There was a problem with the connection to the sqlite database: {source}")]
|
#[error("There was a problem with the connection to the sqlite database: {source}")]
|
||||||
SqliteError {
|
SqliteError {
|
||||||
#[from]
|
#[from]
|
||||||
source: rusqlite::Error,
|
source: rusqlite::Error,
|
||||||
},
|
},
|
||||||
#[cfg(feature = "persy")]
|
|
||||||
#[error("There was a problem with the connection to the persy database.")]
|
|
||||||
PersyError { source: PersyError },
|
|
||||||
#[cfg(feature = "heed")]
|
|
||||||
#[error("There was a problem with the connection to the heed database: {error}")]
|
|
||||||
HeedError { error: String },
|
|
||||||
#[cfg(feature = "rocksdb")]
|
#[cfg(feature = "rocksdb")]
|
||||||
#[error("There was a problem with the connection to the rocksdb database: {source}")]
|
#[error("There was a problem with the connection to the rocksdb database: {source}")]
|
||||||
RocksDbError {
|
RocksDbError {
|
||||||
|
@ -75,7 +60,7 @@ pub enum Error {
|
||||||
BadDatabase(&'static str),
|
BadDatabase(&'static str),
|
||||||
#[error("uiaa")]
|
#[error("uiaa")]
|
||||||
Uiaa(UiaaInfo),
|
Uiaa(UiaaInfo),
|
||||||
#[error("{0}: {1}")]
|
#[error("{}: {1}",.0.errcode())]
|
||||||
BadRequest(ErrorKind, &'static str),
|
BadRequest(ErrorKind, &'static str),
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
Conflict(&'static str), // This is only needed for when a room alias already exists
|
Conflict(&'static str), // This is only needed for when a room alias already exists
|
||||||
|
@ -157,14 +142,8 @@ impl Error {
|
||||||
let db_error = String::from("Database or I/O error occurred.");
|
let db_error = String::from("Database or I/O error occurred.");
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
#[cfg(feature = "sled")]
|
|
||||||
Self::SledError { .. } => db_error,
|
|
||||||
#[cfg(feature = "sqlite")]
|
#[cfg(feature = "sqlite")]
|
||||||
Self::SqliteError { .. } => db_error,
|
Self::SqliteError { .. } => db_error,
|
||||||
#[cfg(feature = "persy")]
|
|
||||||
Self::PersyError { .. } => db_error,
|
|
||||||
#[cfg(feature = "heed")]
|
|
||||||
Self::HeedError => db_error,
|
|
||||||
#[cfg(feature = "rocksdb")]
|
#[cfg(feature = "rocksdb")]
|
||||||
Self::RocksDbError { .. } => db_error,
|
Self::RocksDbError { .. } => db_error,
|
||||||
Self::IoError { .. } => db_error,
|
Self::IoError { .. } => db_error,
|
||||||
|
@ -175,15 +154,6 @@ impl Error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "persy")]
|
|
||||||
impl<T: Into<PersyError>> From<persy::PE<T>> for Error {
|
|
||||||
fn from(err: persy::PE<T>) -> Self {
|
|
||||||
Error::PersyError {
|
|
||||||
source: err.error().into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Infallible> for Error {
|
impl From<Infallible> for Error {
|
||||||
fn from(i: Infallible) -> Self {
|
fn from(i: Infallible) -> Self {
|
||||||
match i {}
|
match i {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue