diff --git a/Cargo.lock b/Cargo.lock index bd4a829..705fc3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,37 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "abnf" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "087113bd50d9adce24850eed5d0476c7d199d532fce8fab5173650331e09033a" +dependencies = [ + "abnf-core", + "nom", +] + +[[package]] +name = "abnf-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c44e09c43ae1c368fb91a03a566472d0087c26cf7e1b9e8e289c14ede681dd7d" +dependencies = [ + "nom", +] + [[package]] name = "adler2" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + [[package]] name = "ahash" version = "0.7.8" @@ -28,6 +53,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -131,6 +162,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + [[package]] name = "async-broadcast" version = "0.7.2" @@ -155,6 +192,18 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.14.0" @@ -285,6 +334,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -297,6 +355,34 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base256emoji" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" +dependencies = [ + "const-str", + "match-lookup", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.7" @@ -309,6 +395,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bincode" version = "1.3.3" @@ -439,6 +531,17 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor 2.5.1", +] + [[package]] name = "brotli" version = "8.0.2" @@ -447,7 +550,17 @@ checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor", + "brotli-decompressor 5.0.0", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] @@ -460,6 +573,40 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "btree-range-map" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be5c9672446d3800bcbcaabaeba121fe22f1fb25700c4562b22faf76d377c33" +dependencies = [ + "btree-slab", + "cc-traits", + "range-traits", + "serde", + "slab", +] + +[[package]] +name = "btree-slab" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2b56d3029f075c4fa892428a098425b86cef5c89ae54073137ece416aef13c" +dependencies = [ + "cc-traits", + "slab", + "smallvec", +] + +[[package]] +name = "buf_redux" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" +dependencies = [ + "memchr", + "safemem", +] + [[package]] name = "bumpalo" version = "3.19.1" @@ -603,6 +750,15 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "cbor4ii" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" +dependencies = [ + "serde", +] + [[package]] name = "cc" version = "1.2.56" @@ -613,6 +769,15 @@ dependencies = [ "shlex", ] +[[package]] +name = "cc-traits" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060303ef31ef4a522737e1b1ab68c67916f2a787bb2f4f54f383279adba962b5" +dependencies = [ + "slab", +] + [[package]] name = "cesu8" version = "1.1.0" @@ -666,6 +831,53 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "chunked_transfer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cid" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" +dependencies = [ + "core2", + "multibase", + "multihash", + "serde", + "serde_bytes", + "unsigned-varint", +] + [[package]] name = "clap" version = "4.5.58" @@ -707,6 +919,15 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -729,6 +950,23 @@ dependencies = [ "memchr", ] +[[package]] +name = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + [[package]] name = "comrak" version = "0.50.0" @@ -762,6 +1000,18 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const-str" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" + [[package]] name = "convert_case" version = "0.4.0" @@ -778,6 +1028,26 @@ dependencies = [ "version_check", ] +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -801,7 +1071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ "bitflags 2.11.0", - "core-foundation", + "core-foundation 0.10.1", "core-graphics-types", "foreign-types", "libc", @@ -814,10 +1084,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ "bitflags 2.11.0", - "core-foundation", + "core-foundation 0.10.1", "libc", ] +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -836,6 +1115,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -857,6 +1142,18 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.7" @@ -939,6 +1236,67 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "data-encoding-macro" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8142a83c17aa9461d637e649271eae18bf2edd00e91f2e105df36c3c16355bdb" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" +dependencies = [ + "data-encoding", + "syn 2.0.116", +] + +[[package]] +name = "deflate" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" +dependencies = [ + "adler32", + "gzip-header", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.6" @@ -962,6 +1320,33 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", + "unicode-xid", +] + +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + [[package]] name = "digest" version = "0.10.7" @@ -969,7 +1354,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -1097,17 +1484,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] -name = "embed-resource" -version = "3.0.6" +name = "ecdsa" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pem-rfc7468", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" dependencies = [ "cc", "memchr", "rustc_version", "toml 0.9.12+spec-1.1.0", "vswhom", - "winreg", + "winreg 0.55.0", ] [[package]] @@ -1116,6 +1537,18 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "emojis" version = "0.8.0" @@ -1125,6 +1558,15 @@ dependencies = [ "phf 0.13.1", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "endi" version = "1.1.1" @@ -1137,6 +1579,18 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "enumflags2" version = "0.7.12" @@ -1283,6 +1737,16 @@ dependencies = [ "log", ] +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "field-offset" version = "0.3.6" @@ -1293,6 +1757,17 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1394,6 +1869,19 @@ dependencies = [ "new_debug_unreachable", ] +[[package]] +name = "futures-buffered" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin 0.10.0", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -1586,6 +2074,21 @@ dependencies = [ "x11", ] +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link 0.2.1", + "windows-result 0.4.1", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1594,6 +2097,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1624,8 +2128,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1635,9 +2141,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasip2", + "wasm-bindgen", ] [[package]] @@ -1766,6 +2274,34 @@ dependencies = [ "xkeysym", ] +[[package]] +name = "gloo-storage" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc8031e8c92758af912f9bc08fbbadd3c6f3cfcbf6b64cdf3d6a81f0139277a" +dependencies = [ + "gloo-utils", + "js-sys", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gobject-sys" version = "0.18.0" @@ -1777,6 +2313,17 @@ dependencies = [ "system-deps", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "gtk" version = "0.18.2" @@ -1829,6 +2376,34 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "gzip-header" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95cc527b92e6029a62960ad99aa8a6660faa4555fe5f731aab13aa6a921795a2" +dependencies = [ + "crc32fast", +] + +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" @@ -1840,6 +2415,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1849,6 +2433,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -1876,6 +2466,20 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin 0.9.8", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.4.1" @@ -1900,6 +2504,80 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + +[[package]] +name = "hickory-proto" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.8.5", + "thiserror 1.0.69", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror 1.0.69", + "tokio", + "tracing", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "html5ever" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" +dependencies = [ + "log", + "mac", + "markup5ever 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "html5ever" version = "0.29.1" @@ -1908,7 +2586,7 @@ checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", - "markup5ever", + "markup5ever 0.14.1", "match_token", ] @@ -1951,6 +2629,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.8.1" @@ -1961,6 +2645,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", + "h2", "http", "http-body", "httparse", @@ -1972,6 +2657,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + [[package]] name = "hyper-util" version = "0.1.20" @@ -1989,10 +2691,12 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -2184,6 +2888,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + [[package]] name = "infer" version = "0.19.0" @@ -2213,6 +2926,38 @@ dependencies = [ "libc", ] +[[package]] +name = "inventory" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ae045c87e7082cb72dab0ccd01ae075dd00141ddc108f43a0ea150a9e7227" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg 0.50.0", +] + +[[package]] +name = "ipld-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090f624976d72f0b0bb71b86d58dc16c15e069193067cb3a3a09d655246cbbda" +dependencies = [ + "cid", + "serde", + "serde_bytes", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -2261,18 +3006,210 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] -name = "javascriptcore-rs" -version = "1.1.2" +name = "jacquard" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +checksum = "f7c1fdbcf1153e6e6b87fde20036c1ffe7473c4852f1c6369bc4ef1fe47ccb9f" dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" + "bytes", + "getrandom 0.2.17", + "gloo-storage", + "http", + "jacquard-api", + "jacquard-common", + "jacquard-derive", + "jacquard-identity", + "jacquard-oauth", + "jose-jwk", + "miette", + "regex", + "regex-lite", + "reqwest 0.12.28", + "serde", + "serde_html_form", + "serde_json", + "smol_str", + "thiserror 2.0.18", + "tokio", + "trait-variant", + "url", + "webpage", +] + +[[package]] +name = "jacquard-api" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979fb1848c1dd7ac8fd12745bc71f56f6da61374407d5f9b06005467a954e5a" +dependencies = [ + "bon", + "bytes", + "jacquard-common", + "jacquard-derive", + "jacquard-lexicon", + "miette", + "rustversion", + "serde", + "serde_bytes", + "serde_ipld_dagcbor", + "thiserror 2.0.18", + "unicode-segmentation", +] + +[[package]] +name = "jacquard-common" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1751921e0bdae5e0077afade6161545e9ef7698306c868f800916e99ecbcaae9" +dependencies = [ + "base64 0.22.1", + "bon", + "bytes", + "chrono", + "cid", + "getrandom 0.2.17", + "getrandom 0.3.4", + "http", + "ipld-core", + "k256", + "langtag", + "miette", + "multibase", + "multihash", + "ouroboros", + "p256", + "postcard", + "rand 0.9.2", + "regex", + "regex-lite", + "reqwest 0.12.28", + "serde", + "serde_bytes", + "serde_html_form", + "serde_ipld_dagcbor", + "serde_json", + "signature", + "smol_str", + "thiserror 2.0.18", + "tokio", + "tokio-util", + "trait-variant", + "url", +] + +[[package]] +name = "jacquard-derive" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d73dfee07943fdab93569ed1c28b06c6921ed891c08b415c4a323ff67e593" +dependencies = [ + "heck 0.5.0", + "jacquard-lexicon", + "proc-macro2", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "jacquard-identity" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aaefa819fa4213cf59f180dba932f018a7cd0599582fd38474ee2a38c16cf2" +dependencies = [ + "bon", + "bytes", + "hickory-resolver", + "http", + "jacquard-api", + "jacquard-common", + "jacquard-lexicon", + "miette", + "mini-moka-wasm", + "n0-future", + "percent-encoding", + "reqwest 0.12.28", + "serde", + "serde_html_form", + "serde_json", + "thiserror 2.0.18", + "tokio", + "trait-variant", + "url", + "urlencoding", +] + +[[package]] +name = "jacquard-lexicon" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8411aff546569b0a1e0ef669bed2380cec1c00d48f02f3fcd57a71545321b3d8" +dependencies = [ + "cid", + "dashmap", + "heck 0.5.0", + "inventory", + "jacquard-common", + "miette", + "multihash", + "prettyplease", + "proc-macro2", + "quote", + "serde", + "serde_ipld_dagcbor", + "serde_json", + "serde_repr", + "serde_with", + "sha2", + "syn 2.0.116", + "thiserror 2.0.18", + "unicode-segmentation", +] + +[[package]] +name = "jacquard-oauth" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bf0b0e061d85b09cfa78588dc098918d5b62f539a719165c6a806a1d2c0ef2" +dependencies = [ + "base64 0.22.1", + "bytes", + "chrono", + "dashmap", + "elliptic-curve", + "http", + "jacquard-common", + "jacquard-identity", + "jose-jwa", + "jose-jwk", + "miette", + "p256", + "rand 0.8.5", + "rouille", + "serde", + "serde_html_form", + "serde_json", + "sha2", + "smol_str", + "thiserror 2.0.18", + "tokio", + "trait-variant", + "url", + "webbrowser", +] + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" @@ -2298,19 +3235,104 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.0", "log", "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link 0.2.1", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.116", +] + [[package]] name = "jni-sys" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.116", +] + +[[package]] +name = "jose-b64" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec69375368709666b21c76965ce67549f2d2db7605f1f8707d17c9656801b56" +dependencies = [ + "base64ct", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "jose-jwa" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ab78e053fe886a351d67cf0d194c000f9d0dcb92906eb34d853d7e758a4b3a7" +dependencies = [ + "serde", +] + +[[package]] +name = "jose-jwk" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280fa263807fe0782ecb6f2baadc28dffc04e00558a58e33bfdb801d11fd58e7" +dependencies = [ + "jose-b64", + "jose-jwa", + "p256", + "p384", + "rsa", + "serde", + "zeroize", +] + [[package]] name = "js-sys" version = "0.3.85" @@ -2343,6 +3365,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "sha2", +] + [[package]] name = "keyboard-types" version = "0.7.0" @@ -2381,16 +3415,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", - "html5ever", + "html5ever 0.29.1", "indexmap 2.13.0", "selectors", ] +[[package]] +name = "langtag" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecb4c689a30e48ebeaa14237f34037e300dd072e6ad21a9ec72e810ff3c6600" +dependencies = [ + "serde", + "static-regular-grammar", + "thiserror 1.0.69", +] + [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin 0.9.8", +] [[package]] name = "leb128fmt" @@ -2438,6 +3486,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + [[package]] name = "libredox" version = "0.1.12" @@ -2446,6 +3500,7 @@ checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ "bitflags 2.11.0", "libc", + "redox_syscall 0.7.3", ] [[package]] @@ -2467,9 +3522,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" @@ -2495,12 +3550,54 @@ dependencies = [ "value-bag", ] +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "markup5ever" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16ce3abbeba692c8b8441d036ef91aea6df8da2c6b6e21c7e14d3c18e526be45" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + [[package]] name = "markup5ever" version = "0.14.1" @@ -2515,6 +3612,29 @@ dependencies = [ "tendril", ] +[[package]] +name = "markup5ever_rcdom" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edaa21ab3701bfee5099ade5f7e1f84553fd19228cf332f13cd6e964bf59be18" +dependencies = [ + "html5ever 0.27.0", + "markup5ever 0.12.1", + "tendril", + "xml5ever", +] + +[[package]] +name = "match-lookup" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "match_token" version = "0.1.0" @@ -2526,6 +3646,15 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.10" @@ -2547,12 +3676,65 @@ dependencies = [ "autocfg", ] +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "cfg-if", + "miette-derive", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mini-moka-wasm" +version = "0.10.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0102b9a2ad50fa47ca89eead2316c8222285ecfbd3f69ce99564fbe4253866e8" +dependencies = [ + "crossbeam-channel", + "crossbeam-utils", + "dashmap", + "smallvec", + "tagptr", + "triomphe", + "web-time", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2606,6 +3788,68 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "multibase" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" +dependencies = [ + "base-x", + "base256emoji", + "data-encoding", + "data-encoding-macro", +] + +[[package]] +name = "multihash" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +dependencies = [ + "core2", + "serde", + "unsigned-varint", +] + +[[package]] +name = "multipart" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" +dependencies = [ + "buf_redux", + "httparse", + "log", + "mime", + "mime_guess", + "quick-error 1.2.3", + "rand 0.8.5", + "safemem", + "tempfile", + "twoway", +] + +[[package]] +name = "n0-future" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794" +dependencies = [ + "cfg_aliases", + "derive_more 1.0.0", + "futures-buffered", + "futures-lite", + "futures-util", + "js-sys", + "pin-project", + "send_wrapper", + "tokio", + "tokio-util", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + [[package]] name = "ndk" version = "0.9.0" @@ -2613,7 +3857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ "bitflags 2.11.0", - "jni-sys", + "jni-sys 0.3.0", "log", "ndk-sys", "num_enum", @@ -2633,7 +3877,7 @@ version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "jni-sys", + "jni-sys 0.3.0", ] [[package]] @@ -2648,6 +3892,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "notify" version = "8.2.0" @@ -2675,12 +3929,57 @@ dependencies = [ "bitflags 2.11.0", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-conv" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2688,6 +3987,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", ] [[package]] @@ -2995,6 +4305,52 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "ouroboros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.116", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "elliptic-curve", + "primeorder", +] + [[package]] name = "pango" version = "0.18.3" @@ -3044,7 +4400,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link 0.2.1", ] @@ -3055,6 +4411,15 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -3234,6 +4599,26 @@ dependencies = [ "siphasher 1.0.2", ] +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -3257,6 +4642,27 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -3316,6 +4722,19 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + [[package]] name = "potential_utf" version = "0.1.4" @@ -3356,6 +4775,15 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3424,6 +4852,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", + "version_check", + "yansi", +] + [[package]] name = "ptr_meta" version = "0.1.4" @@ -3454,18 +4895,79 @@ dependencies = [ ] [[package]] -name = "quick-error" -version = "2.0.1" +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2 0.6.2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] [[package]] -name = "quick-xml" -version = "0.38.4" +name = "quinn-udp" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ - "memchr", + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.2", + "tracing", + "windows-sys 0.60.2", ] [[package]] @@ -3514,6 +5016,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -3534,6 +5046,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -3552,6 +5074,15 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -3570,6 +5101,12 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "range-traits" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20581732dd76fa913c7dff1a2412b714afe3573e94d41c34719de73337cc8ab" + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -3585,6 +5122,15 @@ dependencies = [ "bitflags 2.11.0", ] +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags 2.11.0", +] + [[package]] name = "redox_users" version = "0.5.2" @@ -3639,6 +5185,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + [[package]] name = "regex-syntax" version = "0.8.9" @@ -3654,6 +5206,47 @@ dependencies = [ "bytecheck", ] +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] + [[package]] name = "reqwest" version = "0.13.2" @@ -3688,6 +5281,22 @@ dependencies = [ "web-sys", ] +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "rfd" version = "0.16.0" @@ -3712,6 +5321,20 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rkyv" version = "0.7.46" @@ -3741,6 +5364,50 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rouille" +version = "3.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3716fbf57fc1084d7a706adf4e445298d123e4a44294c4e8213caf1b85fcc921" +dependencies = [ + "base64 0.13.1", + "brotli 3.5.0", + "chrono", + "deflate", + "filetime", + "multipart", + "percent-encoding", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha1_smol", + "threadpool", + "time", + "tiny_http", + "url", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rsqlite-vfs" version = "0.1.0" @@ -3801,9 +5468,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags 2.11.0", "errno", @@ -3812,6 +5479,41 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -3824,6 +5526,12 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[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" @@ -3884,6 +5592,12 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -3896,6 +5610,20 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "selectors" version = "0.24.0" @@ -3904,7 +5632,7 @@ checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", "cssparser", - "derive_more", + "derive_more 0.99.20", "fxhash", "log", "phf 0.8.0", @@ -3924,6 +5652,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "serde" version = "1.0.228" @@ -3946,6 +5680,16 @@ dependencies = [ "typeid", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -3977,6 +5721,31 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "serde_html_form" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" +dependencies = [ + "form_urlencoded", + "indexmap 2.13.0", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "serde_ipld_dagcbor" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" +dependencies = [ + "cbor4ii", + "ipld-core", + "scopeguard", + "serde", +] + [[package]] name = "serde_json" version = "1.0.149" @@ -4019,6 +5788,18 @@ dependencies = [ "serde_core", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_with" version = "3.16.1" @@ -4095,6 +5876,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.9" @@ -4106,6 +5893,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shell-words" version = "1.1.1" @@ -4128,12 +5924,32 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + [[package]] name = "simdutf8" version = "0.1.5" @@ -4164,6 +5980,26 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smol_str" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" +dependencies = [ + "borsh", + "serde_core", +] + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "socket2" version = "0.6.2" @@ -4189,7 +6025,7 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "redox_syscall", + "redox_syscall 0.5.18", "tracing", "wasm-bindgen", "web-sys", @@ -4222,6 +6058,31 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlite-wasm-rs" version = "0.5.2" @@ -4240,6 +6101,32 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static-regular-grammar" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4a6c40247579acfbb138c3cd7de3dab113ab4ac6227f1b7de7d626ee667957" +dependencies = [ + "abnf", + "btree-range-map", + "ciborium", + "hex_fmt", + "indoc", + "proc-macro-error", + "proc-macro2", + "quote", + "serde", + "sha2", + "syn 2.0.116", + "thiserror 1.0.69", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.8.9" @@ -4271,6 +6158,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 = "swift-rs" version = "1.0.7" @@ -4346,6 +6239,27 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "6.2.2" @@ -4359,6 +6273,12 @@ dependencies = [ "version-compare", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tao" version = "0.34.5" @@ -4367,7 +6287,7 @@ checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ "bitflags 2.11.0", "block2", - "core-foundation", + "core-foundation 0.10.1", "core-graphics", "crossbeam-channel", "dispatch", @@ -4376,7 +6296,7 @@ dependencies = [ "gdkwayland-sys", "gdkx11-sys", "gtk", - "jni", + "jni 0.21.1", "lazy_static", "libc", "log", @@ -4439,7 +6359,7 @@ dependencies = [ "gtk", "heck 0.5.0", "http", - "jni", + "jni 0.21.1", "libc", "log", "mime", @@ -4452,7 +6372,7 @@ dependencies = [ "percent-encoding", "plist", "raw-window-handle", - "reqwest", + "reqwest 0.13.2", "serde", "serde_json", "serde_repr", @@ -4502,7 +6422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" dependencies = [ "base64 0.22.1", - "brotli", + "brotli 8.0.2", "ico", "json-patch", "plist", @@ -4694,7 +6614,7 @@ dependencies = [ "dpi", "gtk", "http", - "jni", + "jni 0.21.1", "objc2", "objc2-ui-kit", "objc2-web-kit", @@ -4717,7 +6637,7 @@ checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" dependencies = [ "gtk", "http", - "jni", + "jni 0.21.1", "log", "objc2", "objc2-app-kit", @@ -4743,12 +6663,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" dependencies = [ "anyhow", - "brotli", + "brotli 8.0.2", "cargo_metadata", "ctor", "dunce", "glob", - "html5ever", + "html5ever 0.29.1", "http", "infer", "json-patch", @@ -4787,9 +6707,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.25.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", "getrandom 0.4.1", @@ -4859,6 +6779,24 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "tiff" version = "0.10.3" @@ -4868,7 +6806,7 @@ dependencies = [ "fax", "flate2", "half", - "quick-error", + "quick-error 2.0.1", "weezl", "zune-jpeg 0.4.21", ] @@ -4906,6 +6844,18 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny_http" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" +dependencies = [ + "ascii", + "chunked_transfer", + "httpdate", + "log", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -4941,7 +6891,7 @@ dependencies = [ "libc", "mio", "pin-project-lite", - "socket2", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -4957,6 +6907,16 @@ dependencies = [ "syn 2.0.116", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.18" @@ -4966,6 +6926,7 @@ dependencies = [ "bytes", "futures-core", "futures-sink", + "futures-util", "pin-project-lite", "tokio", ] @@ -5087,13 +7048,18 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ + "async-compression", "bitflags 2.11.0", "bytes", + "futures-core", "futures-util", "http", "http-body", + "http-body-util", "iri-string", "pin-project-lite", + "tokio", + "tokio-util", "tower", "tower-layer", "tower-service", @@ -5140,6 +7106,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "trait-variant" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.116", ] [[package]] @@ -5164,12 +7171,27 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "triomphe" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39" + [[package]] name = "try-lock" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "twoway" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" +dependencies = [ + "memchr", +] + [[package]] name = "typed-arena" version = "2.0.2" @@ -5240,6 +7262,12 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + [[package]] name = "unicode-ident" version = "1.0.23" @@ -5261,6 +7289,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -5279,6 +7313,18 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.8" @@ -5292,6 +7338,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "urlpattern" version = "0.3.0" @@ -5340,6 +7392,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "value-bag" version = "1.12.0" @@ -5549,6 +7607,32 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe985f41e291eecef5e5c0770a18d28390addb03331c043964d9e916453d6f16" +dependencies = [ + "core-foundation 0.10.1", + "jni 0.22.4", + "log", + "ndk-context", + "objc2", + "objc2-foundation", + "url", + "web-sys", +] + [[package]] name = "webkit2gtk" version = "2.0.2" @@ -5593,6 +7677,27 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpage" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70862efc041d46e6bbaa82bb9c34ae0596d090e86cbd14bd9e93b36ee6802eac" +dependencies = [ + "html5ever 0.27.0", + "markup5ever_rcdom", + "serde_json", + "url", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webview2-com" version = "0.38.2" @@ -5635,6 +7740,12 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + [[package]] name = "winapi" version = "0.3.9" @@ -5784,6 +7895,17 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -5829,6 +7951,24 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -5871,6 +8011,21 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -5928,6 +8083,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -5946,6 +8107,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -5964,6 +8131,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5994,6 +8167,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -6012,6 +8191,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -6030,6 +8215,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -6048,6 +8239,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -6078,6 +8275,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "winreg" version = "0.55.0" @@ -6186,7 +8393,9 @@ checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" name = "writer" version = "0.2.0" dependencies = [ + "async-trait", "chrono", + "jacquard", "log", "notify", "serde", @@ -6200,6 +8409,8 @@ dependencies = [ "tauri-plugin-opener", "tauri-plugin-persisted-scope", "tauri-plugin-store", + "tempfile", + "thiserror 2.0.18", "writer-core", "writer-md", "writer-store", @@ -6261,10 +8472,10 @@ dependencies = [ "dunce", "gdkx11", "gtk", - "html5ever", + "html5ever 0.29.1", "http", "javascriptcore-rs", - "jni", + "jni 0.21.1", "kuchikiki", "libc", "ndk", @@ -6356,6 +8567,17 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +[[package]] +name = "xml5ever" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbb26405d8e919bc1547a5aa9abc95cbfa438f04844f5fdd9dc7596b748bf69" +dependencies = [ + "log", + "mac", + "markup5ever 0.12.1", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -6365,6 +8587,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" version = "0.8.1" @@ -6490,6 +8718,15 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "serde", +] + [[package]] name = "zerotrie" version = "0.2.3" diff --git a/docs/at-proto.md b/docs/at-proto.md index 47d5942..b76e537 100644 --- a/docs/at-proto.md +++ b/docs/at-proto.md @@ -111,13 +111,11 @@ Jacquard types use zero-copy deserialization via `CowStr<'_>`. Use `.parse()` fo ```sh src-tauri/src/ ├── atproto/ -│ ├── mod.rs # re-exports, shared types (StringRecord, AtProtoState) -│ ├── auth.rs # OAuth loopback flow, session management, token refresh -│ ├── strings.rs # string CRUD commands (create, get, list, update, delete) -│ └── resolve.rs # handle → DID → PDS resolution +│ ├── mod.rs # re-exports shared auth types/state +│ └── auth.rs # OAuth loopback flow, session restore, logout cleanup ``` -`AtProtoState` holds the `jacquard::Agent` (or `None` when logged out) and lives inside `AppState`. Auth-required commands check for an active session and return `ErrorCode::PermissionDenied` when unauthenticated. +`AtProtoState` lives inside `AppState` and owns the Jacquard OAuth client plus persisted session metadata paths. The current auth slice restores an existing session during app startup, exposes the active `SessionInfo`, and clears persisted auth artifacts when restoration or logout fails. **Tauri commands:** @@ -138,18 +136,20 @@ src-tauri/src/ ```sh src/ -├── state/stores/atproto.ts # auth state, current user DID/handle, published strings -├── state/selectors.ts # useAtProtoSession, useIsAuthenticated, etc. -├── ports/commands.ts # atproto_login, string_create, string_list, etc. +├── state/stores/ui.ts # auth sheet mode + hydrated/pending/session state +├── state/selectors.ts # AT Protocol selector hooks +├── ports/commands.ts # atproto_login / logout / session_status ├── hooks/controllers/ │ └── useAtProtoController.ts ├── components/ │ ├── AtProto/ -│ │ ├── LoginSheet.tsx -│ │ ├── PublishStringSheet.tsx -│ │ └── ImportStringSheet.tsx +│ │ └── AtProtoAuthSheet.tsx +│ └── AppLayout/LayoutSettingsPanel/ +│ └── AtProtoSection.tsx ``` +Auth UI is launched from the toolbar `@` button. When no session exists it opens the login sheet; when a session exists it opens the session indicator sheet. Logout is available from both the session sheet and the full settings panel. + ### Sync & Origin Tracking When a document is published as a string or imported from one, store the association in SQLite: diff --git a/docs/roadmap.md b/docs/roadmap.md index cf3f8ed..a96717c 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -9,21 +9,27 @@ Publish documents as [Tangled strings](https://tangled.sh) (AT Protocol gists) a ### Part 1 — Auth -1. **`jacquard` dependency** - add to `src-tauri/Cargo.toml` with `oauth` + `loopback` features -2. **OAuth loopback flow** - `src-tauri/src/atproto/auth.rs` -3. **Session persistence** - token + DPoP key storage in app data dir -4. **Tauri commands** - `atproto_login`, `atproto_logout`, `atproto_session_status` -5. **Frontend auth UI** - login sheet, session indicator, logout +1. **OAuth loopback flow** - `src-tauri/src/atproto/auth.rs` +2. **Session persistence** - token + DPoP key storage in app data dir +3. **Tauri commands** - `atproto_login`, `atproto_logout`, `atproto_session_status` +4. **Frontend auth UI** - login sheet, session indicator, logout + - User clicks `@` button in toolbar + - If not logged in, show login sheet + - If logged in, show session indicator (Dolly from `icons.tsx`) + - Logout button in session indicator or in the settings menu -### Part 2 — Push - -1. **Tauri commands** - `string_create`, `string_update`, `string_delete` -2. **Publish UI** - "Publish as String" action in export menu with filename, description, preview - -### Part 3 — Pull +### Part 2 — Pull 1. **Tauri commands** - `string_list`, `string_get` 2. **Import UI** - "Import from Tangled" sheet with handle input, string browser, preview, import to location + - Fluent Icons (`i-fluent-document-*-16-filled`) + - Extensions covered: `py`, `md`, `js`, `ts`, `yaml`, `java`, `sass`, `css`, `csv`, `fs`, `cs` + - `i-fluent-document-16-filled` for fallback + +### Part 3 — Push + +1. **Tauri commands** - `string_create`, `string_update`, `string_delete` +2. **Publish UI** - "Publish as String" action in export menu with filename, description, preview ### Part 4 — Sync & metadata diff --git a/package.json b/package.json index 56ad857..371e572 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ }, "devDependencies": { "@egoist/tailwindcss-icons": "^1.9.2", + "@iconify-json/fluent": "^1.2.41", "@iconify-json/ri": "^1.2.10", "@tailwindcss/forms": "^0.5.11", "@tauri-apps/cli": "^2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0aa97b..820322f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,6 +99,9 @@ importers: '@egoist/tailwindcss-icons': specifier: ^1.9.2 version: 1.9.2(tailwindcss@4.1.18) + '@iconify-json/fluent': + specifier: ^1.2.41 + version: 1.2.41 '@iconify-json/ri': specifier: ^1.2.10 version: 1.2.10 @@ -636,6 +639,9 @@ packages: '@fontsource-variable/ibm-plex-sans@5.2.8': resolution: {integrity: sha512-n5PF2iFa0CZT0QYTPzxvZ39opC9LnU0zdoRccoADbs+Dtsd+lbXOZF7RNuIPHcQX1dKjF63sxnRImQIB5eD0Ag==} + '@iconify-json/fluent@1.2.41': + resolution: {integrity: sha512-UbUFCJm7gICJuiDVZdo259L05TxAKbECJ/NBax/+N5CejWXJ0q/y++HNWLdJBkSfsZVYH9KtFZgwox36PC0/Wg==} + '@iconify-json/ri@1.2.10': resolution: {integrity: sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q==} @@ -3541,6 +3547,10 @@ snapshots: '@fontsource-variable/ibm-plex-sans@5.2.8': {} + '@iconify-json/fluent@1.2.41': + dependencies: + '@iconify/types': 2.0.0 + '@iconify-json/ri@1.2.10': dependencies: '@iconify/types': 2.0.0 diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 91d8001..db0a62b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -30,7 +30,13 @@ serde_json = "1" notify = "8" chrono = "0.4" log = "0.4" +async-trait = "0.1" +thiserror = "2" +jacquard = { version = "0.9.5", features = ["default"] } writer-core = { path = "../crates/core" } writer-md = { path = "../crates/markdown" } writer-store = { path = "../crates/store" } + +[dev-dependencies] +tempfile = "3.27" diff --git a/src-tauri/src/atproto/auth.rs b/src-tauri/src/atproto/auth.rs new file mode 100644 index 0000000..54eec77 --- /dev/null +++ b/src-tauri/src/atproto/auth.rs @@ -0,0 +1,268 @@ +use jacquard::client::FileAuthStore; +use jacquard::oauth::client::{OAuthClient, OAuthSession}; +use jacquard::oauth::loopback::{LoopbackConfig, LoopbackPort}; +use jacquard::types::did::Did; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fs; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::sync::Mutex; +use writer_core::{AppError, ErrorCode}; + +type OAuthResolver = jacquard::identity::JacquardResolver; +type AtProtoSession = OAuthSession; + +const AUTH_STORE_FILENAME: &str = "atproto-auth.json"; +const SESSION_META_FILENAME: &str = "atproto-session.json"; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SessionInfo { + pub did: String, + pub handle: String, + pub session_id: String, + pub endpoint: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct PersistedSessionMeta { + did: String, + handle: String, + session_id: String, +} + +#[derive(Debug, Deserialize)] +struct OAuthSessionRecord { + account_did: String, + session_id: String, +} + +#[derive(Debug, Deserialize)] +struct StoredOAuthEntry { + #[serde(rename = "OAuth")] + oauth: OAuthSessionRecord, +} + +pub struct AtProtoState { + oauth: Arc>, + auth_store_path: PathBuf, + session_meta_path: PathBuf, + session_info: Mutex>, +} + +impl AtProtoState { + pub fn new(app_dir: &Path) -> Result { + fs::create_dir_all(app_dir) + .map_err(|error| AppError::io(format!("Failed to create AT Protocol data directory: {}", error)))?; + + let auth_store_path = app_dir.join(AUTH_STORE_FILENAME); + let session_meta_path = app_dir.join(SESSION_META_FILENAME); + let oauth = OAuthClient::with_default_config(FileAuthStore::new(&auth_store_path)); + + Ok(Self { oauth: Arc::new(oauth), auth_store_path, session_meta_path, session_info: Mutex::new(None) }) + } + + pub async fn restore_session(&self) -> Result, AppError> { + let persisted = self + .read_session_meta() + .or_else(|| self.read_session_meta_from_auth_store()); + + let Some(persisted) = persisted else { + self.clear_in_memory()?; + return Ok(None); + }; + + let did = Did::new(&persisted.did) + .map_err(|error| AppError::new(ErrorCode::Parse, format!("Invalid persisted DID: {}", error)))?; + let session = match self.oauth.restore(&did, &persisted.session_id).await { + Ok(session) => session, + Err(error) => { + self.clear_persisted()?; + self.clear_in_memory()?; + return Err(AppError::io(format!( + "Failed to restore AT Protocol session: {}", + error + ))); + } + }; + + let endpoint = session.endpoint().await.to_string(); + let info = + SessionInfo { did: persisted.did, handle: persisted.handle, session_id: persisted.session_id, endpoint }; + + self.set_active_session(session, info.clone()).await?; + Ok(Some(info)) + } + + pub async fn login(&self, handle: &str) -> Result { + let normalized_handle = handle.trim(); + if normalized_handle.is_empty() { + return Err(AppError::new( + ErrorCode::InvalidPath, + "Handle is required to log into AT Protocol", + )); + } + + let session = self + .oauth + .login_with_local_server( + normalized_handle, + Default::default(), + LoopbackConfig { + host: "127.0.0.1".into(), + port: LoopbackPort::Ephemeral, + open_browser: true, + timeout_ms: 5 * 60 * 1000, + }, + ) + .await + .map_err(|error| AppError::io(format!("AT Protocol login failed: {}", error)))?; + + let (did, session_id) = session.session_info().await; + let info = SessionInfo { + did: did.to_string(), + handle: normalized_handle.to_string(), + session_id: session_id.to_string(), + endpoint: session.endpoint().await.to_string(), + }; + + self.set_active_session(session, info.clone()).await?; + Ok(info) + } + + pub async fn logout(&self) -> Result<(), AppError> { + let info = self.session_info.lock().ok().and_then(|guard| guard.clone()); + let persisted = self.read_session_meta(); + + if let Some(info) = info { + if let Ok(did) = Did::new(&info.did) { + if let Err(error) = self.oauth.revoke(&did, &info.session_id).await { + log::warn!("Failed to revoke AT Protocol session: {}", error); + } + } + } else if let Some(meta) = persisted { + if let Ok(did) = Did::new(&meta.did) { + if let Err(error) = self.oauth.revoke(&did, &meta.session_id).await { + log::warn!("Failed to revoke AT Protocol session: {}", error); + } + } + } + + self.clear_persisted()?; + self.clear_in_memory()?; + Ok(()) + } + + pub async fn session_status(&self) -> Option { + self.session_info.lock().ok().and_then(|guard| guard.clone()) + } + + async fn set_active_session(&self, session: AtProtoSession, info: SessionInfo) -> Result<(), AppError> { + self.write_session_meta(&PersistedSessionMeta { + did: info.did.clone(), + handle: info.handle.clone(), + session_id: info.session_id.clone(), + })?; + + let _ = session; + let mut guard = self + .session_info + .lock() + .map_err(|_| AppError::new(ErrorCode::Io, "Failed to lock AT Protocol session state"))?; + *guard = Some(info); + Ok(()) + } + + fn clear_in_memory(&self) -> Result<(), AppError> { + let mut guard = self + .session_info + .lock() + .map_err(|_| AppError::new(ErrorCode::Io, "Failed to lock AT Protocol session state"))?; + *guard = None; + Ok(()) + } + + fn clear_persisted(&self) -> Result<(), AppError> { + if self.auth_store_path.exists() { + fs::remove_file(&self.auth_store_path) + .map_err(|error| AppError::io(format!("Failed to remove AT Protocol auth store: {}", error)))?; + } + if self.session_meta_path.exists() { + fs::remove_file(&self.session_meta_path) + .map_err(|error| AppError::io(format!("Failed to remove AT Protocol session metadata: {}", error)))?; + } + Ok(()) + } + + fn read_session_meta(&self) -> Option { + let bytes = fs::read(&self.session_meta_path).ok()?; + serde_json::from_slice::(&bytes).ok() + } + + fn write_session_meta(&self, meta: &PersistedSessionMeta) -> Result<(), AppError> { + let bytes = serde_json::to_vec_pretty(meta) + .map_err(|error| AppError::io(format!("Failed to encode AT Protocol session metadata: {}", error)))?; + fs::write(&self.session_meta_path, bytes) + .map_err(|error| AppError::io(format!("Failed to persist AT Protocol session metadata: {}", error))) + } + + fn read_session_meta_from_auth_store(&self) -> Option { + let bytes = fs::read(&self.auth_store_path).ok()?; + let map = serde_json::from_slice::>(&bytes).ok()?; + let (_, entry) = map.into_iter().find(|(_, entry)| !entry.oauth.account_did.is_empty())?; + let did = entry.oauth.account_did; + + Some(PersistedSessionMeta { did: did.clone(), handle: did, session_id: entry.oauth.session_id }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::tempdir; + + #[test] + fn reads_session_meta_from_auth_store_when_sidecar_file_is_missing() { + let dir = tempdir().expect("tempdir"); + let state = AtProtoState::new(dir.path()).expect("state"); + + fs::write( + dir.path().join(AUTH_STORE_FILENAME), + r#"{ + "did:plc:alice_writer-session": { + "OAuth": { + "account_did": "did:plc:alice", + "session_id": "writer-session" + } + } + }"#, + ) + .expect("write auth store"); + + let meta = state.read_session_meta_from_auth_store().expect("meta"); + assert_eq!(meta.did, "did:plc:alice"); + assert_eq!(meta.handle, "did:plc:alice"); + assert_eq!(meta.session_id, "writer-session"); + } + + #[test] + fn logout_clears_persisted_session_metadata_without_touching_other_app_state() { + let dir = tempdir().expect("tempdir"); + let state = AtProtoState::new(dir.path()).expect("state"); + + state + .write_session_meta(&PersistedSessionMeta { + did: "did:plc:alice".into(), + handle: "alice.bsky.social".into(), + session_id: "writer-session".into(), + }) + .expect("write meta"); + fs::write(dir.path().join(AUTH_STORE_FILENAME), "{}").expect("write auth store"); + + tauri::async_runtime::block_on(state.logout()).expect("logout"); + + assert!(!state.session_meta_path.exists()); + assert!(!state.auth_store_path.exists()); + assert!(tauri::async_runtime::block_on(state.session_status()).is_none()); + } +} diff --git a/src-tauri/src/atproto/mod.rs b/src-tauri/src/atproto/mod.rs new file mode 100644 index 0000000..45baf56 --- /dev/null +++ b/src-tauri/src/atproto/mod.rs @@ -0,0 +1,3 @@ +pub mod auth; + +pub use auth::{AtProtoState, SessionInfo}; diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 96d00ce..7211c91 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,3 +1,4 @@ +use super::atproto::{AtProtoState, SessionInfo}; use super::capture; use super::locations::*; use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher}; @@ -21,14 +22,48 @@ type CommandResponse = std::result::Result, AppError>; pub struct AppState { pub store: Arc, pub watchers: Mutex>, + pub atproto: Arc, } impl AppState { pub fn new(store: Store) -> Self { - Self { store: Arc::new(store), watchers: Mutex::new(HashMap::new()) } + let app_dir = Store::default_app_dir().expect("store app dir should resolve"); + let atproto = AtProtoState::new(&app_dir).expect("AT Protocol state should initialize"); + Self { store: Arc::new(store), watchers: Mutex::new(HashMap::new()), atproto: Arc::new(atproto) } } } +#[tauri::command] +pub async fn atproto_login(state: State<'_, AppState>, handle: String) -> CommandResponse { + log::info!("Starting AT Protocol login flow"); + + match state.atproto.login(&handle).await { + Ok(session) => Ok(CommandResult::ok(session)), + Err(error) => { + log::error!("AT Protocol login failed: {}", error); + Ok(CommandResult::err(error)) + } + } +} + +#[tauri::command] +pub async fn atproto_logout(state: State<'_, AppState>) -> CommandResponse<()> { + log::info!("Logging out of AT Protocol"); + + match state.atproto.logout().await { + Ok(()) => Ok(CommandResult::ok(())), + Err(error) => { + log::error!("AT Protocol logout failed: {}", error); + Ok(CommandResult::err(error)) + } + } +} + +#[tauri::command] +pub async fn atproto_session_status(state: State<'_, AppState>) -> CommandResponse> { + Ok(CommandResult::ok(state.atproto.session_status().await)) +} + #[tauri::command] pub fn app_version_get() -> CommandResponse { Ok(CommandResult::ok( diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index a1da8be..3247126 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,6 +1,7 @@ use tauri::Manager; use tauri_plugin_log::{RotationStrategy, Target, TargetKind, TimezoneStrategy}; +mod atproto; mod capture; mod commands; mod locations; @@ -61,6 +62,9 @@ pub fn run() { }; let app_state = AppState::new(store); + if let Err(error) = tauri::async_runtime::block_on(app_state.atproto.restore_session()) { + log::warn!("Failed to restore AT Protocol session: {}", error); + } app.manage(app_state); if let Err(e) = locations::reconcile(app.handle()) { @@ -83,6 +87,9 @@ pub fn run() { Ok(()) }) .invoke_handler(tauri::generate_handler![ + cmd::atproto_login, + cmd::atproto_logout, + cmd::atproto_session_status, cmd::app_version_get, cmd::location_add_via_dialog, cmd::location_list, diff --git a/src/App.tsx b/src/App.tsx index 4192bd6..60d98b9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,16 +5,27 @@ import { FocusModePanel } from "./components/AppLayout/FocusModePanel"; import { LayoutSettingsPanel, RoutedSettingsSheet } from "./components/AppLayout/LayoutSettingsPanel"; import { SearchOverlay } from "./components/AppLayout/SearchOverlay"; import { WorkspacePanel } from "./components/AppLayout/WorkspacePanel"; +import { AtProtoAuthSheet } from "./components/AtProto/AtProtoAuthSheet"; import { ExportDialog } from "./components/export/ExportDialog/ExportDialog"; import { HelpSheet } from "./components/HelpSheet"; import { Toaster } from "./components/Toaster"; import { useAppChromeController } from "./hooks/controllers/useAppChromeController"; -import { useWorkspaceViewController } from "./hooks/controllers/useWorkspaceViewController"; +import { + useWorkspaceViewController, + type WorkspaceViewController, +} from "./hooks/controllers/useWorkspaceViewController"; import { useHelpSheetState } from "./state/selectors"; -const AppContent = ({ isFocusMode }: { isFocusMode: boolean }) => { - const { workspacePanelProps, focusModePanelProps, handleExportPdf, previewResult, editorFontFamily, editorText } = - useWorkspaceViewController(); +const AppContent = ({ isFocusMode, view }: { isFocusMode: boolean; view: WorkspaceViewController }) => { + const { + workspacePanelProps, + focusModePanelProps, + handleExportPdf, + previewResult, + editorFontFamily, + editorText, + atProto, + } = view; const { isOpen: isHelpSheetOpen, setOpen: setHelpSheetOpen } = useHelpSheetState(); const closeHelpSheet = useCallback(() => setHelpSheetOpen(false), [setHelpSheetOpen]); @@ -22,6 +33,13 @@ const AppContent = ({ isFocusMode }: { isFocusMode: boolean }) => { return ( <> + @@ -31,7 +49,18 @@ const AppContent = ({ isFocusMode }: { isFocusMode: boolean }) => { return ( <> - + + { function App() { const { theme, isFocusMode } = useAppChromeController(); + const view = useWorkspaceViewController(); + const { atProto } = view; return (
{isFocusMode ? null : } - - + +
); } diff --git a/src/__tests__/Toolbar.test.tsx b/src/__tests__/Toolbar.test.tsx index 53f4065..b07026c 100644 --- a/src/__tests__/Toolbar.test.tsx +++ b/src/__tests__/Toolbar.test.tsx @@ -59,4 +59,13 @@ describe("Toolbar", () => { fireEvent.click(screen.getByText("Editor")); expect(setEditorOnlyMode).toHaveBeenCalledOnce(); }); + + it("opens the Tangled auth entry from the toolbar", () => { + const onAtProtoAuth = vi.fn(); + + render(); + + fireEvent.click(screen.getByRole("button", { name: "Tangled" })); + expect(onAtProtoAuth).toHaveBeenCalledOnce(); + }); }); diff --git a/src/__tests__/Version.test.tsx b/src/__tests__/Version.test.tsx index db3d10c..f885a4c 100644 --- a/src/__tests__/Version.test.tsx +++ b/src/__tests__/Version.test.tsx @@ -1,4 +1,4 @@ -import { Version, transformVersion } from "$components/Version"; +import { transformVersion, Version } from "$components/Version"; import { render, screen } from "@testing-library/react"; import { describe, expect, it } from "vitest"; diff --git a/src/__tests__/ports.test.ts b/src/__tests__/ports.test.ts index bf186e7..7ff514a 100644 --- a/src/__tests__/ports.test.ts +++ b/src/__tests__/ports.test.ts @@ -1,5 +1,8 @@ import { appVersionGet, + atprotoLogin, + atprotoLogout, + atprotoSessionStatus, backendEvents, batch, dirMove, @@ -187,6 +190,30 @@ describe("command Builders", () => { }); }); + describe("AT Protocol commands", () => { + it("should create an AT Protocol login command", () => { + const onOk = vi.fn(); + const onErr = vi.fn(); + const cmd = atprotoLogin("alice.bsky.social", onOk, onErr) as InvokeCmd; + + expect(cmd.command).toBe("atproto_login"); + expect(cmd.payload).toStrictEqual({ handle: "alice.bsky.social" }); + }); + + it("should create AT Protocol session status and logout commands", () => { + const onOk = vi.fn(); + const onErr = vi.fn(); + + expect(atprotoSessionStatus(onOk, onErr)).toMatchObject({ + type: "Invoke", + command: "atproto_session_status", + payload: {}, + }); + + expect(atprotoLogout(onOk, onErr)).toMatchObject({ type: "Invoke", command: "atproto_logout", payload: {} }); + }); + }); + describe(startWatch, () => { it("should create a StartWatch command", () => { const cmd = startWatch(123) as StartWatchCmd; diff --git a/src/assets/dolly.svg b/src/assets/dolly.svg new file mode 100644 index 0000000..74b1895 --- /dev/null +++ b/src/assets/dolly.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/AppLayout/LayoutSettingsPanel/AtProtoSection.tsx b/src/components/AppLayout/LayoutSettingsPanel/AtProtoSection.tsx new file mode 100644 index 0000000..86d0e8b --- /dev/null +++ b/src/components/AppLayout/LayoutSettingsPanel/AtProtoSection.tsx @@ -0,0 +1,36 @@ +import { Button } from "$components/Button"; +import type { AtProtoSession } from "$types"; + +type AtProtoSectionProps = { + session: AtProtoSession | null; + isPending: boolean; + onOpenAuth: () => void; + onLogout: () => void; +}; + +export function AtProtoSection({ session, isPending, onOpenAuth, onLogout }: AtProtoSectionProps) { + return ( +
+
+
+ {session ? `Connected as ${session.handle}` : "Not connected"} +
+

+ {session + ? "Your Tangled session is stored locally and reused across app launches." + : "Connect an AT Protocol account to publish and import Tangled strings."} +

+
+
+ + {session && ( + + )} +
+
+ ); +} diff --git a/src/components/AppLayout/LayoutSettingsPanel/LayoutSettingsPanel.tsx b/src/components/AppLayout/LayoutSettingsPanel/LayoutSettingsPanel.tsx index e3a7e0a..e1eb24e 100644 --- a/src/components/AppLayout/LayoutSettingsPanel/LayoutSettingsPanel.tsx +++ b/src/components/AppLayout/LayoutSettingsPanel/LayoutSettingsPanel.tsx @@ -7,6 +7,7 @@ import type { SettingsScope } from "$types"; import { cn } from "$utils/tw"; import { useCallback, useEffect, useMemo } from "react"; import { AccessibilitySection } from "./Accessibility"; +import { AtProtoSection } from "./AtProtoSection"; import { ChromeSettingsSection } from "./ChromeSettings"; import { EditorSettingsSection } from "./EditorSettings"; import { FocusModeSection } from "./FocusModeSettings"; @@ -16,7 +17,17 @@ import { WriterToolsSection } from "./WriterTools"; type SettingsSheetLayout = { position: SheetPosition; size: SheetSize; className: string; backdropClassName: string }; -const SettingsBody = ({ scope }: { scope: SettingsScope }) => ( +type SettingsBodyProps = { + scope: SettingsScope; + onOpenAtProtoAuth: () => void; + onLogoutAtProto: () => void; + atProtoSession: import("$types").AtProtoSession | null; + atProtoPending: boolean; +}; + +const SettingsBody = ( + { scope, onOpenAtProtoAuth, onLogoutAtProto, atProtoSession, atProtoPending }: SettingsBodyProps, +) => (
( contentClassName="pb-3"> + + + void; closeAriaLabel: string; onViewMore?: () => void; + onOpenAtProtoAuth: () => void; + onLogoutAtProto: () => void; + atProtoSession: import("$types").AtProtoSession | null; + atProtoPending: boolean; }; -const SettingsContent = ({ title, scope, onClose, closeAriaLabel, onViewMore }: SettingsContentProps) => ( +const SettingsContent = ( + { + title, + scope, + onClose, + closeAriaLabel, + onViewMore, + onOpenAtProtoAuth, + onLogoutAtProto, + atProtoSession, + atProtoPending, + }: SettingsContentProps, +) => (
- +
); @@ -123,7 +166,17 @@ function useSettingsSheetLayout(scope: SettingsScope): SettingsSheetLayout { }, [compactPanel, scope]); } -export function LayoutSettingsPanel() { +type SettingsSheetProps = { + atProtoSession?: import("$types").AtProtoSession | null; + atProtoPending?: boolean; + onOpenAtProtoAuth?: () => void; + onLogoutAtProto?: () => void; +}; + +export function LayoutSettingsPanel( + { atProtoSession = null, atProtoPending = false, onOpenAtProtoAuth = () => {}, onLogoutAtProto = () => {} }: + SettingsSheetProps, +) { const { isOpen: isVisible, setOpen } = useLayoutSettingsUiState(); const { isOpen: isSettingsRouteOpen, open: openSettingsRoute } = useRoutedSheet("/settings"); const layout = useSettingsSheetLayout("basic"); @@ -157,12 +210,19 @@ export function LayoutSettingsPanel() { scope="basic" onClose={handleClose} closeAriaLabel="Close layout settings" - onViewMore={handleViewMore} /> + onViewMore={handleViewMore} + onOpenAtProtoAuth={onOpenAtProtoAuth} + onLogoutAtProto={onLogoutAtProto} + atProtoSession={atProtoSession} + atProtoPending={atProtoPending} /> ); } -export function RoutedSettingsSheet() { +export function RoutedSettingsSheet( + { atProtoSession = null, atProtoPending = false, onOpenAtProtoAuth = () => {}, onLogoutAtProto = () => {} }: + SettingsSheetProps, +) { const { isOpen, close } = useRoutedSheet("/settings"); const layout = useSettingsSheetLayout("full"); @@ -175,7 +235,15 @@ export function RoutedSettingsSheet() { ariaLabel="Settings" backdropClassName={layout.backdropClassName} className={layout.className}> - + ); } diff --git a/src/components/AppLayout/WorkspacePanel.tsx b/src/components/AppLayout/WorkspacePanel.tsx index dbee5ee..97ba8c2 100644 --- a/src/components/AppLayout/WorkspacePanel.tsx +++ b/src/components/AppLayout/WorkspacePanel.tsx @@ -47,8 +47,10 @@ export type WorkspacePanelProps = { toolbar: Pick< ToolbarProps, | "saveStatus" + | "atProtoSession" | "hasActiveDocument" | "onSave" + | "onAtProtoAuth" | "onNewDocument" | "isNewDocumentDisabled" | "onExportPdf" diff --git a/src/components/AtProto/AtProtoAuthSheet.tsx b/src/components/AtProto/AtProtoAuthSheet.tsx new file mode 100644 index 0000000..27e8406 --- /dev/null +++ b/src/components/AtProto/AtProtoAuthSheet.tsx @@ -0,0 +1,116 @@ +import { Button } from "$components/Button"; +import { Sheet } from "$components/Sheet"; +import type { AtProtoSheetMode } from "$state/types"; +import type { AtProtoSession } from "$types"; +import { type ChangeEventHandler, type KeyboardEventHandler, useCallback, useMemo, useState } from "react"; + +type AtProtoAuthSheetProps = { + mode: AtProtoSheetMode; + session: AtProtoSession | null; + isPending: boolean; + onClose: () => void; + onLogin: (handle: string) => void; + onLogout: () => void; +}; + +function AuthSheetHeader({ title, description }: { title: string; description: string }) { + return ( +
+

{title}

+

{description}

+
+ ); +} + +function LoginView({ isPending, onLogin }: { isPending: boolean; onLogin: (handle: string) => void }) { + const [handle, setHandle] = useState(""); + + const isDisabled = useMemo(() => isPending || !handle.trim(), [handle, isPending]); + const submit = useCallback(() => { + onLogin(handle); + }, [handle, onLogin]); + const handleChange: ChangeEventHandler = useCallback((event) => { + setHandle(event.target.value); + }, []); + const handleKeyDown: KeyboardEventHandler = useCallback((event) => { + if (event.key === "Enter" && !isDisabled) { + submit(); + } + }, [isDisabled, submit]); + + return ( + <> + +
+ +
+

+ Writer opens your browser and completes the OAuth loopback flow locally. +

+ +
+
+ + ); +} + +function SessionView( + { session, isPending, onLogout }: { session: AtProtoSession | null; isPending: boolean; onLogout: () => void }, +) { + return ( + <> + +
+
+
Account
+
{session?.handle ?? "Unknown handle"}
+
{session?.did ?? "Unknown DID"}
+
+
+
PDS endpoint
+
{session?.endpoint ?? "Unknown endpoint"}
+
+
+ +
+
+ + ); +} + +export function AtProtoAuthSheet({ mode, session, isPending, onClose, onLogin, onLogout }: AtProtoAuthSheetProps) { + return ( + +
+ {mode === "session" + ? + : } +
+
+ ); +} diff --git a/src/components/Toolbar/Toolbar.tsx b/src/components/Toolbar/Toolbar.tsx index 88953b3..2f651bd 100644 --- a/src/components/Toolbar/Toolbar.tsx +++ b/src/components/Toolbar/Toolbar.tsx @@ -1,6 +1,7 @@ import { useViewportTier } from "$hooks/useViewportTier"; import type { IconSize } from "$icons"; import { + AtSignIcon, DocumentIcon, EyeIcon, FileTextIcon, @@ -13,7 +14,7 @@ import { SplitViewIcon, } from "$icons"; import { useLayoutSettingsUiState, useToolbarState } from "$state/selectors"; -import { SaveStatus } from "$types"; +import { AtProtoSession, SaveStatus } from "$types"; import { formatShortcut } from "$utils/shortcuts"; import { useCallback, useMemo } from "react"; import { SaveStatusIndicator } from "./SaveStatusIndicator"; @@ -21,8 +22,10 @@ import { ToolbarButton } from "./ToolbarButton"; export type ToolbarProps = { saveStatus: SaveStatus; + atProtoSession?: AtProtoSession | null; hasActiveDocument?: boolean; onSave: () => void; + onAtProtoAuth?: () => void; onNewDocument?: () => void; isNewDocumentDisabled?: boolean; onExportPdf?: () => void; @@ -46,8 +49,10 @@ function SettingsToolbarButton( export function Toolbar( { saveStatus, + atProtoSession = null, hasActiveDocument = false, onSave, + onAtProtoAuth = () => {}, onNewDocument, isNewDocumentDisabled = false, onExportPdf, @@ -76,6 +81,7 @@ export function Toolbar( eye: { Component: EyeIcon, size: "sm" }, focus: { Component: FocusIcon, size: "sm" }, export: { Component: DocumentIcon, size: "sm" }, + atproto: { Component: AtSignIcon, size: "sm" }, settings: { Component: SettingsIcon, size: "sm" }, }), [], @@ -144,6 +150,11 @@ export function Toolbar(
+ {onExportPdf && ( ); + +export const AtSignIcon = ({ size = "md", className = "", style }: IconProps) => ( + + + +); + +/** + * @see assets/dolly.svg + */ +export const Tangled = (props: Record) => ( + + + + + + + + + + + + {/* oxlint-disable-next-line react/jsx-max-depth */} + + + + + + + + + + + +); diff --git a/src/hooks/controllers/useAtProtoController.ts b/src/hooks/controllers/useAtProtoController.ts new file mode 100644 index 0000000..2950247 --- /dev/null +++ b/src/hooks/controllers/useAtProtoController.ts @@ -0,0 +1,105 @@ +import { atprotoLogin, atprotoLogout, atprotoSessionStatus, runCmd } from "$ports"; +import { useAtProtoUiState } from "$state/selectors"; +import { showErrorToast, showSuccessToast } from "$state/stores/toasts"; +import { f } from "$utils/serialize"; +import * as logger from "@tauri-apps/plugin-log"; +import { useCallback, useEffect } from "react"; + +export function useAtProtoController() { + const { + sheetMode, + session, + isHydrated, + isPending, + openLoginSheet, + openSessionSheet, + closeSheet, + setSession, + setHydrated, + setPending, + } = useAtProtoUiState(); + + useEffect(() => { + let isCancelled = false; + + void runCmd(atprotoSessionStatus((nextSession) => { + if (isCancelled) { + return; + } + + setSession(nextSession); + setHydrated(true); + }, (error) => { + if (isCancelled) { + return; + } + + logger.error(f("Failed to load AT Protocol session status", { error })); + setSession(null); + setHydrated(true); + })); + + return () => { + isCancelled = true; + }; + }, [setHydrated, setSession]); + + const openAuthSheet = useCallback(() => { + if (session) { + openSessionSheet(); + return; + } + + openLoginSheet(); + }, [openLoginSheet, openSessionSheet, session]); + + const handleLogin = useCallback((handle: string) => { + const trimmedHandle = handle.trim(); + if (!trimmedHandle || isPending) { + return; + } + + setPending(true); + void runCmd(atprotoLogin(trimmedHandle, (nextSession) => { + setPending(false); + setSession(nextSession); + openSessionSheet(); + showSuccessToast(`Connected to Tangled as ${nextSession.handle}`); + }, (error) => { + setPending(false); + logger.error(f("AT Protocol login failed", { handle: trimmedHandle, error })); + showErrorToast(error.message); + })); + }, [isPending, openSessionSheet, setPending, setSession]); + + const handleLogout = useCallback(() => { + if (isPending) { + return; + } + + setPending(true); + void runCmd(atprotoLogout(() => { + setPending(false); + setSession(null); + closeSheet(); + showSuccessToast("Disconnected from Tangled"); + }, (error) => { + setPending(false); + logger.error(f("AT Protocol logout failed", { error })); + showErrorToast(error.message); + })); + }, [closeSheet, isPending, setPending, setSession]); + + return { + sheetMode, + session, + isHydrated, + isPending, + openAuthSheet, + openLoginSheet, + openSessionSheet, + closeSheet, + handleLogin, + handleLogout, + }; +} diff --git a/src/hooks/controllers/useWorkspaceViewController.ts b/src/hooks/controllers/useWorkspaceViewController.ts index f2f8314..e6bcdfc 100644 --- a/src/hooks/controllers/useWorkspaceViewController.ts +++ b/src/hooks/controllers/useWorkspaceViewController.ts @@ -4,6 +4,7 @@ import type { StyleMatch } from "$editor/types"; import { useDocumentSessionEffects } from "$hooks/app/useDocumentSessionEffects"; import { useEditorPreviewEffects } from "$hooks/app/useEditorPreviewEffects"; import { useSettingsSync } from "$hooks/app/useSettingsSync"; +import { useAtProtoController } from "$hooks/controllers/useAtProtoController"; import { useWorkspaceController } from "$hooks/controllers/useWorkspaceController"; import { useDocumentActions } from "$hooks/useDocumentActions"; import { useEditor } from "$hooks/useEditor"; @@ -34,6 +35,7 @@ export type WorkspaceViewController = { previewResult: PdfRenderResult | null; editorFontFamily: EditorFontFamily; editorText: string; + atProto: ReturnType; }; export function deriveWordCount(text: string, renderWordCount: number | undefined): number { @@ -57,6 +59,7 @@ export function useWorkspaceViewController(): WorkspaceViewController { const { model: editorModel, dispatch: editorDispatch, openDoc } = useEditor(); const { model: previewModel, render: renderPreview, syncLine: syncPreviewLine, setDoc: setPreviewDoc } = usePreview(); const exportPdf = usePdfExport(); + const atProto = useAtProtoController(); useWorkspaceSync(); useLayoutHotkeys(); @@ -193,8 +196,10 @@ export function useWorkspaceViewController(): WorkspaceViewController { const toolbarProps = useMemo( () => ({ saveStatus: editorModel.saveStatus, + atProtoSession: atProto.session, hasActiveDocument: hasOpenDocument, onSave: handleSave, + onAtProtoAuth: atProto.openAuthSheet, onNewDocument: handleNewDocument, isNewDocumentDisabled: !hasLocations, onExportPdf: handleOpenPdfExport, @@ -203,6 +208,8 @@ export function useWorkspaceViewController(): WorkspaceViewController { }), [ editorModel.saveStatus, + atProto.openAuthSheet, + atProto.session, activeTab, handleOpenPdfExport, handleNewDocument, @@ -318,5 +325,6 @@ export function useWorkspaceViewController(): WorkspaceViewController { previewResult, editorFontFamily: editorPresentation.fontFamily, editorText: editorModel.text, + atProto, }; } diff --git a/src/hooks/useLayoutHotkeys.ts b/src/hooks/useLayoutHotkeys.ts index d5ee3dd..c14677b 100644 --- a/src/hooks/useLayoutHotkeys.ts +++ b/src/hooks/useLayoutHotkeys.ts @@ -100,5 +100,12 @@ export function useLayoutHotkeys(): void { return () => { globalThis.removeEventListener("keydown", handleKeyDown); }; - }, [toggleFocusMode, togglePreviewVisible, toggleShowSearch, toggleSidebarCollapsed, toggleTabBarCollapsed, toggleSplitView]); + }, [ + toggleFocusMode, + togglePreviewVisible, + toggleShowSearch, + toggleSidebarCollapsed, + toggleTabBarCollapsed, + toggleSplitView, + ]); } diff --git a/src/ports/commands.ts b/src/ports/commands.ts index 0d8a2c0..33f1590 100644 --- a/src/ports/commands.ts +++ b/src/ports/commands.ts @@ -16,6 +16,8 @@ import type { import { info } from "@tauri-apps/plugin-log"; import { invokeCmd, runCmd } from "./invoke"; import type { + AtProtoLoginParams, + AtProtoSessionStatusParams, BackendCaptureDocRef, BackendCaptureSubmitInput, BackendGlobalCaptureSettings, @@ -134,6 +136,18 @@ function describeValueShape(value: unknown): string { return constructorName ? `object(${constructorName})` : "object"; } +export function atprotoLogin(...[handle, onOk, onErr]: AtProtoLoginParams): Cmd { + return invokeCmd("atproto_login", { handle }, onOk, onErr); +} + +export function atprotoSessionStatus(...[onOk, onErr]: AtProtoSessionStatusParams): Cmd { + return invokeCmd("atproto_session_status", {}, onOk, onErr); +} + +export function atprotoLogout(...[onOk, onErr]: LocParams): Cmd { + return invokeCmd("atproto_logout", {}, onOk, onErr); +} + export function locationAddViaDialog(...[onOk, onErr]: LocParams): Cmd { return invokeCmd("location_add_via_dialog", {}, onOk, onErr); } diff --git a/src/ports/invoke.ts b/src/ports/invoke.ts index 8e8f95a..18147e0 100644 --- a/src/ports/invoke.ts +++ b/src/ports/invoke.ts @@ -1,5 +1,6 @@ import type { AppError, + AtProtoSession, CaptureDocRef, CaptureMode, CaptureSubmitResult, @@ -238,6 +239,23 @@ function normalizeCaptureSubmitResult(value: unknown): CaptureSubmitResult { }; } +function normalizeAtProtoSession(value: unknown): AtProtoSession | null { + if (!isRecord(value)) { + return null; + } + + if ( + typeof value.did !== "string" + || typeof value.handle !== "string" + || typeof value.session_id !== "string" + || typeof value.endpoint !== "string" + ) { + return null; + } + + return { did: value.did, handle: value.handle, sessionId: value.session_id, endpoint: value.endpoint }; +} + function normalizeSessionState(value: unknown): SessionState { if (!isRecord(value) || !Array.isArray(value.tabs)) { return { tabs: [], activeTabId: null }; @@ -307,6 +325,10 @@ function normalizeCommandValue(command: string, value: unknown): unknown { case "global_capture_submit": { return normalizeCaptureSubmitResult(value); } + case "atproto_login": + case "atproto_session_status": { + return normalizeAtProtoSession(value); + } case "style_check_scan": { if (!Array.isArray(value)) { return []; diff --git a/src/ports/types.ts b/src/ports/types.ts index ab5c9b3..c47b941 100644 --- a/src/ports/types.ts +++ b/src/ports/types.ts @@ -2,6 +2,7 @@ import { StyleCategory } from "$editor/types"; import type { PdfRenderResult } from "$pdf/types"; import type { AppError, + AtProtoSession, CaptureMode, CaptureSubmitInput, CaptureSubmitResult, @@ -258,3 +259,9 @@ export type GlobalCapturePauseParams = Parameters< export type GlobalCaptureValidateShortcutParams = Parameters< (shortcut: string, onOk: SuccessCallback, onErr: ErrorCallback) => void >; + +export type AtProtoSessionParams = LocParams; +export type AtProtoSessionStatusParams = LocParams; +export type AtProtoLoginParams = Parameters< + (handle: string, onOk: SuccessCallback, onErr: ErrorCallback) => void +>; diff --git a/src/state/selectors.ts b/src/state/selectors.ts index c0a24c6..62cfe3e 100644 --- a/src/state/selectors.ts +++ b/src/state/selectors.ts @@ -497,6 +497,22 @@ export const useStyleDiagnosticsUiState = () => })), ); +export const useAtProtoUiState = () => + useUiStore( + useShallow((state) => ({ + sheetMode: state.atProtoSheetMode, + session: state.atProtoSession, + isHydrated: state.atProtoHydrated, + isPending: state.atProtoPending, + openLoginSheet: state.openAtProtoLoginSheet, + openSessionSheet: state.openAtProtoSessionSheet, + closeSheet: state.closeAtProtoSheet, + setSession: state.setAtProtoSession, + setHydrated: state.setAtProtoHydrated, + setPending: state.setAtProtoPending, + })), + ); + export type SidebarStateReturn = ReturnType; export type ToolbarStateReturn = ReturnType; export type EditorPresentationStateReturn = ReturnType; @@ -504,3 +520,4 @@ export type WorkspacePanelSidebarStateReturn = ReturnType; export type TopBarsCollapsedReturn = ReturnType; export type StatusBarCollapsedReturn = ReturnType; +export type AtProtoUiStateReturn = ReturnType; diff --git a/src/state/stores/ui.ts b/src/state/stores/ui.ts index 390b0b2..5264ac8 100644 --- a/src/state/stores/ui.ts +++ b/src/state/stores/ui.ts @@ -28,6 +28,10 @@ export const getInitialUiState = (): UiState => ({ globalCaptureSettings: DEFAULT_GLOBAL_CAPTURE_SETTINGS, helpSheetOpen: false, styleDiagnosticsOpen: false, + atProtoSheetMode: "closed", + atProtoSession: null, + atProtoHydrated: false, + atProtoPending: false, }); export const useUiStore = create()((set, get) => ({ @@ -73,6 +77,12 @@ export const useUiStore = create()((set, get) => ({ toggleHelpSheet: () => set((state) => ({ helpSheetOpen: !state.helpSheetOpen })), setStyleDiagnosticsOpen: (value) => set({ styleDiagnosticsOpen: value }), toggleStyleDiagnostics: () => set((state) => ({ styleDiagnosticsOpen: !state.styleDiagnosticsOpen })), + openAtProtoLoginSheet: () => set({ atProtoSheetMode: "login" }), + openAtProtoSessionSheet: () => set({ atProtoSheetMode: "session" }), + closeAtProtoSheet: () => set({ atProtoSheetMode: "closed" }), + setAtProtoSession: (value) => set({ atProtoSession: value }), + setAtProtoHydrated: (value) => set({ atProtoHydrated: value }), + setAtProtoPending: (value) => set({ atProtoPending: value }), })); export function resetUiStore(): void { diff --git a/src/state/types.ts b/src/state/types.ts index ff97b48..3ca9977 100644 --- a/src/state/types.ts +++ b/src/state/types.ts @@ -1,6 +1,7 @@ import type { MarginSide, Orientation, PageSize, PdfExportOptions } from "$pdf/types"; import type { AppTheme, + AtProtoSession, DocMeta, EditorFontFamily, FocusDimmingMode, @@ -217,6 +218,24 @@ export type SearchActions = { resetSearch: () => void; }; +export type AtProtoSheetMode = "closed" | "login" | "session"; + +export type AtProtoUiState = { + atProtoSheetMode: AtProtoSheetMode; + atProtoSession: AtProtoSession | null; + atProtoHydrated: boolean; + atProtoPending: boolean; +}; + +export type AtProtoUiActions = { + openAtProtoLoginSheet: () => void; + openAtProtoSessionSheet: () => void; + closeAtProtoSheet: () => void; + setAtProtoSession: (value: AtProtoSession | null) => void; + setAtProtoHydrated: (value: boolean) => void; + setAtProtoPending: (value: boolean) => void; +}; + export type UiState = { layoutSettingsOpen: boolean; pdfExportDialogOpen: boolean; @@ -224,7 +243,7 @@ export type UiState = { globalCaptureSettings: GlobalCaptureSettings; helpSheetOpen: boolean; styleDiagnosticsOpen: boolean; -}; +} & AtProtoUiState; export type UiActions = { setLayoutSettingsOpen: (value: boolean) => void; @@ -244,7 +263,7 @@ export type UiActions = { toggleHelpSheet: () => void; setStyleDiagnosticsOpen: (value: boolean) => void; toggleStyleDiagnostics: () => void; -}; +} & AtProtoUiActions; export type AppStore = & LayoutState diff --git a/src/types.ts b/src/types.ts index d528903..e3162e3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -79,6 +79,8 @@ export type SearchHit = { export type AppError = { code: ErrorCode; message: string; context?: string }; +export type AtProtoSession = { did: string; handle: string; sessionId: string; endpoint: string }; + export type FocusDimmingMode = "off" | "sentence" | "paragraph"; export type MarkdownPreviewStyle = "github" | "pdf";