diff options
| -rw-r--r-- | .gitignore | 7 | ||||
| -rw-r--r-- | Cargo.lock | 2284 | ||||
| -rw-r--r-- | Cargo.toml | 53 | ||||
| -rw-r--r-- | flake.lock | 96 | ||||
| -rw-r--r-- | flake.nix | 61 | ||||
| -rw-r--r-- | src/config.rs | 38 | ||||
| -rw-r--r-- | src/main.rs | 36 | ||||
| -rw-r--r-- | src/nostr/mod.rs | 1 | ||||
| -rw-r--r-- | src/nostr/relay.rs | 310 | ||||
| -rw-r--r-- | src/storage/mod.rs | 126 | ||||
| -rwxr-xr-x | test_relay.sh | 49 |
11 files changed, 3060 insertions, 1 deletions
| @@ -2,8 +2,13 @@ | |||
| 2 | .ai/ | 2 | .ai/ |
| 3 | 3 | ||
| 4 | # Rust build artifacts | 4 | # Rust build artifacts |
| 5 | target/ | ||
| 5 | grasp-audit/target | 6 | grasp-audit/target |
| 6 | 7 | ||
| 7 | # Working directory (session-specific temporary files) | 8 | # Working directory (session-specific temporary files) |
| 8 | work/* | 9 | work/* |
| 9 | !work/README.md \ No newline at end of file | 10 | !work/README.md |
| 11 | |||
| 12 | # Environment and data | ||
| 13 | .env | ||
| 14 | data/ \ No newline at end of file | ||
diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..8bd5996 --- /dev/null +++ b/Cargo.lock | |||
| @@ -0,0 +1,2284 @@ | |||
| 1 | # This file is automatically @generated by Cargo. | ||
| 2 | # It is not intended for manual editing. | ||
| 3 | version = 3 | ||
| 4 | |||
| 5 | [[package]] | ||
| 6 | name = "aead" | ||
| 7 | version = "0.5.2" | ||
| 8 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 9 | checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" | ||
| 10 | dependencies = [ | ||
| 11 | "crypto-common", | ||
| 12 | "generic-array", | ||
| 13 | ] | ||
| 14 | |||
| 15 | [[package]] | ||
| 16 | name = "aho-corasick" | ||
| 17 | version = "1.1.4" | ||
| 18 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 19 | checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" | ||
| 20 | dependencies = [ | ||
| 21 | "memchr", | ||
| 22 | ] | ||
| 23 | |||
| 24 | [[package]] | ||
| 25 | name = "android_system_properties" | ||
| 26 | version = "0.1.5" | ||
| 27 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 28 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" | ||
| 29 | dependencies = [ | ||
| 30 | "libc", | ||
| 31 | ] | ||
| 32 | |||
| 33 | [[package]] | ||
| 34 | name = "anstream" | ||
| 35 | version = "0.6.21" | ||
| 36 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 37 | checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" | ||
| 38 | dependencies = [ | ||
| 39 | "anstyle", | ||
| 40 | "anstyle-parse", | ||
| 41 | "anstyle-query", | ||
| 42 | "anstyle-wincon", | ||
| 43 | "colorchoice", | ||
| 44 | "is_terminal_polyfill", | ||
| 45 | "utf8parse", | ||
| 46 | ] | ||
| 47 | |||
| 48 | [[package]] | ||
| 49 | name = "anstyle" | ||
| 50 | version = "1.0.13" | ||
| 51 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 52 | checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" | ||
| 53 | |||
| 54 | [[package]] | ||
| 55 | name = "anstyle-parse" | ||
| 56 | version = "0.2.7" | ||
| 57 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 58 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" | ||
| 59 | dependencies = [ | ||
| 60 | "utf8parse", | ||
| 61 | ] | ||
| 62 | |||
| 63 | [[package]] | ||
| 64 | name = "anstyle-query" | ||
| 65 | version = "1.1.4" | ||
| 66 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 67 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" | ||
| 68 | dependencies = [ | ||
| 69 | "windows-sys 0.60.2", | ||
| 70 | ] | ||
| 71 | |||
| 72 | [[package]] | ||
| 73 | name = "anstyle-wincon" | ||
| 74 | version = "3.0.10" | ||
| 75 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 76 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" | ||
| 77 | dependencies = [ | ||
| 78 | "anstyle", | ||
| 79 | "once_cell_polyfill", | ||
| 80 | "windows-sys 0.60.2", | ||
| 81 | ] | ||
| 82 | |||
| 83 | [[package]] | ||
| 84 | name = "anyhow" | ||
| 85 | version = "1.0.100" | ||
| 86 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 87 | checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" | ||
| 88 | |||
| 89 | [[package]] | ||
| 90 | name = "arrayvec" | ||
| 91 | version = "0.7.6" | ||
| 92 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 93 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" | ||
| 94 | |||
| 95 | [[package]] | ||
| 96 | name = "async-stream" | ||
| 97 | version = "0.3.6" | ||
| 98 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 99 | checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" | ||
| 100 | dependencies = [ | ||
| 101 | "async-stream-impl", | ||
| 102 | "futures-core", | ||
| 103 | "pin-project-lite", | ||
| 104 | ] | ||
| 105 | |||
| 106 | [[package]] | ||
| 107 | name = "async-stream-impl" | ||
| 108 | version = "0.3.6" | ||
| 109 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 110 | checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" | ||
| 111 | dependencies = [ | ||
| 112 | "proc-macro2", | ||
| 113 | "quote", | ||
| 114 | "syn", | ||
| 115 | ] | ||
| 116 | |||
| 117 | [[package]] | ||
| 118 | name = "async-utility" | ||
| 119 | version = "0.3.1" | ||
| 120 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 121 | checksum = "a34a3b57207a7a1007832416c3e4862378c8451b4e8e093e436f48c2d3d2c151" | ||
| 122 | dependencies = [ | ||
| 123 | "futures-util", | ||
| 124 | "gloo-timers", | ||
| 125 | "tokio", | ||
| 126 | "wasm-bindgen-futures", | ||
| 127 | ] | ||
| 128 | |||
| 129 | [[package]] | ||
| 130 | name = "async-wsocket" | ||
| 131 | version = "0.13.1" | ||
| 132 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 133 | checksum = "9a7d8c7d34a225ba919dd9ba44d4b9106d20142da545e086be8ae21d1897e043" | ||
| 134 | dependencies = [ | ||
| 135 | "async-utility", | ||
| 136 | "futures", | ||
| 137 | "futures-util", | ||
| 138 | "js-sys", | ||
| 139 | "tokio", | ||
| 140 | "tokio-rustls", | ||
| 141 | "tokio-socks", | ||
| 142 | "tokio-tungstenite 0.26.2", | ||
| 143 | "url", | ||
| 144 | "wasm-bindgen", | ||
| 145 | "web-sys", | ||
| 146 | ] | ||
| 147 | |||
| 148 | [[package]] | ||
| 149 | name = "atomic-destructor" | ||
| 150 | version = "0.3.0" | ||
| 151 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 152 | checksum = "ef49f5882e4b6afaac09ad239a4f8c70a24b8f2b0897edb1f706008efd109cf4" | ||
| 153 | |||
| 154 | [[package]] | ||
| 155 | name = "autocfg" | ||
| 156 | version = "1.5.0" | ||
| 157 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 158 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" | ||
| 159 | |||
| 160 | [[package]] | ||
| 161 | name = "base64" | ||
| 162 | version = "0.22.1" | ||
| 163 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 164 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" | ||
| 165 | |||
| 166 | [[package]] | ||
| 167 | name = "base64ct" | ||
| 168 | version = "1.8.0" | ||
| 169 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 170 | checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" | ||
| 171 | |||
| 172 | [[package]] | ||
| 173 | name = "bech32" | ||
| 174 | version = "0.11.0" | ||
| 175 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 176 | checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" | ||
| 177 | |||
| 178 | [[package]] | ||
| 179 | name = "bip39" | ||
| 180 | version = "2.2.0" | ||
| 181 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 182 | checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" | ||
| 183 | dependencies = [ | ||
| 184 | "bitcoin_hashes 0.13.0", | ||
| 185 | "serde", | ||
| 186 | "unicode-normalization", | ||
| 187 | ] | ||
| 188 | |||
| 189 | [[package]] | ||
| 190 | name = "bitcoin-internals" | ||
| 191 | version = "0.2.0" | ||
| 192 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 193 | checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" | ||
| 194 | |||
| 195 | [[package]] | ||
| 196 | name = "bitcoin-io" | ||
| 197 | version = "0.1.3" | ||
| 198 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 199 | checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" | ||
| 200 | |||
| 201 | [[package]] | ||
| 202 | name = "bitcoin_hashes" | ||
| 203 | version = "0.13.0" | ||
| 204 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 205 | checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" | ||
| 206 | dependencies = [ | ||
| 207 | "bitcoin-internals", | ||
| 208 | "hex-conservative 0.1.2", | ||
| 209 | ] | ||
| 210 | |||
| 211 | [[package]] | ||
| 212 | name = "bitcoin_hashes" | ||
| 213 | version = "0.14.0" | ||
| 214 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 215 | checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" | ||
| 216 | dependencies = [ | ||
| 217 | "bitcoin-io", | ||
| 218 | "hex-conservative 0.2.1", | ||
| 219 | "serde", | ||
| 220 | ] | ||
| 221 | |||
| 222 | [[package]] | ||
| 223 | name = "bitflags" | ||
| 224 | version = "2.10.0" | ||
| 225 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 226 | checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" | ||
| 227 | |||
| 228 | [[package]] | ||
| 229 | name = "block-buffer" | ||
| 230 | version = "0.10.4" | ||
| 231 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 232 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" | ||
| 233 | dependencies = [ | ||
| 234 | "generic-array", | ||
| 235 | ] | ||
| 236 | |||
| 237 | [[package]] | ||
| 238 | name = "block-padding" | ||
| 239 | version = "0.3.3" | ||
| 240 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 241 | checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" | ||
| 242 | dependencies = [ | ||
| 243 | "generic-array", | ||
| 244 | ] | ||
| 245 | |||
| 246 | [[package]] | ||
| 247 | name = "bumpalo" | ||
| 248 | version = "3.19.0" | ||
| 249 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 250 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" | ||
| 251 | |||
| 252 | [[package]] | ||
| 253 | name = "byteorder" | ||
| 254 | version = "1.5.0" | ||
| 255 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 256 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" | ||
| 257 | |||
| 258 | [[package]] | ||
| 259 | name = "bytes" | ||
| 260 | version = "1.10.1" | ||
| 261 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 262 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" | ||
| 263 | |||
| 264 | [[package]] | ||
| 265 | name = "cbc" | ||
| 266 | version = "0.1.2" | ||
| 267 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 268 | checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" | ||
| 269 | dependencies = [ | ||
| 270 | "cipher", | ||
| 271 | ] | ||
| 272 | |||
| 273 | [[package]] | ||
| 274 | name = "cc" | ||
| 275 | version = "1.2.44" | ||
| 276 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 277 | checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" | ||
| 278 | dependencies = [ | ||
| 279 | "find-msvc-tools", | ||
| 280 | "shlex", | ||
| 281 | ] | ||
| 282 | |||
| 283 | [[package]] | ||
| 284 | name = "cfg-if" | ||
| 285 | version = "1.0.4" | ||
| 286 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 287 | checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" | ||
| 288 | |||
| 289 | [[package]] | ||
| 290 | name = "chacha20" | ||
| 291 | version = "0.9.1" | ||
| 292 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 293 | checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" | ||
| 294 | dependencies = [ | ||
| 295 | "cfg-if", | ||
| 296 | "cipher", | ||
| 297 | "cpufeatures", | ||
| 298 | ] | ||
| 299 | |||
| 300 | [[package]] | ||
| 301 | name = "chacha20poly1305" | ||
| 302 | version = "0.10.1" | ||
| 303 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 304 | checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" | ||
| 305 | dependencies = [ | ||
| 306 | "aead", | ||
| 307 | "chacha20", | ||
| 308 | "cipher", | ||
| 309 | "poly1305", | ||
| 310 | "zeroize", | ||
| 311 | ] | ||
| 312 | |||
| 313 | [[package]] | ||
| 314 | name = "chrono" | ||
| 315 | version = "0.4.42" | ||
| 316 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 317 | checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" | ||
| 318 | dependencies = [ | ||
| 319 | "iana-time-zone", | ||
| 320 | "js-sys", | ||
| 321 | "num-traits", | ||
| 322 | "wasm-bindgen", | ||
| 323 | "windows-link", | ||
| 324 | ] | ||
| 325 | |||
| 326 | [[package]] | ||
| 327 | name = "cipher" | ||
| 328 | version = "0.4.4" | ||
| 329 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 330 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" | ||
| 331 | dependencies = [ | ||
| 332 | "crypto-common", | ||
| 333 | "inout", | ||
| 334 | "zeroize", | ||
| 335 | ] | ||
| 336 | |||
| 337 | [[package]] | ||
| 338 | name = "clap" | ||
| 339 | version = "4.5.51" | ||
| 340 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 341 | checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" | ||
| 342 | dependencies = [ | ||
| 343 | "clap_builder", | ||
| 344 | "clap_derive", | ||
| 345 | ] | ||
| 346 | |||
| 347 | [[package]] | ||
| 348 | name = "clap_builder" | ||
| 349 | version = "4.5.51" | ||
| 350 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 351 | checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" | ||
| 352 | dependencies = [ | ||
| 353 | "anstream", | ||
| 354 | "anstyle", | ||
| 355 | "clap_lex", | ||
| 356 | "strsim", | ||
| 357 | ] | ||
| 358 | |||
| 359 | [[package]] | ||
| 360 | name = "clap_derive" | ||
| 361 | version = "4.5.49" | ||
| 362 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 363 | checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" | ||
| 364 | dependencies = [ | ||
| 365 | "heck", | ||
| 366 | "proc-macro2", | ||
| 367 | "quote", | ||
| 368 | "syn", | ||
| 369 | ] | ||
| 370 | |||
| 371 | [[package]] | ||
| 372 | name = "clap_lex" | ||
| 373 | version = "0.7.6" | ||
| 374 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 375 | checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" | ||
| 376 | |||
| 377 | [[package]] | ||
| 378 | name = "colorchoice" | ||
| 379 | version = "1.0.4" | ||
| 380 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 381 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" | ||
| 382 | |||
| 383 | [[package]] | ||
| 384 | name = "core-foundation-sys" | ||
| 385 | version = "0.8.7" | ||
| 386 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 387 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" | ||
| 388 | |||
| 389 | [[package]] | ||
| 390 | name = "cpufeatures" | ||
| 391 | version = "0.2.17" | ||
| 392 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 393 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" | ||
| 394 | dependencies = [ | ||
| 395 | "libc", | ||
| 396 | ] | ||
| 397 | |||
| 398 | [[package]] | ||
| 399 | name = "crypto-common" | ||
| 400 | version = "0.1.6" | ||
| 401 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 402 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" | ||
| 403 | dependencies = [ | ||
| 404 | "generic-array", | ||
| 405 | "rand_core 0.6.4", | ||
| 406 | "typenum", | ||
| 407 | ] | ||
| 408 | |||
| 409 | [[package]] | ||
| 410 | name = "data-encoding" | ||
| 411 | version = "2.9.0" | ||
| 412 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 413 | checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" | ||
| 414 | |||
| 415 | [[package]] | ||
| 416 | name = "digest" | ||
| 417 | version = "0.10.7" | ||
| 418 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 419 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" | ||
| 420 | dependencies = [ | ||
| 421 | "block-buffer", | ||
| 422 | "crypto-common", | ||
| 423 | "subtle", | ||
| 424 | ] | ||
| 425 | |||
| 426 | [[package]] | ||
| 427 | name = "displaydoc" | ||
| 428 | version = "0.2.5" | ||
| 429 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 430 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" | ||
| 431 | dependencies = [ | ||
| 432 | "proc-macro2", | ||
| 433 | "quote", | ||
| 434 | "syn", | ||
| 435 | ] | ||
| 436 | |||
| 437 | [[package]] | ||
| 438 | name = "dotenvy" | ||
| 439 | version = "0.15.7" | ||
| 440 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 441 | checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" | ||
| 442 | |||
| 443 | [[package]] | ||
| 444 | name = "either" | ||
| 445 | version = "1.15.0" | ||
| 446 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 447 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" | ||
| 448 | |||
| 449 | [[package]] | ||
| 450 | name = "find-msvc-tools" | ||
| 451 | version = "0.1.4" | ||
| 452 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 453 | checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" | ||
| 454 | |||
| 455 | [[package]] | ||
| 456 | name = "fnv" | ||
| 457 | version = "1.0.7" | ||
| 458 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 459 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" | ||
| 460 | |||
| 461 | [[package]] | ||
| 462 | name = "form_urlencoded" | ||
| 463 | version = "1.2.2" | ||
| 464 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 465 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" | ||
| 466 | dependencies = [ | ||
| 467 | "percent-encoding", | ||
| 468 | ] | ||
| 469 | |||
| 470 | [[package]] | ||
| 471 | name = "futures" | ||
| 472 | version = "0.3.31" | ||
| 473 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 474 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" | ||
| 475 | dependencies = [ | ||
| 476 | "futures-channel", | ||
| 477 | "futures-core", | ||
| 478 | "futures-executor", | ||
| 479 | "futures-io", | ||
| 480 | "futures-sink", | ||
| 481 | "futures-task", | ||
| 482 | "futures-util", | ||
| 483 | ] | ||
| 484 | |||
| 485 | [[package]] | ||
| 486 | name = "futures-channel" | ||
| 487 | version = "0.3.31" | ||
| 488 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 489 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" | ||
| 490 | dependencies = [ | ||
| 491 | "futures-core", | ||
| 492 | "futures-sink", | ||
| 493 | ] | ||
| 494 | |||
| 495 | [[package]] | ||
| 496 | name = "futures-core" | ||
| 497 | version = "0.3.31" | ||
| 498 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 499 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" | ||
| 500 | |||
| 501 | [[package]] | ||
| 502 | name = "futures-executor" | ||
| 503 | version = "0.3.31" | ||
| 504 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 505 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" | ||
| 506 | dependencies = [ | ||
| 507 | "futures-core", | ||
| 508 | "futures-task", | ||
| 509 | "futures-util", | ||
| 510 | ] | ||
| 511 | |||
| 512 | [[package]] | ||
| 513 | name = "futures-io" | ||
| 514 | version = "0.3.31" | ||
| 515 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 516 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" | ||
| 517 | |||
| 518 | [[package]] | ||
| 519 | name = "futures-macro" | ||
| 520 | version = "0.3.31" | ||
| 521 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 522 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" | ||
| 523 | dependencies = [ | ||
| 524 | "proc-macro2", | ||
| 525 | "quote", | ||
| 526 | "syn", | ||
| 527 | ] | ||
| 528 | |||
| 529 | [[package]] | ||
| 530 | name = "futures-sink" | ||
| 531 | version = "0.3.31" | ||
| 532 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 533 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" | ||
| 534 | |||
| 535 | [[package]] | ||
| 536 | name = "futures-task" | ||
| 537 | version = "0.3.31" | ||
| 538 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 539 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" | ||
| 540 | |||
| 541 | [[package]] | ||
| 542 | name = "futures-util" | ||
| 543 | version = "0.3.31" | ||
| 544 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 545 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" | ||
| 546 | dependencies = [ | ||
| 547 | "futures-channel", | ||
| 548 | "futures-core", | ||
| 549 | "futures-io", | ||
| 550 | "futures-macro", | ||
| 551 | "futures-sink", | ||
| 552 | "futures-task", | ||
| 553 | "memchr", | ||
| 554 | "pin-project-lite", | ||
| 555 | "pin-utils", | ||
| 556 | "slab", | ||
| 557 | ] | ||
| 558 | |||
| 559 | [[package]] | ||
| 560 | name = "generic-array" | ||
| 561 | version = "0.14.9" | ||
| 562 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 563 | checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" | ||
| 564 | dependencies = [ | ||
| 565 | "typenum", | ||
| 566 | "version_check", | ||
| 567 | ] | ||
| 568 | |||
| 569 | [[package]] | ||
| 570 | name = "getrandom" | ||
| 571 | version = "0.2.16" | ||
| 572 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 573 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" | ||
| 574 | dependencies = [ | ||
| 575 | "cfg-if", | ||
| 576 | "js-sys", | ||
| 577 | "libc", | ||
| 578 | "wasi", | ||
| 579 | "wasm-bindgen", | ||
| 580 | ] | ||
| 581 | |||
| 582 | [[package]] | ||
| 583 | name = "getrandom" | ||
| 584 | version = "0.3.4" | ||
| 585 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 586 | checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" | ||
| 587 | dependencies = [ | ||
| 588 | "cfg-if", | ||
| 589 | "libc", | ||
| 590 | "r-efi", | ||
| 591 | "wasip2", | ||
| 592 | ] | ||
| 593 | |||
| 594 | [[package]] | ||
| 595 | name = "gloo-timers" | ||
| 596 | version = "0.3.0" | ||
| 597 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 598 | checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" | ||
| 599 | dependencies = [ | ||
| 600 | "futures-channel", | ||
| 601 | "futures-core", | ||
| 602 | "js-sys", | ||
| 603 | "wasm-bindgen", | ||
| 604 | ] | ||
| 605 | |||
| 606 | [[package]] | ||
| 607 | name = "grasp-audit" | ||
| 608 | version = "0.1.0" | ||
| 609 | dependencies = [ | ||
| 610 | "anyhow", | ||
| 611 | "chrono", | ||
| 612 | "clap", | ||
| 613 | "futures", | ||
| 614 | "nostr-sdk", | ||
| 615 | "serde", | ||
| 616 | "serde_json", | ||
| 617 | "thiserror 1.0.69", | ||
| 618 | "tokio", | ||
| 619 | "tokio-test", | ||
| 620 | "tracing", | ||
| 621 | "tracing-subscriber", | ||
| 622 | "uuid", | ||
| 623 | ] | ||
| 624 | |||
| 625 | [[package]] | ||
| 626 | name = "heck" | ||
| 627 | version = "0.5.0" | ||
| 628 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 629 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" | ||
| 630 | |||
| 631 | [[package]] | ||
| 632 | name = "hex-conservative" | ||
| 633 | version = "0.1.2" | ||
| 634 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 635 | checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" | ||
| 636 | |||
| 637 | [[package]] | ||
| 638 | name = "hex-conservative" | ||
| 639 | version = "0.2.1" | ||
| 640 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 641 | checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" | ||
| 642 | dependencies = [ | ||
| 643 | "arrayvec", | ||
| 644 | ] | ||
| 645 | |||
| 646 | [[package]] | ||
| 647 | name = "hmac" | ||
| 648 | version = "0.12.1" | ||
| 649 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 650 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" | ||
| 651 | dependencies = [ | ||
| 652 | "digest", | ||
| 653 | ] | ||
| 654 | |||
| 655 | [[package]] | ||
| 656 | name = "http" | ||
| 657 | version = "1.3.1" | ||
| 658 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 659 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" | ||
| 660 | dependencies = [ | ||
| 661 | "bytes", | ||
| 662 | "fnv", | ||
| 663 | "itoa", | ||
| 664 | ] | ||
| 665 | |||
| 666 | [[package]] | ||
| 667 | name = "httparse" | ||
| 668 | version = "1.10.1" | ||
| 669 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 670 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" | ||
| 671 | |||
| 672 | [[package]] | ||
| 673 | name = "iana-time-zone" | ||
| 674 | version = "0.1.64" | ||
| 675 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 676 | checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" | ||
| 677 | dependencies = [ | ||
| 678 | "android_system_properties", | ||
| 679 | "core-foundation-sys", | ||
| 680 | "iana-time-zone-haiku", | ||
| 681 | "js-sys", | ||
| 682 | "log", | ||
| 683 | "wasm-bindgen", | ||
| 684 | "windows-core", | ||
| 685 | ] | ||
| 686 | |||
| 687 | [[package]] | ||
| 688 | name = "iana-time-zone-haiku" | ||
| 689 | version = "0.1.2" | ||
| 690 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 691 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" | ||
| 692 | dependencies = [ | ||
| 693 | "cc", | ||
| 694 | ] | ||
| 695 | |||
| 696 | [[package]] | ||
| 697 | name = "icu_collections" | ||
| 698 | version = "2.1.1" | ||
| 699 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 700 | checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" | ||
| 701 | dependencies = [ | ||
| 702 | "displaydoc", | ||
| 703 | "potential_utf", | ||
| 704 | "yoke", | ||
| 705 | "zerofrom", | ||
| 706 | "zerovec", | ||
| 707 | ] | ||
| 708 | |||
| 709 | [[package]] | ||
| 710 | name = "icu_locale_core" | ||
| 711 | version = "2.1.1" | ||
| 712 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 713 | checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" | ||
| 714 | dependencies = [ | ||
| 715 | "displaydoc", | ||
| 716 | "litemap", | ||
| 717 | "tinystr", | ||
| 718 | "writeable", | ||
| 719 | "zerovec", | ||
| 720 | ] | ||
| 721 | |||
| 722 | [[package]] | ||
| 723 | name = "icu_normalizer" | ||
| 724 | version = "2.1.1" | ||
| 725 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 726 | checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" | ||
| 727 | dependencies = [ | ||
| 728 | "icu_collections", | ||
| 729 | "icu_normalizer_data", | ||
| 730 | "icu_properties", | ||
| 731 | "icu_provider", | ||
| 732 | "smallvec", | ||
| 733 | "zerovec", | ||
| 734 | ] | ||
| 735 | |||
| 736 | [[package]] | ||
| 737 | name = "icu_normalizer_data" | ||
| 738 | version = "2.1.1" | ||
| 739 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 740 | checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" | ||
| 741 | |||
| 742 | [[package]] | ||
| 743 | name = "icu_properties" | ||
| 744 | version = "2.1.1" | ||
| 745 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 746 | checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" | ||
| 747 | dependencies = [ | ||
| 748 | "icu_collections", | ||
| 749 | "icu_locale_core", | ||
| 750 | "icu_properties_data", | ||
| 751 | "icu_provider", | ||
| 752 | "zerotrie", | ||
| 753 | "zerovec", | ||
| 754 | ] | ||
| 755 | |||
| 756 | [[package]] | ||
| 757 | name = "icu_properties_data" | ||
| 758 | version = "2.1.1" | ||
| 759 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 760 | checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" | ||
| 761 | |||
| 762 | [[package]] | ||
| 763 | name = "icu_provider" | ||
| 764 | version = "2.1.1" | ||
| 765 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 766 | checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" | ||
| 767 | dependencies = [ | ||
| 768 | "displaydoc", | ||
| 769 | "icu_locale_core", | ||
| 770 | "writeable", | ||
| 771 | "yoke", | ||
| 772 | "zerofrom", | ||
| 773 | "zerotrie", | ||
| 774 | "zerovec", | ||
| 775 | ] | ||
| 776 | |||
| 777 | [[package]] | ||
| 778 | name = "idna" | ||
| 779 | version = "1.1.0" | ||
| 780 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 781 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" | ||
| 782 | dependencies = [ | ||
| 783 | "idna_adapter", | ||
| 784 | "smallvec", | ||
| 785 | "utf8_iter", | ||
| 786 | ] | ||
| 787 | |||
| 788 | [[package]] | ||
| 789 | name = "idna_adapter" | ||
| 790 | version = "1.2.1" | ||
| 791 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 792 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" | ||
| 793 | dependencies = [ | ||
| 794 | "icu_normalizer", | ||
| 795 | "icu_properties", | ||
| 796 | ] | ||
| 797 | |||
| 798 | [[package]] | ||
| 799 | name = "inout" | ||
| 800 | version = "0.1.4" | ||
| 801 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 802 | checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" | ||
| 803 | dependencies = [ | ||
| 804 | "block-padding", | ||
| 805 | "generic-array", | ||
| 806 | ] | ||
| 807 | |||
| 808 | [[package]] | ||
| 809 | name = "instant" | ||
| 810 | version = "0.1.13" | ||
| 811 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 812 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" | ||
| 813 | dependencies = [ | ||
| 814 | "cfg-if", | ||
| 815 | "js-sys", | ||
| 816 | "wasm-bindgen", | ||
| 817 | "web-sys", | ||
| 818 | ] | ||
| 819 | |||
| 820 | [[package]] | ||
| 821 | name = "is_terminal_polyfill" | ||
| 822 | version = "1.70.2" | ||
| 823 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 824 | checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" | ||
| 825 | |||
| 826 | [[package]] | ||
| 827 | name = "itoa" | ||
| 828 | version = "1.0.15" | ||
| 829 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 830 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" | ||
| 831 | |||
| 832 | [[package]] | ||
| 833 | name = "js-sys" | ||
| 834 | version = "0.3.82" | ||
| 835 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 836 | checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" | ||
| 837 | dependencies = [ | ||
| 838 | "once_cell", | ||
| 839 | "wasm-bindgen", | ||
| 840 | ] | ||
| 841 | |||
| 842 | [[package]] | ||
| 843 | name = "lazy_static" | ||
| 844 | version = "1.5.0" | ||
| 845 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 846 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" | ||
| 847 | |||
| 848 | [[package]] | ||
| 849 | name = "libc" | ||
| 850 | version = "0.2.177" | ||
| 851 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 852 | checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" | ||
| 853 | |||
| 854 | [[package]] | ||
| 855 | name = "litemap" | ||
| 856 | version = "0.8.1" | ||
| 857 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 858 | checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" | ||
| 859 | |||
| 860 | [[package]] | ||
| 861 | name = "lock_api" | ||
| 862 | version = "0.4.14" | ||
| 863 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 864 | checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" | ||
| 865 | dependencies = [ | ||
| 866 | "scopeguard", | ||
| 867 | ] | ||
| 868 | |||
| 869 | [[package]] | ||
| 870 | name = "log" | ||
| 871 | version = "0.4.28" | ||
| 872 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 873 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" | ||
| 874 | |||
| 875 | [[package]] | ||
| 876 | name = "lru" | ||
| 877 | version = "0.16.2" | ||
| 878 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 879 | checksum = "96051b46fc183dc9cd4a223960ef37b9af631b55191852a8274bfef064cda20f" | ||
| 880 | |||
| 881 | [[package]] | ||
| 882 | name = "matchers" | ||
| 883 | version = "0.2.0" | ||
| 884 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 885 | checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" | ||
| 886 | dependencies = [ | ||
| 887 | "regex-automata", | ||
| 888 | ] | ||
| 889 | |||
| 890 | [[package]] | ||
| 891 | name = "memchr" | ||
| 892 | version = "2.7.6" | ||
| 893 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 894 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" | ||
| 895 | |||
| 896 | [[package]] | ||
| 897 | name = "mio" | ||
| 898 | version = "1.1.0" | ||
| 899 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 900 | checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" | ||
| 901 | dependencies = [ | ||
| 902 | "libc", | ||
| 903 | "wasi", | ||
| 904 | "windows-sys 0.61.2", | ||
| 905 | ] | ||
| 906 | |||
| 907 | [[package]] | ||
| 908 | name = "negentropy" | ||
| 909 | version = "0.5.0" | ||
| 910 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 911 | checksum = "f0efe882e02d206d8d279c20eb40e03baf7cb5136a1476dc084a324fbc3ec42d" | ||
| 912 | |||
| 913 | [[package]] | ||
| 914 | name = "ngit-grasp" | ||
| 915 | version = "0.1.0" | ||
| 916 | dependencies = [ | ||
| 917 | "anyhow", | ||
| 918 | "dotenvy", | ||
| 919 | "futures-util", | ||
| 920 | "nostr-sdk", | ||
| 921 | "serde", | ||
| 922 | "serde_json", | ||
| 923 | "thiserror 1.0.69", | ||
| 924 | "tokio", | ||
| 925 | "tokio-test", | ||
| 926 | "tokio-tungstenite 0.21.0", | ||
| 927 | "tracing", | ||
| 928 | "tracing-subscriber", | ||
| 929 | "tungstenite 0.21.0", | ||
| 930 | ] | ||
| 931 | |||
| 932 | [[package]] | ||
| 933 | name = "nostr" | ||
| 934 | version = "0.43.1" | ||
| 935 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 936 | checksum = "62a97d745f1bd8d5e05a978632bbb87b0614567d5142906fe7c86fb2440faac6" | ||
| 937 | dependencies = [ | ||
| 938 | "base64", | ||
| 939 | "bech32", | ||
| 940 | "bip39", | ||
| 941 | "bitcoin_hashes 0.14.0", | ||
| 942 | "cbc", | ||
| 943 | "chacha20", | ||
| 944 | "chacha20poly1305", | ||
| 945 | "getrandom 0.2.16", | ||
| 946 | "instant", | ||
| 947 | "scrypt", | ||
| 948 | "secp256k1", | ||
| 949 | "serde", | ||
| 950 | "serde_json", | ||
| 951 | "unicode-normalization", | ||
| 952 | "url", | ||
| 953 | ] | ||
| 954 | |||
| 955 | [[package]] | ||
| 956 | name = "nostr-database" | ||
| 957 | version = "0.43.0" | ||
| 958 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 959 | checksum = "b1c75a8c2175d2785ba73cfddef21d1e30da5fbbdf158569b6808ba44973a15b" | ||
| 960 | dependencies = [ | ||
| 961 | "lru", | ||
| 962 | "nostr", | ||
| 963 | "tokio", | ||
| 964 | ] | ||
| 965 | |||
| 966 | [[package]] | ||
| 967 | name = "nostr-relay-pool" | ||
| 968 | version = "0.43.1" | ||
| 969 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 970 | checksum = "2b2f43b70d13dfc50508a13cd902e11f4625312b2ce0e4b7c4c2283fd04001bd" | ||
| 971 | dependencies = [ | ||
| 972 | "async-utility", | ||
| 973 | "async-wsocket", | ||
| 974 | "atomic-destructor", | ||
| 975 | "lru", | ||
| 976 | "negentropy", | ||
| 977 | "nostr", | ||
| 978 | "nostr-database", | ||
| 979 | "tokio", | ||
| 980 | "tracing", | ||
| 981 | ] | ||
| 982 | |||
| 983 | [[package]] | ||
| 984 | name = "nostr-sdk" | ||
| 985 | version = "0.43.0" | ||
| 986 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 987 | checksum = "599f8963d6a1522a13b1a2b0ea6e168acfc367706606f1d33fa595e91fa22db0" | ||
| 988 | dependencies = [ | ||
| 989 | "async-utility", | ||
| 990 | "nostr", | ||
| 991 | "nostr-database", | ||
| 992 | "nostr-relay-pool", | ||
| 993 | "tokio", | ||
| 994 | ] | ||
| 995 | |||
| 996 | [[package]] | ||
| 997 | name = "nu-ansi-term" | ||
| 998 | version = "0.50.3" | ||
| 999 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1000 | checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" | ||
| 1001 | dependencies = [ | ||
| 1002 | "windows-sys 0.61.2", | ||
| 1003 | ] | ||
| 1004 | |||
| 1005 | [[package]] | ||
| 1006 | name = "num-traits" | ||
| 1007 | version = "0.2.19" | ||
| 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1009 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" | ||
| 1010 | dependencies = [ | ||
| 1011 | "autocfg", | ||
| 1012 | ] | ||
| 1013 | |||
| 1014 | [[package]] | ||
| 1015 | name = "once_cell" | ||
| 1016 | version = "1.21.3" | ||
| 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1018 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" | ||
| 1019 | |||
| 1020 | [[package]] | ||
| 1021 | name = "once_cell_polyfill" | ||
| 1022 | version = "1.70.2" | ||
| 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1024 | checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" | ||
| 1025 | |||
| 1026 | [[package]] | ||
| 1027 | name = "opaque-debug" | ||
| 1028 | version = "0.3.1" | ||
| 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1030 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" | ||
| 1031 | |||
| 1032 | [[package]] | ||
| 1033 | name = "parking_lot" | ||
| 1034 | version = "0.12.5" | ||
| 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1036 | checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" | ||
| 1037 | dependencies = [ | ||
| 1038 | "lock_api", | ||
| 1039 | "parking_lot_core", | ||
| 1040 | ] | ||
| 1041 | |||
| 1042 | [[package]] | ||
| 1043 | name = "parking_lot_core" | ||
| 1044 | version = "0.9.12" | ||
| 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1046 | checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" | ||
| 1047 | dependencies = [ | ||
| 1048 | "cfg-if", | ||
| 1049 | "libc", | ||
| 1050 | "redox_syscall", | ||
| 1051 | "smallvec", | ||
| 1052 | "windows-link", | ||
| 1053 | ] | ||
| 1054 | |||
| 1055 | [[package]] | ||
| 1056 | name = "password-hash" | ||
| 1057 | version = "0.5.0" | ||
| 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1059 | checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" | ||
| 1060 | dependencies = [ | ||
| 1061 | "base64ct", | ||
| 1062 | "rand_core 0.6.4", | ||
| 1063 | "subtle", | ||
| 1064 | ] | ||
| 1065 | |||
| 1066 | [[package]] | ||
| 1067 | name = "pbkdf2" | ||
| 1068 | version = "0.12.2" | ||
| 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1070 | checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" | ||
| 1071 | dependencies = [ | ||
| 1072 | "digest", | ||
| 1073 | "hmac", | ||
| 1074 | ] | ||
| 1075 | |||
| 1076 | [[package]] | ||
| 1077 | name = "percent-encoding" | ||
| 1078 | version = "2.3.2" | ||
| 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1080 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" | ||
| 1081 | |||
| 1082 | [[package]] | ||
| 1083 | name = "pin-project-lite" | ||
| 1084 | version = "0.2.16" | ||
| 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1086 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" | ||
| 1087 | |||
| 1088 | [[package]] | ||
| 1089 | name = "pin-utils" | ||
| 1090 | version = "0.1.0" | ||
| 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1092 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" | ||
| 1093 | |||
| 1094 | [[package]] | ||
| 1095 | name = "poly1305" | ||
| 1096 | version = "0.8.0" | ||
| 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1098 | checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" | ||
| 1099 | dependencies = [ | ||
| 1100 | "cpufeatures", | ||
| 1101 | "opaque-debug", | ||
| 1102 | "universal-hash", | ||
| 1103 | ] | ||
| 1104 | |||
| 1105 | [[package]] | ||
| 1106 | name = "potential_utf" | ||
| 1107 | version = "0.1.4" | ||
| 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1109 | checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" | ||
| 1110 | dependencies = [ | ||
| 1111 | "zerovec", | ||
| 1112 | ] | ||
| 1113 | |||
| 1114 | [[package]] | ||
| 1115 | name = "ppv-lite86" | ||
| 1116 | version = "0.2.21" | ||
| 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1118 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" | ||
| 1119 | dependencies = [ | ||
| 1120 | "zerocopy", | ||
| 1121 | ] | ||
| 1122 | |||
| 1123 | [[package]] | ||
| 1124 | name = "proc-macro2" | ||
| 1125 | version = "1.0.103" | ||
| 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1127 | checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" | ||
| 1128 | dependencies = [ | ||
| 1129 | "unicode-ident", | ||
| 1130 | ] | ||
| 1131 | |||
| 1132 | [[package]] | ||
| 1133 | name = "quote" | ||
| 1134 | version = "1.0.41" | ||
| 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1136 | checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" | ||
| 1137 | dependencies = [ | ||
| 1138 | "proc-macro2", | ||
| 1139 | ] | ||
| 1140 | |||
| 1141 | [[package]] | ||
| 1142 | name = "r-efi" | ||
| 1143 | version = "5.3.0" | ||
| 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1145 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" | ||
| 1146 | |||
| 1147 | [[package]] | ||
| 1148 | name = "rand" | ||
| 1149 | version = "0.8.5" | ||
| 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1151 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" | ||
| 1152 | dependencies = [ | ||
| 1153 | "libc", | ||
| 1154 | "rand_chacha 0.3.1", | ||
| 1155 | "rand_core 0.6.4", | ||
| 1156 | ] | ||
| 1157 | |||
| 1158 | [[package]] | ||
| 1159 | name = "rand" | ||
| 1160 | version = "0.9.2" | ||
| 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1162 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" | ||
| 1163 | dependencies = [ | ||
| 1164 | "rand_chacha 0.9.0", | ||
| 1165 | "rand_core 0.9.3", | ||
| 1166 | ] | ||
| 1167 | |||
| 1168 | [[package]] | ||
| 1169 | name = "rand_chacha" | ||
| 1170 | version = "0.3.1" | ||
| 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1172 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" | ||
| 1173 | dependencies = [ | ||
| 1174 | "ppv-lite86", | ||
| 1175 | "rand_core 0.6.4", | ||
| 1176 | ] | ||
| 1177 | |||
| 1178 | [[package]] | ||
| 1179 | name = "rand_chacha" | ||
| 1180 | version = "0.9.0" | ||
| 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1182 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" | ||
| 1183 | dependencies = [ | ||
| 1184 | "ppv-lite86", | ||
| 1185 | "rand_core 0.9.3", | ||
| 1186 | ] | ||
| 1187 | |||
| 1188 | [[package]] | ||
| 1189 | name = "rand_core" | ||
| 1190 | version = "0.6.4" | ||
| 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1192 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" | ||
| 1193 | dependencies = [ | ||
| 1194 | "getrandom 0.2.16", | ||
| 1195 | ] | ||
| 1196 | |||
| 1197 | [[package]] | ||
| 1198 | name = "rand_core" | ||
| 1199 | version = "0.9.3" | ||
| 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1201 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" | ||
| 1202 | dependencies = [ | ||
| 1203 | "getrandom 0.3.4", | ||
| 1204 | ] | ||
| 1205 | |||
| 1206 | [[package]] | ||
| 1207 | name = "redox_syscall" | ||
| 1208 | version = "0.5.18" | ||
| 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1210 | checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" | ||
| 1211 | dependencies = [ | ||
| 1212 | "bitflags", | ||
| 1213 | ] | ||
| 1214 | |||
| 1215 | [[package]] | ||
| 1216 | name = "regex-automata" | ||
| 1217 | version = "0.4.13" | ||
| 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1219 | checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" | ||
| 1220 | dependencies = [ | ||
| 1221 | "aho-corasick", | ||
| 1222 | "memchr", | ||
| 1223 | "regex-syntax", | ||
| 1224 | ] | ||
| 1225 | |||
| 1226 | [[package]] | ||
| 1227 | name = "regex-syntax" | ||
| 1228 | version = "0.8.8" | ||
| 1229 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1230 | checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" | ||
| 1231 | |||
| 1232 | [[package]] | ||
| 1233 | name = "ring" | ||
| 1234 | version = "0.17.14" | ||
| 1235 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1236 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" | ||
| 1237 | dependencies = [ | ||
| 1238 | "cc", | ||
| 1239 | "cfg-if", | ||
| 1240 | "getrandom 0.2.16", | ||
| 1241 | "libc", | ||
| 1242 | "untrusted", | ||
| 1243 | "windows-sys 0.52.0", | ||
| 1244 | ] | ||
| 1245 | |||
| 1246 | [[package]] | ||
| 1247 | name = "rustls" | ||
| 1248 | version = "0.23.34" | ||
| 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1250 | checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" | ||
| 1251 | dependencies = [ | ||
| 1252 | "once_cell", | ||
| 1253 | "ring", | ||
| 1254 | "rustls-pki-types", | ||
| 1255 | "rustls-webpki", | ||
| 1256 | "subtle", | ||
| 1257 | "zeroize", | ||
| 1258 | ] | ||
| 1259 | |||
| 1260 | [[package]] | ||
| 1261 | name = "rustls-pki-types" | ||
| 1262 | version = "1.13.0" | ||
| 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1264 | checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" | ||
| 1265 | dependencies = [ | ||
| 1266 | "zeroize", | ||
| 1267 | ] | ||
| 1268 | |||
| 1269 | [[package]] | ||
| 1270 | name = "rustls-webpki" | ||
| 1271 | version = "0.103.8" | ||
| 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1273 | checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" | ||
| 1274 | dependencies = [ | ||
| 1275 | "ring", | ||
| 1276 | "rustls-pki-types", | ||
| 1277 | "untrusted", | ||
| 1278 | ] | ||
| 1279 | |||
| 1280 | [[package]] | ||
| 1281 | name = "rustversion" | ||
| 1282 | version = "1.0.22" | ||
| 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1284 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" | ||
| 1285 | |||
| 1286 | [[package]] | ||
| 1287 | name = "ryu" | ||
| 1288 | version = "1.0.20" | ||
| 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1290 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" | ||
| 1291 | |||
| 1292 | [[package]] | ||
| 1293 | name = "salsa20" | ||
| 1294 | version = "0.10.2" | ||
| 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1296 | checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" | ||
| 1297 | dependencies = [ | ||
| 1298 | "cipher", | ||
| 1299 | ] | ||
| 1300 | |||
| 1301 | [[package]] | ||
| 1302 | name = "scopeguard" | ||
| 1303 | version = "1.2.0" | ||
| 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1305 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" | ||
| 1306 | |||
| 1307 | [[package]] | ||
| 1308 | name = "scrypt" | ||
| 1309 | version = "0.11.0" | ||
| 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1311 | checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" | ||
| 1312 | dependencies = [ | ||
| 1313 | "password-hash", | ||
| 1314 | "pbkdf2", | ||
| 1315 | "salsa20", | ||
| 1316 | "sha2", | ||
| 1317 | ] | ||
| 1318 | |||
| 1319 | [[package]] | ||
| 1320 | name = "secp256k1" | ||
| 1321 | version = "0.29.1" | ||
| 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1323 | checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" | ||
| 1324 | dependencies = [ | ||
| 1325 | "rand 0.8.5", | ||
| 1326 | "secp256k1-sys", | ||
| 1327 | "serde", | ||
| 1328 | ] | ||
| 1329 | |||
| 1330 | [[package]] | ||
| 1331 | name = "secp256k1-sys" | ||
| 1332 | version = "0.10.1" | ||
| 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1334 | checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" | ||
| 1335 | dependencies = [ | ||
| 1336 | "cc", | ||
| 1337 | ] | ||
| 1338 | |||
| 1339 | [[package]] | ||
| 1340 | name = "serde" | ||
| 1341 | version = "1.0.228" | ||
| 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1343 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" | ||
| 1344 | dependencies = [ | ||
| 1345 | "serde_core", | ||
| 1346 | "serde_derive", | ||
| 1347 | ] | ||
| 1348 | |||
| 1349 | [[package]] | ||
| 1350 | name = "serde_core" | ||
| 1351 | version = "1.0.228" | ||
| 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1353 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" | ||
| 1354 | dependencies = [ | ||
| 1355 | "serde_derive", | ||
| 1356 | ] | ||
| 1357 | |||
| 1358 | [[package]] | ||
| 1359 | name = "serde_derive" | ||
| 1360 | version = "1.0.228" | ||
| 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1362 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" | ||
| 1363 | dependencies = [ | ||
| 1364 | "proc-macro2", | ||
| 1365 | "quote", | ||
| 1366 | "syn", | ||
| 1367 | ] | ||
| 1368 | |||
| 1369 | [[package]] | ||
| 1370 | name = "serde_json" | ||
| 1371 | version = "1.0.145" | ||
| 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1373 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" | ||
| 1374 | dependencies = [ | ||
| 1375 | "itoa", | ||
| 1376 | "memchr", | ||
| 1377 | "ryu", | ||
| 1378 | "serde", | ||
| 1379 | "serde_core", | ||
| 1380 | ] | ||
| 1381 | |||
| 1382 | [[package]] | ||
| 1383 | name = "sha1" | ||
| 1384 | version = "0.10.6" | ||
| 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1386 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" | ||
| 1387 | dependencies = [ | ||
| 1388 | "cfg-if", | ||
| 1389 | "cpufeatures", | ||
| 1390 | "digest", | ||
| 1391 | ] | ||
| 1392 | |||
| 1393 | [[package]] | ||
| 1394 | name = "sha2" | ||
| 1395 | version = "0.10.9" | ||
| 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1397 | checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" | ||
| 1398 | dependencies = [ | ||
| 1399 | "cfg-if", | ||
| 1400 | "cpufeatures", | ||
| 1401 | "digest", | ||
| 1402 | ] | ||
| 1403 | |||
| 1404 | [[package]] | ||
| 1405 | name = "sharded-slab" | ||
| 1406 | version = "0.1.7" | ||
| 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1408 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" | ||
| 1409 | dependencies = [ | ||
| 1410 | "lazy_static", | ||
| 1411 | ] | ||
| 1412 | |||
| 1413 | [[package]] | ||
| 1414 | name = "shlex" | ||
| 1415 | version = "1.3.0" | ||
| 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1417 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" | ||
| 1418 | |||
| 1419 | [[package]] | ||
| 1420 | name = "signal-hook-registry" | ||
| 1421 | version = "1.4.6" | ||
| 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1423 | checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" | ||
| 1424 | dependencies = [ | ||
| 1425 | "libc", | ||
| 1426 | ] | ||
| 1427 | |||
| 1428 | [[package]] | ||
| 1429 | name = "slab" | ||
| 1430 | version = "0.4.11" | ||
| 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1432 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" | ||
| 1433 | |||
| 1434 | [[package]] | ||
| 1435 | name = "smallvec" | ||
| 1436 | version = "1.15.1" | ||
| 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1438 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" | ||
| 1439 | |||
| 1440 | [[package]] | ||
| 1441 | name = "socket2" | ||
| 1442 | version = "0.6.1" | ||
| 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1444 | checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" | ||
| 1445 | dependencies = [ | ||
| 1446 | "libc", | ||
| 1447 | "windows-sys 0.60.2", | ||
| 1448 | ] | ||
| 1449 | |||
| 1450 | [[package]] | ||
| 1451 | name = "stable_deref_trait" | ||
| 1452 | version = "1.2.1" | ||
| 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1454 | checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" | ||
| 1455 | |||
| 1456 | [[package]] | ||
| 1457 | name = "strsim" | ||
| 1458 | version = "0.11.1" | ||
| 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1460 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" | ||
| 1461 | |||
| 1462 | [[package]] | ||
| 1463 | name = "subtle" | ||
| 1464 | version = "2.6.1" | ||
| 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1466 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" | ||
| 1467 | |||
| 1468 | [[package]] | ||
| 1469 | name = "syn" | ||
| 1470 | version = "2.0.108" | ||
| 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1472 | checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" | ||
| 1473 | dependencies = [ | ||
| 1474 | "proc-macro2", | ||
| 1475 | "quote", | ||
| 1476 | "unicode-ident", | ||
| 1477 | ] | ||
| 1478 | |||
| 1479 | [[package]] | ||
| 1480 | name = "synstructure" | ||
| 1481 | version = "0.13.2" | ||
| 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1483 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" | ||
| 1484 | dependencies = [ | ||
| 1485 | "proc-macro2", | ||
| 1486 | "quote", | ||
| 1487 | "syn", | ||
| 1488 | ] | ||
| 1489 | |||
| 1490 | [[package]] | ||
| 1491 | name = "thiserror" | ||
| 1492 | version = "1.0.69" | ||
| 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1494 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" | ||
| 1495 | dependencies = [ | ||
| 1496 | "thiserror-impl 1.0.69", | ||
| 1497 | ] | ||
| 1498 | |||
| 1499 | [[package]] | ||
| 1500 | name = "thiserror" | ||
| 1501 | version = "2.0.17" | ||
| 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1503 | checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" | ||
| 1504 | dependencies = [ | ||
| 1505 | "thiserror-impl 2.0.17", | ||
| 1506 | ] | ||
| 1507 | |||
| 1508 | [[package]] | ||
| 1509 | name = "thiserror-impl" | ||
| 1510 | version = "1.0.69" | ||
| 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1512 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" | ||
| 1513 | dependencies = [ | ||
| 1514 | "proc-macro2", | ||
| 1515 | "quote", | ||
| 1516 | "syn", | ||
| 1517 | ] | ||
| 1518 | |||
| 1519 | [[package]] | ||
| 1520 | name = "thiserror-impl" | ||
| 1521 | version = "2.0.17" | ||
| 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1523 | checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" | ||
| 1524 | dependencies = [ | ||
| 1525 | "proc-macro2", | ||
| 1526 | "quote", | ||
| 1527 | "syn", | ||
| 1528 | ] | ||
| 1529 | |||
| 1530 | [[package]] | ||
| 1531 | name = "thread_local" | ||
| 1532 | version = "1.1.9" | ||
| 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1534 | checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" | ||
| 1535 | dependencies = [ | ||
| 1536 | "cfg-if", | ||
| 1537 | ] | ||
| 1538 | |||
| 1539 | [[package]] | ||
| 1540 | name = "tinystr" | ||
| 1541 | version = "0.8.2" | ||
| 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1543 | checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" | ||
| 1544 | dependencies = [ | ||
| 1545 | "displaydoc", | ||
| 1546 | "zerovec", | ||
| 1547 | ] | ||
| 1548 | |||
| 1549 | [[package]] | ||
| 1550 | name = "tinyvec" | ||
| 1551 | version = "1.10.0" | ||
| 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1553 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" | ||
| 1554 | dependencies = [ | ||
| 1555 | "tinyvec_macros", | ||
| 1556 | ] | ||
| 1557 | |||
| 1558 | [[package]] | ||
| 1559 | name = "tinyvec_macros" | ||
| 1560 | version = "0.1.1" | ||
| 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1562 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" | ||
| 1563 | |||
| 1564 | [[package]] | ||
| 1565 | name = "tokio" | ||
| 1566 | version = "1.48.0" | ||
| 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1568 | checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" | ||
| 1569 | dependencies = [ | ||
| 1570 | "bytes", | ||
| 1571 | "libc", | ||
| 1572 | "mio", | ||
| 1573 | "parking_lot", | ||
| 1574 | "pin-project-lite", | ||
| 1575 | "signal-hook-registry", | ||
| 1576 | "socket2", | ||
| 1577 | "tokio-macros", | ||
| 1578 | "windows-sys 0.61.2", | ||
| 1579 | ] | ||
| 1580 | |||
| 1581 | [[package]] | ||
| 1582 | name = "tokio-macros" | ||
| 1583 | version = "2.6.0" | ||
| 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1585 | checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" | ||
| 1586 | dependencies = [ | ||
| 1587 | "proc-macro2", | ||
| 1588 | "quote", | ||
| 1589 | "syn", | ||
| 1590 | ] | ||
| 1591 | |||
| 1592 | [[package]] | ||
| 1593 | name = "tokio-rustls" | ||
| 1594 | version = "0.26.4" | ||
| 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1596 | checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" | ||
| 1597 | dependencies = [ | ||
| 1598 | "rustls", | ||
| 1599 | "tokio", | ||
| 1600 | ] | ||
| 1601 | |||
| 1602 | [[package]] | ||
| 1603 | name = "tokio-socks" | ||
| 1604 | version = "0.5.2" | ||
| 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1606 | checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" | ||
| 1607 | dependencies = [ | ||
| 1608 | "either", | ||
| 1609 | "futures-util", | ||
| 1610 | "thiserror 1.0.69", | ||
| 1611 | "tokio", | ||
| 1612 | ] | ||
| 1613 | |||
| 1614 | [[package]] | ||
| 1615 | name = "tokio-stream" | ||
| 1616 | version = "0.1.17" | ||
| 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1618 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" | ||
| 1619 | dependencies = [ | ||
| 1620 | "futures-core", | ||
| 1621 | "pin-project-lite", | ||
| 1622 | "tokio", | ||
| 1623 | ] | ||
| 1624 | |||
| 1625 | [[package]] | ||
| 1626 | name = "tokio-test" | ||
| 1627 | version = "0.4.4" | ||
| 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1629 | checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" | ||
| 1630 | dependencies = [ | ||
| 1631 | "async-stream", | ||
| 1632 | "bytes", | ||
| 1633 | "futures-core", | ||
| 1634 | "tokio", | ||
| 1635 | "tokio-stream", | ||
| 1636 | ] | ||
| 1637 | |||
| 1638 | [[package]] | ||
| 1639 | name = "tokio-tungstenite" | ||
| 1640 | version = "0.21.0" | ||
| 1641 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1642 | checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" | ||
| 1643 | dependencies = [ | ||
| 1644 | "futures-util", | ||
| 1645 | "log", | ||
| 1646 | "tokio", | ||
| 1647 | "tungstenite 0.21.0", | ||
| 1648 | ] | ||
| 1649 | |||
| 1650 | [[package]] | ||
| 1651 | name = "tokio-tungstenite" | ||
| 1652 | version = "0.26.2" | ||
| 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1654 | checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" | ||
| 1655 | dependencies = [ | ||
| 1656 | "futures-util", | ||
| 1657 | "log", | ||
| 1658 | "rustls", | ||
| 1659 | "rustls-pki-types", | ||
| 1660 | "tokio", | ||
| 1661 | "tokio-rustls", | ||
| 1662 | "tungstenite 0.26.2", | ||
| 1663 | "webpki-roots 0.26.11", | ||
| 1664 | ] | ||
| 1665 | |||
| 1666 | [[package]] | ||
| 1667 | name = "tracing" | ||
| 1668 | version = "0.1.41" | ||
| 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1670 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" | ||
| 1671 | dependencies = [ | ||
| 1672 | "pin-project-lite", | ||
| 1673 | "tracing-attributes", | ||
| 1674 | "tracing-core", | ||
| 1675 | ] | ||
| 1676 | |||
| 1677 | [[package]] | ||
| 1678 | name = "tracing-attributes" | ||
| 1679 | version = "0.1.30" | ||
| 1680 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1681 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" | ||
| 1682 | dependencies = [ | ||
| 1683 | "proc-macro2", | ||
| 1684 | "quote", | ||
| 1685 | "syn", | ||
| 1686 | ] | ||
| 1687 | |||
| 1688 | [[package]] | ||
| 1689 | name = "tracing-core" | ||
| 1690 | version = "0.1.34" | ||
| 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1692 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" | ||
| 1693 | dependencies = [ | ||
| 1694 | "once_cell", | ||
| 1695 | "valuable", | ||
| 1696 | ] | ||
| 1697 | |||
| 1698 | [[package]] | ||
| 1699 | name = "tracing-log" | ||
| 1700 | version = "0.2.0" | ||
| 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1702 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" | ||
| 1703 | dependencies = [ | ||
| 1704 | "log", | ||
| 1705 | "once_cell", | ||
| 1706 | "tracing-core", | ||
| 1707 | ] | ||
| 1708 | |||
| 1709 | [[package]] | ||
| 1710 | name = "tracing-subscriber" | ||
| 1711 | version = "0.3.20" | ||
| 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1713 | checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" | ||
| 1714 | dependencies = [ | ||
| 1715 | "matchers", | ||
| 1716 | "nu-ansi-term", | ||
| 1717 | "once_cell", | ||
| 1718 | "regex-automata", | ||
| 1719 | "sharded-slab", | ||
| 1720 | "smallvec", | ||
| 1721 | "thread_local", | ||
| 1722 | "tracing", | ||
| 1723 | "tracing-core", | ||
| 1724 | "tracing-log", | ||
| 1725 | ] | ||
| 1726 | |||
| 1727 | [[package]] | ||
| 1728 | name = "tungstenite" | ||
| 1729 | version = "0.21.0" | ||
| 1730 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1731 | checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" | ||
| 1732 | dependencies = [ | ||
| 1733 | "byteorder", | ||
| 1734 | "bytes", | ||
| 1735 | "data-encoding", | ||
| 1736 | "http", | ||
| 1737 | "httparse", | ||
| 1738 | "log", | ||
| 1739 | "rand 0.8.5", | ||
| 1740 | "sha1", | ||
| 1741 | "thiserror 1.0.69", | ||
| 1742 | "url", | ||
| 1743 | "utf-8", | ||
| 1744 | ] | ||
| 1745 | |||
| 1746 | [[package]] | ||
| 1747 | name = "tungstenite" | ||
| 1748 | version = "0.26.2" | ||
| 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1750 | checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" | ||
| 1751 | dependencies = [ | ||
| 1752 | "bytes", | ||
| 1753 | "data-encoding", | ||
| 1754 | "http", | ||
| 1755 | "httparse", | ||
| 1756 | "log", | ||
| 1757 | "rand 0.9.2", | ||
| 1758 | "rustls", | ||
| 1759 | "rustls-pki-types", | ||
| 1760 | "sha1", | ||
| 1761 | "thiserror 2.0.17", | ||
| 1762 | "utf-8", | ||
| 1763 | ] | ||
| 1764 | |||
| 1765 | [[package]] | ||
| 1766 | name = "typenum" | ||
| 1767 | version = "1.19.0" | ||
| 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1769 | checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" | ||
| 1770 | |||
| 1771 | [[package]] | ||
| 1772 | name = "unicode-ident" | ||
| 1773 | version = "1.0.22" | ||
| 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1775 | checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" | ||
| 1776 | |||
| 1777 | [[package]] | ||
| 1778 | name = "unicode-normalization" | ||
| 1779 | version = "0.1.25" | ||
| 1780 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1781 | checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" | ||
| 1782 | dependencies = [ | ||
| 1783 | "tinyvec", | ||
| 1784 | ] | ||
| 1785 | |||
| 1786 | [[package]] | ||
| 1787 | name = "universal-hash" | ||
| 1788 | version = "0.5.1" | ||
| 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1790 | checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" | ||
| 1791 | dependencies = [ | ||
| 1792 | "crypto-common", | ||
| 1793 | "subtle", | ||
| 1794 | ] | ||
| 1795 | |||
| 1796 | [[package]] | ||
| 1797 | name = "untrusted" | ||
| 1798 | version = "0.9.0" | ||
| 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1800 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" | ||
| 1801 | |||
| 1802 | [[package]] | ||
| 1803 | name = "url" | ||
| 1804 | version = "2.5.7" | ||
| 1805 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1806 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" | ||
| 1807 | dependencies = [ | ||
| 1808 | "form_urlencoded", | ||
| 1809 | "idna", | ||
| 1810 | "percent-encoding", | ||
| 1811 | "serde", | ||
| 1812 | ] | ||
| 1813 | |||
| 1814 | [[package]] | ||
| 1815 | name = "utf-8" | ||
| 1816 | version = "0.7.6" | ||
| 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1818 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" | ||
| 1819 | |||
| 1820 | [[package]] | ||
| 1821 | name = "utf8_iter" | ||
| 1822 | version = "1.0.4" | ||
| 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1824 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" | ||
| 1825 | |||
| 1826 | [[package]] | ||
| 1827 | name = "utf8parse" | ||
| 1828 | version = "0.2.2" | ||
| 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1830 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" | ||
| 1831 | |||
| 1832 | [[package]] | ||
| 1833 | name = "uuid" | ||
| 1834 | version = "1.18.1" | ||
| 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1836 | checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" | ||
| 1837 | dependencies = [ | ||
| 1838 | "getrandom 0.3.4", | ||
| 1839 | "js-sys", | ||
| 1840 | "wasm-bindgen", | ||
| 1841 | ] | ||
| 1842 | |||
| 1843 | [[package]] | ||
| 1844 | name = "valuable" | ||
| 1845 | version = "0.1.1" | ||
| 1846 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1847 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" | ||
| 1848 | |||
| 1849 | [[package]] | ||
| 1850 | name = "version_check" | ||
| 1851 | version = "0.9.5" | ||
| 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1853 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" | ||
| 1854 | |||
| 1855 | [[package]] | ||
| 1856 | name = "wasi" | ||
| 1857 | version = "0.11.1+wasi-snapshot-preview1" | ||
| 1858 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1859 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" | ||
| 1860 | |||
| 1861 | [[package]] | ||
| 1862 | name = "wasip2" | ||
| 1863 | version = "1.0.1+wasi-0.2.4" | ||
| 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1865 | checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" | ||
| 1866 | dependencies = [ | ||
| 1867 | "wit-bindgen", | ||
| 1868 | ] | ||
| 1869 | |||
| 1870 | [[package]] | ||
| 1871 | name = "wasm-bindgen" | ||
| 1872 | version = "0.2.105" | ||
| 1873 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1874 | checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" | ||
| 1875 | dependencies = [ | ||
| 1876 | "cfg-if", | ||
| 1877 | "once_cell", | ||
| 1878 | "rustversion", | ||
| 1879 | "wasm-bindgen-macro", | ||
| 1880 | "wasm-bindgen-shared", | ||
| 1881 | ] | ||
| 1882 | |||
| 1883 | [[package]] | ||
| 1884 | name = "wasm-bindgen-futures" | ||
| 1885 | version = "0.4.55" | ||
| 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1887 | checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" | ||
| 1888 | dependencies = [ | ||
| 1889 | "cfg-if", | ||
| 1890 | "js-sys", | ||
| 1891 | "once_cell", | ||
| 1892 | "wasm-bindgen", | ||
| 1893 | "web-sys", | ||
| 1894 | ] | ||
| 1895 | |||
| 1896 | [[package]] | ||
| 1897 | name = "wasm-bindgen-macro" | ||
| 1898 | version = "0.2.105" | ||
| 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1900 | checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" | ||
| 1901 | dependencies = [ | ||
| 1902 | "quote", | ||
| 1903 | "wasm-bindgen-macro-support", | ||
| 1904 | ] | ||
| 1905 | |||
| 1906 | [[package]] | ||
| 1907 | name = "wasm-bindgen-macro-support" | ||
| 1908 | version = "0.2.105" | ||
| 1909 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1910 | checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" | ||
| 1911 | dependencies = [ | ||
| 1912 | "bumpalo", | ||
| 1913 | "proc-macro2", | ||
| 1914 | "quote", | ||
| 1915 | "syn", | ||
| 1916 | "wasm-bindgen-shared", | ||
| 1917 | ] | ||
| 1918 | |||
| 1919 | [[package]] | ||
| 1920 | name = "wasm-bindgen-shared" | ||
| 1921 | version = "0.2.105" | ||
| 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1923 | checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" | ||
| 1924 | dependencies = [ | ||
| 1925 | "unicode-ident", | ||
| 1926 | ] | ||
| 1927 | |||
| 1928 | [[package]] | ||
| 1929 | name = "web-sys" | ||
| 1930 | version = "0.3.82" | ||
| 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1932 | checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" | ||
| 1933 | dependencies = [ | ||
| 1934 | "js-sys", | ||
| 1935 | "wasm-bindgen", | ||
| 1936 | ] | ||
| 1937 | |||
| 1938 | [[package]] | ||
| 1939 | name = "webpki-roots" | ||
| 1940 | version = "0.26.11" | ||
| 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1942 | checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" | ||
| 1943 | dependencies = [ | ||
| 1944 | "webpki-roots 1.0.4", | ||
| 1945 | ] | ||
| 1946 | |||
| 1947 | [[package]] | ||
| 1948 | name = "webpki-roots" | ||
| 1949 | version = "1.0.4" | ||
| 1950 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1951 | checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" | ||
| 1952 | dependencies = [ | ||
| 1953 | "rustls-pki-types", | ||
| 1954 | ] | ||
| 1955 | |||
| 1956 | [[package]] | ||
| 1957 | name = "windows-core" | ||
| 1958 | version = "0.62.2" | ||
| 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1960 | checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" | ||
| 1961 | dependencies = [ | ||
| 1962 | "windows-implement", | ||
| 1963 | "windows-interface", | ||
| 1964 | "windows-link", | ||
| 1965 | "windows-result", | ||
| 1966 | "windows-strings", | ||
| 1967 | ] | ||
| 1968 | |||
| 1969 | [[package]] | ||
| 1970 | name = "windows-implement" | ||
| 1971 | version = "0.60.2" | ||
| 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1973 | checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" | ||
| 1974 | dependencies = [ | ||
| 1975 | "proc-macro2", | ||
| 1976 | "quote", | ||
| 1977 | "syn", | ||
| 1978 | ] | ||
| 1979 | |||
| 1980 | [[package]] | ||
| 1981 | name = "windows-interface" | ||
| 1982 | version = "0.59.3" | ||
| 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1984 | checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" | ||
| 1985 | dependencies = [ | ||
| 1986 | "proc-macro2", | ||
| 1987 | "quote", | ||
| 1988 | "syn", | ||
| 1989 | ] | ||
| 1990 | |||
| 1991 | [[package]] | ||
| 1992 | name = "windows-link" | ||
| 1993 | version = "0.2.1" | ||
| 1994 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 1995 | checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" | ||
| 1996 | |||
| 1997 | [[package]] | ||
| 1998 | name = "windows-result" | ||
| 1999 | version = "0.4.1" | ||
| 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2001 | checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" | ||
| 2002 | dependencies = [ | ||
| 2003 | "windows-link", | ||
| 2004 | ] | ||
| 2005 | |||
| 2006 | [[package]] | ||
| 2007 | name = "windows-strings" | ||
| 2008 | version = "0.5.1" | ||
| 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2010 | checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" | ||
| 2011 | dependencies = [ | ||
| 2012 | "windows-link", | ||
| 2013 | ] | ||
| 2014 | |||
| 2015 | [[package]] | ||
| 2016 | name = "windows-sys" | ||
| 2017 | version = "0.52.0" | ||
| 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2019 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" | ||
| 2020 | dependencies = [ | ||
| 2021 | "windows-targets 0.52.6", | ||
| 2022 | ] | ||
| 2023 | |||
| 2024 | [[package]] | ||
| 2025 | name = "windows-sys" | ||
| 2026 | version = "0.60.2" | ||
| 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2028 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" | ||
| 2029 | dependencies = [ | ||
| 2030 | "windows-targets 0.53.5", | ||
| 2031 | ] | ||
| 2032 | |||
| 2033 | [[package]] | ||
| 2034 | name = "windows-sys" | ||
| 2035 | version = "0.61.2" | ||
| 2036 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2037 | checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" | ||
| 2038 | dependencies = [ | ||
| 2039 | "windows-link", | ||
| 2040 | ] | ||
| 2041 | |||
| 2042 | [[package]] | ||
| 2043 | name = "windows-targets" | ||
| 2044 | version = "0.52.6" | ||
| 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2046 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" | ||
| 2047 | dependencies = [ | ||
| 2048 | "windows_aarch64_gnullvm 0.52.6", | ||
| 2049 | "windows_aarch64_msvc 0.52.6", | ||
| 2050 | "windows_i686_gnu 0.52.6", | ||
| 2051 | "windows_i686_gnullvm 0.52.6", | ||
| 2052 | "windows_i686_msvc 0.52.6", | ||
| 2053 | "windows_x86_64_gnu 0.52.6", | ||
| 2054 | "windows_x86_64_gnullvm 0.52.6", | ||
| 2055 | "windows_x86_64_msvc 0.52.6", | ||
| 2056 | ] | ||
| 2057 | |||
| 2058 | [[package]] | ||
| 2059 | name = "windows-targets" | ||
| 2060 | version = "0.53.5" | ||
| 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2062 | checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" | ||
| 2063 | dependencies = [ | ||
| 2064 | "windows-link", | ||
| 2065 | "windows_aarch64_gnullvm 0.53.1", | ||
| 2066 | "windows_aarch64_msvc 0.53.1", | ||
| 2067 | "windows_i686_gnu 0.53.1", | ||
| 2068 | "windows_i686_gnullvm 0.53.1", | ||
| 2069 | "windows_i686_msvc 0.53.1", | ||
| 2070 | "windows_x86_64_gnu 0.53.1", | ||
| 2071 | "windows_x86_64_gnullvm 0.53.1", | ||
| 2072 | "windows_x86_64_msvc 0.53.1", | ||
| 2073 | ] | ||
| 2074 | |||
| 2075 | [[package]] | ||
| 2076 | name = "windows_aarch64_gnullvm" | ||
| 2077 | version = "0.52.6" | ||
| 2078 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2079 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" | ||
| 2080 | |||
| 2081 | [[package]] | ||
| 2082 | name = "windows_aarch64_gnullvm" | ||
| 2083 | version = "0.53.1" | ||
| 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2085 | checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" | ||
| 2086 | |||
| 2087 | [[package]] | ||
| 2088 | name = "windows_aarch64_msvc" | ||
| 2089 | version = "0.52.6" | ||
| 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2091 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" | ||
| 2092 | |||
| 2093 | [[package]] | ||
| 2094 | name = "windows_aarch64_msvc" | ||
| 2095 | version = "0.53.1" | ||
| 2096 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2097 | checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" | ||
| 2098 | |||
| 2099 | [[package]] | ||
| 2100 | name = "windows_i686_gnu" | ||
| 2101 | version = "0.52.6" | ||
| 2102 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2103 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" | ||
| 2104 | |||
| 2105 | [[package]] | ||
| 2106 | name = "windows_i686_gnu" | ||
| 2107 | version = "0.53.1" | ||
| 2108 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2109 | checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" | ||
| 2110 | |||
| 2111 | [[package]] | ||
| 2112 | name = "windows_i686_gnullvm" | ||
| 2113 | version = "0.52.6" | ||
| 2114 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2115 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" | ||
| 2116 | |||
| 2117 | [[package]] | ||
| 2118 | name = "windows_i686_gnullvm" | ||
| 2119 | version = "0.53.1" | ||
| 2120 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2121 | checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" | ||
| 2122 | |||
| 2123 | [[package]] | ||
| 2124 | name = "windows_i686_msvc" | ||
| 2125 | version = "0.52.6" | ||
| 2126 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2127 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" | ||
| 2128 | |||
| 2129 | [[package]] | ||
| 2130 | name = "windows_i686_msvc" | ||
| 2131 | version = "0.53.1" | ||
| 2132 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2133 | checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" | ||
| 2134 | |||
| 2135 | [[package]] | ||
| 2136 | name = "windows_x86_64_gnu" | ||
| 2137 | version = "0.52.6" | ||
| 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2139 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" | ||
| 2140 | |||
| 2141 | [[package]] | ||
| 2142 | name = "windows_x86_64_gnu" | ||
| 2143 | version = "0.53.1" | ||
| 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2145 | checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" | ||
| 2146 | |||
| 2147 | [[package]] | ||
| 2148 | name = "windows_x86_64_gnullvm" | ||
| 2149 | version = "0.52.6" | ||
| 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2151 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" | ||
| 2152 | |||
| 2153 | [[package]] | ||
| 2154 | name = "windows_x86_64_gnullvm" | ||
| 2155 | version = "0.53.1" | ||
| 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2157 | checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" | ||
| 2158 | |||
| 2159 | [[package]] | ||
| 2160 | name = "windows_x86_64_msvc" | ||
| 2161 | version = "0.52.6" | ||
| 2162 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2163 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" | ||
| 2164 | |||
| 2165 | [[package]] | ||
| 2166 | name = "windows_x86_64_msvc" | ||
| 2167 | version = "0.53.1" | ||
| 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2169 | checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" | ||
| 2170 | |||
| 2171 | [[package]] | ||
| 2172 | name = "wit-bindgen" | ||
| 2173 | version = "0.46.0" | ||
| 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2175 | checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" | ||
| 2176 | |||
| 2177 | [[package]] | ||
| 2178 | name = "writeable" | ||
| 2179 | version = "0.6.2" | ||
| 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2181 | checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" | ||
| 2182 | |||
| 2183 | [[package]] | ||
| 2184 | name = "yoke" | ||
| 2185 | version = "0.8.1" | ||
| 2186 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2187 | checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" | ||
| 2188 | dependencies = [ | ||
| 2189 | "stable_deref_trait", | ||
| 2190 | "yoke-derive", | ||
| 2191 | "zerofrom", | ||
| 2192 | ] | ||
| 2193 | |||
| 2194 | [[package]] | ||
| 2195 | name = "yoke-derive" | ||
| 2196 | version = "0.8.1" | ||
| 2197 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2198 | checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" | ||
| 2199 | dependencies = [ | ||
| 2200 | "proc-macro2", | ||
| 2201 | "quote", | ||
| 2202 | "syn", | ||
| 2203 | "synstructure", | ||
| 2204 | ] | ||
| 2205 | |||
| 2206 | [[package]] | ||
| 2207 | name = "zerocopy" | ||
| 2208 | version = "0.8.27" | ||
| 2209 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2210 | checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" | ||
| 2211 | dependencies = [ | ||
| 2212 | "zerocopy-derive", | ||
| 2213 | ] | ||
| 2214 | |||
| 2215 | [[package]] | ||
| 2216 | name = "zerocopy-derive" | ||
| 2217 | version = "0.8.27" | ||
| 2218 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2219 | checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" | ||
| 2220 | dependencies = [ | ||
| 2221 | "proc-macro2", | ||
| 2222 | "quote", | ||
| 2223 | "syn", | ||
| 2224 | ] | ||
| 2225 | |||
| 2226 | [[package]] | ||
| 2227 | name = "zerofrom" | ||
| 2228 | version = "0.1.6" | ||
| 2229 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2230 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" | ||
| 2231 | dependencies = [ | ||
| 2232 | "zerofrom-derive", | ||
| 2233 | ] | ||
| 2234 | |||
| 2235 | [[package]] | ||
| 2236 | name = "zerofrom-derive" | ||
| 2237 | version = "0.1.6" | ||
| 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2239 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" | ||
| 2240 | dependencies = [ | ||
| 2241 | "proc-macro2", | ||
| 2242 | "quote", | ||
| 2243 | "syn", | ||
| 2244 | "synstructure", | ||
| 2245 | ] | ||
| 2246 | |||
| 2247 | [[package]] | ||
| 2248 | name = "zeroize" | ||
| 2249 | version = "1.8.2" | ||
| 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2251 | checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" | ||
| 2252 | |||
| 2253 | [[package]] | ||
| 2254 | name = "zerotrie" | ||
| 2255 | version = "0.2.3" | ||
| 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2257 | checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" | ||
| 2258 | dependencies = [ | ||
| 2259 | "displaydoc", | ||
| 2260 | "yoke", | ||
| 2261 | "zerofrom", | ||
| 2262 | ] | ||
| 2263 | |||
| 2264 | [[package]] | ||
| 2265 | name = "zerovec" | ||
| 2266 | version = "0.11.5" | ||
| 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2268 | checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" | ||
| 2269 | dependencies = [ | ||
| 2270 | "yoke", | ||
| 2271 | "zerofrom", | ||
| 2272 | "zerovec-derive", | ||
| 2273 | ] | ||
| 2274 | |||
| 2275 | [[package]] | ||
| 2276 | name = "zerovec-derive" | ||
| 2277 | version = "0.11.2" | ||
| 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| 2279 | checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" | ||
| 2280 | dependencies = [ | ||
| 2281 | "proc-macro2", | ||
| 2282 | "quote", | ||
| 2283 | "syn", | ||
| 2284 | ] | ||
diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..dec6113 --- /dev/null +++ b/Cargo.toml | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | [package] | ||
| 2 | name = "ngit-grasp" | ||
| 3 | version = "0.1.0" | ||
| 4 | edition = "2021" | ||
| 5 | authors = ["ngit-grasp contributors"] | ||
| 6 | license = "MIT" | ||
| 7 | description = "A GRASP (Git Relays Authorized via Signed-Nostr Proofs) implementation in Rust" | ||
| 8 | repository = "https://gitworkshop.dev/ngit-grasp" | ||
| 9 | |||
| 10 | [dependencies] | ||
| 11 | # Async runtime | ||
| 12 | tokio = { version = "1.35", features = ["full"] } | ||
| 13 | tokio-tungstenite = "0.21" | ||
| 14 | |||
| 15 | # WebSocket | ||
| 16 | tungstenite = "0.21" | ||
| 17 | futures-util = "0.3" | ||
| 18 | |||
| 19 | # HTTP server (for future use) | ||
| 20 | # actix-web = "4.4" | ||
| 21 | # actix-cors = "0.7" | ||
| 22 | |||
| 23 | # Nostr | ||
| 24 | nostr-sdk = "0.43" | ||
| 25 | |||
| 26 | # Serialization | ||
| 27 | serde = { version = "1.0", features = ["derive"] } | ||
| 28 | serde_json = "1.0" | ||
| 29 | |||
| 30 | # Logging | ||
| 31 | tracing = "0.1" | ||
| 32 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } | ||
| 33 | |||
| 34 | # Configuration | ||
| 35 | dotenvy = "0.15" | ||
| 36 | |||
| 37 | # Error handling | ||
| 38 | anyhow = "1.0" | ||
| 39 | thiserror = "1.0" | ||
| 40 | |||
| 41 | # Git (for future use) | ||
| 42 | # git-http-backend = "0.3" | ||
| 43 | |||
| 44 | [dev-dependencies] | ||
| 45 | # Testing | ||
| 46 | tokio-test = "0.4" | ||
| 47 | |||
| 48 | [[bin]] | ||
| 49 | name = "ngit-grasp" | ||
| 50 | path = "src/main.rs" | ||
| 51 | |||
| 52 | [workspace] | ||
| 53 | members = [".", "grasp-audit"] | ||
diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..d014800 --- /dev/null +++ b/flake.lock | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | { | ||
| 2 | "nodes": { | ||
| 3 | "flake-utils": { | ||
| 4 | "inputs": { | ||
| 5 | "systems": "systems" | ||
| 6 | }, | ||
| 7 | "locked": { | ||
| 8 | "lastModified": 1731533236, | ||
| 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", | ||
| 10 | "owner": "numtide", | ||
| 11 | "repo": "flake-utils", | ||
| 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", | ||
| 13 | "type": "github" | ||
| 14 | }, | ||
| 15 | "original": { | ||
| 16 | "owner": "numtide", | ||
| 17 | "repo": "flake-utils", | ||
| 18 | "type": "github" | ||
| 19 | } | ||
| 20 | }, | ||
| 21 | "nixpkgs": { | ||
| 22 | "locked": { | ||
| 23 | "lastModified": 1762111121, | ||
| 24 | "narHash": "sha256-4vhDuZ7OZaZmKKrnDpxLZZpGIJvAeMtK6FKLJYUtAdw=", | ||
| 25 | "owner": "NixOS", | ||
| 26 | "repo": "nixpkgs", | ||
| 27 | "rev": "b3d51a0365f6695e7dd5cdf3e180604530ed33b4", | ||
| 28 | "type": "github" | ||
| 29 | }, | ||
| 30 | "original": { | ||
| 31 | "owner": "NixOS", | ||
| 32 | "ref": "nixos-unstable", | ||
| 33 | "repo": "nixpkgs", | ||
| 34 | "type": "github" | ||
| 35 | } | ||
| 36 | }, | ||
| 37 | "nixpkgs_2": { | ||
| 38 | "locked": { | ||
| 39 | "lastModified": 1744536153, | ||
| 40 | "narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=", | ||
| 41 | "owner": "NixOS", | ||
| 42 | "repo": "nixpkgs", | ||
| 43 | "rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11", | ||
| 44 | "type": "github" | ||
| 45 | }, | ||
| 46 | "original": { | ||
| 47 | "owner": "NixOS", | ||
| 48 | "ref": "nixpkgs-unstable", | ||
| 49 | "repo": "nixpkgs", | ||
| 50 | "type": "github" | ||
| 51 | } | ||
| 52 | }, | ||
| 53 | "root": { | ||
| 54 | "inputs": { | ||
| 55 | "flake-utils": "flake-utils", | ||
| 56 | "nixpkgs": "nixpkgs", | ||
| 57 | "rust-overlay": "rust-overlay" | ||
| 58 | } | ||
| 59 | }, | ||
| 60 | "rust-overlay": { | ||
| 61 | "inputs": { | ||
| 62 | "nixpkgs": "nixpkgs_2" | ||
| 63 | }, | ||
| 64 | "locked": { | ||
| 65 | "lastModified": 1762223900, | ||
| 66 | "narHash": "sha256-caxpESVH71mdrdihYvQZ9rTZPZqW0GyEG9un7MgpyRM=", | ||
| 67 | "owner": "oxalica", | ||
| 68 | "repo": "rust-overlay", | ||
| 69 | "rev": "cfe1598d69a42a5edb204770e71b8df77efef2c3", | ||
| 70 | "type": "github" | ||
| 71 | }, | ||
| 72 | "original": { | ||
| 73 | "owner": "oxalica", | ||
| 74 | "repo": "rust-overlay", | ||
| 75 | "type": "github" | ||
| 76 | } | ||
| 77 | }, | ||
| 78 | "systems": { | ||
| 79 | "locked": { | ||
| 80 | "lastModified": 1681028828, | ||
| 81 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", | ||
| 82 | "owner": "nix-systems", | ||
| 83 | "repo": "default", | ||
| 84 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", | ||
| 85 | "type": "github" | ||
| 86 | }, | ||
| 87 | "original": { | ||
| 88 | "owner": "nix-systems", | ||
| 89 | "repo": "default", | ||
| 90 | "type": "github" | ||
| 91 | } | ||
| 92 | } | ||
| 93 | }, | ||
| 94 | "root": "root", | ||
| 95 | "version": 7 | ||
| 96 | } | ||
diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..6edab71 --- /dev/null +++ b/flake.nix | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | { | ||
| 2 | description = "ngit-grasp - A GRASP implementation in Rust"; | ||
| 3 | |||
| 4 | inputs = { | ||
| 5 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; | ||
| 6 | rust-overlay.url = "github:oxalica/rust-overlay"; | ||
| 7 | flake-utils.url = "github:numtide/flake-utils"; | ||
| 8 | }; | ||
| 9 | |||
| 10 | outputs = { self, nixpkgs, rust-overlay, flake-utils }: | ||
| 11 | flake-utils.lib.eachDefaultSystem (system: | ||
| 12 | let | ||
| 13 | overlays = [ (import rust-overlay) ]; | ||
| 14 | pkgs = import nixpkgs { | ||
| 15 | inherit system overlays; | ||
| 16 | }; | ||
| 17 | |||
| 18 | rustToolchain = pkgs.rust-bin.stable.latest.default.override { | ||
| 19 | extensions = [ "rust-src" "rust-analyzer" ]; | ||
| 20 | }; | ||
| 21 | in | ||
| 22 | { | ||
| 23 | devShells.default = pkgs.mkShell { | ||
| 24 | buildInputs = with pkgs; [ | ||
| 25 | rustToolchain | ||
| 26 | pkg-config | ||
| 27 | openssl | ||
| 28 | git | ||
| 29 | ]; | ||
| 30 | |||
| 31 | RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library"; | ||
| 32 | |||
| 33 | shellHook = '' | ||
| 34 | echo "๐ ngit-grasp development environment" | ||
| 35 | echo "Rust version: $(rustc --version)" | ||
| 36 | echo "" | ||
| 37 | echo "Quick commands:" | ||
| 38 | echo " cargo build - Build the project" | ||
| 39 | echo " cargo test - Run unit tests" | ||
| 40 | echo " cargo run - Run the relay" | ||
| 41 | echo "" | ||
| 42 | ''; | ||
| 43 | }; | ||
| 44 | |||
| 45 | packages.default = pkgs.rustPlatform.buildRustPackage { | ||
| 46 | pname = "ngit-grasp"; | ||
| 47 | version = "0.1.0"; | ||
| 48 | src = ./.; | ||
| 49 | cargoLock.lockFile = ./Cargo.lock; | ||
| 50 | |||
| 51 | nativeBuildInputs = with pkgs; [ | ||
| 52 | pkg-config | ||
| 53 | ]; | ||
| 54 | |||
| 55 | buildInputs = with pkgs; [ | ||
| 56 | openssl | ||
| 57 | ]; | ||
| 58 | }; | ||
| 59 | } | ||
| 60 | ); | ||
| 61 | } | ||
diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..252873d --- /dev/null +++ b/src/config.rs | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | use anyhow::{Context, Result}; | ||
| 2 | use serde::{Deserialize, Serialize}; | ||
| 3 | use std::env; | ||
| 4 | |||
| 5 | #[derive(Debug, Clone, Serialize, Deserialize)] | ||
| 6 | pub struct Config { | ||
| 7 | pub domain: String, | ||
| 8 | pub owner_npub: String, | ||
| 9 | pub relay_name: String, | ||
| 10 | pub relay_description: String, | ||
| 11 | pub git_data_path: String, | ||
| 12 | pub relay_data_path: String, | ||
| 13 | pub bind_address: String, | ||
| 14 | } | ||
| 15 | |||
| 16 | impl Config { | ||
| 17 | pub fn from_env() -> Result<Self> { | ||
| 18 | // Load .env file if present | ||
| 19 | dotenvy::dotenv().ok(); | ||
| 20 | |||
| 21 | Ok(Config { | ||
| 22 | domain: env::var("NGIT_DOMAIN") | ||
| 23 | .unwrap_or_else(|_| "localhost:8080".to_string()), | ||
| 24 | owner_npub: env::var("NGIT_OWNER_NPUB") | ||
| 25 | .context("NGIT_OWNER_NPUB must be set")?, | ||
| 26 | relay_name: env::var("NGIT_RELAY_NAME") | ||
| 27 | .unwrap_or_else(|_| "ngit-grasp relay".to_string()), | ||
| 28 | relay_description: env::var("NGIT_RELAY_DESCRIPTION") | ||
| 29 | .unwrap_or_else(|_| "A GRASP-compliant Nostr relay for Git".to_string()), | ||
| 30 | git_data_path: env::var("NGIT_GIT_DATA_PATH") | ||
| 31 | .unwrap_or_else(|_| "./data/git".to_string()), | ||
| 32 | relay_data_path: env::var("NGIT_RELAY_DATA_PATH") | ||
| 33 | .unwrap_or_else(|_| "./data/relay".to_string()), | ||
| 34 | bind_address: env::var("NGIT_BIND_ADDRESS") | ||
| 35 | .unwrap_or_else(|_| "127.0.0.1:8080".to_string()), | ||
| 36 | }) | ||
| 37 | } | ||
| 38 | } | ||
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7da4c73 --- /dev/null +++ b/src/main.rs | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | use anyhow::Result; | ||
| 2 | use tracing::{info, Level}; | ||
| 3 | use tracing_subscriber::FmtSubscriber; | ||
| 4 | |||
| 5 | mod config; | ||
| 6 | mod nostr; | ||
| 7 | mod storage; | ||
| 8 | |||
| 9 | use config::Config; | ||
| 10 | |||
| 11 | #[tokio::main] | ||
| 12 | async fn main() -> Result<()> { | ||
| 13 | // Initialize tracing | ||
| 14 | let subscriber = FmtSubscriber::builder() | ||
| 15 | .with_max_level(Level::DEBUG) | ||
| 16 | .finish(); | ||
| 17 | tracing::subscriber::set_global_default(subscriber)?; | ||
| 18 | |||
| 19 | info!("Starting ngit-grasp..."); | ||
| 20 | |||
| 21 | // Load configuration | ||
| 22 | let config = Config::from_env()?; | ||
| 23 | info!("Configuration loaded: {}", config.bind_address); | ||
| 24 | |||
| 25 | // Initialize storage | ||
| 26 | let storage = storage::Storage::new(&config)?; | ||
| 27 | info!("Storage initialized at: {}", config.relay_data_path); | ||
| 28 | |||
| 29 | // Start Nostr relay | ||
| 30 | let relay = nostr::relay::RelayServer::new(config.clone(), storage)?; | ||
| 31 | |||
| 32 | info!("Starting Nostr relay on {}", config.bind_address); | ||
| 33 | relay.run().await?; | ||
| 34 | |||
| 35 | Ok(()) | ||
| 36 | } | ||
diff --git a/src/nostr/mod.rs b/src/nostr/mod.rs new file mode 100644 index 0000000..6193dd9 --- /dev/null +++ b/src/nostr/mod.rs | |||
| @@ -0,0 +1 @@ | |||
| pub mod relay; | |||
diff --git a/src/nostr/relay.rs b/src/nostr/relay.rs new file mode 100644 index 0000000..5af9b04 --- /dev/null +++ b/src/nostr/relay.rs | |||
| @@ -0,0 +1,310 @@ | |||
| 1 | use anyhow::Result; | ||
| 2 | use futures_util::{SinkExt, StreamExt}; | ||
| 3 | use nostr_sdk::{Event, EventId, Filter}; | ||
| 4 | use serde_json::{json, Value}; | ||
| 5 | use std::collections::HashMap; | ||
| 6 | use std::net::SocketAddr; | ||
| 7 | use std::sync::Arc; | ||
| 8 | use tokio::net::{TcpListener, TcpStream}; | ||
| 9 | use tokio::sync::RwLock; | ||
| 10 | use tokio_tungstenite::{accept_async, tungstenite::Message}; | ||
| 11 | use tracing::{debug, error, info, warn}; | ||
| 12 | |||
| 13 | use crate::config::Config; | ||
| 14 | use crate::storage::Storage; | ||
| 15 | |||
| 16 | type Subscriptions = Arc<RwLock<HashMap<String, Vec<Filter>>>>; | ||
| 17 | |||
| 18 | pub struct RelayServer { | ||
| 19 | config: Config, | ||
| 20 | storage: Storage, | ||
| 21 | } | ||
| 22 | |||
| 23 | impl RelayServer { | ||
| 24 | pub fn new(config: Config, storage: Storage) -> Result<Self> { | ||
| 25 | Ok(RelayServer { config, storage }) | ||
| 26 | } | ||
| 27 | |||
| 28 | pub async fn run(self) -> Result<()> { | ||
| 29 | let addr: SocketAddr = self.config.bind_address.parse()?; | ||
| 30 | let listener = TcpListener::bind(&addr).await?; | ||
| 31 | |||
| 32 | info!("โ Nostr relay listening on ws://{}", addr); | ||
| 33 | info!("๐ก Ready to accept connections..."); | ||
| 34 | |||
| 35 | loop { | ||
| 36 | match listener.accept().await { | ||
| 37 | Ok((stream, peer_addr)) => { | ||
| 38 | debug!("New connection from: {}", peer_addr); | ||
| 39 | let storage = self.storage.clone(); | ||
| 40 | tokio::spawn(async move { | ||
| 41 | if let Err(e) = handle_connection(stream, storage).await { | ||
| 42 | error!("Error handling connection from {}: {}", peer_addr, e); | ||
| 43 | } | ||
| 44 | }); | ||
| 45 | } | ||
| 46 | Err(e) => { | ||
| 47 | error!("Error accepting connection: {}", e); | ||
| 48 | } | ||
| 49 | } | ||
| 50 | } | ||
| 51 | } | ||
| 52 | } | ||
| 53 | |||
| 54 | async fn handle_connection(stream: TcpStream, storage: Storage) -> Result<()> { | ||
| 55 | let ws_stream = accept_async(stream).await?; | ||
| 56 | let (mut ws_sender, mut ws_receiver) = ws_stream.split(); | ||
| 57 | |||
| 58 | let subscriptions: Subscriptions = Arc::new(RwLock::new(HashMap::new())); | ||
| 59 | |||
| 60 | while let Some(msg) = ws_receiver.next().await { | ||
| 61 | match msg { | ||
| 62 | Ok(Message::Text(text)) => { | ||
| 63 | debug!("Received message: {}", text); | ||
| 64 | |||
| 65 | match handle_message(&text, &storage, &subscriptions).await { | ||
| 66 | Ok(responses) => { | ||
| 67 | for response in responses { | ||
| 68 | let response_text = serde_json::to_string(&response)?; | ||
| 69 | debug!("Sending response: {}", response_text); | ||
| 70 | ws_sender.send(Message::Text(response_text)).await?; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | Err(e) => { | ||
| 74 | warn!("Error handling message: {}", e); | ||
| 75 | let notice = json!(["NOTICE", format!("Error: {}", e)]); | ||
| 76 | ws_sender.send(Message::Text(notice.to_string())).await?; | ||
| 77 | } | ||
| 78 | } | ||
| 79 | } | ||
| 80 | Ok(Message::Close(_)) => { | ||
| 81 | debug!("Client closed connection"); | ||
| 82 | break; | ||
| 83 | } | ||
| 84 | Ok(Message::Ping(data)) => { | ||
| 85 | ws_sender.send(Message::Pong(data)).await?; | ||
| 86 | } | ||
| 87 | Ok(_) => { | ||
| 88 | // Ignore other message types | ||
| 89 | } | ||
| 90 | Err(e) => { | ||
| 91 | error!("WebSocket error: {}", e); | ||
| 92 | break; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | Ok(()) | ||
| 98 | } | ||
| 99 | |||
| 100 | async fn handle_message( | ||
| 101 | text: &str, | ||
| 102 | storage: &Storage, | ||
| 103 | subscriptions: &Subscriptions, | ||
| 104 | ) -> Result<Vec<Value>> { | ||
| 105 | let msg: Value = serde_json::from_str(text)?; | ||
| 106 | |||
| 107 | if let Some(arr) = msg.as_array() { | ||
| 108 | if arr.is_empty() { | ||
| 109 | return Ok(vec![json!(["NOTICE", "Empty message"])]); | ||
| 110 | } | ||
| 111 | |||
| 112 | let msg_type = arr[0].as_str().unwrap_or(""); | ||
| 113 | |||
| 114 | match msg_type { | ||
| 115 | "EVENT" => handle_event(arr, storage).await, | ||
| 116 | "REQ" => handle_req(arr, storage, subscriptions).await, | ||
| 117 | "CLOSE" => handle_close(arr, subscriptions).await, | ||
| 118 | _ => Ok(vec![json!(["NOTICE", format!("Unknown message type: {}", msg_type)])]), | ||
| 119 | } | ||
| 120 | } else { | ||
| 121 | Ok(vec![json!(["NOTICE", "Invalid message format"])]) | ||
| 122 | } | ||
| 123 | } | ||
| 124 | |||
| 125 | async fn handle_event(arr: &[Value], storage: &Storage) -> Result<Vec<Value>> { | ||
| 126 | if arr.len() < 2 { | ||
| 127 | return Ok(vec![json!(["NOTICE", "EVENT message requires event object"])]); | ||
| 128 | } | ||
| 129 | |||
| 130 | let event: Event = serde_json::from_value(arr[1].clone())?; | ||
| 131 | let event_id = event.id; | ||
| 132 | |||
| 133 | // Verify event (signature and ID) | ||
| 134 | if event.verify().is_err() { | ||
| 135 | return Ok(vec![json!(["OK", event_id.to_hex(), false, "invalid: signature or ID verification failed"])]); | ||
| 136 | } | ||
| 137 | |||
| 138 | // Check if event already exists | ||
| 139 | if storage.get_event(&event_id.to_hex()).await.is_some() { | ||
| 140 | return Ok(vec![json!(["OK", event_id.to_hex(), true, "duplicate: event already exists"])]); | ||
| 141 | } | ||
| 142 | |||
| 143 | // Store the event | ||
| 144 | storage.store_event(event.clone()).await?; | ||
| 145 | |||
| 146 | info!("โ Stored event: {} (kind: {})", event_id, event.kind); | ||
| 147 | |||
| 148 | Ok(vec![json!(["OK", event_id.to_hex(), true, ""])]) | ||
| 149 | } | ||
| 150 | |||
| 151 | async fn handle_req( | ||
| 152 | arr: &[Value], | ||
| 153 | storage: &Storage, | ||
| 154 | subscriptions: &Subscriptions, | ||
| 155 | ) -> Result<Vec<Value>> { | ||
| 156 | if arr.len() < 2 { | ||
| 157 | return Ok(vec![json!(["NOTICE", "REQ message requires subscription ID"])]); | ||
| 158 | } | ||
| 159 | |||
| 160 | let sub_id = arr[1].as_str().ok_or_else(|| anyhow::anyhow!("Invalid subscription ID"))?; | ||
| 161 | |||
| 162 | // Parse filters | ||
| 163 | let mut filters = Vec::new(); | ||
| 164 | for filter_value in &arr[2..] { | ||
| 165 | let filter: Filter = serde_json::from_value(filter_value.clone())?; | ||
| 166 | filters.push(filter.clone()); | ||
| 167 | } | ||
| 168 | |||
| 169 | // Store subscription | ||
| 170 | { | ||
| 171 | let mut subs = subscriptions.write().await; | ||
| 172 | subs.insert(sub_id.to_string(), filters.clone()); | ||
| 173 | } | ||
| 174 | |||
| 175 | debug!("Created subscription: {} with {} filters", sub_id, filters.len()); | ||
| 176 | |||
| 177 | // Query and send matching events | ||
| 178 | let mut responses = Vec::new(); | ||
| 179 | |||
| 180 | for filter in filters { | ||
| 181 | let events = storage.query_events(|event| { | ||
| 182 | matches_filter(event, &filter) | ||
| 183 | }).await; | ||
| 184 | |||
| 185 | for event in events { | ||
| 186 | responses.push(json!(["EVENT", sub_id, event])); | ||
| 187 | } | ||
| 188 | } | ||
| 189 | |||
| 190 | // Send EOSE (End of Stored Events) | ||
| 191 | responses.push(json!(["EOSE", sub_id])); | ||
| 192 | |||
| 193 | debug!("Subscription {} returned {} events", sub_id, responses.len() - 1); | ||
| 194 | |||
| 195 | Ok(responses) | ||
| 196 | } | ||
| 197 | |||
| 198 | async fn handle_close(arr: &[Value], subscriptions: &Subscriptions) -> Result<Vec<Value>> { | ||
| 199 | if arr.len() < 2 { | ||
| 200 | return Ok(vec![json!(["NOTICE", "CLOSE message requires subscription ID"])]); | ||
| 201 | } | ||
| 202 | |||
| 203 | let sub_id = arr[1].as_str().ok_or_else(|| anyhow::anyhow!("Invalid subscription ID"))?; | ||
| 204 | |||
| 205 | { | ||
| 206 | let mut subs = subscriptions.write().await; | ||
| 207 | subs.remove(sub_id); | ||
| 208 | } | ||
| 209 | |||
| 210 | debug!("Closed subscription: {}", sub_id); | ||
| 211 | |||
| 212 | Ok(vec![]) | ||
| 213 | } | ||
| 214 | |||
| 215 | fn matches_filter(event: &Event, filter: &Filter) -> bool { | ||
| 216 | // Check IDs | ||
| 217 | if let Some(ref ids) = filter.ids { | ||
| 218 | if !ids.is_empty() && !ids.contains(&event.id) { | ||
| 219 | return false; | ||
| 220 | } | ||
| 221 | } | ||
| 222 | |||
| 223 | // Check authors | ||
| 224 | if let Some(ref authors) = filter.authors { | ||
| 225 | if !authors.is_empty() && !authors.contains(&event.pubkey) { | ||
| 226 | return false; | ||
| 227 | } | ||
| 228 | } | ||
| 229 | |||
| 230 | // Check kinds | ||
| 231 | if let Some(ref kinds) = filter.kinds { | ||
| 232 | if !kinds.is_empty() && !kinds.contains(&event.kind) { | ||
| 233 | return false; | ||
| 234 | } | ||
| 235 | } | ||
| 236 | |||
| 237 | // Check since | ||
| 238 | if let Some(since) = filter.since { | ||
| 239 | if event.created_at < since { | ||
| 240 | return false; | ||
| 241 | } | ||
| 242 | } | ||
| 243 | |||
| 244 | // Check until | ||
| 245 | if let Some(until) = filter.until { | ||
| 246 | if event.created_at > until { | ||
| 247 | return false; | ||
| 248 | } | ||
| 249 | } | ||
| 250 | |||
| 251 | // TODO: Check tags (#e, #p, etc.) | ||
| 252 | |||
| 253 | true | ||
| 254 | } | ||
| 255 | |||
| 256 | #[cfg(test)] | ||
| 257 | mod tests { | ||
| 258 | use super::*; | ||
| 259 | use nostr_sdk::{EventBuilder, Keys, Kind}; | ||
| 260 | |||
| 261 | #[test] | ||
| 262 | fn test_matches_filter_by_id() { | ||
| 263 | let keys = Keys::generate(); | ||
| 264 | let event = EventBuilder::text_note("test") | ||
| 265 | .sign_with_keys(&keys) | ||
| 266 | .unwrap(); | ||
| 267 | |||
| 268 | // Filter matching the event ID | ||
| 269 | let filter = Filter::new().id(event.id); | ||
| 270 | assert!(matches_filter(&event, &filter)); | ||
| 271 | |||
| 272 | // Filter not matching | ||
| 273 | let other_id = EventId::all_zeros(); | ||
| 274 | let filter = Filter::new().id(other_id); | ||
| 275 | assert!(!matches_filter(&event, &filter)); | ||
| 276 | } | ||
| 277 | |||
| 278 | #[test] | ||
| 279 | fn test_matches_filter_by_author() { | ||
| 280 | let keys = Keys::generate(); | ||
| 281 | let event = EventBuilder::text_note("test") | ||
| 282 | .sign_with_keys(&keys) | ||
| 283 | .unwrap(); | ||
| 284 | |||
| 285 | // Filter matching the author | ||
| 286 | let filter = Filter::new().author(keys.public_key()); | ||
| 287 | assert!(matches_filter(&event, &filter)); | ||
| 288 | |||
| 289 | // Filter not matching | ||
| 290 | let other_keys = Keys::generate(); | ||
| 291 | let filter = Filter::new().author(other_keys.public_key()); | ||
| 292 | assert!(!matches_filter(&event, &filter)); | ||
| 293 | } | ||
| 294 | |||
| 295 | #[test] | ||
| 296 | fn test_matches_filter_by_kind() { | ||
| 297 | let keys = Keys::generate(); | ||
| 298 | let event = EventBuilder::text_note("test") | ||
| 299 | .sign_with_keys(&keys) | ||
| 300 | .unwrap(); | ||
| 301 | |||
| 302 | // Filter matching the kind | ||
| 303 | let filter = Filter::new().kind(Kind::TextNote); | ||
| 304 | assert!(matches_filter(&event, &filter)); | ||
| 305 | |||
| 306 | // Filter not matching | ||
| 307 | let filter = Filter::new().kind(Kind::Metadata); | ||
| 308 | assert!(!matches_filter(&event, &filter)); | ||
| 309 | } | ||
| 310 | } | ||
diff --git a/src/storage/mod.rs b/src/storage/mod.rs new file mode 100644 index 0000000..2ec6d4e --- /dev/null +++ b/src/storage/mod.rs | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | use anyhow::Result; | ||
| 2 | use nostr_sdk::Event; | ||
| 3 | use std::collections::HashMap; | ||
| 4 | use std::sync::Arc; | ||
| 5 | use tokio::sync::RwLock; | ||
| 6 | |||
| 7 | use crate::config::Config; | ||
| 8 | |||
| 9 | /// Simple in-memory storage for events | ||
| 10 | /// TODO: Persist to disk for production use | ||
| 11 | #[derive(Clone)] | ||
| 12 | pub struct Storage { | ||
| 13 | events: Arc<RwLock<HashMap<String, Event>>>, | ||
| 14 | data_path: String, | ||
| 15 | } | ||
| 16 | |||
| 17 | impl Storage { | ||
| 18 | pub fn new(config: &Config) -> Result<Self> { | ||
| 19 | // Create data directory if it doesn't exist | ||
| 20 | std::fs::create_dir_all(&config.relay_data_path)?; | ||
| 21 | |||
| 22 | Ok(Storage { | ||
| 23 | events: Arc::new(RwLock::new(HashMap::new())), | ||
| 24 | data_path: config.relay_data_path.clone(), | ||
| 25 | }) | ||
| 26 | } | ||
| 27 | |||
| 28 | pub async fn store_event(&self, event: Event) -> Result<()> { | ||
| 29 | let mut events = self.events.write().await; | ||
| 30 | events.insert(event.id.to_hex(), event); | ||
| 31 | Ok(()) | ||
| 32 | } | ||
| 33 | |||
| 34 | pub async fn get_event(&self, event_id: &str) -> Option<Event> { | ||
| 35 | let events = self.events.read().await; | ||
| 36 | events.get(event_id).cloned() | ||
| 37 | } | ||
| 38 | |||
| 39 | pub async fn query_events<F>(&self, filter: F) -> Vec<Event> | ||
| 40 | where | ||
| 41 | F: Fn(&Event) -> bool, | ||
| 42 | { | ||
| 43 | let events = self.events.read().await; | ||
| 44 | events.values().filter(|e| filter(e)).cloned().collect() | ||
| 45 | } | ||
| 46 | |||
| 47 | pub async fn count_events(&self) -> usize { | ||
| 48 | let events = self.events.read().await; | ||
| 49 | events.len() | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | #[cfg(test)] | ||
| 54 | mod tests { | ||
| 55 | use super::*; | ||
| 56 | use nostr_sdk::{EventBuilder, Keys, Kind}; | ||
| 57 | |||
| 58 | #[tokio::test] | ||
| 59 | async fn test_store_and_retrieve() { | ||
| 60 | let config = Config { | ||
| 61 | domain: "test".to_string(), | ||
| 62 | owner_npub: "npub1test".to_string(), | ||
| 63 | relay_name: "test".to_string(), | ||
| 64 | relay_description: "test".to_string(), | ||
| 65 | git_data_path: "./test_data/git".to_string(), | ||
| 66 | relay_data_path: "./test_data/relay".to_string(), | ||
| 67 | bind_address: "127.0.0.1:8080".to_string(), | ||
| 68 | }; | ||
| 69 | |||
| 70 | let storage = Storage::new(&config).unwrap(); | ||
| 71 | |||
| 72 | // Create a test event | ||
| 73 | let keys = Keys::generate(); | ||
| 74 | let event = EventBuilder::text_note("test content") | ||
| 75 | .sign_with_keys(&keys) | ||
| 76 | .unwrap(); | ||
| 77 | |||
| 78 | // Store it | ||
| 79 | storage.store_event(event.clone()).await.unwrap(); | ||
| 80 | |||
| 81 | // Retrieve it | ||
| 82 | let retrieved = storage.get_event(&event.id.to_hex()).await; | ||
| 83 | assert!(retrieved.is_some()); | ||
| 84 | assert_eq!(retrieved.unwrap().id, event.id); | ||
| 85 | |||
| 86 | // Count events | ||
| 87 | assert_eq!(storage.count_events().await, 1); | ||
| 88 | } | ||
| 89 | |||
| 90 | #[tokio::test] | ||
| 91 | async fn test_query_events() { | ||
| 92 | let config = Config { | ||
| 93 | domain: "test".to_string(), | ||
| 94 | owner_npub: "npub1test".to_string(), | ||
| 95 | relay_name: "test".to_string(), | ||
| 96 | relay_description: "test".to_string(), | ||
| 97 | git_data_path: "./test_data/git".to_string(), | ||
| 98 | relay_data_path: "./test_data/relay".to_string(), | ||
| 99 | bind_address: "127.0.0.1:8080".to_string(), | ||
| 100 | }; | ||
| 101 | |||
| 102 | let storage = Storage::new(&config).unwrap(); | ||
| 103 | |||
| 104 | // Create multiple events | ||
| 105 | let keys = Keys::generate(); | ||
| 106 | let event1 = EventBuilder::text_note("message 1") | ||
| 107 | .sign_with_keys(&keys) | ||
| 108 | .unwrap(); | ||
| 109 | let event2 = EventBuilder::text_note("message 2") | ||
| 110 | .sign_with_keys(&keys) | ||
| 111 | .unwrap(); | ||
| 112 | |||
| 113 | storage.store_event(event1.clone()).await.unwrap(); | ||
| 114 | storage.store_event(event2.clone()).await.unwrap(); | ||
| 115 | |||
| 116 | // Query all events | ||
| 117 | let all_events = storage.query_events(|_| true).await; | ||
| 118 | assert_eq!(all_events.len(), 2); | ||
| 119 | |||
| 120 | // Query by kind | ||
| 121 | let text_notes = storage | ||
| 122 | .query_events(|e| e.kind == Kind::TextNote) | ||
| 123 | .await; | ||
| 124 | assert_eq!(text_notes.len(), 2); | ||
| 125 | } | ||
| 126 | } | ||
diff --git a/test_relay.sh b/test_relay.sh new file mode 100755 index 0000000..be463fa --- /dev/null +++ b/test_relay.sh | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | #!/usr/bin/env bash | ||
| 2 | set -e | ||
| 3 | |||
| 4 | echo "๐งช Testing ngit-grasp NIP-01 relay" | ||
| 5 | echo "" | ||
| 6 | |||
| 7 | # Start the relay in the background | ||
| 8 | echo "๐ก Starting relay on port 9000..." | ||
| 9 | cd grasp-audit | ||
| 10 | nix develop -c bash -c "cd .. && NGIT_BIND_ADDRESS=127.0.0.1:9000 RUST_LOG=info cargo run" > /tmp/relay.log 2>&1 & | ||
| 11 | RELAY_PID=$! | ||
| 12 | cd .. | ||
| 13 | |||
| 14 | echo "Relay PID: $RELAY_PID" | ||
| 15 | echo "Waiting for relay to start..." | ||
| 16 | sleep 3 | ||
| 17 | |||
| 18 | # Check if relay is running | ||
| 19 | if ! ps -p $RELAY_PID > /dev/null; then | ||
| 20 | echo "โ Relay failed to start" | ||
| 21 | cat /tmp/relay.log | ||
| 22 | exit 1 | ||
| 23 | fi | ||
| 24 | |||
| 25 | echo "โ Relay started" | ||
| 26 | echo "" | ||
| 27 | |||
| 28 | # Run the audit | ||
| 29 | echo "๐ Running NIP-01 smoke tests..." | ||
| 30 | cd grasp-audit | ||
| 31 | nix develop -c cargo run -- audit --relay ws://127.0.0.1:9000 --spec nip01-smoke | ||
| 32 | |||
| 33 | # Capture exit code | ||
| 34 | AUDIT_EXIT=$? | ||
| 35 | |||
| 36 | # Stop the relay | ||
| 37 | echo "" | ||
| 38 | echo "๐ Stopping relay..." | ||
| 39 | kill $RELAY_PID 2>/dev/null || true | ||
| 40 | wait $RELAY_PID 2>/dev/null || true | ||
| 41 | |||
| 42 | # Show relay log if there were errors | ||
| 43 | if [ $AUDIT_EXIT -ne 0 ]; then | ||
| 44 | echo "" | ||
| 45 | echo "๐ Relay log:" | ||
| 46 | cat /tmp/relay.log | ||
| 47 | fi | ||
| 48 | |||
| 49 | exit $AUDIT_EXIT | ||