From 96a6c1251b6cc117cbb714e4fad5da01d9bc93a0 Mon Sep 17 00:00:00 2001 From: Steve Sampson Date: Fri, 21 Oct 2022 19:28:51 -0300 Subject: [PATCH] Add Server, Filtering, and In-Memory Cache --- Cargo.lock | 1530 ++++++++++++++++- Cargo.toml | 1 + crates/bidgely_adapter/src/auth.rs | 6 +- crates/bidgely_adapter/src/feed.rs | 52 +- crates/bidgely_adapter/src/lib.rs | 2 + crates/bidgely_adapter/src/session.rs | 6 +- crates/runner/Cargo.toml | 1 + crates/runner/src/args.rs | 1 + crates/runner/src/download.rs | 8 +- crates/runner/src/error.rs | 2 + crates/runner/src/main.rs | 5 +- crates/server/Cargo.toml | 16 + crates/server/src/context.rs | 19 + crates/server/src/error.rs | 29 + crates/server/src/lib.rs | 23 + .../src/nspdata/cache/in_memory_cache.rs | 49 + crates/server/src/nspdata/cache/mod.rs | 18 + crates/server/src/nspdata/mod.rs | 16 + crates/server/src/nspdata/search.rs | 96 ++ 19 files changed, 1781 insertions(+), 99 deletions(-) create mode 100644 crates/server/Cargo.toml create mode 100644 crates/server/src/context.rs create mode 100644 crates/server/src/error.rs create mode 100644 crates/server/src/lib.rs create mode 100644 crates/server/src/nspdata/cache/in_memory_cache.rs create mode 100644 crates/server/src/nspdata/cache/mod.rs create mode 100644 crates/server/src/nspdata/mod.rs create mode 100644 crates/server/src/nspdata/search.rs diff --git a/Cargo.lock b/Cargo.lock index cca6785..7826a0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,82 @@ # It is not intended for manual editing. version = 3 +[[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.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe0133578c0986e1fe3dfcd4af1cc5b2dd6c3dbf534d69916ce16a2701d40ba" +dependencies = [ + "cfg-if 1.0.0", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "async-stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +dependencies = [ + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", +] + +[[package]] +name = "async-trait" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c" +dependencies = [ + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", +] + +[[package]] +name = "atomic" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" +dependencies = [ + "autocfg", +] + [[package]] name = "atty" version = "0.2.14" @@ -10,7 +86,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -19,6 +95,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" +dependencies = [ + "byteorder", + "safemem", +] + [[package]] name = "base64" version = "0.13.0" @@ -36,18 +122,39 @@ dependencies = [ "thiserror", ] +[[package]] +name = "binascii" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "bytes" version = "1.2.1" @@ -60,12 +167,28 @@ version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[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 = "4.0.17" @@ -89,9 +212,9 @@ checksum = "c42f169caba89a7d512b5418b09864543eeb4d497416c917d7137863bd2076ad" dependencies = [ "heck", "proc-macro-error", - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", ] [[package]] @@ -103,6 +226,34 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "cookie" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2018768ed1d848cc4d347d551546474025ba820e5db70e4c9aaa349f678bd7" +dependencies = [ + "percent-encoding 2.2.0", + "time 0.1.44", +] + +[[package]] +name = "cookie" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "344adc371239ef32293cb1c4fe519592fcf21206c79c02854320afcdf3ab4917" +dependencies = [ + "aes-gcm", + "base64 0.13.0", + "hkdf", + "hmac", + "percent-encoding 2.2.0", + "rand", + "sha2", + "subtle", + "time 0.3.15", + "version_check 0.9.4", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -119,13 +270,124 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "rand_core", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "devise" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd716c4a507adc5a2aa7c2a372d06c7497727e0892b243d3036bc7478a13e526" +dependencies = [ + "devise_codegen 0.2.1", + "devise_core 0.2.1", +] + +[[package]] +name = "devise" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" +dependencies = [ + "devise_codegen 0.3.1", + "devise_core 0.3.1", +] + +[[package]] +name = "devise_codegen" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea7b8290d118127c08e3669da20b331bed56b09f20be5945b7da6c116d8fab53" +dependencies = [ + "devise_core 0.2.1", + "quote 0.6.13", +] + +[[package]] +name = "devise_codegen" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" +dependencies = [ + "devise_core 0.3.1", + "quote 1.0.21", +] + +[[package]] +name = "devise_core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1053e9d5d5aade9bcedb5ab53b78df2b56ff9408a3138ce77eaaef87f932373" +dependencies = [ + "bitflags", + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", +] + +[[package]] +name = "devise_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" +dependencies = [ + "bitflags", + "proc-macro2 1.0.47", + "proc-macro2-diagnostics", + "quote 1.0.21", + "syn 1.0.102", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + [[package]] name = "encoding_rs" version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -137,6 +399,32 @@ dependencies = [ "instant", ] +[[package]] +name = "figment" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e56602b469b2201400dec66a66aec5a9b8761ee97cd1b8c96ab2483fcc16cc9" +dependencies = [ + "atomic", + "pear 0.2.3", + "serde", + "toml 0.5.9", + "uncased", + "version_check 0.9.4", +] + +[[package]] +name = "filetime" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "windows-sys 0.42.0", +] + [[package]] name = "fnv" version = "1.0.7" @@ -164,7 +452,56 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "percent-encoding", + "percent-encoding 2.2.0", +] + +[[package]] +name = "fsevent" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" +dependencies = [ + "bitflags", + "fsevent-sys", +] + +[[package]] +name = "fsevent-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +dependencies = [ + "libc", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] @@ -174,6 +511,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -182,6 +520,12 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +[[package]] +name = "futures-io" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" + [[package]] name = "futures-sink" version = "0.3.25" @@ -200,12 +544,67 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", + "slab", ] +[[package]] +name = "generator" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7" +dependencies = [ + "cc", + "libc", + "log 0.4.17", + "rustversion", + "windows", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check 0.9.4", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "ghash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "h2" version = "0.3.14" @@ -246,6 +645,24 @@ dependencies = [ "libc", ] +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "0.2.8" @@ -280,6 +697,25 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +[[package]] +name = "hyper" +version = "0.10.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" +dependencies = [ + "base64 0.9.3", + "httparse", + "language-tags", + "log 0.3.9", + "mime 0.2.6", + "num_cpus", + "time 0.1.44", + "traitobject", + "typeable", + "unicase", + "url 1.7.2", +] + [[package]] name = "hyper" version = "0.14.20" @@ -311,12 +747,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.20", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.3.0" @@ -335,6 +782,42 @@ checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", + "serde", +] + +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + +[[package]] +name = "inotify" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +dependencies = [ + "bitflags", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", ] [[package]] @@ -343,7 +826,16 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", ] [[package]] @@ -367,12 +859,34 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "language-tags" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.135" @@ -389,27 +903,94 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +dependencies = [ + "log 0.4.17", +] + [[package]] name = "log" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if 1.0.0", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "mime" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +dependencies = [ + "log 0.3.9", +] + [[package]] name = "mime" version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log 0.4.17", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + [[package]] name = "mio" version = "0.8.4" @@ -417,11 +998,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", - "log", - "wasi", + "log 0.4.17", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.36.1", ] +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log 0.4.17", + "mio 0.6.23", + "slab", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "multer" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed4198ce7a4cbd2a57af78d28c6fbb57d81ac5f1d6ad79ac6c5587419cbdf22" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "log 0.4.17", + "memchr", + "mime 0.3.16", + "spin", + "tokio", + "tokio-util", + "version_check 0.9.4", +] + [[package]] name = "native-tls" version = "0.2.10" @@ -430,7 +1055,7 @@ checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", - "log", + "log 0.4.17", "openssl", "openssl-probe", "openssl-sys", @@ -440,6 +1065,35 @@ dependencies = [ "tempfile", ] +[[package]] +name = "net2" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "notify" +version = "4.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" +dependencies = [ + "bitflags", + "filetime", + "fsevent", + "fsevent-sys", + "inotify", + "libc", + "mio 0.6.23", + "mio-extras", + "walkdir", + "winapi 0.3.9", +] + [[package]] name = "nspdata" version = "0.1.0" @@ -449,10 +1103,21 @@ dependencies = [ "quick-xml", "serde", "serde_json", + "server", "thiserror", "tokio", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi 0.3.9", +] + [[package]] name = "num_cpus" version = "1.13.1" @@ -463,12 +1128,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "once_cell" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "openssl" version = "0.10.42" @@ -476,7 +1156,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" dependencies = [ "bitflags", - "cfg-if", + "cfg-if 1.0.0", "foreign-types", "libc", "once_cell", @@ -490,9 +1170,9 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", ] [[package]] @@ -520,6 +1200,12 @@ version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.1" @@ -536,13 +1222,64 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", "windows-sys 0.42.0", ] +[[package]] +name = "pear" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32dfa7458144c6af7f9ce6a137ef975466aa68ffa44d4d816ee5934018ba960a" +dependencies = [ + "pear_codegen 0.1.5", +] + +[[package]] +name = "pear" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" +dependencies = [ + "inlinable_string", + "pear_codegen 0.2.3", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0288ba5d581afbc93e2bbd931c1013584c15ecf46b1cdb927edc7abddbc8ca6" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", + "version_check 0.9.4", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" +dependencies = [ + "proc-macro2 1.0.47", + "proc-macro2-diagnostics", + "quote 1.0.21", + "syn 1.0.102", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + [[package]] name = "percent-encoding" version = "2.2.0" @@ -567,6 +1304,24 @@ version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +[[package]] +name = "polyval" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef234e08c11dfcb2e56f79fd70f6f2eb7f025c0ce2333e82f4f0518ecad30c6" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -574,10 +1329,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn", - "version_check", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", + "version_check 0.9.4", ] [[package]] @@ -586,9 +1341,18 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "proc-macro2 1.0.47", + "quote 1.0.21", + "version_check 0.9.4", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", ] [[package]] @@ -600,6 +1364,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" +dependencies = [ + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", + "version_check 0.9.4", + "yansi", +] + [[package]] name = "quick-xml" version = "0.25.0" @@ -610,13 +1387,52 @@ dependencies = [ "serde", ] +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + [[package]] name = "quote" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.47", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", ] [[package]] @@ -628,13 +1444,57 @@ dependencies = [ "bitflags", ] +[[package]] +name = "ref-cast" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12a733f1746c929b4913fe48f8697fcf9c55e3304ba251a79ffb41adfeaf49c2" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5887de4a01acafd221861463be6113e6e87275e79804e56779f4cdc131c60368" +dependencies = [ + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -643,7 +1503,7 @@ version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" dependencies = [ - "base64", + "base64 0.13.0", "bytes", "encoding_rs", "futures-core", @@ -651,15 +1511,15 @@ dependencies = [ "h2", "http", "http-body", - "hyper", + "hyper 0.14.20", "hyper-tls", "ipnet", "js-sys", - "log", - "mime", + "log 0.4.17", + "mime 0.3.16", "native-tls", "once_cell", - "percent-encoding", + "percent-encoding 2.2.0", "pin-project-lite", "serde", "serde_json", @@ -667,19 +1527,187 @@ dependencies = [ "tokio", "tokio-native-tls", "tower-service", - "url", + "url 2.3.1", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "winreg", ] +[[package]] +name = "rocket" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b9d9dc08c5dcc1d8126a9dd615545e6a358f8c13c883c8dfed8c0376fa355e" +dependencies = [ + "atty", + "base64 0.13.0", + "log 0.4.17", + "memchr", + "num_cpus", + "pear 0.1.5", + "rocket_codegen 0.4.11", + "rocket_http 0.4.11", + "state 0.4.2", + "time 0.1.44", + "toml 0.4.10", + "version_check 0.9.4", + "yansi", +] + +[[package]] +name = "rocket" +version = "0.5.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ead083fce4a405feb349cf09abdf64471c6077f14e0ce59364aa90d4b99317" +dependencies = [ + "async-stream", + "async-trait", + "atomic", + "atty", + "binascii", + "bytes", + "either", + "figment", + "futures", + "indexmap", + "log 0.4.17", + "memchr", + "multer", + "num_cpus", + "parking_lot", + "pin-project-lite", + "rand", + "ref-cast", + "rocket_codegen 0.5.0-rc.2", + "rocket_http 0.5.0-rc.2", + "serde", + "state 0.5.3", + "tempfile", + "time 0.3.15", + "tokio", + "tokio-stream", + "tokio-util", + "ubyte", + "version_check 0.9.4", + "yansi", +] + +[[package]] +name = "rocket_codegen" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2810037b5820098af97bd4fdd309e76a8101ceb178147de775c835a2537284fe" +dependencies = [ + "devise 0.2.1", + "glob", + "indexmap", + "quote 0.6.13", + "rocket_http 0.4.11", + "version_check 0.9.4", + "yansi", +] + +[[package]] +name = "rocket_codegen" +version = "0.5.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6aeb6bb9c61e9cd2c00d70ea267bf36f76a4cc615e5908b349c2f9d93999b47" +dependencies = [ + "devise 0.3.1", + "glob", + "indexmap", + "proc-macro2 1.0.47", + "quote 1.0.21", + "rocket_http 0.5.0-rc.2", + "syn 1.0.102", + "unicode-xid 0.2.4", +] + +[[package]] +name = "rocket_contrib" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e20efbc6a211cb3df5375accf532d4186f224b623f39eca650b19b96240c596b" +dependencies = [ + "log 0.4.17", + "notify", + "rocket 0.4.11", + "serde", + "serde_json", +] + +[[package]] +name = "rocket_http" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf9cbd128e1f321a2d0bebd2b7cf0aafd89ca43edf69e49b56a5c46e48eb19f" +dependencies = [ + "cookie 0.11.5", + "hyper 0.10.16", + "indexmap", + "pear 0.1.5", + "percent-encoding 1.0.1", + "smallvec", + "state 0.4.2", + "time 0.1.44", + "unicode-xid 0.1.0", +] + +[[package]] +name = "rocket_http" +version = "0.5.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ded65d127954de3c12471630bf4b81a2792f065984461e65b91d0fdaafc17a2" +dependencies = [ + "cookie 0.16.1", + "either", + "futures", + "http", + "hyper 0.14.20", + "indexmap", + "log 0.4.17", + "memchr", + "pear 0.2.3", + "percent-encoding 2.2.0", + "pin-project-lite", + "ref-cast", + "serde", + "smallvec", + "stable-pattern", + "state 0.5.3", + "time 0.3.15", + "tokio", + "uncased", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + [[package]] name = "ryu" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.20" @@ -690,6 +1718,12 @@ dependencies = [ "windows-sys 0.36.1", ] +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + [[package]] name = "scopeguard" version = "1.1.0" @@ -734,9 +1768,9 @@ version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", ] [[package]] @@ -762,6 +1796,39 @@ dependencies = [ "serde", ] +[[package]] +name = "server" +version = "0.1.0" +dependencies = [ + "async-trait", + "bidgely_adapter", + "rocket 0.5.0-rc.2", + "rocket_contrib", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -793,7 +1860,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", +] + +[[package]] +name = "spin" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" + +[[package]] +name = "stable-pattern" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" +dependencies = [ + "memchr", +] + +[[package]] +name = "state" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3015a7d0a5fd5105c91c3710d42f9ccf0abfb287d62206484dcc67f9569a6483" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", ] [[package]] @@ -802,14 +1899,31 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + [[package]] name = "syn" version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.47", + "quote 1.0.21", "unicode-ident", ] @@ -819,12 +1933,12 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", "libc", "redox_syscall", "remove_dir_all", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -851,11 +1965,49 @@ version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", ] +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + +[[package]] +name = "time" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" +dependencies = [ + "itoa", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + [[package]] name = "tinyvec" version = "1.6.0" @@ -881,14 +2033,14 @@ dependencies = [ "bytes", "libc", "memchr", - "mio", + "mio 0.8.4", "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -897,9 +2049,9 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", ] [[package]] @@ -912,6 +2064,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.4" @@ -926,6 +2089,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -938,11 +2119,23 @@ version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "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 1.0.47", + "quote 1.0.21", + "syn 1.0.102", +] + [[package]] name = "tracing-core" version = "0.1.30" @@ -950,14 +2143,90 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", + "valuable", ] +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log 0.4.17", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "traitobject" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" + [[package]] name = "try-lock" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "typeable" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ubyte" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c81f0dae7d286ad0d9366d7679a77934cfc3cf3a8d67e82669794412b2368fe6" +dependencies = [ + "serde", +] + +[[package]] +name = "uncased" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" +dependencies = [ + "serde", + "version_check 0.9.4", +] + +[[package]] +name = "unicase" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +dependencies = [ + "version_check 0.1.5", +] + [[package]] name = "unicode-bidi" version = "0.3.8" @@ -979,6 +2248,39 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + [[package]] name = "url" version = "2.3.1" @@ -986,32 +2288,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna", - "percent-encoding", + "idna 0.3.0", + "percent-encoding 2.2.0", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi 0.3.9", + "winapi-util", +] + [[package]] name = "want" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ - "log", + "log 0.4.17", "try-lock", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1024,7 +2355,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -1035,11 +2366,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" dependencies = [ "bumpalo", - "log", + "log 0.4.17", "once_cell", - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", "wasm-bindgen-shared", ] @@ -1049,7 +2380,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -1061,7 +2392,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ - "quote", + "quote 1.0.21", "wasm-bindgen-macro-support", ] @@ -1071,9 +2402,9 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2 1.0.47", + "quote 1.0.21", + "syn 1.0.102", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1094,6 +2425,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -1104,6 +2441,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1116,7 +2459,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1125,6 +2468,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" +dependencies = [ + "windows_aarch64_msvc 0.32.0", + "windows_i686_gnu 0.32.0", + "windows_i686_msvc 0.32.0", + "windows_x86_64_gnu 0.32.0", + "windows_x86_64_msvc 0.32.0", +] + [[package]] name = "windows-sys" version = "0.36.1" @@ -1159,6 +2515,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" @@ -1171,6 +2533,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + [[package]] name = "windows_i686_gnu" version = "0.36.1" @@ -1183,6 +2551,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + [[package]] name = "windows_i686_msvc" version = "0.36.1" @@ -1195,6 +2569,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" @@ -1213,6 +2593,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" @@ -1231,5 +2617,21 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ - "winapi", + "winapi 0.3.9", ] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" diff --git a/Cargo.toml b/Cargo.toml index be846eb..56c3263 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,4 +2,5 @@ members = [ "crates/bidgely_adapter", "crates/runner", + "crates/server", ] diff --git a/crates/bidgely_adapter/src/auth.rs b/crates/bidgely_adapter/src/auth.rs index 5bcd94b..3cd59e0 100644 --- a/crates/bidgely_adapter/src/auth.rs +++ b/crates/bidgely_adapter/src/auth.rs @@ -1,4 +1,4 @@ -use crate::BidgelyError; +use crate::{BidgelyError, BIDGELY_BASE_URL}; #[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)] #[serde(rename_all(deserialize = "camelCase"))] @@ -8,10 +8,10 @@ pub struct UserAuthResponse { pub error: Option, } -pub async fn auth(base_url: &str, user_id: &str) -> Result { +pub async fn auth(user_id: &str) -> Result { Ok(serde_json::from_str( &reqwest::get(format!( - "{base_url}/user-auth/cipher?user-id={user_id}&pilot-id=40003" + "{BIDGELY_BASE_URL}/user-auth/cipher?user-id={user_id}&pilot-id=40003" )) .await? .text() diff --git a/crates/bidgely_adapter/src/feed.rs b/crates/bidgely_adapter/src/feed.rs index c036b2c..da491a6 100644 --- a/crates/bidgely_adapter/src/feed.rs +++ b/crates/bidgely_adapter/src/feed.rs @@ -1,7 +1,7 @@ -use crate::BidgelyError; +use crate::{BidgelyError, BIDGELY_BASE_URL}; use std::fs; -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "lowercase")] pub struct Feed { pub id: String, @@ -11,7 +11,7 @@ pub struct Feed { pub entries: Vec, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Entry { pub id: String, pub link: Vec, @@ -21,7 +21,7 @@ pub struct Entry { pub updated: String, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Link { pub href: String, pub rel: String, @@ -29,12 +29,18 @@ pub struct Link { pub kind: String, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Content { #[serde(rename(deserialize = "$value"))] inner: ContentType, } +impl From for Content { + fn from(inner: ContentType) -> Self { + Self { inner } + } +} + impl Content { pub fn to_inner(self) -> ContentType { self.inner @@ -49,7 +55,13 @@ impl std::ops::Deref for Content { } } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +impl std::ops::DerefMut for Content { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub enum ContentType { LocalTimeParameters(LocalTimeParameters), UsagePoint(UsagePoint), @@ -60,7 +72,7 @@ pub enum ContentType { Other, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all(deserialize = "camelCase"))] pub struct LocalTimeParameters { pub dst_end_rule: String, @@ -69,18 +81,18 @@ pub struct LocalTimeParameters { pub tz_offset: String, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all(deserialize = "PascalCase"))] pub struct UsagePoint { pub service_category: ServiceCategory, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct ServiceCategory { pub kind: u32, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all(deserialize = "camelCase"))] pub struct ReadingType { pub accumulation_behaviour: u32, @@ -95,20 +107,20 @@ pub struct ReadingType { pub time_attribute: u32, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct IntervalBlock { pub interval: Interval, #[serde(rename = "IntervalReading")] pub interval_reading: Vec, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Interval { pub duration: u64, pub start: u64, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct IntervalReading { #[serde(rename = "ReadingQuality")] pub reading_quality: ReadingQuality, @@ -117,20 +129,19 @@ pub struct IntervalReading { pub value: u32, } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct ReadingQuality { pub quality: u32, // todo: pub enum ReadingQuality } -#[derive(serde::Deserialize, serde::Serialize, Debug)] +#[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(rename_all(deserialize = "camelCase"))] pub struct TimePeriod { - pub duration: u32, - pub start: u32, + pub duration: u64, + pub start: u64, } pub async fn download_and_save_feed_xml( - base_url: &str, user_id: &str, token: &str, start: u64, @@ -139,7 +150,7 @@ pub async fn download_and_save_feed_xml( ) -> Result<(), BidgelyError> { let client = reqwest::Client::new(); let xml_data = client.get(format!( - "{base_url}/dashboard/users/{user_id}/gb-download?start={start}&end={end}&measurement-type=ELECTRIC" + "{BIDGELY_BASE_URL}/dashboard/users/{user_id}/gb-download?start={start}&end={end}&measurement-type=ELECTRIC" )) .header(reqwest::header::CONTENT_TYPE, "application/json;charset=UTF-8") .header(reqwest::header::AUTHORIZATION, format!("Bearer {token}")) @@ -165,7 +176,6 @@ pub async fn download_and_save_feed_xml( } pub async fn get_feed( - base_url: &str, user_id: &str, token: &str, start: u64, @@ -173,7 +183,7 @@ pub async fn get_feed( ) -> Result { let client = reqwest::Client::new(); let xml_data = client.get(format!( - "{base_url}/dashboard/users/{user_id}/gb-download?start={start}&end={end}&measurement-type=ELECTRIC" + "{BIDGELY_BASE_URL}/dashboard/users/{user_id}/gb-download?start={start}&end={end}&measurement-type=ELECTRIC" )) .header(reqwest::header::CONTENT_TYPE, "application/json;charset=UTF-8") .header(reqwest::header::AUTHORIZATION, format!("Bearer {token}")) diff --git a/crates/bidgely_adapter/src/lib.rs b/crates/bidgely_adapter/src/lib.rs index feab71d..6448963 100644 --- a/crates/bidgely_adapter/src/lib.rs +++ b/crates/bidgely_adapter/src/lib.rs @@ -2,6 +2,8 @@ pub mod auth; pub mod feed; pub mod session; +pub(crate) const BIDGELY_BASE_URL: &'static str = "https://caapi.bidgely.com/v2.0"; + #[derive(thiserror::Error, Debug)] pub enum BidgelyError { #[error("reqwest error")] diff --git a/crates/bidgely_adapter/src/session.rs b/crates/bidgely_adapter/src/session.rs index 012a36e..b8bfb79 100644 --- a/crates/bidgely_adapter/src/session.rs +++ b/crates/bidgely_adapter/src/session.rs @@ -1,4 +1,4 @@ -use crate::BidgelyError; +use crate::{BidgelyError, BIDGELY_BASE_URL}; #[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)] #[serde(rename_all(deserialize = "camelCase"))] @@ -105,10 +105,10 @@ pub struct PremiseAddress { pub context: Option, } -pub async fn session(base_url: &str, session: &str) -> Result { +pub async fn session(session: &str) -> Result { Ok(serde_json::from_str( &reqwest::get(format!( - "{base_url}/web/web-session/{session}?pilotId=40003&clientId=nsp-dashboard" + "{BIDGELY_BASE_URL}/web/web-session/{session}?pilotId=40003&clientId=nsp-dashboard" )) .await? .text() diff --git a/crates/runner/Cargo.toml b/crates/runner/Cargo.toml index 64cc5fc..8299bf1 100644 --- a/crates/runner/Cargo.toml +++ b/crates/runner/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] bidgely_adapter = { path = "../bidgely_adapter" } +server = { path = "../server" } clap = { version = "4.0.17", features = ["derive"] } quick-xml = { version = "0.25.0", features = ["serde", "serialize"] } serde = { version = "1.0", features = ["derive"] } diff --git a/crates/runner/src/args.rs b/crates/runner/src/args.rs index 53b9e48..3bd4a37 100644 --- a/crates/runner/src/args.rs +++ b/crates/runner/src/args.rs @@ -2,6 +2,7 @@ pub enum Action { Convert, Download, + RunServer, } #[derive(clap::Parser, Debug)] diff --git a/crates/runner/src/download.rs b/crates/runner/src/download.rs index 07301c3..24f55c0 100644 --- a/crates/runner/src/download.rs +++ b/crates/runner/src/download.rs @@ -1,15 +1,13 @@ -pub async fn download(base_url: &str, args: &crate::args::Args) -> Result<(), crate::error::Error> { +pub async fn download(args: &crate::args::Args) -> Result<(), crate::error::Error> { println!("downloading nsp xml"); match (&args.uid, &args.output_filename, args.start, args.end) { (Some(user_id), Some(output_filename), Some(start), Some(end)) => { - let user_auth_response = bidgely_adapter::auth::auth(base_url, user_id).await?; + let user_auth_response = bidgely_adapter::auth::auth(user_id).await?; let session_response = - bidgely_adapter::session::session(base_url, user_auth_response.payload.as_str()) - .await?; + bidgely_adapter::session::session(user_auth_response.payload.as_str()).await?; bidgely_adapter::feed::download_and_save_feed_xml( - base_url, user_id, session_response.payload.token_details.access_token.as_str(), start, diff --git a/crates/runner/src/error.rs b/crates/runner/src/error.rs index d7f30a9..4e4c71e 100644 --- a/crates/runner/src/error.rs +++ b/crates/runner/src/error.rs @@ -10,4 +10,6 @@ pub enum Error { IoError(#[from] std::io::Error), #[error("Bad Argument: {0}")] BadArgument(String), + #[error("Server Error")] + ServerError(#[from] server::error::ServerError), } diff --git a/crates/runner/src/main.rs b/crates/runner/src/main.rs index eb5c5df..d825d4d 100644 --- a/crates/runner/src/main.rs +++ b/crates/runner/src/main.rs @@ -6,15 +6,14 @@ pub mod convert; pub mod download; pub mod error; -const BIDGELY_BASE_URL: &'static str = "https://caapi.bidgely.com/v2.0"; - #[tokio::main] async fn main() -> Result<(), error::Error> { let args: Args = Args::parse(); match args.action { Action::Convert => convert::convert(&args)?, - Action::Download => download::download(BIDGELY_BASE_URL, &args).await?, + Action::Download => download::download(&args).await?, + Action::RunServer => server::run().await?, } Ok(()) diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml new file mode 100644 index 0000000..71540d8 --- /dev/null +++ b/crates/server/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "server" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = "0.1.58" +bidgely_adapter = { path = "../bidgely_adapter" } +rocket = "0.5.0-rc.2" +rocket_contrib = { version = "0.4.11", features = ["json"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = { version = "1.0" } +thiserror = "1.0" + diff --git a/crates/server/src/context.rs b/crates/server/src/context.rs new file mode 100644 index 0000000..462ce86 --- /dev/null +++ b/crates/server/src/context.rs @@ -0,0 +1,19 @@ +use crate::nspdata::cache::in_memory_cache::InMemoryCache; +use crate::nspdata::cache::NspCache; +use std::sync::Arc; + +pub struct Context { + nsp_cache: Arc, +} + +impl Context { + pub(crate) fn new_with_in_memory_cache() -> Self { + Self { + nsp_cache: Arc::new(InMemoryCache::default()), + } + } + + pub(crate) fn nsp_cache(&self) -> Arc { + self.nsp_cache.clone() + } +} diff --git a/crates/server/src/error.rs b/crates/server/src/error.rs new file mode 100644 index 0000000..f43bab2 --- /dev/null +++ b/crates/server/src/error.rs @@ -0,0 +1,29 @@ +use bidgely_adapter::session::SessionResponse; +use std::collections::HashMap; +use std::sync::{PoisonError, RwLockReadGuard, RwLockWriteGuard}; + +#[derive(thiserror::Error, Debug)] +pub enum ServerError { + #[error("Rocket Error {0}")] + RocketError(#[from] rocket::error::Error), + #[error("Bidgely Error {0}")] + BidgelyError(#[from] bidgely_adapter::BidgelyError), + #[error("Read Guard Poisoned")] + ReadGuardPoisoned, + #[error("Write Guard Poisoned")] + WriteGuardPoisoned, + #[error("SerdeJsonError")] + SerdeJsonError(#[from] serde_json::Error), +} + +impl From>>> for ServerError { + fn from(_: PoisonError>>) -> Self { + Self::ReadGuardPoisoned + } +} + +impl From>>> for ServerError { + fn from(_: PoisonError>>) -> Self { + Self::WriteGuardPoisoned + } +} diff --git a/crates/server/src/lib.rs b/crates/server/src/lib.rs new file mode 100644 index 0000000..2e30158 --- /dev/null +++ b/crates/server/src/lib.rs @@ -0,0 +1,23 @@ +#![feature(proc_macro_hygiene, decl_macro)] +#[macro_use] +extern crate rocket; + +use crate::context::Context; +use crate::error::ServerError; + +pub mod error; + +mod context; +mod nspdata; + +pub async fn run() -> Result<(), ServerError> { + let context = Context::new_with_in_memory_cache(); + + let _rocket = rocket::build() + .manage(context) + .mount("/nspdata", routes![nspdata::handle_search]) + .launch() + .await?; + + Ok(()) +} diff --git a/crates/server/src/nspdata/cache/in_memory_cache.rs b/crates/server/src/nspdata/cache/in_memory_cache.rs new file mode 100644 index 0000000..a071628 --- /dev/null +++ b/crates/server/src/nspdata/cache/in_memory_cache.rs @@ -0,0 +1,49 @@ +use crate::nspdata::cache::NspCache; +use crate::ServerError; +use bidgely_adapter::session::SessionResponse; +use std::collections::HashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::RwLock; + +#[derive(Default)] +pub struct InMemoryCache { + user_id_sessions: RwLock>, + hits: AtomicU64, + requests: AtomicU64, +} + +#[async_trait] +impl NspCache for InMemoryCache { + async fn find_session(&self, user_id: &String) -> Result, ServerError> { + self.requests.fetch_add(1, Ordering::Relaxed); + let map = self.user_id_sessions.read()?; + Ok(match map.get(user_id).cloned() { + Some(session_response) => { + self.hits.fetch_add(1, Ordering::Relaxed); + Some(session_response) + } + None => None, + }) + } + + async fn store_session( + &self, + user_id: String, + session: SessionResponse, + ) -> Result, crate::ServerError> { + { + self.user_id_sessions + .write()? + .insert(user_id.clone(), session); + } + self.find_session(&user_id).await + } + + fn hits(&self) -> u64 { + self.hits.load(Ordering::Relaxed) + } + + fn requests(&self) -> u64 { + self.requests.load(Ordering::Relaxed) + } +} diff --git a/crates/server/src/nspdata/cache/mod.rs b/crates/server/src/nspdata/cache/mod.rs new file mode 100644 index 0000000..bce0eb5 --- /dev/null +++ b/crates/server/src/nspdata/cache/mod.rs @@ -0,0 +1,18 @@ +use bidgely_adapter::session::SessionResponse; + +pub(crate) mod in_memory_cache; + +#[async_trait] +pub(crate) trait NspCache { + async fn find_session( + &self, + user_id: &String, + ) -> Result, crate::ServerError>; + async fn store_session( + &self, + user_id: String, + session: SessionResponse, + ) -> Result, crate::ServerError>; + fn hits(&self) -> u64; + fn requests(&self) -> u64; +} diff --git a/crates/server/src/nspdata/mod.rs b/crates/server/src/nspdata/mod.rs new file mode 100644 index 0000000..ac04436 --- /dev/null +++ b/crates/server/src/nspdata/mod.rs @@ -0,0 +1,16 @@ +pub(crate) mod cache; +pub(crate) mod search; + +use crate::Context; +use rocket::State; + +#[get("/?&")] +pub(crate) async fn handle_search( + context: &State, + user_id: String, + start: u64, + end: u64, +) -> String { + // todo: impl Responder for ServerError to eliminate these unwraps + serde_json::to_string(&search::handler(context, user_id, start, end).await.unwrap()).unwrap() +} diff --git a/crates/server/src/nspdata/search.rs b/crates/server/src/nspdata/search.rs new file mode 100644 index 0000000..27e9de8 --- /dev/null +++ b/crates/server/src/nspdata/search.rs @@ -0,0 +1,96 @@ +use crate::{Context, ServerError}; +use bidgely_adapter::feed::{ContentType, IntervalReading}; +use bidgely_adapter::session::{SessionResponse, UserProfileDetails}; +use rocket::State; +use std::ops::DerefMut; + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub(crate) struct SearchResponse { + user_profile: UserProfileDetails, + readings: Vec, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub(crate) struct PrettyIntervalReading { + start: u64, + duration: u64, + quality: u32, + value: u32, +} + +impl From<(SessionResponse, Vec)> for SearchResponse { + fn from((session_response, readings): (SessionResponse, Vec)) -> Self { + Self { + user_profile: session_response.payload.user_profile_details, + readings: readings + .into_iter() + .map(|reading| PrettyIntervalReading { + start: reading.time_period.start, + duration: reading.time_period.duration, + quality: reading.reading_quality.quality, + value: reading.value, + }) + .collect::>(), + } + } +} + +pub(crate) async fn handler( + context: &State, + user_id: String, + start: u64, + end: u64, +) -> Result { + let session_response = get_session(context, user_id.clone()).await?; + + let mut feed = bidgely_adapter::feed::get_feed( + user_id.as_str(), + session_response.payload.token_details.access_token.as_str(), + start, + end, + ) + .await?; + + // todo: think if there is a nicer way to do this via some sort of filter / retain / map / collect as opposed + // to creating a new vector and moving elements into it. + let mut return_data: Vec = vec![]; + + feed.entries + .iter_mut() + .for_each(|entry| match entry.content.deref_mut() { + ContentType::IntervalBlock(interval_block) => { + interval_block.interval_reading.retain(|interval_reading| { + (interval_reading.time_period.start > start) + && ((interval_reading.time_period.start + + interval_reading.time_period.duration) + <= end) + }); + return_data.append(&mut interval_block.interval_reading) + } + _ => {} + }); + + Ok((session_response, return_data).into()) +} + +async fn get_session( + context: &State, + user_id: String, +) -> Result { + let cache = context.nsp_cache(); + + Ok(match cache.find_session(&user_id).await? { + Some(session) => session, + None => { + let user_auth_response = bidgely_adapter::auth::auth(user_id.as_str()).await.unwrap(); + + let session_response = + bidgely_adapter::session::session(user_auth_response.payload.as_str()).await?; + + cache + .store_session(user_id.clone(), session_response) + .await? + .unwrap() + } + }) +}