diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 534f5f8..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/Cargo.lock b/Cargo.lock index 6038a93..a3cbf29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", "generic-array", @@ -39,9 +39,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] @@ -55,6 +55,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.71" @@ -63,9 +112,9 @@ checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" @@ -75,13 +124,13 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "async-trait" -version = "0.1.66" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -103,9 +152,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.11" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d8068b6ccb8b34db9de397c7043f91db8b4c66414952c6db944f238c4d3db3" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" dependencies = [ "async-trait", "axum-core", @@ -135,9 +184,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2f958c80c248b34b9a877a643811be8dbca03ca5ba827f2b63baf3a81e5fc4e" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" dependencies = [ "async-trait", "bytes", @@ -152,14 +201,14 @@ dependencies = [ [[package]] name = "axum-macros" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39bcef27b56d5cad8912d735d5ed1286f073f7bcb88cc31b38a15b514fcf8600" +checksum = "2bb524613be645939e280b7279f7b017f98cf7f5ef084ec374df373530e73277" dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -251,9 +300,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" [[package]] name = "by_address" @@ -358,40 +407,45 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.8" +version = "4.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5" +checksum = "34d21f9bf1b425d2968943631ec91202fe5e837264063503708b83013f8fc938" dependencies = [ - "bitflags", + "clap_builder", "clap_derive", - "clap_lex", - "is-terminal", "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914c8c79fb560f238ef6429439a30023c862f7a28e688c58f7203f12b29970bd" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", "strsim", - "termcolor", ] [[package]] name = "clap_derive" -version = "4.1.8" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0" +checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4" dependencies = [ "heck", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "clap_lex" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09" -dependencies = [ - "os_str_bytes", -] +checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" [[package]] name = "codespan-reporting" @@ -403,6 +457,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "constant_time_eq" version = "0.2.5" @@ -411,15 +471,15 @@ checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -440,9 +500,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", @@ -529,9 +589,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a140f260e6f3f79013b8bfc65e7ce630c9ab4388c6a89c71e07226f49487b72" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" dependencies = [ "cc", "cxxbridge-flags", @@ -541,9 +601,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da6383f459341ea689374bf0a42979739dc421874f112ff26f829b8040b8e613" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" dependencies = [ "cc", "codespan-reporting", @@ -551,24 +611,24 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "cxxbridge-flags" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90201c1a650e95ccff1c8c0bb5a343213bdd317c6e600a93075bca2eff54ec97" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" [[package]] name = "cxxbridge-macro" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -672,13 +732,13 @@ dependencies = [ [[package]] name = "errno" -version = "0.2.8" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -847,9 +907,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -857,9 +917,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "js-sys", @@ -1027,9 +1087,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.25" +version = "0.14.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" dependencies = [ "bytes", "futures-channel", @@ -1050,16 +1110,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.53" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows", ] [[package]] @@ -1074,9 +1134,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -1093,24 +1153,25 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" dependencies = [ + "hermit-abi 0.3.1", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "is-terminal" -version = "0.4.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -1136,9 +1197,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.140" +version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" [[package]] name = "libsecp256k1" @@ -1199,9 +1260,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.1.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" [[package]] name = "lock_api" @@ -1251,9 +1312,9 @@ dependencies = [ [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -1358,12 +1419,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "os_str_bytes" -version = "6.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" - [[package]] name = "overload" version = "0.1.1" @@ -1478,30 +1533,6 @@ dependencies = [ "log", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro2" version = "1.0.56" @@ -1600,9 +1631,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ "aho-corasick", "memchr", @@ -1611,22 +1642,22 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" [[package]] name = "rustix" -version = "0.36.9" +version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -1696,9 +1727,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.94" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", @@ -1707,9 +1738,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0969fff533976baadd92e08b1d102c5a3d8a8049eadfd69d4d1e3c5b2ed189" +checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" dependencies = [ "serde", ] @@ -1850,9 +1881,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "syslog" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978044cc68150ad5e40083c9f6a725e6fd02d7ba1bcf691ec2ff0d66c0b41acc" +checksum = "7434e95bcccce1215d30f4bf84fe8c00e8de1b9be4fb736d747ca53d36e7f96f" dependencies = [ "error-chain", "hostname", @@ -1872,22 +1903,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -1932,14 +1963,13 @@ dependencies = [ [[package]] name = "tokio" -version = "1.26.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" dependencies = [ "autocfg", "bytes", "libc", - "memchr", "mio", "num_cpus", "parking_lot", @@ -1947,18 +1977,18 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] @@ -1984,9 +2014,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.7" +version = "0.19.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc18466501acd8ac6a3f615dd29a3438f8ca6bb3b19537138b3106e575621274" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" dependencies = [ "indexmap", "serde", @@ -2096,6 +2126,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "version_check" version = "0.9.4" @@ -2209,6 +2245,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -2343,9 +2388,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.3.6" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d020b441f92996c80d94ae9166e8501e59c7bb56121189dc9eab3bd8216966" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] diff --git a/src/backend.rs b/src/backend.rs index ffb0abc..d521fbd 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -1,2 +1 @@ pub mod fs; -// pub mod task; diff --git a/src/backend/fs.rs b/src/backend/fs.rs index 340c684..485d325 100644 --- a/src/backend/fs.rs +++ b/src/backend/fs.rs @@ -1,7 +1,6 @@ use std::{ fs::{self, OpenOptions}, - io::{self, Read, Seek, Write}, - path::{Path, PathBuf}, + io::{Read, Seek, Write}, pin::Pin, sync::Arc, }; @@ -131,6 +130,7 @@ pub async fn write_catalog( segment_hashes: &[BaoHash], ) -> Result<()> { debug!("Write catalog"); + let contents: Vec = segment_hashes .iter() .flat_map(|bao_hash| bao_hash.to_bytes()) @@ -189,7 +189,7 @@ pub fn read_file(pk: &Secp256k1PubKey, blake3_hash: &Blake3Hash) -> Result Result Result<()> { - let pk_bytes = pk.to_bytes(); - let (x_only_pk, _) = pk.into_inner().x_only_public_key(); +pub fn read_slice( + pk: &Secp256k1PubKey, + file_hash: &Blake3Hash, + slice_start: usize, + slice_len: usize, +) -> Result> { + trace!("Create a shared secret using ECDH"); + let ss = node_shared_secret(&pk.into_inner())?.secret_bytes(); + let write_pk = PublicKey::from_secret_key_global(&SecretKey::from_slice(&ss)?); + let write_pk_str = write_pk.to_string(); - let file_hash = Blake3Hash(blake3::keyed_hash(&x_only_pk.serialize(), file_bytes)); - trace!(">>>>>file_hash:: {}", file_hash); + let path = file_path(0, &write_pk_str, CATALOG_DIR, &file_hash.to_string())?; - for vol in &SYS_CFG.volumes { - let seg_file = &vol.path.join(SEGMENT_DIR).join(file_hash.to_string()); - let seg_dir = &vol.path.join(SEGMENT_DIR); - remove_dir_contents(seg_dir, seg_file.to_path_buf()).unwrap(); - } + trace!("Read catalog at {path:?}"); + let mut catalog_file = OpenOptions::new().read(true).open(path)?; - for vol in &SYS_CFG.volumes { - let cat_path = &vol.path.join(CATALOG_DIR).join(file_hash.to_string()); - let cat = &vol.path.join(CATALOG_DIR); - remove_dir_catalogs(cat.to_path_buf(), cat_path.to_path_buf()).unwrap(); - } - Ok(()) -} + let mut bytes = vec![]; + catalog_file.read_to_end(&mut bytes)?; -#[allow(unused_variables)] -fn remove_dir_contents>(path: P, seg_file: PathBuf) -> io::Result<()> { - trace!(">>> remove_Segment_contents"); - for entry in fs::read_dir(path)? { - trace!("Delete Segment File at {:?}", entry); - fs::remove_file(entry?.path())?; - } - Ok(()) + trace!("Read catalog at {:?}", catalog_file); + trace!(" )))) Read catalog BYTES len() {:?}", bytes.len()); + + // GET RANGE ex: &bytes[1..4]); + let slice_end = slice_start + slice_len; + trace!(" {:?}", &bytes[slice_start..slice_end]); + + let bao_hashes = bytes + .chunks_exact(bao::HASH_SIZE) + .map(BaoHash::try_from) + .collect::>>()?; + + Ok(bao_hashes) } -#[allow(unused_variables)] -fn remove_dir_catalogs(path: PathBuf, file: PathBuf) -> io::Result<()> { - for entry in fs::read_dir(path)? { - trace!("Delete CATALOG File at {:?}", entry); - fs::remove_file(entry?.path())?; +pub async fn delete_file(pk: &Secp256k1PubKey) -> Result<()> { + let ss = node_shared_secret(&pk.into_inner())?.secret_bytes(); + let write_pk = PublicKey::from_secret_key_global(&SecretKey::from_slice(&ss)?); + let write_pk_str = write_pk.to_string(); + trace!("WRITE_PK_STR: {}", write_pk_str); + + for vol in &SYS_CFG.volumes { + trace!("VOLUME PATH: {:?}", vol.path); + + let pk_path = vol.path.join(&write_pk_str); + let is_removed = fs::remove_dir_all(pk_path).is_ok(); + trace!( + "VOLUME_{:?} WRITE_PK_STR REMOVED {:?}: ", + vol.path, + is_removed + ); } Ok(()) } - -// fn remove_dir_segements>(path: P, seg_file: PathBuf) -> io::Result<()> { -// trace!(">>> remove_Segment_contents"); -// for entry in fs::read_dir(path)? { -// let entry = entry?; -// trace!("ENTRY Delete SEGMENT File at {:?}", entry); - -// match &entry { -// seg_file => { -// fs::remove_file(seg_file.path())?; -// trace!("Delete Segment File at {:?}", seg_file); -// } -// } -// } -// Ok(()) -// } - -// fn remove_dir_catalogs(path: PathBuf, file: PathBuf) -> io::Result<()> { -// for entry in fs::read_dir(path)? { -// let entry = entry?; -// trace!("ENTRY Delete CATALOG File at {:?}", entry); -// match &entry { -// file => { -// fs::remove_file(file.path())?; -// trace!("FILE MATCH Delete CATALOG File at {:?}", file); -// } -// } -// } -// Ok(()) -// } diff --git a/src/frontend/http.rs b/src/frontend/http.rs index 6cc5262..bb36f46 100644 --- a/src/frontend/http.rs +++ b/src/frontend/http.rs @@ -3,7 +3,7 @@ use std::{net::SocketAddr, str::FromStr}; use anyhow::Result; use axum::{ body::StreamBody, - extract::{BodyStream, Path}, + extract::{BodyStream, Path, Query}, http::StatusCode, response::{IntoResponse, Response}, routing::{delete, get, post}, @@ -16,11 +16,33 @@ use secp256k1::PublicKey; use tower_http::cors::CorsLayer; use crate::{ - backend::fs::{delete_file, read_file, write_file, FileStream}, + backend::fs::{delete_file, read_file, read_slice, write_file, FileStream}, config::{node_shared_secret, SYS_CFG}, prelude::*, }; +struct FileSlice { + //#[serde(default, deserialize_with = "empty_string_as_none")] + pk: String, + black3_hash: String, + index_start: usize, + range_end: usize, +} + +/// Serde deserialization decorator to map empty Strings to None, +// fn empty_string_as_none<'de, D, T>(de: D) -> Result, D::Error> +// where +// D: Deserializer<'de>, +// T: FromStr, +// T::Err: fmt::Display, +// { +// let opt = Option::::deserialize(de)?; +// match opt.as_deref() { +// None | Some("") => Ok(None), +// Some(s) => FromStr::from_str(s).map_err(de::Error::custom).map(Some), +// } +// } + #[axum_macros::debug_handler] async fn post_file( Path(pk): Path, @@ -69,13 +91,32 @@ async fn get_file( Ok((StatusCode::OK, StreamBody::new(file_stream))) } +// #[axum_macros::debug_handler] +// //async fn get_slice(Query(my_params): Query) -> Result { +// async fn get_slice(Query(my_params): Query) -> Result { +// // let pk = my_params.black3_hash; +// // let blake3_hash = my_params.black3_hash; +// // let start_index = my_params.index_start; +// // let range_end = my_params.range_end; +// // debug!("my_params :: blake {:?} ", my_params.black3_hash); +// // debug!("my_params :: start {:?} ", my_params.index_start); +// // debug!("my_params :: end {:?} ", my_params.range_end); +// let file_stream = read_slices( +// my_params.pk, +// my_params.black3_hash, +// my_params.index_start, +// my_params.range_end, +// ) +// .await?; +// Ok((StatusCode::OK, StreamBody::new(file_stream))) +// } + #[axum_macros::debug_handler] -async fn remove_file( - Path((pk, blake3_hash)): Path<(String, String)>, -) -> Result { +async fn remove_file(Path(pk): Path) -> Result { let pk = Secp256k1PubKey::try_from(pk.as_str())?; - delete_file(pk, blake3_hash.as_bytes())?; - Ok((StatusCode::OK, blake3_hash)) + let del = delete_file(&pk).await.is_ok(); + + Ok((StatusCode::OK, del.to_string())) } async fn key(Path(pk): Path) -> Result { @@ -89,9 +130,10 @@ async fn key(Path(pk): Path) -> Result { pub async fn start() -> Result<()> { let app = Router::new() - .route("/remove/:pk/:blake3_hash", delete(remove_file)) + .route("/remove/:blake3_hash", delete(remove_file)) .route("/store/:pk", post(post_file)) .route("/retrieve/:pk/:blake3_hash", get(get_file)) + // .route("/slice/", get(get_slice)) .route("/key/:pk", get(key)) // .route("/catalog/:blake3_hash", get(get_catalog)) // .route("/raw/:bao_hash", get(get_raw)) diff --git a/src/structs.rs b/src/structs.rs index f92ac78..354fb65 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -15,6 +15,16 @@ impl fmt::Display for Blake3Hash { } } +impl TryFrom<&[u8]> for Blake3Hash { + type Error = Error; + + fn try_from(value: &[u8]) -> Result { + let mut hash = [0_u8; 32]; + hash.copy_from_slice(&value[0..32]); + Ok(Self(blake3::Hash::try_from(hash)?)) + } +} + pub struct BaoHash(pub bao::Hash); impl BaoHash { diff --git a/tests/.DS_Store b/tests/.DS_Store deleted file mode 100644 index c745045..0000000 Binary files a/tests/.DS_Store and /dev/null differ diff --git a/tests/file.rs b/tests/file.rs index cfa4fb3..d1a2d93 100644 --- a/tests/file.rs +++ b/tests/file.rs @@ -4,9 +4,9 @@ use anyhow::Result; use axum::body::Bytes; use bytes::BytesMut; use carbonado_node::{ - backend::fs::{read_file, write_file, FileStream}, - config::node_shared_secret, - prelude::SEGMENT_SIZE, + backend::fs::{delete_file, read_file, read_slice, write_file, FileStream}, + config::{node_shared_secret, SYS_CFG}, + prelude::{CATALOG_DIR, SEGMENT_DIR, SEGMENT_SIZE}, structs::Secp256k1PubKey, }; use futures_util::{stream, StreamExt, TryStreamExt}; @@ -80,54 +80,122 @@ async fn write_read() -> Result<()> { async fn read_write_delete_file() -> Result<()> { carbonado::utils::init_logging(RUST_LOG); - info!("Write Delete:: Reading file bytes"); + // write file to test delete + let (_sk, pk) = generate_keypair(&mut thread_rng()); + let file_bytes = fs::read("tests/samples/cat.gif")?; debug!("{} Write Delete:: bytes read", file_bytes.len()); - let file_stream = stream::iter(file_bytes.clone()) + let file_stream = stream::iter(file_bytes) .chunks(1024 * 1024) .map(|chunk| Ok(Bytes::from(chunk))) .boxed(); - // first file to write - let (_sk, pk) = generate_keypair(&mut thread_rng()); + info!("Write Delete:: Writing file if not exists in order to test delete"); + let final_blake3_hash = write_file(&Secp256k1PubKey(pk), file_stream).await?; - // info!("Write Delete:: Writing file if not exists in order to test delete"); - let file_did_write = write_file(&Secp256k1PubKey(pk), file_stream).await.is_ok(); + info!( + "File To Delete as blake3_hash:: {} ", + final_blake3_hash.to_string() + ); - if file_did_write { - info!( - "Write File Group One to Delete File as blake3_hash:: {} ", - file_did_write.to_string() + let ss = node_shared_secret(&Secp256k1PubKey(pk).into_inner())?.secret_bytes(); + let write_pk = PublicKey::from_secret_key_global(&SecretKey::from_slice(&ss)?); + let write_pk_str = write_pk.to_string(); + + // Check number of catalog files + let mut current_volume = -1; // start for volume 0 + for vol in &SYS_CFG.volumes { + current_volume += 1; + let seg_file = &vol.path.join(&write_pk_str).join(CATALOG_DIR); + + let paths = fs::read_dir(seg_file).unwrap(); + let mut counter = 0; + for path in paths { + counter += 1; + debug!( + "Catalog count: {:?} :: path: {}", + counter, + path.unwrap().path().display() + ) + } + debug!( + "CATALOGS Volume: {}, total deleted: {:?}", + current_volume, counter ); } - // second file to write + // // Check number of segment files + let mut current_volume = -1; // start for volume 0 + for vol in &SYS_CFG.volumes { + current_volume += 1; + let seg_file = &vol.path.join(&write_pk_str).join(SEGMENT_DIR); + + let paths = fs::read_dir(seg_file).unwrap(); + let mut counter = 0; + for path in paths { + counter += 1; + debug!( + "Segment count: {:?} :: path: {}", + counter, + path.unwrap().path().display() + ) + } + debug!( + "SEGMENT Volume: {}, total deleted: {:?}", + current_volume, counter + ); + } + + // Delete Files for blake3_hash + let new_file_bytes = delete_file(&Secp256k1PubKey(pk)).await.is_ok(); + debug!("Deleted files success:: {:?}", new_file_bytes); + + info!("Write/Delete test finished successfully!"); + + Ok(()) +} + +#[tokio::test] +async fn read_slices() -> Result<()> { + carbonado::utils::init_logging(RUST_LOG); + + // write file to test delete let (_sk, pk) = generate_keypair(&mut thread_rng()); + let file_bytes = fs::read("tests/samples/cat.gif")?; + debug!("{} Write Delete:: bytes read", file_bytes.len()); + let file_stream = stream::iter(file_bytes) .chunks(1024 * 1024) .map(|chunk| Ok(Bytes::from(chunk))) .boxed(); info!("Write Delete:: Writing file if not exists in order to test delete"); - let blake3_hash = write_file(&Secp256k1PubKey(pk), file_stream).await.is_ok(); + let final_blake3_hash = write_file(&Secp256k1PubKey(pk), file_stream).await?; - if blake3_hash { - info!( - "Write File in Group Two to Delete File as blake3_hash:: {} ", - blake3_hash.to_string() - ); - } + info!( + "File To Delete as blake3_hash:: {} ", + final_blake3_hash.to_string() + ); - // TODO: This is not how you delete files - // let new_file_bytes = delete_file(Secp256k1PubKey(pk), &file_bytes).is_err(); - // debug!("Write Delete:: deleted file:: {:?}", new_file_bytes); + // let slice_start = 65536; + // let slice_len = 8192; - // TODO: Check number of files + // get slice of only 1 bye + let slice_start = 0; + let slice_len = 150; - debug!(" >>>> Public Key Generated :: {:?} :: {}", _sk, pk); - info!("Write/Delete test finished successfully!"); + let new_file_bytes = read_slice( + &Secp256k1PubKey(pk), + &final_blake3_hash, + slice_start, + slice_len, + ) + .is_ok(); + debug!("GOT SLICE OF CATALOG FILE success:: {}", new_file_bytes); + + info!("Get/Slice test finished successfully!"); Ok(()) }