From 0bc88f2338316aab29df27626c37234d7302f91b Mon Sep 17 00:00:00 2001 From: glyph Date: Mon, 13 Mar 2023 12:53:59 +0200 Subject: [PATCH 1/8] Add libp2p service and configuration (#282) * Include libp2p in dependencies * Create dummy libp2p service * CLI arg for setting http server port * libp2p service with mdns * Tidy imports * More even logging * Remove mdns service * Init quic transport and listen for events * Add dialer * Use swarm * Define swarm configuration parameters * Remove extraneous configuration parameters * Add mDNS behaviour with default config * Move libp2p config into separate module * Alphabetise libp2p configuration * Add libp2p config to application configuration object * Export Libp2pConfiguration * Implement network behaviour toggles for mDNS and ping * Add ping to libp2p config * Expose ping and mDNS flags via CLI * Include libp2p in dependencies * Create dummy libp2p service * CLI arg for setting http server port * libp2p service with mdns * Tidy imports * More even logging * Remove mdns service * Init quic transport and listen for events * Add dialer * Use swarm * Define swarm configuration parameters * Remove extraneous configuration parameters * Add mDNS behaviour with default config * Move libp2p config into separate module * Alphabetise libp2p configuration * Add libp2p config to application configuration object * Export Libp2pConfiguration * Implement network behaviour toggles for mDNS and ping * Add ping to libp2p config * Expose ping and mDNS flags via CLI * Rebuild lock file * Update connection buffer and mDNS config * Install protobuf-compiler for clippy CI * Install protobuf-complier for remaining CI checks * Add pem dependency and rebuild lockfile * Add keypair identity trait and implementation * Introduce keypair loader * Use new keypair config flows in libp2p service * Add tempfile as dev dependency * Test keypair generation, saving and loading * Define the default QUIC transport port * Remove keep_alive behaviour and update service doc comments * Move default connection limit definition into config module * Add note about Protocol Buffers compiler installation * Change development heading * Update unreleased section of CHANGELOG * Rename libp2p module and config to network * Change default QUIC port to 2022 * Change key file name and use p2panda key pair naming convention * Replace PEM key file with hex-encoded private key * Remove PEM dependency * Use p2panda key pair naming convention * Update network service configuration * Use Display representation for PeerId * Capitalise letter * Enable mDNS and ping by default for CLI application * Add mDNS port in doc comment * Update SwarmEvent logging * Extend and clarify doc comments for network config * Introduce CLI option to define custom QUIC port * Remove noise feature from libp2p dependency * Add mention of mDNS to network service doc comment --------- Co-authored-by: Sam Andreae --- .github/workflows/tests.yml | 15 + CHANGELOG.md | 1 + Cargo.lock | 3153 +++++++++++++++++++++++++---- aquadoggo/Cargo.toml | 8 + aquadoggo/README.md | 12 + aquadoggo/src/config.rs | 11 +- aquadoggo/src/lib.rs | 2 + aquadoggo/src/network/config.rs | 166 ++ aquadoggo/src/network/identity.rs | 86 + aquadoggo/src/network/mod.rs | 8 + aquadoggo/src/network/service.rs | 199 ++ aquadoggo/src/node.rs | 10 +- aquadoggo_cli/src/main.rs | 26 +- 13 files changed, 3323 insertions(+), 374 deletions(-) create mode 100644 aquadoggo/src/network/config.rs create mode 100644 aquadoggo/src/network/identity.rs create mode 100644 aquadoggo/src/network/mod.rs create mode 100644 aquadoggo/src/network/service.rs diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 91795a8f1..d02b09d26 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,6 +14,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Install Protocol Buffers compiler + run: sudo apt-get install protobuf-compiler + - name: Checkout repository uses: actions/checkout@v3 @@ -67,6 +70,9 @@ jobs: --health-retries 5 steps: + - name: Install Protocol Buffers compiler + run: sudo apt-get install protobuf-compiler + - name: Checkout repository uses: actions/checkout@v3 @@ -99,6 +105,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Install Protocol Buffers compiler + run: sudo apt-get install protobuf-compiler + - name: Checkout repository uses: actions/checkout@v3 @@ -152,6 +161,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Install Protocol Buffers compiler + run: sudo apt-get install protobuf-compiler + - name: Checkout repository uses: actions/checkout@v3 @@ -179,6 +191,9 @@ jobs: runs-on: ubuntu-latest steps: + - name: Install Protocol Buffers compiler + run: sudo apt-get install protobuf-compiler + - name: Checkout repository uses: actions/checkout@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b410549..8e3a80f27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- Introduce libp2p networking service and configuration [#282](https://github.com/p2panda/aquadoggo/pull/282) - Rework test runner and test node population patterns and refactor test_utils [#277](https://github.com/p2panda/aquadoggo/pull/277) - Implement API changes to p2panda-rs storage traits, new and breaking db migration [#268](https://github.com/p2panda/aquadoggo/pull/268) - Move all test utils into one module [#275](https://github.com/p2panda/aquadoggo/pull/275) diff --git a/Cargo.lock b/Cargo.lock index 744a46a95..5c3af3a11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,22 +12,133 @@ dependencies = [ "regex", ] +[[package]] +name = "aead" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", + "rand_core 0.6.4", +] + +[[package]] +name = "aead" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" +dependencies = [ + "aes-soft", + "aesni", + "cipher 0.2.5", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +dependencies = [ + "cfg-if", + "cipher 0.4.3", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "cipher 0.3.0", + "ctr 0.8.0", + "ghash 0.4.4", + "subtle", +] + +[[package]] +name = "aes-gcm" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" +dependencies = [ + "aead 0.5.1", + "aes 0.8.2", + "cipher 0.4.3", + "ctr 0.9.2", + "ghash 0.5.0", + "subtle", +] + +[[package]] +name = "aes-soft" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" +dependencies = [ + "cipher 0.2.5", + "opaque-debug", +] + +[[package]] +name = "aesni" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" +dependencies = [ + "cipher 0.2.5", + "opaque-debug", +] + [[package]] name = "ahash" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.8", "once_cell", "version_check", ] [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] @@ -43,9 +154,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.62" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" [[package]] name = "aquadoggo" @@ -69,6 +180,7 @@ dependencies = [ "hex", "http", "hyper", + "libp2p", "lipmaa-link 0.2.2", "log", "once_cell", @@ -82,6 +194,7 @@ dependencies = [ "serde_json", "serial_test", "sqlx", + "tempfile", "thiserror", "tokio", "tower", @@ -101,6 +214,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "arrayref" version = "0.3.6" @@ -125,6 +244,79 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" +[[package]] +name = "asn1-rs" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" +dependencies = [ + "asn1-rs-derive 0.1.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf6690c370453db30743b373a60ba498fc0d6d83b11f4abfd87a84a075db5dd4" +dependencies = [ + "asn1-rs-derive 0.4.0", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "asn1_der" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21" + [[package]] name = "async-graphql" version = "3.0.38" @@ -181,7 +373,7 @@ checksum = "1a6ec150ac445a660169a3ad5075b953a7351ec75fe28095e639f6282aac9fdb" dependencies = [ "Inflector", "async-graphql-parser", - "darling", + "darling 0.13.4", "proc-macro-crate", "proc-macro2", "quote", @@ -214,11 +406,41 @@ dependencies = [ "serde_json", ] +[[package]] +name = "async-io" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" +dependencies = [ + "async-lock", + "autocfg", + "concurrent-queue", + "futures-lite", + "libc", + "log", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "windows-sys 0.42.0", +] + +[[package]] +name = "async-lock" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" +dependencies = [ + "event-listener", + "futures-lite", +] + [[package]] name = "async-recursion" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cda8f4bcc10624c4e85bc66b3f452cca98cfa5ca002dc83a16aad2367641bea" +checksum = "3b015a331cc64ebd1774ba119538573603427eaace0a1950c423ab971f903796" dependencies = [ "proc-macro2", "quote", @@ -227,19 +449,20 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +checksum = "ad445822218ce64be7a341abfb0b1ea43b5c23aa83902542a4542e78309d8e5e" dependencies = [ "async-stream-impl", "futures-core", + "pin-project-lite", ] [[package]] name = "async-stream-impl" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965" dependencies = [ "proc-macro2", "quote", @@ -257,6 +480,19 @@ dependencies = [ "syn", ] +[[package]] +name = "asynchronous-codec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" +dependencies = [ + "bytes", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + [[package]] name = "atoi" version = "1.0.0" @@ -266,13 +502,19 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" + [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi", ] @@ -285,13 +527,13 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.5.15" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de18bc5f2e9df8f52da03856bf40e29b747de5a84e43aefff90e3dc4a21529b" +checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43" dependencies = [ "async-trait", "axum-core", - "base64", + "base64 0.13.1", "bitflags", "bytes", "futures-util", @@ -308,7 +550,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sha-1", + "sha-1 0.10.1", "sync_wrapper", "tokio", "tokio-tungstenite", @@ -320,9 +562,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635" +checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc" dependencies = [ "async-trait", "bytes", @@ -330,6 +572,8 @@ dependencies = [ "http", "http-body", "mime", + "tower-layer", + "tower-service", ] [[package]] @@ -352,11 +596,44 @@ dependencies = [ "yasmf-hash", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" -version = "0.13.0" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] [[package]] name = "bitflags" @@ -364,6 +641,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.6", +] + [[package]] name = "blake2b_simd" version = "0.5.11" @@ -372,21 +658,21 @@ checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" dependencies = [ "arrayref", "arrayvec 0.5.2", - "constant_time_eq", + "constant_time_eq 0.1.5", ] [[package]] name = "blake3" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" +checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" dependencies = [ "arrayref", "arrayvec 0.7.2", "cc", "cfg-if", - "constant_time_eq", - "digest 0.10.3", + "constant_time_eq 0.2.4", + "digest 0.10.6", ] [[package]] @@ -400,18 +686,40 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ "generic-array", ] +[[package]] +name = "block-modes" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" +dependencies = [ + "block-padding", + "cipher 0.2.5", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + [[package]] name = "bumpalo" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -421,18 +729,29 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.2.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.0.73" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "ccm" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" +dependencies = [ + "aead 0.3.2", + "cipher 0.2.5", + "subtle", +] [[package]] name = "cfg-if" @@ -440,6 +759,31 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chacha20" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures", + "zeroize", +] + +[[package]] +name = "chacha20poly1305" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5" +dependencies = [ + "aead 0.4.3", + "chacha20", + "cipher 0.3.0", + "poly1305", + "zeroize", +] + [[package]] name = "ciborium" version = "0.2.0" @@ -467,6 +811,34 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "cipher" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "2.34.0" @@ -483,8 +855,17 @@ dependencies = [ ] [[package]] -name = "console_error_panic_hook" -version = "0.1.7" +name = "concurrent-queue" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ @@ -492,12 +873,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "const-oid" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" + [[package]] name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "constant_time_eq" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" + [[package]] name = "core-foundation" version = "0.9.3" @@ -514,29 +907,38 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1079fb8528d9f9c888b1e8aa651e6e079ade467323d58f75faf1d30b1808f540" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" [[package]] name = "crossbeam-channel" @@ -561,23 +963,22 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.10" +version = "0.9.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", - "once_cell", + "memoffset 0.7.1", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" dependencies = [ "cfg-if", "crossbeam-utils", @@ -585,12 +986,23 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.11" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", - "once_cell", +] + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", ] [[package]] @@ -600,24 +1012,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "ctor" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ "quote", "syn", ] +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher 0.4.3", +] + [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", "digest 0.9.0", @@ -626,14 +1067,38 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da00a7a9a4eb92a0a0f8e75660926d48f0d0f3c537e455c457bcdaa1e16b1ac" +dependencies = [ + "cfg-if", + "fiat-crypto", + "packed_simd_2", + "platforms", + "subtle", + "zeroize", +] + [[package]] name = "darling" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0808e1bd8671fb44a113a14e13497557533369847788fa2ae912b6ebfce9fa8" +dependencies = [ + "darling_core 0.14.3", + "darling_macro 0.14.3", ] [[package]] @@ -650,39 +1115,161 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "001d80444f28e193f30c2f293455da62dcf9a6b29918a4253152ae2b1de592cb" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + [[package]] name = "darling_macro" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core", + "darling_core 0.13.4", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b36230598a2d5de7ec1c6f51f72d8a99a9208daff41de2084d06e3fd3ea56685" +dependencies = [ + "darling_core 0.14.3", "quote", "syn", ] [[package]] name = "dashmap" -version = "5.3.4" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3495912c9c1ccf2e18976439f4443f3fee0fd61f424ff99fde6a66b15ecb448f" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", "hashbrown", "lock_api", - "parking_lot_core 0.9.3", + "once_cell", + "parking_lot_core 0.9.7", +] + +[[package]] +name = "data-encoding" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" + +[[package]] +name = "data-encoding-macro" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86927b7cd2fe88fa698b87404b287ab98d1a0063a34071d92e575b72d3029aca" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5bbed42daaa95e780b60a50546aa345b8413a1e46f9a40a12907d3598f038db" +dependencies = [ + "data-encoding", + "syn", ] [[package]] name = "deadqueue" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35c1225e178e8fd4fe648205304a25dc8712740d5d46462cbf0fc38d280ee8d" +checksum = "16a2561fd313df162315935989dceb8c99db4ee1933358270a57a3cfb8c957f3" dependencies = [ "crossbeam-queue", "tokio", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" +dependencies = [ + "asn1-rs 0.3.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der-parser" +version = "8.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d4bc9b0db0a0df9ae64634ac5bdefb7afcb534e182275ca0beadbe486701c1" +dependencies = [ + "asn1-rs 0.5.1", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "derive_builder" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" +dependencies = [ + "darling 0.14.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" +dependencies = [ + "derive_builder_core", + "syn", +] + [[package]] name = "digest" version = "0.9.0" @@ -694,11 +1281,11 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.3" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "block-buffer 0.10.2", + "block-buffer 0.10.3", "crypto-common", "subtle", ] @@ -732,6 +1319,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "doc-comment" version = "0.3.3" @@ -740,18 +1338,33 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dotenvy" -version = "0.15.1" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" + +[[package]] +name = "dtoa" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e851a83c30366fd01d75b913588e95e74a1705c1ecc5d58b1f8e1a6d556525f" +checksum = "c00704156a7de8df8da0911424e30c2049957b0a714542a44e05fe693dd85313" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" dependencies = [ - "dirs", + "der", + "elliptic-curve", + "rfc6979", + "signature", ] [[package]] name = "ed25519" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9c280362032ea4203659fc489832d0204ef09f247a0506f170dafcac08c369" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ "serde", "signature", @@ -763,7 +1376,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek", + "curve25519-dalek 3.2.0", "ed25519", "merlin", "rand 0.7.3", @@ -775,24 +1388,58 @@ dependencies = [ [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint", + "der", + "digest 0.10.6", + "ff", + "generic-array", + "group", + "hkdf", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] +[[package]] +name = "enum-as-inner" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "env_logger" -version = "0.9.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" dependencies = [ "atty", "humantime", @@ -810,6 +1457,27 @@ dependencies = [ "serde", ] +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -827,13 +1495,35 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a214f5bb88731d436478f3ae1f8a277b62124089ba9fb67f4f93fb100ef73c90" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flume" version = "0.10.14" @@ -843,7 +1533,7 @@ dependencies = [ "futures-core", "futures-sink", "pin-project", - "spin 0.9.4", + "spin 0.9.5", ] [[package]] @@ -869,19 +1559,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "futures" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab30e97ab6aacfe635fad58f22c2bb06c8b685f7421eb1e064a729e2a5f481fa" +checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" dependencies = [ "futures-channel", "futures-core", @@ -894,9 +1583,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" +checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" dependencies = [ "futures-core", "futures-sink", @@ -904,26 +1593,27 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" +checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" [[package]] name = "futures-executor" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d11aa21b5b587a64682c0094c2bdd4df0076c5324961a40cc3abd7f37930528" +checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] name = "futures-intrusive" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" dependencies = [ "futures-core", "lock_api", @@ -932,32 +1622,58 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.23" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" + +[[package]] +name = "futures-lite" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a66fc6d035a26a3ae255a6d2bca35eda63ae4c5512bef54449113f7a1228e5" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] [[package]] name = "futures-macro" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0db9cce532b0eae2ccf2766ab246f114b56b9cf6d445e00c2549fbc100ca045d" +checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "futures-rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" +dependencies = [ + "futures-io", + "rustls 0.20.8", + "webpki 0.22.0", +] + [[package]] name = "futures-sink" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" +checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" [[package]] name = "futures-task" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" +checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" [[package]] name = "futures-timer" @@ -967,9 +1683,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.23" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" +checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" dependencies = [ "futures-channel", "futures-core", @@ -1008,20 +1724,40 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug", + "polyval 0.5.3", +] + +[[package]] +name = "ghash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +dependencies = [ + "opaque-debug", + "polyval 0.6.0", +] + [[package]] name = "gql_client" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ad0b978ded703acd23762f99e0f701450c9d0066912c0d7f9bf65bf017d87d" +checksum = "e57f4862d3e5cd4ffe8df03fa2137e620e33578bbc1895e6f8f569630e17b1db" dependencies = [ "log", "reqwest", @@ -1029,11 +1765,22 @@ dependencies = [ "serde_json", ] +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "h2" -version = "0.3.14" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" +checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" dependencies = [ "bytes", "fnv", @@ -1044,7 +1791,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.3", + "tokio-util 0.7.7", "tracing", ] @@ -1065,27 +1812,27 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452c155cb93fecdfb02a73dd57b5d8e442c2063bd7aac72f1bc5e4263a43086" +checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" dependencies = [ "hashbrown", ] [[package]] name = "headers" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cff78e5788be1e0ab65b04d306b2ed5092c815ec97ec70f4ebd5aee158aa55d" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ - "base64", + "base64 0.13.1", "bitflags", "bytes", "headers-core", "http", "httpdate", "mime", - "sha-1", + "sha1", ] [[package]] @@ -1108,9 +1855,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] @@ -1124,6 +1871,15 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + [[package]] name = "hex" version = "0.4.3" @@ -1139,7 +1895,17 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" dependencies = [ - "hmac", + "hmac 0.12.1", +] + +[[package]] +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", ] [[package]] @@ -1148,14 +1914,25 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.3", + "digest 0.10.6", +] + +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", ] [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -1181,9 +1958,9 @@ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" [[package]] name = "httparse" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" @@ -1199,9 +1976,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.20" +version = "0.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" +checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" dependencies = [ "bytes", "futures-channel", @@ -1251,17 +2028,65 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "if-addrs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "if-watch" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba7abdbb86e485125dad06c2691e1e393bf3b08c7b743b43aa162a00fd39062e" +dependencies = [ + "async-io", + "core-foundation", + "fnv", + "futures", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "tokio", + "windows", +] + [[package]] name = "indexmap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", "serde", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.12" @@ -1271,26 +2096,67 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interceptor" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" +dependencies = [ + "async-trait", + "bytes", + "log", + "rand 0.8.5", + "rtcp", + "rtp", + "thiserror", + "tokio", + "waitgroup", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +dependencies = [ + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "ipconfig" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" +dependencies = [ + "socket2", + "widestring", + "winapi", + "winreg", +] + [[package]] name = "ipnet" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" +checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" +checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "js-sys" @@ -1303,9 +2169,12 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b7d56ba4a8344d6be9729995e6b06f928af29998cdf79fe390cbf6b1fee838" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] [[package]] name = "lazy_static" @@ -1315,9 +2184,280 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.132" +version = "0.2.139" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" + +[[package]] +name = "libm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" + +[[package]] +name = "libp2p" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb49f950659c645e0606461026387916f91bb2f6058c57ea1df4fab053cc676" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "getrandom 0.2.8", + "instant", + "libp2p-core", + "libp2p-dns", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-ping", + "libp2p-quic", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-webrtc", + "multiaddr", + "parking_lot 0.12.1", + "pin-project", + "smallvec", +] + +[[package]] +name = "libp2p-core" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881d9a54e97d97cdaa4125d48269d97ca8c40e5fefec6b85b30440dc60cc551f" +dependencies = [ + "asn1_der", + "bs58", + "ed25519-dalek", + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "log", + "multiaddr", + "multihash", + "multistream-select", + "once_cell", + "parking_lot 0.12.1", + "pin-project", + "prost", + "prost-build", + "rand 0.8.5", + "rw-stream-sink", + "sec1", + "sha2 0.10.6", + "smallvec", + "thiserror", + "unsigned-varint", + "void", + "zeroize", +] + +[[package]] +name = "libp2p-dns" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146ff7034daae62077c415c2376b8057368042df6ab95f5432ad5e88568b1554" +dependencies = [ + "futures", + "libp2p-core", + "log", + "parking_lot 0.12.1", + "smallvec", + "trust-dns-resolver", +] + +[[package]] +name = "libp2p-mdns" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687a0b54ee8f7106be36f012b32bd30faceeb4cd857ebad96e512566886ffea5" +dependencies = [ + "data-encoding", + "futures", + "if-watch", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "smallvec", + "socket2", + "tokio", + "trust-dns-proto", + "void", +] + +[[package]] +name = "libp2p-metrics" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a42ec91e227d7d0dafa4ce88b333cdf5f277253873ab087555c92798db2ddd46" +dependencies = [ + "libp2p-core", + "libp2p-ping", + "libp2p-swarm", + "prometheus-client", +] + +[[package]] +name = "libp2p-noise" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1216f9ec823ac7a2289b954674c54cbce81c9e45920b4fcf173018ede4295246" +dependencies = [ + "bytes", + "curve25519-dalek 3.2.0", + "futures", + "libp2p-core", + "log", + "once_cell", + "prost", + "prost-build", + "rand 0.8.5", + "sha2 0.10.6", + "snow", + "static_assertions 1.1.0", + "thiserror", + "x25519-dalek 1.1.1", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e57759c19c28a73ef1eb3585ca410cefb72c1a709fcf6de1612a378e4219202" +dependencies = [ + "either", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm", + "log", + "rand 0.8.5", + "void", +] + +[[package]] +name = "libp2p-quic" +version = "0.7.0-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971f629ff7519f4d4889a7c981f0dc09c6ad493423cd8a13ee442de241bc8c8" +dependencies = [ + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-tls", + "log", + "parking_lot 0.12.1", + "quinn-proto", + "rand 0.8.5", + "rustls 0.20.8", + "thiserror", + "tokio", +] + +[[package]] +name = "libp2p-swarm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c22a83d70703d140092c969c1ca06ecdffff8ca7ce8ac2fd3b7eb2c1f0da86" +dependencies = [ + "either", + "fnv", + "futures", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-swarm-derive", + "log", + "pin-project", + "rand 0.8.5", + "smallvec", + "thiserror", + "tokio", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" +dependencies = [ + "heck 0.4.1", + "quote", + "syn", +] + +[[package]] +name = "libp2p-tcp" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d33698596d7722d85d3ab0c86c2c322254fce1241e91208e3679b4eb3026cf" +dependencies = [ + "futures", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "log", + "socket2", + "tokio", +] + +[[package]] +name = "libp2p-tls" +version = "0.1.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" +checksum = "e9baf6f6292149e124ee737d9a79dbee783f29473fc368c7faad9d157841078a" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "rcgen 0.10.0", + "ring", + "rustls 0.20.8", + "thiserror", + "webpki 0.22.0", + "x509-parser 0.14.0", + "yasna", +] + +[[package]] +name = "libp2p-webrtc" +version = "0.4.0-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4401ec550d36f413310ba5d4bf564bb21f89fb1601cadb32b2300f8bc1eb5b" +dependencies = [ + "async-trait", + "asynchronous-codec", + "bytes", + "futures", + "futures-timer", + "hex", + "if-watch", + "libp2p-core", + "libp2p-noise", + "log", + "multihash", + "prost", + "prost-build", + "prost-codec", + "rand 0.8.5", + "rcgen 0.9.3", + "serde", + "stun", + "thiserror", + "tinytemplate", + "tokio", + "tokio-util 0.7.7", + "webrtc", +] [[package]] name = "libsqlite3-sys" @@ -1330,6 +2470,18 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "lipmaa-link" version = "0.1.1" @@ -1344,9 +2496,9 @@ checksum = "36f5f0defb4c1af68c2b96ef3c9dee86cc4d113a21e1845fd2c557b36c16fbcb" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", @@ -1361,11 +2513,26 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matchit" @@ -1375,11 +2542,11 @@ checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" [[package]] name = "md-5" -version = "0.10.1" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658646b21e0b72f7866c7038ab086d3d5e1cd6271f060fd37defb241949d0582" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" dependencies = [ - "digest 0.10.3", + "digest 0.10.6", ] [[package]] @@ -1397,6 +2564,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "merlin" version = "2.0.1" @@ -1423,21 +2599,21 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.36.1", + "windows-sys 0.45.0", ] [[package]] name = "multer" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a30ba6d97eb198c5e8a35d67d5779d6680cca35652a60ee90fc23dc431d4fde8" +checksum = "6ed4198ce7a4cbd2a57af78d28c6fbb57d81ac5f1d6ad79ac6c5587419cbdf22" dependencies = [ "bytes", "encoding_rs", @@ -1447,15 +2623,91 @@ dependencies = [ "log", "memchr", "mime", - "spin 0.9.4", + "spin 0.9.5", "version_check", ] +[[package]] +name = "multiaddr" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b53e0cc5907a5c216ba6584bf74be8ab47d6d6289f72793b2dddbf15dc3bf8c" +dependencies = [ + "arrayref", + "byteorder", + "data-encoding", + "multibase", + "multihash", + "percent-encoding", + "serde", + "static_assertions 1.1.0", + "unsigned-varint", + "url", +] + +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" +dependencies = [ + "core2", + "digest 0.10.6", + "multihash-derive", + "sha2 0.10.6", + "unsigned-varint", +] + +[[package]] +name = "multihash-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" +dependencies = [ + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multistream-select" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" +dependencies = [ + "bytes", + "futures", + "log", + "pin-project", + "smallvec", + "unsigned-varint", +] + [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -1469,16 +2721,115 @@ dependencies = [ "tempfile", ] +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260e21fbb6f3d253a14df90eb0000a6066780a15dd901a7519ce02d77a94985b" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -1490,14 +2841,32 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] +[[package]] +name = "oid-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" +dependencies = [ + "asn1-rs 0.3.1", +] + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs 0.5.1", +] + [[package]] name = "once_cell" version = "1.17.1" @@ -1512,9 +2881,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.41" +version = "0.10.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" +checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" dependencies = [ "bitflags", "cfg-if", @@ -1544,9 +2913,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.75" +version = "0.9.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" +checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" dependencies = [ "autocfg", "cc", @@ -1555,6 +2924,17 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2 0.10.6", +] + [[package]] name = "p2panda-rs" version = "0.6.0" @@ -1584,6 +2964,33 @@ dependencies = [ "yasmf-hash", ] +[[package]] +name = "p384" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2 0.10.6", +] + +[[package]] +name = "packed_simd_2" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1914cd452d8fccd6f9db48147b29fd4ae05bea9dc5d9ad578509f72415de282" +dependencies = [ + "cfg-if", + "libm", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + [[package]] name = "parking_lot" version = "0.11.2" @@ -1592,7 +2999,7 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core 0.8.5", + "parking_lot_core 0.8.6", ] [[package]] @@ -1602,14 +3009,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.3", + "parking_lot_core 0.9.7", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", "instant", @@ -1621,34 +3028,52 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.3" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys 0.36.1", + "windows-sys 0.45.0", ] [[package]] name = "paste" -version = "1.0.8" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "pem-rfc7468" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" -version = "2.3.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4" +checksum = "028accff104c4e513bad663bbcd2ad7cfd5304144404c31ed0a77ac103d00660" dependencies = [ "thiserror", "ucd-trie", @@ -1656,9 +3081,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.3.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905708f7f674518498c1f8d644481440f476d39ca6ecae83319bba7c6c12da91" +checksum = "2ac3922aac69a40733080f53c1ce7f91dcf57e1a5f6c52f421fadec7fbdc4b69" dependencies = [ "pest", "pest_generator", @@ -1666,9 +3091,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.3.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5803d8284a629cc999094ecd630f55e91b561a1d1ba75e233b00ae13b91a69ad" +checksum = "d06646e185566b5961b4058dd107e0a7f56e77c3f484549fb119867773c0f202" dependencies = [ "pest", "pest_meta", @@ -1679,13 +3104,23 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.3.0" +version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1538eb784f07615c6d9a8ab061089c6c54a344c5b4301db51990ca1c241e8c04" +checksum = "e6f60b2ba541577e2a0c307c8f39d1439108120eb7903adeb6497fa880c59616" dependencies = [ "once_cell", "pest", - "sha-1", + "sha2 0.10.6", +] + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", ] [[package]] @@ -1720,25 +3155,99 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "platforms" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d7ddaed09e0eb771a79ab0fd64609ba0afb0a8366421957936ad14cbd13630" + +[[package]] +name = "polling" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "log", + "wepoll-ffi", + "windows-sys 0.42.0", +] + +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash 0.4.1", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash 0.4.1", +] + +[[package]] +name = "polyval" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash 0.5.0", +] [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78" +dependencies = [ + "proc-macro2", + "syn", +] [[package]] name = "proc-macro-crate" -version = "1.2.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ - "once_cell", "thiserror", "toml", ] @@ -1776,11 +3285,125 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prometheus-client" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" +dependencies = [ + "dtoa", + "itoa", + "parking_lot 0.12.1", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48e50df39172a3e7eb17e14642445da64996989bc212b583015435d39a58537" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c828f93f5ca4826f97fedcbd3f9a536c16b12cff3dbbb4a007f932bbad95b12" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", + "which", +] + +[[package]] +name = "prost-codec" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc34979ff898b6e141106178981ce2596c387ea6e62533facfc61a37fc879c0" +dependencies = [ + "asynchronous-codec", + "bytes", + "prost", + "thiserror", + "unsigned-varint", +] + +[[package]] +name = "prost-derive" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "379119666929a1afd7a043aa6cf96fa67a6dce9af60c88095a4686dbce4c9c88" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quinn-proto" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4ced82a24bb281af338b9e8f94429b6eca01b4e66d899f40031f074e74c9" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls 0.20.8", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki 0.22.0", +] + [[package]] name = "quote" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" dependencies = [ "proc-macro2", ] @@ -1806,7 +3429,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1826,7 +3449,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1840,11 +3463,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.8", ] [[package]] @@ -1858,21 +3481,19 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" dependencies = [ - "autocfg", - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -1880,6 +3501,31 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "rcgen" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +dependencies = [ + "pem", + "ring", + "time", + "x509-parser 0.13.2", + "yasna", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring", + "time", + "yasna", +] + [[package]] name = "redox_syscall" version = "0.2.16" @@ -1895,7 +3541,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.8", "redox_syscall", "thiserror", ] @@ -1913,26 +3559,17 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "reqwest" -version = "0.11.11" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" +checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" dependencies = [ - "base64", + "base64 0.21.0", "bytes", "encoding_rs", "futures-core", @@ -1944,10 +3581,10 @@ dependencies = [ "hyper-tls", "ipnet", "js-sys", - "lazy_static", "log", "mime", "native-tls", + "once_cell", "percent-encoding", "pin-project-lite", "serde", @@ -1955,15 +3592,37 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-native-tls", - "tokio-util 0.7.3", + "tokio-util 0.7.7", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", "winreg", ] +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error", +] + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint", + "hmac 0.12.1", + "zeroize", +] + [[package]] name = "ring" version = "0.16.20" @@ -2053,6 +3712,52 @@ dependencies = [ "syn", ] +[[package]] +name = "rtcp" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" +dependencies = [ + "bytes", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "futures", + "log", + "netlink-packet-route", + "netlink-proto", + "nix", + "thiserror", + "tokio", +] + +[[package]] +name = "rtp" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" +dependencies = [ + "async-trait", + "bytes", + "rand 0.8.5", + "serde", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.4.0" @@ -2062,41 +3767,87 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.36.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.45.0", +] + [[package]] name = "rustls" -version = "0.20.6" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64 0.13.1", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" dependencies = [ - "log", - "ring", - "sct", - "webpki", + "base64 0.21.0", ] [[package]] -name = "rustls-pemfile" -version = "1.0.1" +name = "rw-stream-sink" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" dependencies = [ - "base64", + "futures", + "pin-project", + "static_assertions 1.1.0", ] [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.42.0", ] [[package]] @@ -2105,6 +3856,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sct" version = "0.7.0" @@ -2115,11 +3876,37 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sdp" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" +dependencies = [ + "rand 0.8.5", + "substring", + "thiserror", + "url", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" -version = "2.7.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ "bitflags", "core-foundation", @@ -2130,9 +3917,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ "core-foundation-sys", "libc", @@ -2140,9 +3927,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" +checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" [[package]] name = "serde" @@ -2166,9 +3953,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.7" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" dependencies = [ "serde", ] @@ -2186,9 +3973,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.85" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" +checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" dependencies = [ "itoa", "ryu", @@ -2234,13 +4021,37 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.10.0" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha1" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest 0.10.6", ] [[package]] @@ -2258,44 +4069,48 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.2" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest 0.10.6", ] [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "signature" -version = "1.6.0" +version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ea32af43239f0d353a7dd75a22d94c329c8cdaafdcb4c1c1335aa10c298a4a" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.6", + "rand_core 0.6.4", +] [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "snafu" @@ -2318,11 +4133,28 @@ dependencies = [ "syn", ] +[[package]] +name = "snow" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ba5f4d4ff12bdb6a169ed51b7c48c0e0ac4b0b4b31012b2571e97d78d3201d" +dependencies = [ + "aes-gcm 0.9.4", + "blake2", + "chacha20poly1305", + "curve25519-dalek 4.0.0-rc.0", + "rand_core 0.6.4", + "ring", + "rustc_version", + "sha2 0.10.6", + "subtle", +] + [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi", @@ -2336,18 +4168,28 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "spin" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" +checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc" dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlformat" -version = "0.1.8" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ "itertools", "nom", @@ -2356,9 +4198,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "788841def501aabde58d3666fcea11351ec3962e6ea75dbcd05c84a71d68bcd1" +checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2366,13 +4208,13 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d3b5e7cadfe9ba7cdc1295f72cc556c750b4419c27c219c0693198901f8e" +checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" dependencies = [ "ahash", "atoi", - "base64", + "base64 0.13.1", "bitflags", "byteorder", "bytes", @@ -2391,7 +4233,7 @@ dependencies = [ "hashlink", "hex", "hkdf", - "hmac", + "hmac 0.12.1", "indexmap", "itoa", "libc", @@ -2403,12 +4245,12 @@ dependencies = [ "paste", "percent-encoding", "rand 0.8.5", - "rustls", + "rustls 0.20.8", "rustls-pemfile", "serde", "serde_json", - "sha-1", - "sha2 0.10.2", + "sha1", + "sha2 0.10.6", "smallvec", "sqlformat", "sqlx-rt", @@ -2422,17 +4264,17 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4adfd2df3557bddd3b91377fc7893e8fa899e9b4061737cbade4e1bb85f1b45c" +checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" dependencies = [ "dotenvy", "either", - "heck 0.4.0", + "heck 0.4.1", "once_cell", "proc-macro2", "quote", - "sha2 0.10.2", + "sha2 0.10.6", "sqlx-core", "sqlx-rt", "syn", @@ -2441,9 +4283,9 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be52fc7c96c136cedea840ed54f7d446ff31ad670c9dea95ebcb998530971a3" +checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" dependencies = [ "once_cell", "tokio", @@ -2508,6 +4350,34 @@ dependencies = [ "syn", ] +[[package]] +name = "stun" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" +dependencies = [ + "base64 0.13.1", + "crc", + "lazy_static", + "md-5", + "rand 0.8.5", + "ring", + "subtle", + "thiserror", + "tokio", + "url", + "webrtc-util", +] + +[[package]] +name = "substring" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" +dependencies = [ + "autocfg", +] + [[package]] name = "subtle" version = "2.4.1" @@ -2527,9 +4397,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "synstructure" @@ -2543,25 +4413,45 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "system-configuration" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75182f12f490e953596550b65ee31bda7c8e043d9386174b353bda50838c3fd" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", + "rustix", + "windows-sys 0.42.0", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -2595,6 +4485,43 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -2606,9 +4533,9 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" @@ -2632,9 +4559,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", @@ -2643,9 +4570,9 @@ dependencies = [ [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -2657,16 +4584,16 @@ version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls", + "rustls 0.20.8", "tokio", - "webpki", + "webpki 0.22.0", ] [[package]] name = "tokio-stream" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" +checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" dependencies = [ "futures-core", "pin-project-lite", @@ -2702,12 +4629,13 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.3" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -2716,9 +4644,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -2741,9 +4669,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba" +checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" dependencies = [ "bitflags", "bytes", @@ -2760,9 +4688,9 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" [[package]] name = "tower-service" @@ -2772,21 +4700,33 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.36" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", ] @@ -2797,11 +4737,57 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce148eae0d1a376c1b94ae651fc3261d9cb8294788b962b7382066376503a2d1" +[[package]] +name = "trust-dns-proto" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f7f83d1e4a0e4358ac54c5c3681e5d7da5efc5a7a632c90bb6d6669ddd9bc26" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "rand 0.8.5", + "smallvec", + "socket2", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aff21aa4dcefb0a1afbfac26deb0adc93888c7d295fb63ab273ef276ba2b7cfe" +dependencies = [ + "cfg-if", + "futures-util", + "ipconfig", + "lazy_static", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "tokio", + "tracing", + "trust-dns-proto", +] + [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "tungstenite" @@ -2809,36 +4795,55 @@ version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ - "base64", + "base64 0.13.1", "byteorder", "bytes", "http", "httparse", "log", "rand 0.8.5", - "sha-1", + "sha-1 0.10.1", "thiserror", "url", "utf-8", ] +[[package]] +name = "turn" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" +dependencies = [ + "async-trait", + "base64 0.13.1", + "futures", + "log", + "md-5", + "rand 0.8.5", + "ring", + "stun", + "thiserror", + "tokio", + "webrtc-util", +] + [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" [[package]] name = "unicode-ident" @@ -2848,36 +4853,66 @@ checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-normalization" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "unicode-xid" -version = "0.2.3" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "universal-hash" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +dependencies = [ + "crypto-common", + "subtle", +] [[package]] -name = "unicode_categories" -version = "0.1.1" +name = "unsigned-varint" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +dependencies = [ + "asynchronous-codec", + "bytes", +] [[package]] name = "untrusted" @@ -2887,13 +4922,12 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 0.3.0", "percent-encoding", ] @@ -2903,6 +4937,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "uuid" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +dependencies = [ + "getrandom 0.2.8", +] + [[package]] name = "varu64" version = "0.6.2" @@ -2936,6 +4979,27 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waitgroup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" +dependencies = [ + "atomic-waker", +] + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "want" version = "0.3.0" @@ -2985,9 +5049,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.32" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", @@ -3024,16 +5088,39 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +[[package]] +name = "wasm-streams" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" -version = "0.3.59" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "webpki" version = "0.22.0" @@ -3046,23 +5133,261 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.22.4" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki 0.22.0", +] + +[[package]] +name = "webrtc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "hex", + "interceptor", + "lazy_static", + "log", + "rand 0.8.5", + "rcgen 0.9.3", + "regex", + "ring", + "rtcp", + "rtp", + "rustls 0.19.1", + "sdp", + "serde", + "serde_json", + "sha2 0.10.6", + "stun", + "thiserror", + "time", + "tokio", + "turn", + "url", + "waitgroup", + "webrtc-data", + "webrtc-dtls", + "webrtc-ice", + "webrtc-mdns", + "webrtc-media", + "webrtc-sctp", + "webrtc-srtp", + "webrtc-util", +] + +[[package]] +name = "webrtc-data" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" +dependencies = [ + "bytes", + "derive_builder", + "log", + "thiserror", + "tokio", + "webrtc-sctp", + "webrtc-util", +] + +[[package]] +name = "webrtc-dtls" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942be5bd85f072c3128396f6e5a9bfb93ca8c1939ded735d177b7bcba9a13d05" +dependencies = [ + "aes 0.6.0", + "aes-gcm 0.10.1", + "async-trait", + "bincode", + "block-modes", + "byteorder", + "ccm", + "curve25519-dalek 3.2.0", + "der-parser 8.1.0", + "elliptic-curve", + "hkdf", + "hmac 0.12.1", + "log", + "oid-registry 0.6.1", + "p256", + "p384", + "rand 0.8.5", + "rand_core 0.6.4", + "rcgen 0.9.3", + "ring", + "rustls 0.19.1", + "sec1", + "serde", + "sha1", + "sha2 0.10.6", + "signature", + "subtle", + "thiserror", + "tokio", + "webpki 0.21.4", + "webrtc-util", + "x25519-dalek 2.0.0-pre.1", + "x509-parser 0.13.2", +] + +[[package]] +name = "webrtc-ice" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" +dependencies = [ + "arc-swap", + "async-trait", + "crc", + "log", + "rand 0.8.5", + "serde", + "serde_json", + "stun", + "thiserror", + "tokio", + "turn", + "url", + "uuid", + "waitgroup", + "webrtc-mdns", + "webrtc-util", +] + +[[package]] +name = "webrtc-mdns" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" +dependencies = [ + "log", + "socket2", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-media" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a3c157a040324e5049bcbd644ffc9079e6738fa2cfab2bcff64e5cc4c00d7" +dependencies = [ + "byteorder", + "bytes", + "derive_builder", + "displaydoc", + "rand 0.8.5", + "rtp", + "thiserror", + "webrtc-util", +] + +[[package]] +name = "webrtc-sctp" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" +dependencies = [ + "arc-swap", + "async-trait", + "bytes", + "crc", + "log", + "rand 0.8.5", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-srtp" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "aes-gcm 0.9.4", + "async-trait", + "byteorder", + "bytes", + "ctr 0.8.0", + "hmac 0.11.0", + "log", + "rtcp", + "rtp", + "sha-1 0.9.8", + "subtle", + "thiserror", + "tokio", + "webrtc-util", +] + +[[package]] +name = "webrtc-util" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" +dependencies = [ + "async-trait", + "bitflags", + "bytes", + "cc", + "ipnet", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "thiserror", + "tokio", + "winapi", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + +[[package]] +name = "which" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ - "webpki", + "either", + "libc", + "once_cell", ] [[package]] name = "whoami" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" +checksum = "45dbc71f0cdca27dc261a9bd37ddec174e4a0af2b900b890f378460f745426e3" dependencies = [ "wasm-bindgen", "web-sys", ] +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + [[package]] name = "winapi" version = "0.3.9" @@ -3095,16 +5420,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.36.1" +name = "windows" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "45296b64204227616fdbf2614cefa4c236b98ee64dfaaaa435207ed99fe7829f" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", ] [[package]] @@ -3122,6 +5447,30 @@ dependencies = [ "windows_x86_64_msvc 0.42.1", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" @@ -3130,9 +5479,9 @@ checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" [[package]] name = "windows_aarch64_msvc" @@ -3142,9 +5491,9 @@ checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" [[package]] name = "windows_i686_gnu" @@ -3154,9 +5503,9 @@ checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" [[package]] name = "windows_i686_msvc" @@ -3166,9 +5515,9 @@ checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" [[package]] name = "windows_x86_64_gnu" @@ -3184,9 +5533,9 @@ checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" [[package]] name = "windows_x86_64_msvc" @@ -3203,6 +5552,65 @@ dependencies = [ "winapi", ] +[[package]] +name = "x25519-dalek" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a0c105152107e3b96f6a00a65e86ce82d9b125230e1c4302940eca58ff71f4f" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.5.1", + "zeroize", +] + +[[package]] +name = "x25519-dalek" +version = "2.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5da623d8af10a62342bcbbb230e33e58a63255a58012f8653c578e54bab48df" +dependencies = [ + "curve25519-dalek 3.2.0", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "x509-parser" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" +dependencies = [ + "asn1-rs 0.3.1", + "base64 0.13.1", + "data-encoding", + "der-parser 7.0.0", + "lazy_static", + "nom", + "oid-registry 0.4.0", + "ring", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs 0.5.1", + "base64 0.13.1", + "data-encoding", + "der-parser 8.1.0", + "lazy_static", + "nom", + "oid-registry 0.6.1", + "rusticata-macros", + "thiserror", + "time", +] + [[package]] name = "yasmf-hash" version = "0.1.1" @@ -3219,20 +5627,29 @@ dependencies = [ "varu64 0.6.2", ] +[[package]] +name = "yasna" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +dependencies = [ + "time", +] + [[package]] name = "zeroize" -version = "1.3.0" +version = "1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.3.2" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" +checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ "proc-macro2", "quote", diff --git a/aquadoggo/Cargo.toml b/aquadoggo/Cargo.toml index aec902a77..680218f6b 100644 --- a/aquadoggo/Cargo.toml +++ b/aquadoggo/Cargo.toml @@ -31,6 +31,13 @@ futures = "^0.3.23" gql_client = "^1.0.6" hex = "^0.4.3" http = "^0.2.8" +libp2p = { version = "^0.51.0", features = [ + "tokio", + "macros", + "quic", + "ping", + "mdns", +] } lipmaa-link = "^0.2.2" log = "^0.4.17" once_cell = "^1.12.0" @@ -79,5 +86,6 @@ rstest = "^0.15.0" rstest_reuse = "^0.3.0" serde_json = "^1.0.85" serial_test = "1.0.0" +tempfile = "^3.4.0" tower = "^0.4.13" tower-service = "^0.3.2" diff --git a/aquadoggo/README.md b/aquadoggo/README.md index b3740c25c..08454d777 100644 --- a/aquadoggo/README.md +++ b/aquadoggo/README.md @@ -86,6 +86,18 @@ $ cargo add aquadoggo [`cargo-edit`]: https://github.com/killercup/cargo-edit +## Development + +The Protocol Buffers compiler must be installed in order to compile aquadoggo. + +On a Debian-based OS run: + +```bash +$ sudo apt install -y protobuf-compiler +``` + +See the [installation documentation](https://grpc.io/docs/protoc-installation/) for more options. + ## License GNU Affero General Public License v3.0 [`AGPL-3.0-or-later`](LICENSE) diff --git a/aquadoggo/src/config.rs b/aquadoggo/src/config.rs index b5a2b8c0c..0feba8344 100644 --- a/aquadoggo/src/config.rs +++ b/aquadoggo/src/config.rs @@ -7,6 +7,7 @@ use anyhow::Result; use directories::ProjectDirs; use serde::Deserialize; +use crate::network::NetworkConfiguration; use crate::replication::ReplicationConfiguration; /// Data directory name. @@ -38,11 +39,14 @@ pub struct Configuration { /// RPC API HTTP server port. pub http_port: u16, - /// Materializer worker pool size. - pub worker_pool_size: u32, + /// Network configuration. + pub network: NetworkConfiguration, /// Replication configuration. pub replication: ReplicationConfiguration, + + /// Materializer worker pool size. + pub worker_pool_size: u32, } impl Default for Configuration { @@ -52,8 +56,9 @@ impl Default for Configuration { database_url: None, database_max_connections: 32, http_port: 2020, - worker_pool_size: 16, + network: NetworkConfiguration::default(), replication: ReplicationConfiguration::default(), + worker_pool_size: 16, } } } diff --git a/aquadoggo/src/lib.rs b/aquadoggo/src/lib.rs index 64531a5b9..309970570 100644 --- a/aquadoggo/src/lib.rs +++ b/aquadoggo/src/lib.rs @@ -51,6 +51,7 @@ mod graphql; mod http; mod manager; mod materializer; +mod network; mod node; mod replication; mod schema; @@ -60,6 +61,7 @@ mod test_utils; mod tests; pub use crate::config::Configuration; +pub use crate::network::NetworkConfiguration; pub use crate::replication::ReplicationConfiguration; pub use node::Node; diff --git a/aquadoggo/src/network/config.rs b/aquadoggo/src/network/config.rs new file mode 100644 index 000000000..f634c8bd9 --- /dev/null +++ b/aquadoggo/src/network/config.rs @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +use std::path::PathBuf; + +use anyhow::Result; +use libp2p::identity::Keypair; +use libp2p::swarm::ConnectionLimits; +use log::info; +use serde::{Deserialize, Serialize}; + +use crate::network::identity::Identity; + +/// Key pair file name. +const KEY_PAIR_FILE_NAME: &str = "private-key"; + +/// Network config for the node. +#[derive(Debug, Copy, Clone, Deserialize, Serialize)] +pub struct NetworkConfiguration { + /// Dial concurrency factor. + /// + /// Number of addresses concurrently dialed for an outbound connection attempt with a single + /// peer. + pub dial_concurrency_factor: u8, + + /// Maximum incoming connections. + pub max_connections_in: u32, + + /// Maximum outgoing connections. + pub max_connections_out: u32, + + /// Maximum pending incoming connections. + /// + /// A pending connection is one which has been initiated but has not yet received a response. + pub max_connections_pending_in: u32, + + /// Maximum pending outgoing connections. + /// + /// A pending connection is one which has been initiated but has not yet received a response. + pub max_connections_pending_out: u32, + + /// Maximum connections per peer (includes outgoing and incoming). + pub max_connections_per_peer: u32, + + /// mDNS discovery enabled. + /// + /// Automatically discover peers on the local network (over IPv4 only, using port 5353). + pub mdns: bool, + + /// Notify handler buffer size. + /// + /// Defines the buffer size for events sent from a network protocol handler to the connection + /// manager. If the buffer is exceeded, other network processes will have to wait while the + /// events are processed. An individual buffer with this number of events exists for each + /// individual connection. + pub notify_handler_buffer_size: usize, + + /// Connection event buffer size. + /// + /// Defines the buffer size for events sent from the connection manager to a network protocol + /// handler. Each connection has its own buffer. If the buffer is exceeded, the connection + /// manager will sleep. + pub per_connection_event_buffer_size: usize, + + /// Ping behaviour enabled. + /// + /// Send outbound pings to connected peers every 15 seconds and respond to inbound pings. + /// Every sent ping must yield a response within 20 seconds in order to be successful. + pub ping: bool, + + /// QUIC transport port. + pub quic_port: u16, +} + +impl Default for NetworkConfiguration { + fn default() -> Self { + Self { + dial_concurrency_factor: 8, + max_connections_in: 16, + max_connections_out: 16, + max_connections_pending_in: 8, + max_connections_pending_out: 8, + max_connections_per_peer: 8, + mdns: false, + notify_handler_buffer_size: 128, + per_connection_event_buffer_size: 8, + ping: false, + quic_port: 2022, + } + } +} + +impl NetworkConfiguration { + /// Define the connection limits of the swarm. + pub fn connection_limits(&self) -> ConnectionLimits { + ConnectionLimits::default() + .with_max_pending_outgoing(Some(self.max_connections_pending_out)) + .with_max_pending_incoming(Some(self.max_connections_pending_in)) + .with_max_established_outgoing(Some(self.max_connections_out)) + .with_max_established_incoming(Some(self.max_connections_in)) + .with_max_established_per_peer(Some(self.max_connections_per_peer)) + } + + /// Load the key pair from the file at the specified path. + /// + /// If the file does not exist, a random key pair is generated and saved. + /// If no path is specified, a random key pair is generated. + pub fn load_or_generate_key_pair(path: Option) -> Result { + let key_pair = match path { + Some(mut path) => { + // Extend the base data directory path with the key pair filename + path.push(KEY_PAIR_FILE_NAME); + + // Check if the key pair file exists. + // If not, generate a new key pair and write it to file + if !path.is_file() { + let identity: Keypair = Identity::new(); + identity.save(&path)?; + info!("Created new network key pair and saved it to {:?}", path); + identity.key_pair() + } else { + // If the key pair file exists, open it and load the key pair + let stored_identity: Keypair = Identity::load(&path)?; + stored_identity.key_pair() + } + } + None => { + // No path was provided. Generate and return a random key pair + Identity::new() + } + }; + + Ok(key_pair) + } +} + +#[cfg(test)] +mod tests { + use tempfile::TempDir; + + use super::NetworkConfiguration; + + #[test] + fn generates_new_key_pair() { + let key_pair = NetworkConfiguration::load_or_generate_key_pair(None); + assert!(key_pair.is_ok()); + } + + #[test] + fn saves_and_loads_key_pair() { + let tmp_dir = TempDir::new().unwrap(); + let tmp_path = tmp_dir.path().to_owned(); + + // Attempt to load the key pair from the temporary path + // This should result in a new key pair being generated and written to file + let key_pair_1 = NetworkConfiguration::load_or_generate_key_pair(Some(tmp_path.clone())); + assert!(key_pair_1.is_ok()); + + // Attempt to load the key pair from the same temporary path + // This should result in the previously-generated key pair being loaded from file + let key_pair_2 = NetworkConfiguration::load_or_generate_key_pair(Some(tmp_path)); + assert!(key_pair_2.is_ok()); + + // Ensure that both key pairs have the same public key + assert_eq!(key_pair_1.unwrap().public(), key_pair_2.unwrap().public()); + } +} diff --git a/aquadoggo/src/network/identity.rs b/aquadoggo/src/network/identity.rs new file mode 100644 index 000000000..6ca35ac05 --- /dev/null +++ b/aquadoggo/src/network/identity.rs @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +use std::fs; +use std::fs::File; +use std::io::prelude::*; +use std::os::unix::fs::PermissionsExt; +use std::path::Path; + +use anyhow::Result; +use libp2p::identity::{ed25519, Keypair}; +use libp2p::PeerId; + +/// Utilities for dealing with the node identity in the form of an Ed25519 key pair. +pub trait Identity { + fn new() -> Self + where + Self: Sized; + + fn peer_id(&self) -> PeerId; + + fn key_pair(&self) -> Keypair; + + fn save(&self, path: &Path) -> Result<()>; + + fn load(path: &Path) -> Result + where + Self: Sized; +} + +impl Identity for Keypair { + /// Generate a new Ed25519 key pair. + fn new() -> Self { + Keypair::generate_ed25519() + } + + /// Return the peer ID of a key pair. + fn peer_id(&self) -> PeerId { + PeerId::from(self.public()) + } + + /// Return the key pair. + fn key_pair(&self) -> Keypair { + self.clone() + } + + /// Encode the private key as a hex string and save it to the given file path. + fn save(&self, path: &Path) -> Result<()> { + // Retrieve the private key from the key pair + let private_key = match self { + Keypair::Ed25519(key_pair) => key_pair.secret(), + }; + // Encode the private key + let encoded_private_key = hex::encode(private_key); + + fs::create_dir_all(path.parent().unwrap())?; + let mut file = File::create(path)?; + file.write_all(encoded_private_key.as_bytes())?; + file.sync_all()?; + + let mut permissions = file.metadata()?.permissions(); + permissions.set_mode(0o600); + fs::set_permissions(path, permissions)?; + + Ok(()) + } + + /// Load a key pair from file at the given path. + fn load(path: &Path) -> Result + where + Self: Sized, + { + // Read the key pair from file + let mut file = File::open(path)?; + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + + // Decode the private key + let private_key_bytes = hex::decode(contents)?; + // Convert the private key bytes into a `SecretKey` + let private_key = ed25519::SecretKey::from_bytes(private_key_bytes)?; + // Derive a key pair from the private key + let key_pair = Keypair::Ed25519(private_key.into()); + + Ok(key_pair) + } +} diff --git a/aquadoggo/src/network/mod.rs b/aquadoggo/src/network/mod.rs new file mode 100644 index 000000000..f62375b9d --- /dev/null +++ b/aquadoggo/src/network/mod.rs @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +mod config; +mod identity; +mod service; + +pub use config::NetworkConfiguration; +pub use service::network_service; diff --git a/aquadoggo/src/network/service.rs b/aquadoggo/src/network/service.rs new file mode 100644 index 000000000..26527657b --- /dev/null +++ b/aquadoggo/src/network/service.rs @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +use std::convert::TryInto; + +use anyhow::Result; +use futures::StreamExt; +use libp2p::core::muxing::StreamMuxerBox; +use libp2p::ping::Event; +use libp2p::swarm::behaviour::toggle::Toggle; +use libp2p::swarm::{NetworkBehaviour, SwarmBuilder, SwarmEvent}; +use libp2p::{mdns, ping, quic, Multiaddr, PeerId, Transport}; +use log::{debug, info, warn}; + +use crate::bus::ServiceSender; +use crate::context::Context; +use crate::manager::{ServiceReadySender, Shutdown}; +use crate::network::NetworkConfiguration; + +/// Network behaviour for the aquadoggo node. +#[derive(NetworkBehaviour)] +struct Behaviour { + /// Automatically discover peers on the local network. + mdns: Toggle, + + /// Respond to inbound pings and periodically send outbound ping on every established + /// connection. + ping: Toggle, +} + +impl Behaviour { + /// Generate a new instance of the composed network behaviour according to + /// the network configuration context. + fn new(network_config: &NetworkConfiguration, peer_id: PeerId) -> Result { + // Create an mDNS behaviour with default configuration if the mDNS flag is set + let mdns = if network_config.mdns { + debug!("mDNS network behaviour enabled"); + Some(mdns::Behaviour::new(Default::default(), peer_id)?) + } else { + None + }; + + // Create a ping behaviour with default configuration if the ping flag is set + let ping = if network_config.ping { + debug!("Ping network behaviour enabled"); + Some(ping::Behaviour::default()) + } else { + None + }; + + Ok(Self { + mdns: mdns.into(), // Convert the `Option` into a `Toggle` + ping: ping.into(), + }) + } +} + +/// Network service that configures and deploys a network swarm over QUIC transports, +/// with mDNS provided for peer discovery on the local network. +/// +/// The swarm listens for incoming connections, dials remote nodes, manages +/// connections and executes predefined network behaviours. +pub async fn network_service( + context: Context, + shutdown: Shutdown, + tx: ServiceSender, + tx_ready: ServiceReadySender, +) -> Result<()> { + // Subscribe to communication bus + let mut _rx = tx.subscribe(); + + // Read the network configuration parameters from the application context + let network_config = context.config.network; + + // Load the network key pair and peer ID + let key_pair = + NetworkConfiguration::load_or_generate_key_pair(context.config.base_path.clone())?; + let peer_id = PeerId::from(key_pair.public()); + info!("Network service peer ID: {peer_id}"); + + let quic_config = quic::Config::new(&key_pair); + // Create QUIC transport (provides transport, security and multiplexing in a single protocol) + let quic_transport = quic::tokio::Transport::new(quic_config) + // Perform conversion to a StreamMuxerBox (QUIC handles multiplexing) + .map(|(p, c), _| (p, StreamMuxerBox::new(c))) + .boxed(); + let quic_multiaddr = + format!("/ip4/0.0.0.0/udp/{}/quic-v1", network_config.quic_port).parse()?; + + // Instantiate the custom network behaviour with default configuration + // and the libp2p peer ID + let behaviour = Behaviour::new(&network_config, peer_id)?; + + // Initialise a swarm with QUIC transports, our composed network behaviour + // and the default configuration parameters + let mut swarm = SwarmBuilder::with_tokio_executor(quic_transport, behaviour, peer_id) + .connection_limits(network_config.connection_limits()) + // This method expects a NonZeroU8 as input, hence the try_into conversion + .dial_concurrency_factor(network_config.dial_concurrency_factor.try_into()?) + .per_connection_event_buffer_size(network_config.per_connection_event_buffer_size) + .notify_handler_buffer_size(network_config.notify_handler_buffer_size.try_into()?) + .build(); + + // Listen for incoming connection requests over the QUIC transport + swarm.listen_on(quic_multiaddr)?; + + // Dial the peer identified by the multi-address given in the `--remote-node-addresses` if given + if let Some(addr) = context.config.replication.remote_peers.get(0) { + let remote: Multiaddr = addr.parse()?; + swarm.dial(remote)?; + } + + // Spawn a task logging swarm events + let handle = tokio::spawn(async move { + loop { + match swarm.select_next_some().await { + SwarmEvent::BannedPeer { + peer_id, + endpoint: _, + } => debug!("BannedPeer: {peer_id}"), + SwarmEvent::Behaviour(BehaviourEvent::Mdns(event)) => match event { + mdns::Event::Discovered(list) => { + for (peer, _multiaddr) in list { + debug!("mDNS discovered a new peer: {peer}"); + } + } + mdns::Event::Expired(list) => { + for (peer, _multiaddr) in list { + debug!("mDNS peer has expired: {peer}"); + } + } + }, + SwarmEvent::Behaviour(BehaviourEvent::Ping(Event { peer, result: _ })) => { + debug!("Ping from: {peer}") + } + SwarmEvent::ConnectionClosed { + peer_id, + endpoint, + num_established, + cause, + } => { + debug!("ConnectionClosed: {peer_id} {endpoint:?} {num_established} {cause:?}") + } + SwarmEvent::ConnectionEstablished { + peer_id, + endpoint, + num_established, + .. + } => debug!("ConnectionEstablished: {peer_id} {endpoint:?} {num_established}"), + + SwarmEvent::Dialing(peer_id) => info!("Dialing: {peer_id}"), + SwarmEvent::ExpiredListenAddr { + listener_id, + address, + } => debug!("ExpiredListenAddr: {listener_id:?} {address}"), + + SwarmEvent::IncomingConnection { + local_addr, + send_back_addr, + } => debug!("IncomingConnection: {local_addr} {send_back_addr}"), + SwarmEvent::IncomingConnectionError { + local_addr, + send_back_addr, + error, + } => warn!("IncomingConnectionError: {local_addr} {send_back_addr} {error:?}"), + SwarmEvent::ListenerClosed { + listener_id, + addresses, + reason, + } => debug!("ListenerClosed: {listener_id:?} {addresses:?} {reason:?}"), + SwarmEvent::ListenerError { listener_id, error } => { + warn!("ListenerError: {listener_id:?} {error:?}") + } + SwarmEvent::NewListenAddr { + address, + listener_id: _, + } => { + info!("Listening on {address}"); + } + SwarmEvent::OutgoingConnectionError { peer_id, error } => { + warn!("OutgoingConnectionError: {peer_id:?} {error:?}") + } + }; + } + }); + + info!("Network service is ready"); + + if tx_ready.send(()).is_err() { + warn!("No subscriber informed about network service being ready"); + }; + + // Wait until we received the application shutdown signal or handle closed + tokio::select! { + _ = handle => (), + _ = shutdown => (), + } + + Ok(()) +} diff --git a/aquadoggo/src/node.rs b/aquadoggo/src/node.rs index 2680bd457..d342ed172 100644 --- a/aquadoggo/src/node.rs +++ b/aquadoggo/src/node.rs @@ -10,6 +10,7 @@ use crate::db::{connection_pool, create_database, run_pending_migrations, Pool}; use crate::http::http_service; use crate::manager::ServiceManager; use crate::materializer::materializer_service; +use crate::network::network_service; use crate::replication::replication_service; use crate::schema::SchemaProvider; @@ -70,7 +71,7 @@ impl Node { { panic!("Failed starting materialiser service"); } - // Start replication service + // Start replication service. if manager .add("replication", replication_service) .await @@ -79,11 +80,16 @@ impl Node { panic!("Failed starting replication service"); } - // Start HTTP server with GraphQL API + // Start HTTP server with GraphQL API. if manager.add("http", http_service).await.is_err() { panic!("Failed starting HTTP service"); } + // Start network service. + if manager.add("network", network_service).await.is_err() { + panic!("Failed starting network service"); + } + Self { pool, manager } } diff --git a/aquadoggo_cli/src/main.rs b/aquadoggo_cli/src/main.rs index fac0d9c1b..06a876184 100644 --- a/aquadoggo_cli/src/main.rs +++ b/aquadoggo_cli/src/main.rs @@ -5,7 +5,7 @@ use std::convert::{TryFrom, TryInto}; use std::error::Error; use anyhow::Result; -use aquadoggo::{Configuration, Node, ReplicationConfiguration}; +use aquadoggo::{Configuration, NetworkConfiguration, Node, ReplicationConfiguration}; use structopt::StructOpt; /// Helper method to parse a single key-value pair. @@ -36,6 +36,14 @@ struct Opt { #[structopt(short, long, parse(from_os_str))] data_dir: Option, + /// Port for the http server, 2020 by default. + #[structopt(short = "P", long)] + http_port: Option, + + /// Port for the QUIC transport, 2022 by default. + #[structopt(short, long)] + quic_port: Option, + /// URLs of remote nodes to replicate with. #[structopt(short, long)] remote_node_addresses: Vec, @@ -48,6 +56,14 @@ struct Opt { /// - "456def" with log_ids 6 7 #[structopt(short = "A", parse(try_from_str = parse_key_val), number_of_values = 1)] public_keys_to_replicate: Vec<(String, Vec)>, + + /// Enable mDNS for peer discovery over LAN (using port 5353), true by default. + #[structopt(short, long)] + mdns: Option, + + /// Enable ping for connected peers (send and receive ping packets), true by default. + #[structopt(long)] + ping: Option, } impl TryFrom for Configuration { @@ -55,6 +71,7 @@ impl TryFrom for Configuration { fn try_from(opt: Opt) -> Result { let mut config = Configuration::new(opt.data_dir)?; + config.http_port = opt.http_port.unwrap_or(2020); let public_keys_to_replicate = opt .public_keys_to_replicate @@ -68,6 +85,13 @@ impl TryFrom for Configuration { ..ReplicationConfiguration::default() }; + config.network = NetworkConfiguration { + mdns: opt.mdns.unwrap_or(true), + ping: opt.ping.unwrap_or(true), + quic_port: opt.quic_port.unwrap_or(2022), + ..NetworkConfiguration::default() + }; + Ok(config) } } From 335be5a5edee49c3bd1e3e46bbaa34e3677d7ad3 Mon Sep 17 00:00:00 2001 From: Sam Andreae Date: Tue, 14 Mar 2023 14:21:17 +0000 Subject: [PATCH 2/8] Do transactions correctly (#285) * Do transactions correctly * Clippy * Update CHANGELOG --- CHANGELOG.md | 1 + aquadoggo/src/db/stores/document.rs | 76 +++++++++++++++------------ aquadoggo/src/db/stores/operation.rs | 78 ++++++++++------------------ 3 files changed, 72 insertions(+), 83 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e3a80f27..53a7d8676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Correct use of `sqlx` transactions [#285](https://github.com/p2panda/aquadoggo/pull/285) `rs` - Fix race-condition of mutably shared static schema store during testing [#269](https://github.com/p2panda/aquadoggo/pull/269) ## [0.4.0] diff --git a/aquadoggo/src/db/stores/document.rs b/aquadoggo/src/db/stores/document.rs index 742eccebb..4d6b0e38d 100644 --- a/aquadoggo/src/db/stores/document.rs +++ b/aquadoggo/src/db/stores/document.rs @@ -30,14 +30,13 @@ //! retained, we use a system of "pinned relations" to identify and materialise only views we //! explicitly wish to keep. use async_trait::async_trait; -use futures::future::try_join_all; use p2panda_rs::document::traits::AsDocument; use p2panda_rs::document::{Document, DocumentId, DocumentView, DocumentViewId}; use p2panda_rs::schema::SchemaId; use p2panda_rs::storage_provider::error::DocumentStorageError; use p2panda_rs::storage_provider::traits::DocumentStore; use sqlx::any::AnyQueryResult; -use sqlx::{query, query_as, query_scalar}; +use sqlx::{query, query_as, query_scalar, Any, Transaction}; use crate::db::models::utils::parse_document_view_field_rows; use crate::db::models::{DocumentRow, DocumentViewFieldRow}; @@ -288,24 +287,25 @@ impl SqlStore { pub async fn insert_document(&self, document: &Document) -> Result<(), DocumentStorageError> { // Start a transaction, any db insertions after this point, and before the `commit()` // can be rolled back in the event of an error. - let transaction = self + let mut tx = self .pool .begin() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; // Insert the document and view to the database, in the case of an error all insertions - // since the transaction was instantiated above will be rolled back. - match insert_document(&self.pool, document).await { - // Commit the transaction here if no error occurred. - Ok(_) => transaction + // since the tx was instantiated above will be rolled back. + let result = insert_document(&mut tx, document).await; + + match result { + // Commit the tx here if no error occurred. + Ok(_) => tx .commit() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string())), // Rollback here if an error occurred. Err(err) => { - transaction - .rollback() + tx.rollback() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; Err(err) @@ -328,18 +328,17 @@ impl SqlStore { ) -> Result<(), DocumentStorageError> { // Start a transaction, any db insertions after this point, and before the `commit()` // will be rolled back in the event of an error. - let transaction = self + let mut tx = self .pool .begin() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; // Insert the document view into the `document_views` table. Rollback insertions if an error occurs. - match insert_document_view(&self.pool, document_view, document_id, schema_id).await { + match insert_document_view(&mut tx, document_view, document_id, schema_id).await { Ok(_) => (), Err(err) => { - transaction - .rollback() + tx.rollback() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; return Err(err); @@ -348,20 +347,18 @@ impl SqlStore { // Insert the document view fields into the `document_view_fields` table. Rollback // insertions if an error occurs. - match insert_document_fields(&self.pool, document_view).await { + match insert_document_fields(&mut tx, document_view).await { Ok(_) => (), Err(err) => { - transaction - .rollback() + tx.rollback() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; return Err(err); } }; - // Commit the transaction here as no errors occurred. - transaction - .commit() + // Commit the tx here as no errors occurred. + tx.commit() .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string())) } @@ -411,12 +408,12 @@ async fn get_document_view_field_rows( // Helper method for inserting rows in the `document_view_fields` table. async fn insert_document_fields( - pool: &Pool, + tx: &mut Transaction<'_, Any>, document_view: &DocumentView, ) -> Result, DocumentStorageError> { - // Insert document view field relations into the db - try_join_all(document_view.iter().map(|(name, value)| { - query( + let mut results = Vec::with_capacity(document_view.len()); + for (name, value) in document_view.iter() { + let result = query( " INSERT INTO document_view_fields ( @@ -431,15 +428,19 @@ async fn insert_document_fields( .bind(document_view.id().to_string()) .bind(value.id().as_str().to_owned()) .bind(name) - .execute(pool) - })) - .await - .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string())) + .execute(&mut *tx) + .await + .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; + + results.push(result); + } + + Ok(results) } // Helper method for inserting document views into the `document_views` table. async fn insert_document_view( - pool: &Pool, + tx: &mut Transaction<'_, Any>, document_view: &DocumentView, document_id: &DocumentId, schema_id: &SchemaId, @@ -459,14 +460,17 @@ async fn insert_document_view( .bind(document_view.id().to_string()) .bind(document_id.to_string()) .bind(schema_id.to_string()) - .execute(pool) + .execute(tx) .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string())) } // Helper method for inserting documents into the database. For this, insertions are made in the // `documents`, `document_views` and `document_view_fields` tables. -async fn insert_document(pool: &Pool, document: &Document) -> Result<(), DocumentStorageError> { +async fn insert_document( + tx: &mut Transaction<'_, Any>, + document: &Document, +) -> Result<(), DocumentStorageError> { // Insert or update the document to the `documents` table. query( " @@ -488,7 +492,7 @@ async fn insert_document(pool: &Pool, document: &Document) -> Result<(), Documen .bind(document.view_id().to_string()) .bind(document.is_deleted()) .bind(document.schema_id().to_string()) - .execute(pool) + .execute(&mut *tx) .await .map_err(|e| DocumentStorageError::FatalStorageError(e.to_string()))?; @@ -499,9 +503,15 @@ async fn insert_document(pool: &Pool, document: &Document) -> Result<(), Documen DocumentView::new(document.view_id(), document.view().unwrap().fields()); // Insert the document view. - insert_document_view(pool, &document_view, document.id(), document.schema_id()).await?; + insert_document_view( + &mut *tx, + &document_view, + document.id(), + document.schema_id(), + ) + .await?; // Insert the document view fields. - insert_document_fields(pool, &document_view).await?; + insert_document_fields(&mut *tx, &document_view).await?; }; Ok(()) diff --git a/aquadoggo/src/db/stores/operation.rs b/aquadoggo/src/db/stores/operation.rs index 82b715fae..115319e7f 100644 --- a/aquadoggo/src/db/stores/operation.rs +++ b/aquadoggo/src/db/stores/operation.rs @@ -3,7 +3,6 @@ use std::collections::BTreeMap; use async_trait::async_trait; -use futures::future::try_join_all; use p2panda_rs::document::DocumentId; use p2panda_rs::identity::PublicKey; use p2panda_rs::operation::traits::AsOperation; @@ -78,7 +77,7 @@ impl OperationStore for SqlStore { ) -> Result<(), OperationStorageError> { // Start a transaction, any db insertions after this point, and before the `commit()` will // be rolled back in the event of an error. - let transaction = self + let mut tx = self .pool .begin() .await @@ -86,7 +85,7 @@ impl OperationStore for SqlStore { // Construct query for inserting operation an row, execute it and check exactly one row was // affected. - let operation_insertion_result = query( + query( " INSERT INTO operations_v1 ( @@ -111,29 +110,23 @@ impl OperationStore for SqlStore { .previous() .map(|document_view_id| document_view_id.to_string()), ) - .execute(&self.pool) + .execute(&mut tx) .await .map_err(|e| OperationStorageError::FatalStorageError(e.to_string()))?; - // Construct and execute the queries, return their futures and execute all of them with - // `try_join_all()`. - let fields_insertion_result = match operation.fields() { - Some(fields) => { - let result = try_join_all(fields.iter().flat_map(|(name, value)| { - // If the value is a relation_list or pinned_relation_list we need to insert a - // new field row for every item in the list. Here we collect these items and - // return them in a vector. If this operation value is anything except for the - // above list types, we will return a vec containing a single item. - let db_values = parse_value_to_string_vec(value); - - // Collect all query futures. - db_values - .into_iter() - .enumerate() - .map(|(index, db_value)| { - // Compose the query and return it's future. - query( - " + let mut results = Vec::new(); + if let Some(fields) = operation.fields() { + for (name, value) in fields.iter() { + // If the value is a relation_list or pinned_relation_list we need to insert a + // new field row for every item in the list. Here we collect these items and + // return them in a vector. If this operation value is anything except for the + // above list types, we will return a vec containing a single item. + let db_values = parse_value_to_string_vec(value); + + for (index, db_value) in db_values.into_iter().enumerate() { + // Compose the query and return it's future. + let result = query( + " INSERT INTO operation_fields_v1 ( operation_id, @@ -145,38 +138,23 @@ impl OperationStore for SqlStore { VALUES ($1, $2, $3, $4, $5) ", - ) - .bind(id.as_str().to_owned()) - .bind(name.to_owned()) - .bind(value.field_type().to_string()) - .bind(db_value) - .bind(index as i32) - .execute(&self.pool) - }) - .collect::>() - })) - .await - // If any queries error, we catch that here. - .map_err(|e| OperationStorageError::FatalStorageError(e.to_string()))?; + ) + .bind(id.as_str().to_owned()) + .bind(name.to_owned()) + .bind(value.field_type().to_string()) + .bind(db_value) + .bind(index as i32) + .execute(&mut tx) + .await + .map_err(|e| OperationStorageError::FatalStorageError(e.to_string()))?; - Some(result) + results.push(result); + } } - None => None, }; - // Check every insertion performed affected exactly 1 row. - if operation_insertion_result.rows_affected() != 1 - || fields_insertion_result - .unwrap_or_default() - .iter() - .any(|query_result| query_result.rows_affected() != 1) - { - return Err(OperationStorageError::InsertionError(id.clone())); - } - // Commit the transaction. - transaction - .commit() + tx.commit() .await .map_err(|e| OperationStorageError::FatalStorageError(e.to_string()))?; From c0775bea52d6460bc7cb2e84bf5353cee20ac174 Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Tue, 14 Mar 2023 16:33:39 +0100 Subject: [PATCH 3/8] Introduce requeue flag (#286) * Introduce requeue flag * Write more about re-scheduling * Only remove task from store when it is done for good * Use enum for flag instead * Add entry to CHANGELOG.md * Add logging --------- Co-authored-by: Sam Andreae --- CHANGELOG.md | 3 +- aquadoggo/src/materializer/worker.rs | 130 +++++++++++++++++++-------- 2 files changed, 93 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53a7d8676..59fab1c7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,8 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Correct use of `sqlx` transactions [#285](https://github.com/p2panda/aquadoggo/pull/285) `rs` +- Correct use of `sqlx` transactions [#285](https://github.com/p2panda/aquadoggo/pull/285) - Fix race-condition of mutably shared static schema store during testing [#269](https://github.com/p2panda/aquadoggo/pull/269) +- Introduce flag to requeue tasks in worker queue, fixes race-condition in materialization logic [#286](https://github.com/p2panda/aquadoggo/pull/286) ## [0.4.0] diff --git a/aquadoggo/src/materializer/worker.rs b/aquadoggo/src/materializer/worker.rs index 1d622eabd..3b76ad819 100644 --- a/aquadoggo/src/materializer/worker.rs +++ b/aquadoggo/src/materializer/worker.rs @@ -4,10 +4,10 @@ //! processed in worker pools where one worker executes the task. //! //! A task queue allows control over a) order of operations and b) amount of work being done per -//! time c) avoiding duplicate work. +//! time c) avoiding concurrent writes to the same data. //! -//! This particular task queue implementation rejects tasks with duplicate input values already -//! waiting in the queue (which would result in doing the same work again). +//! This particular task queue implementation "batches" tasks with duplicate input values, only +//! processing one at a time to avoid them overwriting each other's work. //! //! A worker can be defined by any sort of async function which returns a result, indicating if it //! succeeded, failed or crashed critically. @@ -65,7 +65,8 @@ //! -------------------- //! //! The internal queue of "square" contains now: [{Task 1}, {Task 2}, {Task 4}]. Task 3 got -//! rejected silently as it contains the same input data. +//! internally "batched" as it contains the same input data as Task 1, which means that Task 1 will +//! be re-scheduled after it finished. //! //! 3. Process tasks //! @@ -73,9 +74,14 @@ //! concurrently. After one of them finishes, the next free worker will eventually take Task 4 from //! the queue and process it. //! -//! Task 1 results in "25", Task 2 in "64", Task 4 in "9". +//! Task 1 results in "25", Task 2 in "64", Task 4 in "9". Later Task 1 gets re-scheduled to +//! account for the duplicate Task 3 (again resulting in "25"). +//! +//! In this example that might look redundant but in a more complex system the input might be the +//! same, but the worker function might have access to a database with possibily diverging state +//! between the tasks. //! ``` -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::fmt::{Debug, Display}; use std::future::Future; use std::hash::Hash; @@ -139,6 +145,15 @@ pub enum TaskStatus { /// Workers are identified by simple string values. pub type WorkerName = String; +/// Flags for queue items to define post-completion actions. +enum PostAction { + /// Moves the completed task into the queue again. + Requeue, + + /// Do nothing after completion. + Idle, +} + /// Every registered worker pool is managed by a `WorkerManager` which holds the task queue for /// this registered work and an index of all current inputs in the task queue. struct WorkerManager @@ -147,9 +162,14 @@ where { /// Index of all current inputs inside the task queue organized in a hash set. /// - /// This allows us to avoid duplicate tasks by detecting if there is already a task in our + /// This allows us to detect duplicate tasks by checking if there is already a task in our /// queue with the same input hash. - input_index: Arc>>, + /// + /// An additional flag can be used to indicate that we want to requeue the same task again + /// after it completed. This is useful to account for more events which arrived _while_ the + /// task was processed. It is enough to only remember one of the potentially many events + /// arriving in this time, we're "batching" them for the next round. + input_index: Arc>>, /// FIFO queue of all tasks for this worker pool. queue: Arc>>, @@ -162,7 +182,7 @@ where /// Returns a new worker manager. pub fn new() -> Self { Self { - input_index: Arc::new(Mutex::new(HashSet::new())), + input_index: Arc::new(Mutex::new(HashMap::new())), queue: Arc::new(Queue::new()), } } @@ -334,8 +354,8 @@ where /// Queues up a new task in the regarding worker queue. /// - /// Tasks with duplicate input values which already exist in the queue will be silently - /// rejected. + /// Tasks with duplicate input values which already exist in the queue will be internally + /// batched. pub fn queue(&mut self, task: Task) { if let Err(err) = self.tx.send(task) { error!("Error while broadcasting task: {}", err); @@ -405,16 +425,33 @@ where // Check if a task with the same input values already exists in queue match input_index.lock() { Ok(mut index) => { - if index.contains(&task.1) { - continue; // Task already exists - } else { - // Trigger status update - on_pending(task.clone()); - - // Generate a unique id for this new task and add it to queue - let next_id = counter.fetch_add(1, Ordering::Relaxed); - queue.push(QueueItem::new(next_id, task.1.clone())); - index.insert(task.1); + match index.get(&task.1) { + None => { + // 1. This task is completly new! We don't work on anything + // similar yet. + // + // Trigger status update: + on_pending(task.clone()); + + // Generate a unique id for this new task and add it to queue + debug!("Sending materializer {} task with input {} to the task queue.", task.worker_name(), task.input()); + let next_id = counter.fetch_add(1, Ordering::Relaxed); + queue.push(QueueItem::new(next_id, task.1.clone())); + index.insert(task.1, PostAction::Idle); + } + Some(PostAction::Idle) => { + // 2. This is the first duplicate coming in, let's set the + // requeue flag to indicate that more work needs to be done + // when the current task completes + debug!("Duplicate materializer {} task already in progress, setting re-queue flag for task with input {} and not adding this task to the queue.", task.worker_name(), task.input()); + index.insert(task.1, PostAction::Requeue); + } + Some(PostAction::Requeue) => { + // 3. We observed already one duplicate task coming in, let's + // ignore this one + debug!("Materializer {} task with input {} not sent to queue as a task for this document has already been re-queued.", task.worker_name(), task.input()); + continue; + } } } Err(err) => { @@ -480,24 +517,6 @@ where // Take this task and do work .. let result = work.call(context.clone(), item.input()).await; - // Remove input index from queue - match input_index.lock() { - Ok(mut index) => { - index.remove(&item.input()); - } - Err(err) => { - error!( - "Error while locking input index in worker {} for task {:?}: {}", - name, item, err - ); - - error_signal.trigger(); - } - } - - // Trigger removing the task from the task store - on_complete(item.input()); - // Check the result match result { Ok(Some(list)) => { @@ -525,6 +544,39 @@ where ); } _ => (), // Task succeeded, but nothing to dispatch + }; + + // Remove input index from queue and check if we should requeue that task + let requeue = match input_index.lock() { + Ok(mut index) => match index.remove(&item.input()) { + Some(PostAction::Idle) => false, + Some(PostAction::Requeue) => true, + None => { + error!("Incosistency detected in queue input index"); + error_signal.trigger(); + false + } + }, + Err(err) => { + error!( + "Error while locking input index in worker {} for task {:?}: {}", + name, item, err + ); + + error_signal.trigger(); + false + } + }; + + // Send the task again to dispatcher if requeue flag is set + if requeue { + if let Err(err) = tx.send(Task(name.clone(), item.input())) { + error!("Error while broadcasting task during requeue: {}", err); + error_signal.trigger(); + } + } else { + // Trigger removing the task from the task store + on_complete(item.input()); } } }); From 4b5d7c418029eb0bfe06ffb4685cc5ccdadb0053 Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Tue, 14 Mar 2023 17:18:54 +0100 Subject: [PATCH 4/8] Increase timeout for failing materializer test --- aquadoggo/src/materializer/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aquadoggo/src/materializer/service.rs b/aquadoggo/src/materializer/service.rs index 5e4d3f067..3efca9050 100644 --- a/aquadoggo/src/materializer/service.rs +++ b/aquadoggo/src/materializer/service.rs @@ -219,7 +219,7 @@ mod tests { .unwrap(); // Wait a little bit for work being done .. - tokio::time::sleep(Duration::from_millis(100)).await; + tokio::time::sleep(Duration::from_millis(500)).await; // Make sure the service did not crash and is still running assert_eq!(handle.is_finished(), false); From 6c6d15bf32e8f20e78648cc82e4dd0035055296a Mon Sep 17 00:00:00 2001 From: glyph Date: Wed, 15 Mar 2023 11:17:27 +0200 Subject: [PATCH 5/8] Migrate CLI from `structopt` to `clap` (#289) * Replace structopt dependency with clap * Migrate from structopt parser to clap parser * Move CLI about message to doc comment * Fix public keys help formatting * Update README with latest CLI usage * Update CHANGELOG --- CHANGELOG.md | 1 + Cargo.lock | 145 ++++++++++++++++---------------------- aquadoggo_cli/Cargo.toml | 2 +- aquadoggo_cli/README.md | 46 ++++++++---- aquadoggo_cli/src/main.rs | 51 +++++++------- 5 files changed, 120 insertions(+), 125 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59fab1c7b..878a1c14c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- Migrate CLI from `structopt` to `clap` [#289](https://github.com/p2panda/aquadoggo/pull/289) - Introduce libp2p networking service and configuration [#282](https://github.com/p2panda/aquadoggo/pull/282) - Rework test runner and test node population patterns and refactor test_utils [#277](https://github.com/p2panda/aquadoggo/pull/277) - Implement API changes to p2panda-rs storage traits, new and breaking db migration [#268](https://github.com/p2panda/aquadoggo/pull/268) diff --git a/Cargo.lock b/Cargo.lock index 5c3af3a11..4f2daeff4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,15 +143,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anyhow" version = "1.0.69" @@ -209,8 +200,8 @@ version = "0.2.0" dependencies = [ "anyhow", "aquadoggo", + "clap", "env_logger", - "structopt", "tokio", ] @@ -841,17 +832,39 @@ dependencies = [ [[package]] name = "clap" -version = "2.34.0" +version = "4.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5" dependencies = [ - "ansi_term", - "atty", "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", + "clap_derive", + "clap_lex", + "is-terminal", + "once_cell", + "strsim", + "termcolor", +] + +[[package]] +name = "clap_derive" +version = "4.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09" +dependencies = [ + "os_str_bytes", ] [[package]] @@ -1111,7 +1124,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", + "strsim", "syn", ] @@ -1125,7 +1138,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", + "strsim", "syn", ] @@ -1429,7 +1442,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", "syn", @@ -1844,15 +1857,6 @@ dependencies = [ "http", ] -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.1" @@ -1880,6 +1884,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.4.3" @@ -2143,6 +2153,18 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" +[[package]] +name = "is-terminal" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.45.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2389,7 +2411,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" dependencies = [ - "heck 0.4.1", + "heck", "quote", "syn", ] @@ -2924,6 +2946,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "os_str_bytes" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" + [[package]] name = "p256" version = "0.11.1" @@ -3325,7 +3353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c828f93f5ca4826f97fedcbd3f9a536c16b12cff3dbbb4a007f932bbad95b12" dependencies = [ "bytes", - "heck 0.4.1", + "heck", "itertools", "lazy_static", "log", @@ -4270,7 +4298,7 @@ checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" dependencies = [ "dotenvy", "either", - "heck 0.4.1", + "heck", "once_cell", "proc-macro2", "quote", @@ -4314,42 +4342,12 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "structopt" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck 0.3.3", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "stun" version = "0.4.4" @@ -4456,15 +4454,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thiserror" version = "1.0.38" @@ -4866,12 +4855,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -4967,12 +4950,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.4" diff --git a/aquadoggo_cli/Cargo.toml b/aquadoggo_cli/Cargo.toml index 48253c2ad..4be9c9d0c 100644 --- a/aquadoggo_cli/Cargo.toml +++ b/aquadoggo_cli/Cargo.toml @@ -22,7 +22,7 @@ doc = false anyhow = "^1.0.62" tokio = { version = "^1.20.1", features = ["full"] } env_logger = "^0.9.0" -structopt = "^0.3.26" +clap = { version = "^4.1.8", features = ["derive"] } [dependencies.aquadoggo] version = "~0.4.0" diff --git a/aquadoggo_cli/README.md b/aquadoggo_cli/README.md index ea8588e46..0a1105d73 100644 --- a/aquadoggo_cli/README.md +++ b/aquadoggo_cli/README.md @@ -5,26 +5,42 @@ Node server with GraphQL API for the p2panda network. ## Usage ``` -FLAGS: - -h, --help - Prints help information +Options: + -d, --data-dir + Path to data folder, $HOME/.local/share/aquadoggo by default on Linux - -V, --version - Prints version information + -P, --http-port + Port for the http server, 2020 by default -OPTIONS: - -A ... - A collection of authors and their logs to replicate. + -q, --quic-port + Port for the QUIC transport, 2022 by default - eg. -A 123abc="1 2 345" -A 456def="6 7" .. adds the authors: - - "123abc" with log_ids 1, 2, 345 - - "456def" with log_ids 6 7 + -r, --remote-node-addresses + URLs of remote nodes to replicate with - -d, --data-dir - Path to data folder, $HOME/.local/share/aquadoggo by default on Linux + -A + A collection of authors and their logs to replicate. - -r, --remote-node-addresses ... - URLs of remote nodes to replicate with + eg. -A 123abc="1 2 345" -A 456def="6 7" + .. adds the authors: + - "123abc" with log_ids 1, 2, 345 + - "456def" with log_ids 6 7 + + -m, --mdns + Enable mDNS for peer discovery over LAN (using port 5353), true by default + + [possible values: true, false] + + --ping + Enable ping for connected peers (send and receive ping packets), true by default + + [possible values: true, false] + + -h, --help + Print help (see a summary with '-h') + + -V, --version + Print version ``` ## Environment variables diff --git a/aquadoggo_cli/src/main.rs b/aquadoggo_cli/src/main.rs index 06a876184..3e111555f 100644 --- a/aquadoggo_cli/src/main.rs +++ b/aquadoggo_cli/src/main.rs @@ -6,15 +6,15 @@ use std::error::Error; use anyhow::Result; use aquadoggo::{Configuration, NetworkConfiguration, Node, ReplicationConfiguration}; -use structopt::StructOpt; +use clap::Parser; /// Helper method to parse a single key-value pair. -fn parse_key_val(s: &str) -> Result<(T, Vec), Box> +fn parse_key_val(s: &str) -> Result<(T, Vec), Box> where T: std::str::FromStr, - T::Err: Error + 'static, + T::Err: Error + Send + Sync + 'static, U: std::str::FromStr, - U::Err: Error + 'static, + U::Err: Error + Send + Sync + 'static, { let pos = s .find('=') @@ -29,23 +29,24 @@ where Ok((key, values)) } -#[derive(StructOpt, Debug)] -#[structopt(name = "aquadoggo Node", about = "Node server for the p2panda network")] -struct Opt { +#[derive(Parser, Debug)] +#[command(name = "aquadoggo Node", version)] +/// Node server for the p2panda network. +struct Cli { /// Path to data folder, $HOME/.local/share/aquadoggo by default on Linux. - #[structopt(short, long, parse(from_os_str))] + #[arg(short, long)] data_dir: Option, /// Port for the http server, 2020 by default. - #[structopt(short = "P", long)] + #[arg(short = 'P', long)] http_port: Option, /// Port for the QUIC transport, 2022 by default. - #[structopt(short, long)] + #[arg(short, long)] quic_port: Option, /// URLs of remote nodes to replicate with. - #[structopt(short, long)] + #[arg(short, long)] remote_node_addresses: Vec, /// A collection of authors and their logs to replicate. @@ -54,41 +55,41 @@ struct Opt { /// .. adds the authors: /// - "123abc" with log_ids 1, 2, 345 /// - "456def" with log_ids 6 7 - #[structopt(short = "A", parse(try_from_str = parse_key_val), number_of_values = 1)] + #[arg(short = 'A', value_parser = parse_key_val::, number_of_values = 1, verbatim_doc_comment)] public_keys_to_replicate: Vec<(String, Vec)>, /// Enable mDNS for peer discovery over LAN (using port 5353), true by default. - #[structopt(short, long)] + #[arg(short, long)] mdns: Option, /// Enable ping for connected peers (send and receive ping packets), true by default. - #[structopt(long)] + #[arg(long)] ping: Option, } -impl TryFrom for Configuration { +impl TryFrom for Configuration { type Error = anyhow::Error; - fn try_from(opt: Opt) -> Result { - let mut config = Configuration::new(opt.data_dir)?; - config.http_port = opt.http_port.unwrap_or(2020); + fn try_from(cli: Cli) -> Result { + let mut config = Configuration::new(cli.data_dir)?; + config.http_port = cli.http_port.unwrap_or(2020); - let public_keys_to_replicate = opt + let public_keys_to_replicate = cli .public_keys_to_replicate .into_iter() .map(|elem| elem.try_into()) .collect::>()?; config.replication = ReplicationConfiguration { - remote_peers: opt.remote_node_addresses, + remote_peers: cli.remote_node_addresses, public_keys_to_replicate, ..ReplicationConfiguration::default() }; config.network = NetworkConfiguration { - mdns: opt.mdns.unwrap_or(true), - ping: opt.ping.unwrap_or(true), - quic_port: opt.quic_port.unwrap_or(2022), + mdns: cli.mdns.unwrap_or(true), + ping: cli.ping.unwrap_or(true), + quic_port: cli.quic_port.unwrap_or(2022), ..NetworkConfiguration::default() }; @@ -101,8 +102,8 @@ async fn main() { env_logger::init(); // Parse command line arguments and load configuration - let opt = Opt::from_args(); - let config = opt.try_into().expect("Could not load configuration"); + let cli = Cli::parse(); + let config = cli.try_into().expect("Could not load configuration"); // Start p2panda node in async runtime let node = Node::start(config).await; From cc099cf332fb25e814f42e1b65ae856fdf80ee1c Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Wed, 15 Mar 2023 11:27:05 +0100 Subject: [PATCH 6/8] Use released p2panda-rs version 0.7.0 --- aquadoggo/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aquadoggo/Cargo.toml b/aquadoggo/Cargo.toml index 680218f6b..a03375f07 100644 --- a/aquadoggo/Cargo.toml +++ b/aquadoggo/Cargo.toml @@ -42,7 +42,7 @@ lipmaa-link = "^0.2.2" log = "^0.4.17" once_cell = "^1.12.0" openssl-probe = "^0.1.5" -p2panda-rs = { git = "https://github.com/p2panda/p2panda", rev = "d7beb863d95fe9c9227cf565348f788a0d9b31ee", features = [ +p2panda-rs = { version = "^0.7.0", features = [ "storage-provider", ] } serde = { version = "^1.0.144", features = ["derive"] } @@ -73,7 +73,7 @@ env_logger = "^0.9.0" http = "^0.2.8" hyper = "^0.14.19" once_cell = "^1.12.0" -p2panda-rs = { git = "https://github.com/p2panda/p2panda", rev = "d7beb863d95fe9c9227cf565348f788a0d9b31ee", features = [ +p2panda-rs = { version = "^0.7.0", features = [ "test-utils", "storage-provider", ] } From caf71ca8ea68a52969c6093ddab146260f2426ed Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Wed, 15 Mar 2023 12:27:23 +0100 Subject: [PATCH 7/8] Update Cargo.lock as well --- Cargo.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f2daeff4..441bfc883 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2965,8 +2965,9 @@ dependencies = [ [[package]] name = "p2panda-rs" -version = "0.6.0" -source = "git+https://github.com/p2panda/p2panda?rev=d7beb863d95fe9c9227cf565348f788a0d9b31ee#d7beb863d95fe9c9227cf565348f788a0d9b31ee" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a893b4aeffcc5aac83aa5af158ccd4a9de5ef7295a3da0dfd4f7cb9a1e6bb6ae" dependencies = [ "arrayvec 0.5.2", "async-trait", From a792dac9fb41fbc5900b64da9598f02a692e2854 Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Thu, 16 Mar 2023 12:35:42 +0100 Subject: [PATCH 8/8] Update breaking API calls for new `p2panda-rs` version (#293) * Use SchemaName instead of strings when creating SchemaIds * Implement update_view trait on StorageDocument * Remove descriptions from GraphQL for now, they will be replaced soon * Add entry to CHANGELOG.md --- CHANGELOG.md | 1 + aquadoggo/src/db/stores/entry.rs | 5 +++-- aquadoggo/src/db/stores/log.rs | 4 ++-- aquadoggo/src/db/stores/schema.rs | 7 +++++-- aquadoggo/src/db/types/document.rs | 11 +++++++++++ aquadoggo/src/graphql/client/dynamic_query.rs | 6 +++++- .../src/graphql/client/dynamic_types/document.rs | 3 ++- aquadoggo/src/graphql/client/dynamic_types/tests.rs | 6 +++--- aquadoggo/src/graphql/client/mutation.rs | 4 ++-- aquadoggo/src/materializer/tasks/schema.rs | 4 ++-- aquadoggo/src/schema/schema_provider.rs | 12 +++++++----- aquadoggo/src/test_utils/helpers.rs | 7 +++++-- aquadoggo/src/test_utils/node.rs | 4 ++-- aquadoggo/src/tests.rs | 4 ++-- 14 files changed, 52 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 878a1c14c..f1b052e3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Correct use of `sqlx` transactions [#285](https://github.com/p2panda/aquadoggo/pull/285) - Fix race-condition of mutably shared static schema store during testing [#269](https://github.com/p2panda/aquadoggo/pull/269) - Introduce flag to requeue tasks in worker queue, fixes race-condition in materialization logic [#286](https://github.com/p2panda/aquadoggo/pull/286) +- Update breaking API calls for new `p2panda-rs` 0.7.0 version [#293](https://github.com/p2panda/aquadoggo/pull/293) ## [0.4.0] diff --git a/aquadoggo/src/db/stores/entry.rs b/aquadoggo/src/db/stores/entry.rs index 429654736..7d1dcde36 100644 --- a/aquadoggo/src/db/stores/entry.rs +++ b/aquadoggo/src/db/stores/entry.rs @@ -321,7 +321,7 @@ mod tests { use p2panda_rs::hash::Hash; use p2panda_rs::identity::KeyPair; use p2panda_rs::operation::EncodedOperation; - use p2panda_rs::schema::SchemaId; + use p2panda_rs::schema::{SchemaId, SchemaName}; use p2panda_rs::storage_provider::traits::EntryStore; use p2panda_rs::test_utils::fixtures::{encoded_entry, encoded_operation, entry, random_hash}; use p2panda_rs::test_utils::memory_store::helpers::{populate_store, PopulateStoreConfig}; @@ -479,7 +479,8 @@ mod tests { let schema_in_the_db = config.schema.id(); // No entries were published containing an operation which follows this schema. - let schema_not_in_the_db = SchemaId::new_application("venue", &hash.into()); + let schema_not_in_the_db = + SchemaId::new_application(&SchemaName::new("venue").unwrap(), &hash.into()); // Get entries by schema not in db. let entries = node diff --git a/aquadoggo/src/db/stores/log.rs b/aquadoggo/src/db/stores/log.rs index 346deda4e..fd57669dc 100644 --- a/aquadoggo/src/db/stores/log.rs +++ b/aquadoggo/src/db/stores/log.rs @@ -126,7 +126,7 @@ mod tests { use p2panda_rs::entry::LogId; use p2panda_rs::identity::PublicKey; use p2panda_rs::operation::OperationId; - use p2panda_rs::schema::SchemaId; + use p2panda_rs::schema::{SchemaId, SchemaName}; use p2panda_rs::storage_provider::traits::LogStore; use p2panda_rs::test_utils::fixtures::{ public_key, random_document_id, random_operation_id, schema_id, @@ -166,7 +166,7 @@ mod tests { ) { test_runner(move |node: TestNode| async move { let schema = SchemaId::new_application( - "venue", + &SchemaName::new("venue").unwrap(), &DocumentViewId::new(&[operation_id_1, operation_id_2]), ); diff --git a/aquadoggo/src/db/stores/schema.rs b/aquadoggo/src/db/stores/schema.rs index 50e955139..59a17077c 100644 --- a/aquadoggo/src/db/stores/schema.rs +++ b/aquadoggo/src/db/stores/schema.rs @@ -127,7 +127,7 @@ impl SqlStore { mod tests { use p2panda_rs::document::DocumentViewId; use p2panda_rs::identity::KeyPair; - use p2panda_rs::schema::{FieldType, SchemaId}; + use p2panda_rs::schema::{FieldType, SchemaId, SchemaName}; use p2panda_rs::test_utils::fixtures::{key_pair, random_document_view_id}; use p2panda_rs::test_utils::memory_store::helpers::PopulateStoreConfig; use rstest::rstest; @@ -246,7 +246,10 @@ mod tests { assert!(result.is_ok()); // This is the schema name of the schema document we published. - assert_eq!(result.unwrap().unwrap().name(), "schema_definition"); + assert_eq!( + result.unwrap().unwrap().name(), + SchemaName::new("schema_definition").unwrap() + ); }); } diff --git a/aquadoggo/src/db/types/document.rs b/aquadoggo/src/db/types/document.rs index 860f45ae9..6daaebc0d 100644 --- a/aquadoggo/src/db/types/document.rs +++ b/aquadoggo/src/db/types/document.rs @@ -66,4 +66,15 @@ impl AsDocument for StorageDocument { fn is_deleted(&self) -> bool { self.deleted } + + /// Update the current view of this document. + fn update_view(&mut self, id: &DocumentViewId, view: Option<&DocumentViewFields>) { + self.view_id = id.to_owned(); + self.fields = view.cloned(); + + // If no view has been passed we can consider this document as deleted + if view.is_none() { + self.deleted = true; + } + } } diff --git a/aquadoggo/src/graphql/client/dynamic_query.rs b/aquadoggo/src/graphql/client/dynamic_query.rs index daff7d393..540e94ee1 100644 --- a/aquadoggo/src/graphql/client/dynamic_query.rs +++ b/aquadoggo/src/graphql/client/dynamic_query.rs @@ -339,7 +339,11 @@ impl DynamicQuery { } // Handle document fields. - if !schema.fields().contains_key(selected_field.name()) { + if !schema + .fields() + .keys() + .contains(&selected_field.name().to_string()) + { return Err(ServerError::new( format!( "Field {} does not exist for schema {}", diff --git a/aquadoggo/src/graphql/client/dynamic_types/document.rs b/aquadoggo/src/graphql/client/dynamic_types/document.rs index e328c18b7..03bf4b769 100644 --- a/aquadoggo/src/graphql/client/dynamic_types/document.rs +++ b/aquadoggo/src/graphql/client/dynamic_types/document.rs @@ -56,7 +56,8 @@ impl Document { ); // Finally register the metatype for this schema. - let metatype = metaobject(&self.type_name(), Some(self.schema().description()), fields); + let schema_name = self.type_name(); + let metatype = metaobject(&schema_name, Some(""), fields); registry.types.insert(self.type_name(), metatype); } } diff --git a/aquadoggo/src/graphql/client/dynamic_types/tests.rs b/aquadoggo/src/graphql/client/dynamic_types/tests.rs index 9352fb702..34f179e71 100644 --- a/aquadoggo/src/graphql/client/dynamic_types/tests.rs +++ b/aquadoggo/src/graphql/client/dynamic_types/tests.rs @@ -19,7 +19,7 @@ use crate::test_utils::{add_schema, graphql_test_client, test_runner, TestNode}; #[serial] #[case(SYSTEM_SCHEMAS[0].id().to_string(), SYSTEM_SCHEMAS[0].description().to_string())] #[case(SYSTEM_SCHEMAS[1].id().to_string(), SYSTEM_SCHEMAS[1].description().to_string())] -fn system_schema_container_type(#[case] type_name: String, #[case] type_description: String) { +fn system_schema_container_type(#[case] type_name: String, #[case] _type_description: String) { test_runner(move |node: TestNode| async move { let client = graphql_test_client(&node).await; let response = client @@ -52,7 +52,7 @@ fn system_schema_container_type(#[case] type_name: String, #[case] type_descript // Currently, all system schemas are object types. "kind": "OBJECT", "name": type_name, - "description": type_description, + "description": "", "fields": [{ "name": "meta", "type": { @@ -118,7 +118,7 @@ fn application_schema_container_type() { "schema": { "kind": "OBJECT", "name": type_name, - "description": schema.description(), + "description": "", "fields": [{ "name": "meta", "type": { diff --git a/aquadoggo/src/graphql/client/mutation.rs b/aquadoggo/src/graphql/client/mutation.rs index 14d932fc0..f993dfe6b 100644 --- a/aquadoggo/src/graphql/client/mutation.rs +++ b/aquadoggo/src/graphql/client/mutation.rs @@ -133,7 +133,7 @@ mod tests { ) .unwrap(), "My test message schema", - vec![("message", FieldType::String)], + &[("message", FieldType::String)], ) .unwrap() } @@ -632,7 +632,7 @@ mod tests { test_schema().id().to_owned() ).into_bytes() }, - "Operation 0020b177ec1bf26dfb3b7010d473e6d44713b29b765b99c6e60ecbfae742de496543 not found, could not determine document id" + "Previous operation 0020b177ec1bf26dfb3b7010d473e6d44713b29b765b99c6e60ecbfae742de496543 not found in store" )] #[case::claimed_log_id_does_not_match_expected( &entry_signed_encoded_unvalidated( diff --git a/aquadoggo/src/materializer/tasks/schema.rs b/aquadoggo/src/materializer/tasks/schema.rs index b709530c1..d150b6cd0 100644 --- a/aquadoggo/src/materializer/tasks/schema.rs +++ b/aquadoggo/src/materializer/tasks/schema.rs @@ -122,7 +122,7 @@ async fn get_related_schema_definitions( mod tests { use p2panda_rs::identity::KeyPair; use p2panda_rs::operation::{OperationValue, PinnedRelationList}; - use p2panda_rs::schema::{FieldType, SchemaId}; + use p2panda_rs::schema::{FieldType, SchemaId, SchemaName}; use p2panda_rs::test_utils::fixtures::key_pair; use rstest::rstest; @@ -183,7 +183,7 @@ mod tests { .context .schema_provider .get(&SchemaId::Application( - "schema_name".to_string(), + SchemaName::new("schema_name").unwrap(), schema_view_id.clone(), )) .await; diff --git a/aquadoggo/src/schema/schema_provider.rs b/aquadoggo/src/schema/schema_provider.rs index 28b34521c..140557b01 100644 --- a/aquadoggo/src/schema/schema_provider.rs +++ b/aquadoggo/src/schema/schema_provider.rs @@ -93,10 +93,10 @@ impl Default for SchemaProvider { #[cfg(test)] mod test { - use p2panda_rs::schema::FieldType; + use p2panda_rs::schema::{FieldType, Schema, SchemaId, SchemaName}; use p2panda_rs::test_utils::fixtures::random_document_view_id; - use super::*; + use super::SchemaProvider; #[tokio::test] async fn get_all_schemas() { @@ -115,12 +115,14 @@ mod test { #[tokio::test] async fn update_schemas() { let provider = SchemaProvider::default(); - let new_schema_id = - SchemaId::Application("test_schema".to_string(), random_document_view_id()); + let new_schema_id = SchemaId::Application( + SchemaName::new("test_schema").unwrap(), + random_document_view_id(), + ); let new_schema = Schema::new( &new_schema_id, "description", - vec![("test_field", FieldType::String)], + &[("test_field", FieldType::String)], ) .unwrap(); let is_update = provider.update(new_schema).await; diff --git a/aquadoggo/src/test_utils/helpers.rs b/aquadoggo/src/test_utils/helpers.rs index 95569390d..1d6d7c40a 100644 --- a/aquadoggo/src/test_utils/helpers.rs +++ b/aquadoggo/src/test_utils/helpers.rs @@ -7,14 +7,17 @@ use p2panda_rs::hash::Hash; use p2panda_rs::operation::{ OperationValue, PinnedRelation, PinnedRelationList, Relation, RelationList, }; -use p2panda_rs::schema::{Schema, SchemaId}; +use p2panda_rs::schema::{Schema, SchemaId, SchemaName}; use p2panda_rs::storage_provider::traits::OperationStore; use p2panda_rs::test_utils::constants; use p2panda_rs::test_utils::fixtures::{schema, schema_fields}; /// Schema id used in aquadoggo tests. fn doggo_schema_id() -> SchemaId { - SchemaId::new_application("doggo_schema", &constants::HASH.to_owned().parse().unwrap()) + SchemaId::new_application( + &SchemaName::new("doggo_schema").unwrap(), + &constants::HASH.to_owned().parse().unwrap(), + ) } /// Schema used in aquadoggo tests. diff --git a/aquadoggo/src/test_utils/node.rs b/aquadoggo/src/test_utils/node.rs index 999bfaa7e..e98a5f026 100644 --- a/aquadoggo/src/test_utils/node.rs +++ b/aquadoggo/src/test_utils/node.rs @@ -5,7 +5,7 @@ use p2panda_rs::document::{DocumentId, DocumentViewId}; use p2panda_rs::entry::traits::AsEncodedEntry; use p2panda_rs::identity::KeyPair; use p2panda_rs::operation::{OperationBuilder, OperationValue}; -use p2panda_rs::schema::{FieldType, Schema, SchemaId}; +use p2panda_rs::schema::{FieldType, Schema, SchemaId, SchemaName}; use p2panda_rs::test_utils::memory_store::helpers::{ populate_store, send_to_store, PopulateStoreConfig, }; @@ -226,7 +226,7 @@ pub async fn add_schema( .expect("Run schema task"); let view_id = DocumentViewId::from(entry_signed.hash()); - let schema_id = SchemaId::Application(name.to_string(), view_id); + let schema_id = SchemaId::Application(SchemaName::new(name).unwrap(), view_id); debug!("Done building {}", schema_id); node.context diff --git a/aquadoggo/src/tests.rs b/aquadoggo/src/tests.rs index 90852b4e7..a104c5c97 100644 --- a/aquadoggo/src/tests.rs +++ b/aquadoggo/src/tests.rs @@ -14,7 +14,7 @@ use p2panda_rs::identity::{KeyPair, PublicKey}; use p2panda_rs::operation::encode::encode_operation; use p2panda_rs::operation::traits::Actionable; use p2panda_rs::operation::{Operation, OperationAction, OperationBuilder}; -use p2panda_rs::schema::{FieldType, Schema, SchemaId}; +use p2panda_rs::schema::{FieldType, Schema, SchemaId, SchemaName}; use reqwest::Client; use serde_json::{json, Map, Value}; use serial_test::serial; @@ -318,7 +318,7 @@ async fn create_schema( let create_schema_operation = Schema::create(name, description, fields_ids); let schema_definition_id = publish(client, &shirokuma, &create_schema_operation).await; - SchemaId::Application(name.to_string(), schema_definition_id) + SchemaId::Application(SchemaName::new(name).unwrap(), schema_definition_id) } /// Get the next args for a `public_key` and `document`.