From 8dd02761853324c5310a2cf32816270164cb7be5 Mon Sep 17 00:00:00 2001 From: hdbg Date: Tue, 10 Feb 2026 19:01:09 +0100 Subject: [PATCH] feat(proto): add separate client/user-agent gRPC services --- mise.lock | 8 + mise.toml | 1 + protobufs/arbiter.proto | 39 +- protobufs/auth.proto | 36 +- protobufs/unseal.proto | 14 + server/Cargo.lock | 826 +++++++++++++++++- server/Cargo.toml | 23 +- server/crates/arbiter-client/Cargo.toml | 1 + server/crates/arbiter-proto/Cargo.toml | 3 + server/crates/arbiter-proto/src/lib.rs | 2 +- server/crates/arbiter-server/Cargo.toml | 11 +- server/crates/arbiter-server/diesel.toml | 2 +- .../2026-02-09-143015-0000_init/up.sql | 30 +- server/crates/arbiter-server/src/db.rs | 83 ++ server/crates/arbiter-server/src/db/models.rs | 0 server/crates/arbiter-server/src/db/schema.rs | 48 + server/crates/arbiter-server/src/lib.rs | 8 +- server/crates/arbiter-useragent/Cargo.toml | 6 + server/crates/arbiter-useragent/src/lib.rs | 14 + server/diesel.toml | 9 - server/src/main.rs | 3 - 21 files changed, 1073 insertions(+), 94 deletions(-) create mode 100644 protobufs/unseal.proto create mode 100644 server/crates/arbiter-server/src/db.rs create mode 100644 server/crates/arbiter-server/src/db/models.rs create mode 100644 server/crates/arbiter-server/src/db/schema.rs create mode 100644 server/crates/arbiter-useragent/Cargo.toml create mode 100644 server/crates/arbiter-useragent/src/lib.rs delete mode 100644 server/diesel.toml delete mode 100644 server/src/main.rs diff --git a/mise.lock b/mise.lock index 7ad3e9a..d83a929 100644 --- a/mise.lock +++ b/mise.lock @@ -2,6 +2,14 @@ version = "0.22.1" backend = "cargo:cargo-audit" +[[tools."cargo:cargo-features"]] +version = "1.0.0" +backend = "cargo:cargo-features" + +[[tools."cargo:cargo-features-manager"]] +version = "0.11.1" +backend = "cargo:cargo-features-manager" + [[tools."cargo:cargo-vet"]] version = "0.10.2" backend = "cargo:cargo-vet" diff --git a/mise.toml b/mise.toml index cec6169..8623f45 100644 --- a/mise.toml +++ b/mise.toml @@ -6,3 +6,4 @@ flutter = "3.38.9-stable" protoc = "29.6" rust = "1.93.0" +"cargo:cargo-features-manager" = "0.11.1" diff --git a/protobufs/arbiter.proto b/protobufs/arbiter.proto index 6a2f40a..67bf6d0 100644 --- a/protobufs/arbiter.proto +++ b/protobufs/arbiter.proto @@ -4,20 +4,35 @@ package arbiter; import "auth.proto"; -message ClientMessage { - oneof payload { - arbiter.auth.AuthChallengeRequest auth_challenge_request = 1; - arbiter.auth.AuthChallengeSolution auth_challenge_solution = 2; - } +message ClientRequest { + oneof payload { + arbiter.auth.ClientMessage auth_message = 1; + } } -message ServerMessage { - oneof payload { - arbiter.auth.AuthChallenge auth_challenge = 1; - arbiter.auth.AuthResponse auth_response = 2; - } +message ClientResponse { + oneof payload { + arbiter.auth.ServerMessage auth_message = 1; + } } -service Server { - rpc Communicate(stream ClientMessage) returns (stream ServerMessage); +message UserAgentRequest { + oneof payload { + arbiter.auth.ClientMessage auth_message = 1; + } +} +message UserAgentResponse { + oneof payload { + arbiter.auth.ServerMessage auth_message = 1; + } +} + +message ServerInfo { + string version = 1; + bytes cert_public_key = 2; +} + +service ArbiterService { + rpc Client(stream ClientRequest) returns (stream ClientResponse); + rpc UserAgent(stream UserAgentRequest) returns (stream UserAgentResponse); } diff --git a/protobufs/auth.proto b/protobufs/auth.proto index 12db739..3da439e 100644 --- a/protobufs/auth.proto +++ b/protobufs/auth.proto @@ -5,23 +5,37 @@ package arbiter.auth; import "google/protobuf/timestamp.proto"; message AuthChallengeRequest { - bytes pubkey = 1; + bytes pubkey = 1; } message AuthChallenge { - bytes pubkey = 1; - bytes nonce = 2; - google.protobuf.Timestamp minted = 3 ; + bytes pubkey = 1; + bytes nonce = 2; + google.protobuf.Timestamp minted = 3; } message AuthChallengeSolution { - AuthChallenge challenge = 1 ; - bytes signature = 2; + AuthChallenge challenge = 1; + bytes signature = 2; } message AuthResponse { - string token = 1; - string refresh_token = 2; - google.protobuf.Timestamp expires_at = 3 ; - google.protobuf.Timestamp refresh_expires_at = 4 ; -} \ No newline at end of file + string token = 1; + string refresh_token = 2; + google.protobuf.Timestamp expires_at = 3; + google.protobuf.Timestamp refresh_expires_at = 4; +} + +message ClientMessage { + oneof payload { + AuthChallengeRequest auth_challenge_request = 1; + AuthChallengeSolution auth_challenge_solution = 2; + } +} + +message ServerMessage { + oneof payload { + AuthChallenge auth_challenge = 1; + AuthResponse auth_response = 2; + } +} diff --git a/protobufs/unseal.proto b/protobufs/unseal.proto new file mode 100644 index 0000000..b23d20a --- /dev/null +++ b/protobufs/unseal.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package arbiter.auth; + +message UserAgentKeyRequest {} + +message ServerKeyResponse { + bytes pubkey = 1; +} +message UserAgentSealedKey { + bytes sealed_key = 1; + bytes pubkey = 2; + bytes nonce = 3; +} diff --git a/server/Cargo.lock b/server/Cargo.lock index c090792..6723672 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "aho-corasick" version = "1.1.4" @@ -26,10 +41,6 @@ version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" -[[package]] -name = "arbiter" -version = "0.1.0" - [[package]] name = "arbiter-client" version = "0.1.0" @@ -43,6 +54,7 @@ dependencies = [ "prost-build", "prost-derive", "prost-types", + "rkyv", "serde_json", "tonic", "tonic-prost", @@ -53,13 +65,25 @@ dependencies = [ name = "arbiter-server" version = "0.1.0" dependencies = [ + "arbiter-proto", "diesel", "diesel-async", + "diesel_migrations", + "ed25519", + "ed25519-dalek", + "miette", + "rustls", + "smlang", + "thiserror", "tokio", "tonic", "tracing", ] +[[package]] +name = "arbiter-useragent" +version = "0.1.0" + [[package]] name = "async-trait" version = "0.1.89" @@ -68,7 +92,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -83,6 +107,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "aws-lc-rs" +version = "1.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "axum" version = "0.8.8" @@ -126,24 +172,86 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bitflags" version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "block-buffer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96eb4cdd6cf1b31d671e9efe75c5d1ec614776856cefbe109ca373554a6d514f" +dependencies = [ + "hybrid-array", +] + [[package]] name = "bumpalo" version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +[[package]] +name = "bytecheck" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "rancor", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "bytes" version = "1.11.1" @@ -157,6 +265,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] @@ -177,12 +287,72 @@ dependencies = [ "windows-link", ] +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "211f05e03c7d03754740fd9e585de910a095d6b99f8bcfffdef8319fa02a8331" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "curve25519-dalek" +version = "5.0.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335f1947f241137a14106b6f5acc5918a5ede29c9d71d3f2cb1678d5075d9fc3" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "darling" version = "0.21.3" @@ -204,7 +374,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.114", ] [[package]] @@ -215,7 +385,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -236,6 +406,16 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" +[[package]] +name = "der" +version = "0.8.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c1d73e9668ea6b6a28172aa55f3ebec38507131ce179051c8033b5c6037653" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.5" @@ -286,7 +466,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -306,7 +486,17 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" dependencies = [ - "syn", + "syn 2.0.114", +] + +[[package]] +name = "digest" +version = "0.11.0-rc.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b42f1d9edf5207c137646b568a0168ca0ec25b7f9eaf7f9961da51a3d91cea" +dependencies = [ + "block-buffer", + "crypto-common", ] [[package]] @@ -326,7 +516,36 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ed25519" +version = "3.0.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "3.0.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053618a4c3d3bc24f188aa660ae75a46eeab74ef07fb415c61431e5e7cd4749b" +dependencies = [ + "curve25519-dalek", + "ed25519", + "sha2", + "subtle", + "zeroize", ] [[package]] @@ -357,6 +576,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -387,6 +612,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures-channel" version = "0.3.31" @@ -427,6 +658,29 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "getrandom" version = "0.4.1" @@ -440,6 +694,12 @@ dependencies = [ "wasip3", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "h2" version = "0.4.13" @@ -534,6 +794,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "hybrid-array" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b229d73f5803b562cc26e4da0396c8610a4ee209f4fac8fa4f8d709166dc45" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "1.8.1" @@ -638,6 +907,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + [[package]] name = "itertools" version = "0.14.0" @@ -653,6 +928,16 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" version = "0.3.85" @@ -724,6 +1009,37 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "backtrace", + "backtrace-ext", + "cfg-if", + "miette-derive", + "owo-colors", + "serde", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "migrations_internals" version = "2.3.0" @@ -751,6 +1067,15 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "1.1.1" @@ -768,6 +1093,26 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "munge" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "num-conv" version = "0.2.0" @@ -793,12 +1138,27 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "owo-colors" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" + [[package]] name = "parking_lot" version = "0.12.5" @@ -856,7 +1216,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -871,6 +1231,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.11.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b226d2cc389763951db8869584fd800cbbe2962bf454e2edeb5172b31ee99774" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -890,7 +1260,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.114", ] [[package]] @@ -929,7 +1299,7 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn", + "syn 2.0.114", "tempfile", ] @@ -943,7 +1313,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -956,6 +1326,26 @@ dependencies = [ "prost", ] +[[package]] +name = "ptr_meta" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "pulldown-cmark" version = "0.13.0" @@ -991,6 +1381,15 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "rancor" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" +dependencies = [ + "ptr_meta", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1029,6 +1428,59 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +[[package]] +name = "rend" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a30e631b7f4a03dee9056b8ef6982e8ba371dd5bedb74d3ec86df4499132c70" +dependencies = [ + "bytecheck", + "bytes", + "hashbrown 0.16.1", + "indexmap", + "munge", + "ptr_meta", + "rancor", + "rend", + "rkyv_derive", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8100bb34c0a1d0f907143db3149e6b4eea3c33b9ee8b189720168e818303986f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + [[package]] name = "rsqlite-vfs" version = "0.1.0" @@ -1039,6 +1491,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.1.3" @@ -1052,6 +1519,42 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -1106,7 +1609,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1131,6 +1634,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "sha2" +version = "0.11.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c5f3b1e2dc8aad28310d8410bd4d7e180eca65fca176c52ab00d364475d0024" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1147,6 +1661,18 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "3.0.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f1880df446116126965eeec169136b2e0251dba37c6223bcc819569550edea3" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "slab" version = "0.4.12" @@ -1159,6 +1685,27 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smlang" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de84f9f80bbe6272174e2bfdb8cf7ce4815b218038a42161c2f21c1d872c215" +dependencies = [ + "smlang-macros", +] + +[[package]] +name = "smlang-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231b4425dcc43afc7e18c34e7c6738cd252d42d91d909c948df14107c9ae79f1" +dependencies = [ + "proc-macro2", + "quote", + "string_morph", + "syn 1.0.109", +] + [[package]] name = "socket2" version = "0.6.2" @@ -1169,6 +1716,16 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "spki" +version = "0.8.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlite-wasm-rs" version = "0.5.2" @@ -1181,12 +1738,56 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "string_morph" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183aaf7fa637cc7b5f54c45b8f7cb6e8d73831f9f75a56b6defa5bf8c51d1699" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e396b6523b11ccb83120b115a0b7366de372751aa6edf19844dfb13a6af97e91" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.114" @@ -1211,12 +1812,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ "fastrand", - "getrandom", + "getrandom 0.4.1", "once_cell", "rustix", "windows-sys 0.61.2", ] +[[package]] +name = "terminal_size" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" +dependencies = [ + "rustix", + "windows-sys 0.60.2", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.2", +] + [[package]] name = "thiserror" version = "2.0.18" @@ -1234,7 +1855,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1268,6 +1889,21 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.49.0" @@ -1293,7 +1929,17 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", ] [[package]] @@ -1373,6 +2019,7 @@ dependencies = [ "socket2", "sync_wrapper", "tokio", + "tokio-rustls", "tokio-stream", "tower", "tower-layer", @@ -1389,7 +2036,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1414,7 +2061,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn", + "syn 2.0.114", "tempfile", "tonic-build", ] @@ -1469,7 +2116,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1487,6 +2134,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + [[package]] name = "unicase" version = "2.9.0" @@ -1499,12 +2152,36 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "uuid" version = "1.20.0" @@ -1586,7 +2263,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.114", "wasm-bindgen-shared", ] @@ -1654,7 +2331,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1665,7 +2342,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1692,13 +2369,22 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets", + "windows-targets 0.53.5", ] [[package]] @@ -1710,6 +2396,22 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + [[package]] name = "windows-targets" version = "0.53.5" @@ -1717,58 +2419,106 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_aarch64_msvc" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + [[package]] name = "windows_i686_gnu" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_i686_msvc" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnu" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_gnullvm" version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "windows_x86_64_msvc" version = "0.53.1" @@ -1811,7 +2561,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn", + "syn 2.0.114", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -1827,7 +2577,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.114", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -1869,6 +2619,12 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zmij" version = "1.0.20" diff --git a/server/Cargo.toml b/server/Cargo.toml index 9935b29..20612b4 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -3,12 +3,14 @@ members = [ "crates/arbiter-client", "crates/arbiter-proto", "crates/arbiter-server", + "crates/arbiter-useragent", ] resolver = "3" + [workspace.dependencies] prost = "0.14.3" -tonic = "0.14.3" +tonic = { version = "0.14.3", features = ["tls-connect-info"] } tracing = "0.1.44" tokio = { version = "1.49.0", features = ["full"] } ed25519 = "3.0.0-rc.4" @@ -16,18 +18,7 @@ ed25519-dalek = "3.0.0-pre.6" chrono = { version = "0.4.43", features = ["serde"] } rand = "0.10.0" uuid = "1.20.0" - -[package] -name = "arbiter" -version = "0.1.0" -edition = "2024" -repository = "https://git.markettakers.org/MarketTakers/arbiter" - -[dependencies] - - - - - - - +rustls = "0.23.36" +smlang = "0.8.0" +miette = { version = "7.6.0", features = ["fancy", "serde"] } +thiserror = "2.0.18" diff --git a/server/crates/arbiter-client/Cargo.toml b/server/crates/arbiter-client/Cargo.toml index 6bd323d..686d3cf 100644 --- a/server/crates/arbiter-client/Cargo.toml +++ b/server/crates/arbiter-client/Cargo.toml @@ -2,5 +2,6 @@ name = "arbiter-client" version = "0.1.0" edition = "2024" +repository = "https://git.markettakers.org/MarketTakers/arbiter" [dependencies] diff --git a/server/crates/arbiter-proto/Cargo.toml b/server/crates/arbiter-proto/Cargo.toml index 36cee46..2d3ca52 100644 --- a/server/crates/arbiter-proto/Cargo.toml +++ b/server/crates/arbiter-proto/Cargo.toml @@ -2,6 +2,7 @@ name = "arbiter-proto" version = "0.1.0" edition = "2024" +repository = "https://git.markettakers.org/MarketTakers/arbiter" [dependencies] tonic.workspace = true @@ -10,6 +11,8 @@ bytes = "1.11.1" prost-derive = "0.14.3" prost-types = { version = "0.14.3", features = ["chrono"] } tonic-prost = "0.14.3" +rkyv = "0.8.15" + [build-dependencies] prost-build = "0.14.3" diff --git a/server/crates/arbiter-proto/src/lib.rs b/server/crates/arbiter-proto/src/lib.rs index 4ab0e34..4d1ff6d 100644 --- a/server/crates/arbiter-proto/src/lib.rs +++ b/server/crates/arbiter-proto/src/lib.rs @@ -4,4 +4,4 @@ pub mod proto { pub mod auth { tonic::include_proto!("arbiter.auth"); } -} +} \ No newline at end of file diff --git a/server/crates/arbiter-server/Cargo.toml b/server/crates/arbiter-server/Cargo.toml index ea20290..360975d 100644 --- a/server/crates/arbiter-server/Cargo.toml +++ b/server/crates/arbiter-server/Cargo.toml @@ -2,10 +2,19 @@ name = "arbiter-server" version = "0.1.0" edition = "2024" +repository = "https://git.markettakers.org/MarketTakers/arbiter" [dependencies] diesel = { version = "2.3.6", features = ["sqlite", "uuid", "time", "chrono", "serde_json"] } diesel-async = { version = "0.7.4", features = ["sqlite", "tokio", "migrations", "pool", "deadpool"] } +ed25519.workspace = true +ed25519-dalek.workspace = true +arbiter-proto.path = "../arbiter-proto" tracing.workspace = true tonic.workspace = true -tokio.workspace = true \ No newline at end of file +tokio.workspace = true +rustls.workspace = true +smlang.workspace = true +miette.workspace = true +thiserror.workspace = true +diesel_migrations = { version = "2.3.1", features = ["sqlite"] } diff --git a/server/crates/arbiter-server/diesel.toml b/server/crates/arbiter-server/diesel.toml index a0d61bf..bb1d1f7 100644 --- a/server/crates/arbiter-server/diesel.toml +++ b/server/crates/arbiter-server/diesel.toml @@ -2,7 +2,7 @@ # see https://diesel.rs/guides/configuring-diesel-cli [print_schema] -file = "src/schema.rs" +file = "src/db/schema.rs" custom_type_derives = ["diesel::query_builder::QueryId", "Clone"] [migrations_directory] diff --git a/server/crates/arbiter-server/migrations/2026-02-09-143015-0000_init/up.sql b/server/crates/arbiter-server/migrations/2026-02-09-143015-0000_init/up.sql index b37f10d..65cac74 100644 --- a/server/crates/arbiter-server/migrations/2026-02-09-143015-0000_init/up.sql +++ b/server/crates/arbiter-server/migrations/2026-02-09-143015-0000_init/up.sql @@ -1 +1,29 @@ --- Your SQL goes here +-- This is a singleton +create table if not exists arbiter_settings ( + root_key_enc blob, -- if null, means wasn't bootstrapped yet + cert_key blob not null, + cert blob not null +) STRICT; + +create table if not exists key_identity( + id integer primary key, + name text not null, + public_key text not null, + created_at integer not null default (unixepoch('now')), + updated_at integer not null default (unixepoch('now')) +) STRICT; + +create table if not exists useragent_client ( + id integer primary key, + key_identity_id integer not null references key_identity(id) on delete cascade, + created_at integer not null default (unixepoch('now')), + updated_at integer not null default (unixepoch('now')) +) STRICT; + + +create table if not exists program_client( + id integer primary key, + key_identity_id integer not null references key_identity(id) on delete cascade, + created_at integer not null default (unixepoch('now')), + updated_at integer not null default (unixepoch('now')) +) STRICT; \ No newline at end of file diff --git a/server/crates/arbiter-server/src/db.rs b/server/crates/arbiter-server/src/db.rs new file mode 100644 index 0000000..1b965ee --- /dev/null +++ b/server/crates/arbiter-server/src/db.rs @@ -0,0 +1,83 @@ +use diesel::{Connection as _, SqliteConnection, connection::SimpleConnection as _}; +use diesel_async::sync_connection_wrapper::SyncConnectionWrapper; +use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations}; +use miette::Diagnostic; +use thiserror::Error; + +pub mod models; +pub mod schema; + +pub type Database = SyncConnectionWrapper; + +static ARBITER_HOME: &'static str = ".arbiter"; +static DB_FILE: &'static str = "db.sqlite"; + +const MIGRATIONS: EmbeddedMigrations = embed_migrations!(); + +#[derive(Error, Diagnostic, Debug)] +pub enum DatabaseSetupError { + #[error("Failed to determine home directory")] + #[diagnostic(code(arbiter::db::home_dir_error))] + HomeDir(Option), + + #[error(transparent)] + #[diagnostic(code(arbiter::db::connection_error))] + Connection(diesel::ConnectionError), + + #[error(transparent)] + #[diagnostic(code(arbiter::db::concurrency_error))] + ConcurrencySetup(diesel::result::Error), + + #[error(transparent)] + #[diagnostic(code(arbiter::db::migration_error))] + Migration(Box), +} + +fn database_path() -> Result { + let home_dir = std::env::home_dir().ok_or_else(|| DatabaseSetupError::HomeDir(None))?; + + let arbiter_home = home_dir.join(ARBITER_HOME); + + let db_path = arbiter_home.join(DB_FILE); + + std::fs::create_dir_all(arbiter_home) + .map_err(|err| DatabaseSetupError::HomeDir(Some(err)))?; + + Ok(db_path) +} + +fn setup_concurrency(conn: &mut SqliteConnection) -> Result<(), diesel::result::Error> { + // see https://fractaledmind.github.io/2023/09/07/enhancing-rails-sqlite-fine-tuning/ + // sleep if the database is busy, this corresponds to up to 2 seconds sleeping time. + conn.batch_execute("PRAGMA busy_timeout = 2000;")?; + // better write-concurrency + conn.batch_execute("PRAGMA journal_mode = WAL;")?; + // fsync only in critical moments + conn.batch_execute("PRAGMA synchronous = NORMAL;")?; + // write WAL changes back every 1000 pages, for an in average 1MB WAL file. + // May affect readers if number is increased + conn.batch_execute("PRAGMA wal_autocheckpoint = 1000;")?; + // free some space by truncating possibly massive WAL files from the last run + conn.batch_execute("PRAGMA wal_checkpoint(TRUNCATE);")?; + + Ok(()) +} + +#[tracing::instrument] +pub fn connect() -> Result { + let database_url = format!( + "{}?mode=rwc", + database_path()? + .to_str() + .ok_or_else(|| DatabaseSetupError::HomeDir(None))? + ); + let mut conn = + SqliteConnection::establish(&database_url).map_err(DatabaseSetupError::Connection)?; + + setup_concurrency(&mut conn).map_err(DatabaseSetupError::ConcurrencySetup)?; + + conn.run_pending_migrations(MIGRATIONS) + .map_err(DatabaseSetupError::Migration)?; + + Ok(SyncConnectionWrapper::new(conn)) +} diff --git a/server/crates/arbiter-server/src/db/models.rs b/server/crates/arbiter-server/src/db/models.rs new file mode 100644 index 0000000..e69de29 diff --git a/server/crates/arbiter-server/src/db/schema.rs b/server/crates/arbiter-server/src/db/schema.rs new file mode 100644 index 0000000..346f0eb --- /dev/null +++ b/server/crates/arbiter-server/src/db/schema.rs @@ -0,0 +1,48 @@ +// @generated automatically by Diesel CLI. + +diesel::table! { + arbiter_settings (rowid) { + rowid -> Integer, + root_key_enc -> Nullable, + cert_key -> Binary, + cert -> Binary, + } +} + +diesel::table! { + key_identity (id) { + id -> Nullable, + name -> Text, + public_key -> Text, + created_at -> Integer, + updated_at -> Integer, + } +} + +diesel::table! { + program_client (id) { + id -> Nullable, + key_identity_id -> Integer, + created_at -> Integer, + updated_at -> Integer, + } +} + +diesel::table! { + useragent_client (id) { + id -> Nullable, + key_identity_id -> Integer, + created_at -> Integer, + updated_at -> Integer, + } +} + +diesel::joinable!(program_client -> key_identity (key_identity_id)); +diesel::joinable!(useragent_client -> key_identity (key_identity_id)); + +diesel::allow_tables_to_appear_in_same_query!( + arbiter_settings, + key_identity, + program_client, + useragent_client, +); diff --git a/server/crates/arbiter-server/src/lib.rs b/server/crates/arbiter-server/src/lib.rs index c7d637a..027d337 100644 --- a/server/crates/arbiter-server/src/lib.rs +++ b/server/crates/arbiter-server/src/lib.rs @@ -1,5 +1,5 @@ +mod db; -#[tokio::main] -pub async fn main() { - -} \ No newline at end of file +pub struct Server { + pub db: db::Database, +} diff --git a/server/crates/arbiter-useragent/Cargo.toml b/server/crates/arbiter-useragent/Cargo.toml new file mode 100644 index 0000000..d2d0db8 --- /dev/null +++ b/server/crates/arbiter-useragent/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "arbiter-useragent" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/server/crates/arbiter-useragent/src/lib.rs b/server/crates/arbiter-useragent/src/lib.rs new file mode 100644 index 0000000..b93cf3f --- /dev/null +++ b/server/crates/arbiter-useragent/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/server/diesel.toml b/server/diesel.toml deleted file mode 100644 index a0d61bf..0000000 --- a/server/diesel.toml +++ /dev/null @@ -1,9 +0,0 @@ -# For documentation on how to configure this file, -# see https://diesel.rs/guides/configuring-diesel-cli - -[print_schema] -file = "src/schema.rs" -custom_type_derives = ["diesel::query_builder::QueryId", "Clone"] - -[migrations_directory] -dir = "migrations" diff --git a/server/src/main.rs b/server/src/main.rs deleted file mode 100644 index e7a11a9..0000000 --- a/server/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -}