diff --git a/Cargo.lock b/Cargo.lock index ace16593b..45b1a7c04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -53,6 +64,21 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.18" @@ -103,6 +129,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -222,6 +257,12 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64-simd" version = "0.8.0" @@ -322,6 +363,15 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "brk" version = "0.0.6" @@ -343,6 +393,7 @@ name = "brk_cli" version = "0.0.6" dependencies = [ "brk_computer", + "brk_core", "brk_exit", "brk_indexer", "brk_logger", @@ -464,6 +515,7 @@ dependencies = [ "derive_deref", "serde", "serde_json", + "serde_with", "tabled", ] @@ -473,19 +525,24 @@ version = "0.0.6" dependencies = [ "axum", "brk_computer", + "brk_core", "brk_exit", "brk_indexer", "brk_logger", "brk_parser", "brk_query", "brk_vec", + "clap", "color-eyre", "jiff", "log", + "minreq", "oxc", + "serde", "serde_json", "tokio", "tower-http", + "zip", ] [[package]] @@ -554,6 +611,25 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a4516a8561bff0598c45512f90ee04ed62cee2cb36839e650a0a0704d5f741f" +[[package]] +name = "bzip2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +dependencies = [ + "bzip2-sys", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "castaway" version = "0.2.3" @@ -586,6 +662,29 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.5.31" @@ -679,12 +778,48 @@ version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea0095f6103c2a8b44acd6fd15960c801dafebf02e21940360833e0673f48ba7" +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cow-utils" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -760,6 +895,16 @@ version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "ctrlc" version = "3.4.5" @@ -770,6 +915,41 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.99", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.99", +] + [[package]] name = "dashmap" version = "6.1.0" @@ -784,6 +964,33 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "deflate64" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + [[package]] name = "derive_deref" version = "1.1.1" @@ -795,6 +1002,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + [[package]] name = "double-ended-peekable" version = "0.1.0" @@ -961,6 +1190,16 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.15" @@ -996,6 +1235,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.5" @@ -1017,6 +1262,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hex-conservative" version = "0.2.1" @@ -1032,6 +1283,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" +[[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 = "1.2.0" @@ -1119,12 +1379,52 @@ dependencies = [ "tower-service", ] +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "indenter" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.7.1" @@ -1133,6 +1433,16 @@ checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", ] [[package]] @@ -1203,13 +1513,23 @@ dependencies = [ "libc", ] +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "jsonrpc" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3662a38d341d77efecb73caf01420cfa5aa63c0253fd7bc05289ef9f6616e1bf" dependencies = [ - "base64", + "base64 0.13.1", "minreq", "serde", "serde_json", @@ -1243,6 +1563,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + [[package]] name = "log" version = "0.4.26" @@ -1279,6 +1605,16 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + [[package]] name = "matchit" version = "0.8.4" @@ -1378,6 +1714,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.46" @@ -1457,7 +1799,7 @@ dependencies = [ "owo-colors 4.2.0", "oxc-miette-derive", "textwrap", - "thiserror", + "thiserror 1.0.69", "unicode-width", ] @@ -1825,6 +2167,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1838,7 +2190,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 2.7.1", ] [[package]] @@ -1916,6 +2268,12 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -2288,6 +2646,47 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -2312,6 +2711,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simdutf8" version = "0.1.5" @@ -2370,6 +2775,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "1.0.109" @@ -2452,7 +2863,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -2466,6 +2886,17 @@ dependencies = [ "syn 2.0.99", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -2476,6 +2907,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tokio" version = "1.43.0" @@ -2545,7 +3007,7 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -2641,6 +3103,12 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + [[package]] name = "unicode-id-start" version = "1.3.1" @@ -2706,6 +3174,12 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f54a172d0620933a27a4360d3db3e2ae0dd6cceae9730751a036bbf182c4b23" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "vsimd" version = "0.8.0" @@ -2727,12 +3201,85 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.99", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + [[package]] name = "webpki-roots" version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-sys" version = "0.52.0" @@ -2880,6 +3427,69 @@ dependencies = [ "syn 2.0.99", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "zip" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b280484c454e74e5fff658bbf7df8fdbe7a07c6b2de4a53def232c15ef138f3a" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "deflate64", + "displaydoc", + "flate2", + "hmac", + "indexmap 2.7.1", + "lzma-rs", + "memchr", + "pbkdf2", + "rand", + "sha1", + "thiserror 2.0.12", + "time", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + [[package]] name = "zstd" version = "0.13.3" diff --git a/README.md b/README.md index 704b357c7..4f7795bda 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Heartfelt thanks go out to every donor on [Nostr](https://primal.net/p/npub1jagm *Soon™* -If you'd like to have your own instance hosted for you please contact [tranche.dent-9o@icloud.com](mailto:tranche.dent-9o@icloud.com). +If you'd like to have your own instance hosted for you please contact [hosting@bitcoinresearchkit.org](mailto:hosting@bitcoinresearchkit.org). - Separate dedicated servers using different ISPs and Cloudflare for maximum availability - Optional `*.bitcoinresearchkit.org`, `*.kibo.money` and `*.satonomics.xyz` subdomains diff --git a/crates/brk/src/lib.rs b/crates/brk/src/lib.rs index c4ce77e1e..30046f602 100644 --- a/crates/brk/src/lib.rs +++ b/crates/brk/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!(concat!("../", env!("CARGO_PKG_README")))] #[cfg(feature = "core")] diff --git a/crates/brk_cli/Cargo.toml b/crates/brk_cli/Cargo.toml index 417c11dbd..db7455ee8 100644 --- a/crates/brk_cli/Cargo.toml +++ b/crates/brk_cli/Cargo.toml @@ -8,6 +8,7 @@ repository.workspace = true [dependencies] brk_computer = { workspace = true } +brk_core = { workspace = true } brk_exit = { workspace = true } brk_indexer = { workspace = true } brk_logger = { workspace = true } diff --git a/crates/brk_cli/src/main.rs b/crates/brk_cli/src/main.rs index a7a944c65..74f78ee9c 100644 --- a/crates/brk_cli/src/main.rs +++ b/crates/brk_cli/src/main.rs @@ -1,8 +1,6 @@ -use std::{ - fs, - path::{Path, PathBuf}, -}; +use std::fs; +use brk_core::{path_dot_brk, path_dot_brk_log}; use brk_query::Params as QueryArgs; use clap::{Parser, Subcommand}; use query::query; @@ -32,7 +30,7 @@ fn main() -> color_eyre::Result<()> { fs::create_dir_all(path_dot_brk())?; - brk_logger::init(Some(&path_log())); + brk_logger::init(Some(&path_dot_brk_log())); let cli = Cli::parse(); @@ -41,12 +39,3 @@ fn main() -> color_eyre::Result<()> { Commands::Query(args) => query(args), } } - -pub fn path_dot_brk() -> PathBuf { - let home = std::env::var("HOME").unwrap(); - Path::new(&home).join(".brk") -} - -pub fn path_log() -> PathBuf { - path_dot_brk().join("log") -} diff --git a/crates/brk_cli/src/query.rs b/crates/brk_cli/src/query.rs index 2ed28188d..fd90148c9 100644 --- a/crates/brk_cli/src/query.rs +++ b/crates/brk_cli/src/query.rs @@ -33,7 +33,7 @@ pub fn query(params: QueryParams) -> color_eyre::Result<()> { "{}", match res { Output::Json(v) => match v { - Value::Single(v) => v.to_string(), + Value::Single(v) => v.to_string().replace("\"", ""), v => { let v = match v { Value::Single(_) => unreachable!("Already processed"), diff --git a/crates/brk_cli/src/run.rs b/crates/brk_cli/src/run.rs index ea46651f1..7a416f74d 100644 --- a/crates/brk_cli/src/run.rs +++ b/crates/brk_cli/src/run.rs @@ -6,17 +6,16 @@ use std::{ }; use brk_computer::Computer; +use brk_core::path_dot_brk; use brk_exit::Exit; use brk_indexer::Indexer; use brk_parser::rpc::{self, Auth, Client, RpcApi}; -use brk_server::tokio; +use brk_server::{Frontend, tokio}; use clap::{Parser, ValueEnum}; use color_eyre::eyre::eyre; use log::info; use serde::{Deserialize, Serialize}; -use crate::path_dot_brk; - pub fn run(config: RunConfig) -> color_eyre::Result<()> { let config = RunConfig::import(Some(config))?; @@ -40,10 +39,11 @@ pub fn run(config: RunConfig) -> color_eyre::Result<()> { .block_on(async { let served_indexer = indexer.clone(); let served_computer = computer.clone(); + let frontend = config.frontend(); - let handle = if config.serve() { + let server = if config.serve() { Some(tokio::spawn(async move { - brk_server::main(served_indexer, served_computer) + brk_server::main(served_indexer, served_computer, frontend) .await .unwrap(); })) @@ -73,9 +73,10 @@ pub fn run(config: RunConfig) -> color_eyre::Result<()> { } } - if let Some(handle) = handle { + if let Some(handle) = server { handle.await.unwrap(); } + Ok(()) }) } @@ -94,6 +95,10 @@ pub struct RunConfig { #[arg(short, long)] mode: Option, + /// Frontend served by the server (if active), default: kibo.money, saved + #[arg(short, long)] + frontend: Option, + /// Bitcoin RPC ip, default: localhost, saved #[arg(long, value_name = "IP")] rpcconnect: Option, @@ -142,6 +147,10 @@ impl RunConfig { config_saved.mode = Some(mode); } + if let Some(frontend) = config_args.frontend.take() { + config_saved.frontend = Some(frontend); + } + if let Some(rpcconnect) = config_args.rpcconnect.take() { config_saved.rpcconnect = Some(rpcconnect); } @@ -182,6 +191,7 @@ impl RunConfig { // info!(" bitcoindir: {:?}", config.bitcoindir); // info!(" brkdir: {:?}", config.brkdir); // info!(" mode: {:?}", config.mode); + // info!(" frontend: {:?}", config.frontend); // info!(" rpcconnect: {:?}", config.rpcconnect); // info!(" rpcport: {:?}", config.rpcport); // info!(" rpccookiefile: {:?}", config.rpccookiefile); @@ -334,6 +344,10 @@ impl RunConfig { fix("~").unwrap_or_else(|| fix("$HOME").unwrap_or_else(|| PathBuf::from(&path))) } + + pub fn frontend(&self) -> Frontend { + self.frontend.unwrap_or_default() + } } #[derive( diff --git a/crates/brk_computer/src/lib.rs b/crates/brk_computer/src/lib.rs index b55c9d1de..8d877a368 100644 --- a/crates/brk_computer/src/lib.rs +++ b/crates/brk_computer/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] diff --git a/crates/brk_core/src/lib.rs b/crates/brk_core/src/lib.rs index 3ef0e86c4..2c5951430 100644 --- a/crates/brk_core/src/lib.rs +++ b/crates/brk_core/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] mod error; diff --git a/crates/brk_core/src/utils/mod.rs b/crates/brk_core/src/utils/mod.rs index cddefd60c..189d0b677 100644 --- a/crates/brk_core/src/utils/mod.rs +++ b/crates/brk_core/src/utils/mod.rs @@ -1,5 +1,7 @@ +mod paths; mod pause; mod rlimit; +pub use paths::*; pub use pause::*; pub use rlimit::*; diff --git a/crates/brk_core/src/utils/paths.rs b/crates/brk_core/src/utils/paths.rs new file mode 100644 index 000000000..41564a38d --- /dev/null +++ b/crates/brk_core/src/utils/paths.rs @@ -0,0 +1,10 @@ +use std::path::{Path, PathBuf}; + +pub fn path_dot_brk() -> PathBuf { + let home = std::env::var("HOME").unwrap(); + Path::new(&home).join(".brk") +} + +pub fn path_dot_brk_log() -> PathBuf { + path_dot_brk().join("log") +} diff --git a/crates/brk_exit/src/lib.rs b/crates/brk_exit/src/lib.rs index 1d4208c4f..d574cf433 100644 --- a/crates/brk_exit/src/lib.rs +++ b/crates/brk_exit/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] use std::{ diff --git a/crates/brk_fetcher/src/lib.rs b/crates/brk_fetcher/src/lib.rs index db4a75cdc..c6620c943 100644 --- a/crates/brk_fetcher/src/lib.rs +++ b/crates/brk_fetcher/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] diff --git a/crates/brk_indexer/src/lib.rs b/crates/brk_indexer/src/lib.rs index e04a4c6b5..25c032756 100644 --- a/crates/brk_indexer/src/lib.rs +++ b/crates/brk_indexer/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] @@ -55,6 +54,7 @@ impl Indexer { } /// Do NOT import multiple times are things will break !!! + /// Clone struct instead pub fn import_stores(&mut self) -> color_eyre::Result<()> { self.stores = Some(Stores::import(&self.path.join("stores"))?); Ok(()) diff --git a/crates/brk_logger/src/lib.rs b/crates/brk_logger/src/lib.rs index e3bebbc6f..cbcb0d7ac 100644 --- a/crates/brk_logger/src/lib.rs +++ b/crates/brk_logger/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] diff --git a/crates/brk_parser/src/lib.rs b/crates/brk_parser/src/lib.rs index 37e3ce50e..a25723f90 100644 --- a/crates/brk_parser/src/lib.rs +++ b/crates/brk_parser/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] diff --git a/crates/brk_query/Cargo.toml b/crates/brk_query/Cargo.toml index ecbc4772b..068f56748 100644 --- a/crates/brk_query/Cargo.toml +++ b/crates/brk_query/Cargo.toml @@ -15,4 +15,5 @@ color-eyre = { workspace = true } derive_deref = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +serde_with = "3.12.0" tabled = { workspace = true } diff --git a/crates/brk_query/src/lib.rs b/crates/brk_query/src/lib.rs index e563e199b..3536cbacd 100644 --- a/crates/brk_query/src/lib.rs +++ b/crates/brk_query/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] diff --git a/crates/brk_query/src/params.rs b/crates/brk_query/src/params.rs index 672cc7891..31040e279 100644 --- a/crates/brk_query/src/params.rs +++ b/crates/brk_query/src/params.rs @@ -1,20 +1,27 @@ use clap::{Parser, builder::PossibleValuesParser}; use serde::Deserialize; +use serde_with::{OneOrMany, formats::PreferOne, serde_as}; use crate::{Format, Index}; +#[serde_as] #[derive(Debug, Deserialize, Parser)] pub struct Params { #[clap(short, long, value_parser = PossibleValuesParser::new(Index::all_possible_values()))] + #[serde(alias = "i")] /// Index of the values requested pub index: String, #[clap(short, long, value_delimiter = ' ', num_args = 1..)] + #[serde(alias = "v")] + #[serde_as(as = "OneOrMany<_, PreferOne>")] /// Names of the values requested pub values: Vec, #[clap(short, long, allow_hyphen_values = true)] + #[serde(alias = "f")] /// Inclusive starting index, if negative will be from the end pub from: Option, #[clap(short, long, allow_hyphen_values = true)] + #[serde(default, alias = "t")] /// Inclusive ending index, if negative will be from the end pub to: Option, #[clap(long)] diff --git a/crates/brk_query/src/table.rs b/crates/brk_query/src/table.rs index 0de9f6c6a..ef3b4da9c 100644 --- a/crates/brk_query/src/table.rs +++ b/crates/brk_query/src/table.rs @@ -14,7 +14,10 @@ impl Tabled for Vec> { let len = first.len(); (0..len).for_each(|index| { - builder.push_record(self.iter().map(|vec| vec.get(index).unwrap().to_string())); + builder.push_record( + self.iter() + .map(|vec| vec.get(index).unwrap().to_string().replace("\"", "")), + ); }); } diff --git a/crates/brk_server/Cargo.toml b/crates/brk_server/Cargo.toml index e449674c0..fc9960b7e 100644 --- a/crates/brk_server/Cargo.toml +++ b/crates/brk_server/Cargo.toml @@ -10,15 +10,20 @@ repository.workspace = true axum = "0.8.1" brk_computer = { workspace = true } brk_exit = { workspace = true } +brk_core = { workspace = true } brk_indexer = { workspace = true } brk_logger = { workspace = true } brk_parser = { workspace = true } brk_query = { workspace = true } brk_vec = { workspace = true } +clap = { workspace = true } color-eyre = { workspace = true } jiff = { workspace = true } log = { workspace = true } +minreq = { workspace = true } oxc = { version = "0.54.0", features = ["codegen", "minifier"] } +serde = { workspace = true } serde_json = { workspace = true } tokio = { version = "1.43.0", features = ["full"] } tower-http = { version = "0.6.2", features = ["compression-full"] } +zip = "2.2.3" diff --git a/crates/brk_server/examples/main.rs b/crates/brk_server/examples/main.rs index f7524ae0b..b0f383ee0 100644 --- a/crates/brk_server/examples/main.rs +++ b/crates/brk_server/examples/main.rs @@ -7,6 +7,7 @@ use brk_parser::{ Parser, rpc::{self, RpcApi}, }; +use brk_server::Frontend; use log::info; pub fn main() -> color_eyre::Result<()> { @@ -14,6 +15,8 @@ pub fn main() -> color_eyre::Result<()> { brk_logger::init(Some(Path::new(".log"))); + let process = false; + let bitcoin_dir = Path::new("../../../bitcoin"); let rpc = Box::leak(Box::new(rpc::Client::new( "http://localhost:8332", @@ -40,29 +43,33 @@ pub fn main() -> color_eyre::Result<()> { let served_indexer = indexer.clone(); let served_computer = computer.clone(); - tokio::spawn(async move { - brk_server::main(served_indexer, served_computer) + let server = tokio::spawn(async move { + brk_server::main(served_indexer, served_computer, Frontend::KiboMoney) .await .unwrap(); }); - loop { - let block_count = rpc.get_block_count()?; + if process { + loop { + let block_count = rpc.get_block_count()?; - info!("{block_count} blocks found."); + info!("{block_count} blocks found."); - let starting_indexes = indexer.index(&parser, rpc, &exit)?; + let starting_indexes = indexer.index(&parser, rpc, &exit)?; - computer.compute(&mut indexer, starting_indexes, &exit)?; + computer.compute(&mut indexer, starting_indexes, &exit)?; - info!("Waiting for new blocks..."); + info!("Waiting for new blocks..."); - while block_count == rpc.get_block_count()? { - sleep(Duration::from_secs(1)) + while block_count == rpc.get_block_count()? { + sleep(Duration::from_secs(1)) + } } } #[allow(unreachable_code)] + server.await.unwrap(); + Ok(()) }) as color_eyre::Result<()> } diff --git a/crates/brk_server/src/api/vecs/dts.rs b/crates/brk_server/src/api/vecs/dts.rs index 4324a21a8..ba1dc779f 100644 --- a/crates/brk_server/src/api/vecs/dts.rs +++ b/crates/brk_server/src/api/vecs/dts.rs @@ -1,21 +1,34 @@ -use std::{fs, io}; +use std::{fs, io, path::Path}; use brk_query::{Index, Query}; -use crate::WEBSITE_DEV_PATH; +use crate::Frontend; + +const SCRIPTS: &str = "scripts"; +const TPYES: &str = "types"; #[allow(clippy::upper_case_acronyms)] pub trait DTS { - fn generate_dts_file(&self) -> io::Result<()>; + fn generate_dts_file(&self, frontend: Frontend, websites_path: &Path) -> io::Result<()>; } impl DTS for Query<'static> { - fn generate_dts_file(&self) -> io::Result<()> { - if !fs::exists(WEBSITE_DEV_PATH)? { + fn generate_dts_file(&self, frontend: Frontend, websites_path: &Path) -> io::Result<()> { + if frontend.is_none() { return Ok(()); } - let path = format!("{WEBSITE_DEV_PATH}/scripts/types/vecid-to-indexes.d.ts"); + let path = websites_path.join(frontend.to_folder_name()); + + if !fs::exists(&path)? { + return Ok(()); + } + + let path = path.join(SCRIPTS).join(TPYES); + + fs::create_dir_all(&path)?; + + let path = path.join(Path::new("vecid-to-indexes.d.ts")); let mut contents = Index::all() .into_iter() @@ -26,22 +39,24 @@ impl DTS for Query<'static> { contents += "\n\ninterface VecIdToIndexes {\n"; - self.vecid_to_index_to_vec.iter().for_each(|(id, index_to_vec)| { - let indexes = index_to_vec - .keys() - .map(|i| i.to_string()) - .collect::>() - .join(", "); + self.vecid_to_index_to_vec + .iter() + .for_each(|(id, index_to_vec)| { + let indexes = index_to_vec + .keys() + .map(|i| i.to_string()) + .collect::>() + .join(", "); - contents += &format!( - " {}: [{indexes}]\n", - if id.contains("-") { - format!("\"{id}\"") - } else { - id.to_owned() - } - ); - }); + contents += &format!( + " {}: [{indexes}]\n", + if id.contains("-") { + format!("\"{id}\"") + } else { + id.to_owned() + } + ); + }); contents.push('}'); diff --git a/crates/brk_server/src/files/file.rs b/crates/brk_server/src/files/file.rs index 196f39033..ee26ccaa3 100644 --- a/crates/brk_server/src/files/file.rs +++ b/crates/brk_server/src/files/file.rs @@ -1,56 +1,73 @@ use std::{ fs::{self}, - path::{Path, PathBuf}, + path::Path, time::Instant, }; use axum::{ body::Body, - extract, + extract::{self, State}, http::{HeaderMap, StatusCode}, response::{IntoResponse, Response}, }; use log::{error, info}; use crate::{ - WEBSITE_DEV_PATH, log_result, + AppState, log_result, traits::{HeaderMapExtended, ModifiedState, ResponseExtended}, }; use super::minify::minify_js; -pub async fn file_handler(headers: HeaderMap, path: extract::Path) -> Response { - any_handler(headers, Some(path)) +pub async fn file_handler( + headers: HeaderMap, + State(app_state): State, + path: extract::Path, +) -> Response { + any_handler(headers, app_state, Some(path)) } -pub async fn index_handler(headers: HeaderMap) -> Response { - any_handler(headers, None) +pub async fn index_handler(headers: HeaderMap, State(app_state): State) -> Response { + any_handler(headers, app_state, None) } -fn any_handler(headers: HeaderMap, path: Option>) -> Response { +fn any_handler( + headers: HeaderMap, + app_state: AppState, + path: Option>, +) -> Response { + let website_path = app_state + .websites_path + .as_ref() + .expect("Should never reach here is websites_path is None") + .join(app_state.frontend.to_folder_name()); + let instant = Instant::now(); let response = if let Some(path) = path.as_ref() { let path = path.0.replace("..", "").replace("\\", ""); - let mut path = str_to_path(&path); + let mut path = website_path.join(&path); if !path.exists() { if path.extension().is_some() { - let mut response: Response = - (StatusCode::INTERNAL_SERVER_ERROR, "File doesn't exist".to_string()).into_response(); + let mut response: Response = ( + StatusCode::INTERNAL_SERVER_ERROR, + "File doesn't exist".to_string(), + ) + .into_response(); response.headers_mut().insert_cors(); return response; } else { - path = str_to_path("index.html"); + path = website_path.join("index.html"); } } path_to_response(&headers, &path) } else { - path_to_response(&headers, &str_to_path("index.html")) + path_to_response(&headers, &website_path.join("index.html")) }; log_result( @@ -66,7 +83,8 @@ fn path_to_response(headers: &HeaderMap, path: &Path) -> Response { match path_to_response_(headers, path) { Ok(response) => response, Err(error) => { - let mut response = (StatusCode::INTERNAL_SERVER_ERROR, error.to_string()).into_response(); + let mut response = + (StatusCode::INTERNAL_SERVER_ERROR, error.to_string()).into_response(); response.headers_mut().insert_cors(); @@ -116,7 +134,10 @@ fn path_to_response_(headers: &HeaderMap, path: &Path) -> color_eyre::Result color_eyre::Result PathBuf { - PathBuf::from(&format!("{WEBSITE_DEV_PATH}{path}")) -} diff --git a/crates/brk_server/src/files/frontend.rs b/crates/brk_server/src/files/frontend.rs new file mode 100644 index 000000000..a13db1f6c --- /dev/null +++ b/crates/brk_server/src/files/frontend.rs @@ -0,0 +1,30 @@ +use clap::ValueEnum; +use serde::{Deserialize, Serialize}; + +#[derive( + Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize, ValueEnum, +)] +pub enum Frontend { + None, + #[default] + KiboMoney, + Custom, +} + +impl Frontend { + pub fn is_none(&self) -> bool { + self == &Self::None + } + + pub fn is_some(&self) -> bool { + !self.is_none() + } + + pub fn to_folder_name(&self) -> &str { + match self { + Self::Custom => "custom", + Self::KiboMoney => "kibo.money", + Self::None => unreachable!(), + } + } +} diff --git a/crates/brk_server/src/files/mod.rs b/crates/brk_server/src/files/mod.rs index 9be3690de..bdac09df7 100644 --- a/crates/brk_server/src/files/mod.rs +++ b/crates/brk_server/src/files/mod.rs @@ -1,18 +1,25 @@ -use axum::{routing::get, Router}; +use axum::{Router, routing::get}; use super::AppState; mod file; +mod frontend; mod minify; use file::{file_handler, index_handler}; +pub use frontend::Frontend; pub trait FilesRoutes { - fn add_website_routes(self) -> Self; + fn add_website_routes(self, frontend: Frontend) -> Self; } impl FilesRoutes for Router { - fn add_website_routes(self) -> Self { - self.route("/{*path}", get(file_handler)).route("/", get(index_handler)) + fn add_website_routes(self, frontend: Frontend) -> Self { + if frontend.is_some() { + self.route("/{*path}", get(file_handler)) + .route("/", get(index_handler)) + } else { + self + } } } diff --git a/crates/brk_server/src/lib.rs b/crates/brk_server/src/lib.rs index d23e0fa25..432387d30 100644 --- a/crates/brk_server/src/lib.rs +++ b/crates/brk_server/src/lib.rs @@ -1,14 +1,19 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] #![doc = "```"] -use std::time::Instant; +use std::{ + fs, + io::Cursor, + path::{Path, PathBuf}, + time::Instant, +}; use api::{ApiRoutes, DTS}; use axum::{Json, Router, http::StatusCode, routing::get, serve}; use brk_computer::Computer; +use brk_core::path_dot_brk; use brk_indexer::Indexer; use brk_query::Query; use color_eyre::owo_colors::OwoColorize; @@ -22,21 +27,69 @@ mod api; mod files; mod traits; +pub use files::Frontend; + #[derive(Clone)] pub struct AppState { query: &'static Query<'static>, + frontend: Frontend, + websites_path: Option, } -pub const WEBSITE_DEV_PATH: &str = "../../websites/kibo.money/"; +const DEV_PATH: &str = "../.."; +const DOWNLOADS: &str = "downloads"; +const WEBSITES: &str = "websites"; -pub async fn main(indexer: Indexer, computer: Computer) -> color_eyre::Result<()> { +pub async fn main( + indexer: Indexer, + computer: Computer, + frontend: Frontend, +) -> color_eyre::Result<()> { let indexer = Box::leak(Box::new(indexer)); let computer = Box::leak(Box::new(computer)); let query = Box::leak(Box::new(Query::build(indexer, computer))); - query.generate_dts_file()?; + let websites_path = if frontend.is_some() { + let websites_dev_path = Path::new(DEV_PATH).join(WEBSITES); - let state = AppState { query }; + let websites_path = if fs::exists(&websites_dev_path)? { + websites_dev_path + } else { + let downloads_path = path_dot_brk().join(DOWNLOADS); + + let downloaded_websites_path = downloads_path.join("brk-main").join(WEBSITES); + + if !fs::exists(&downloaded_websites_path)? { + info!("Downloading websites from Github..."); + + // TODO + // Need to download versioned, this is only for testing ! + let url = "https://github.com/bitcoinresearchkit/brk/archive/refs/heads/main.zip"; + + let response = minreq::get(url).send()?; + let bytes = response.as_bytes(); + let cursor = Cursor::new(bytes); + + let mut zip = zip::ZipArchive::new(cursor)?; + + zip.extract(&downloads_path)?; + } + + downloaded_websites_path + }; + + query.generate_dts_file(frontend, websites_path.as_path())?; + + Some(websites_path) + } else { + None + }; + + let state = AppState { + query, + frontend, + websites_path, + }; let compression_layer = CompressionLayer::new() .br(true) @@ -46,7 +99,7 @@ pub async fn main(indexer: Indexer, computer: Computer) -> color_eyre::Result<() let router = Router::new() .add_api_routes() - .add_website_routes() + .add_website_routes(frontend) .route("/version", get(Json(env!("CARGO_PKG_VERSION")))) .with_state(state) .layer(compression_layer); diff --git a/crates/brk_vec/src/lib.rs b/crates/brk_vec/src/lib.rs index 52aaa7c77..9db9dbe63 100644 --- a/crates/brk_vec/src/lib.rs +++ b/crates/brk_vec/src/lib.rs @@ -1,4 +1,3 @@ -#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] #![doc = include_str!("../examples/main.rs")] diff --git a/websites/custom/index.html b/websites/custom/index.html new file mode 100644 index 000000000..b893898f6 --- /dev/null +++ b/websites/custom/index.html @@ -0,0 +1,31 @@ + + + + + Custom + + +

Infinite Code: A Digital Symphony

+ +

+ Unleash the inner coder within you and weave a tapestry of innovation in a + digital realm where every line of code becomes your palette. Picture an + endless HTML canvas, each tag an invitation to dream, every element a + window to possibilities. Let your JavaScript spirit soar like a dynamic + function—fluid yet unforgivingly creative—transforming mere logic into + animated expressions of art. And as you style your thoughts with CSS, each + hex color shines like a beacon of brilliance, every property a stroke of + imaginative genius. +

+ +

+ In this universe of web development, the DOM is your poetic playground, + where algorithms dance with beauty and creativity is written in the syntax + of tomorrow. Create without boundaries, let your code be as rich and + expansive as an infinite loop of passion, where every variable holds the + whisper of your inspiration, and every function unveils a new horizon of + digital artistry. The web is your canvas; the sky, a limitless expanse of + code. +

+ +