From 02de9e20380a92731942e91ec246cc2d8de708db Mon Sep 17 00:00:00 2001 From: Mike Dilger Date: Thu, 2 May 2024 09:57:56 +1200 Subject: [PATCH] MAJOR switch to pocket --- Cargo.lock | 401 ++++----- Cargo.toml | 39 +- chorus-bin/Cargo.toml | 29 - chorus-bin/src/bin/chorus_compress.rs | 38 - chorus-bin/src/bin/chorus_dump.rs | 54 -- chorus-bin/src/bin/chorus_dump_approvals.rs | 50 -- chorus-lib/Cargo.toml | 27 - chorus-lib/src/lib.rs | 8 - chorus-lib/src/macros.rs | 75 -- chorus-lib/src/store/event_store.rs | 245 ------ chorus-lib/src/store/lmdb/mod.rs | 766 ------------------ chorus-lib/src/store/lmdb/retired.rs | 88 -- chorus-lib/src/store/migrations.rs | 115 --- chorus-lib/src/store/mod.rs | 666 --------------- chorus-lib/src/types/event/json_event.rs | 318 -------- chorus-lib/src/types/event/mod.rs | 243 ------ chorus-lib/src/types/filter/json_filter.rs | 549 ------------- chorus-lib/src/types/filter/mod.rs | 537 ------------ chorus-lib/src/types/id.rs | 47 -- chorus-lib/src/types/kind.rs | 28 - chorus-lib/src/types/mod.rs | 25 - chorus-lib/src/types/parse/json_escape.rs | 254 ------ chorus-lib/src/types/parse/json_parse.rs | 476 ----------- chorus-lib/src/types/parse/mod.rs | 15 - chorus-lib/src/types/parse/utf8.rs | 165 ---- chorus-lib/src/types/pubkey.rs | 47 -- chorus-lib/src/types/sig.rs | 46 -- chorus-lib/src/types/tags.rs | 332 -------- chorus-lib/src/types/time.rs | 36 - src/bin/chorus.rs | 173 ++++ src/bin/chorus_compress.rs | 22 + src/bin/chorus_dump.rs | 43 + src/bin/chorus_dump_approvals.rs | 32 + .../src => src}/bin/chorus_moderate.rs | 76 +- {chorus-lib/src => src}/config.rs | 2 +- {chorus-lib/src => src}/error.rs | 59 +- {chorus-bin/src => src}/globals.rs | 6 +- {chorus-lib/src => src}/ip.rs | 10 +- chorus-bin/src/main.rs => src/lib.rs | 461 ++++++----- {chorus-bin/src => src}/nostr.rs | 84 +- {chorus-lib/src => src}/reply.rs | 4 +- {chorus-bin/src => src}/tls.rs | 4 +- {chorus-bin/src => src}/web.rs | 6 +- 43 files changed, 898 insertions(+), 5803 deletions(-) delete mode 100644 chorus-bin/Cargo.toml delete mode 100644 chorus-bin/src/bin/chorus_compress.rs delete mode 100644 chorus-bin/src/bin/chorus_dump.rs delete mode 100644 chorus-bin/src/bin/chorus_dump_approvals.rs delete mode 100644 chorus-lib/Cargo.toml delete mode 100644 chorus-lib/src/lib.rs delete mode 100644 chorus-lib/src/macros.rs delete mode 100644 chorus-lib/src/store/event_store.rs delete mode 100644 chorus-lib/src/store/lmdb/mod.rs delete mode 100644 chorus-lib/src/store/lmdb/retired.rs delete mode 100644 chorus-lib/src/store/migrations.rs delete mode 100644 chorus-lib/src/store/mod.rs delete mode 100644 chorus-lib/src/types/event/json_event.rs delete mode 100644 chorus-lib/src/types/event/mod.rs delete mode 100644 chorus-lib/src/types/filter/json_filter.rs delete mode 100644 chorus-lib/src/types/filter/mod.rs delete mode 100644 chorus-lib/src/types/id.rs delete mode 100644 chorus-lib/src/types/kind.rs delete mode 100644 chorus-lib/src/types/mod.rs delete mode 100644 chorus-lib/src/types/parse/json_escape.rs delete mode 100644 chorus-lib/src/types/parse/json_parse.rs delete mode 100644 chorus-lib/src/types/parse/mod.rs delete mode 100644 chorus-lib/src/types/parse/utf8.rs delete mode 100644 chorus-lib/src/types/pubkey.rs delete mode 100644 chorus-lib/src/types/sig.rs delete mode 100644 chorus-lib/src/types/tags.rs delete mode 100644 chorus-lib/src/types/time.rs create mode 100644 src/bin/chorus.rs create mode 100644 src/bin/chorus_compress.rs create mode 100644 src/bin/chorus_dump.rs create mode 100644 src/bin/chorus_dump_approvals.rs rename {chorus-bin/src => src}/bin/chorus_moderate.rs (61%) rename {chorus-lib/src => src}/config.rs (99%) rename {chorus-lib/src => src}/error.rs (88%) rename {chorus-bin/src => src}/globals.rs (94%) rename {chorus-lib/src => src}/ip.rs (95%) rename chorus-bin/src/main.rs => src/lib.rs (70%) rename {chorus-bin/src => src}/nostr.rs (90%) rename {chorus-lib/src => src}/reply.rs (96%) rename {chorus-bin/src => src}/tls.rs (98%) rename {chorus-bin/src => src}/web.rs (97%) diff --git a/Cargo.lock b/Cargo.lock index 803070d..4642a3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,24 +19,24 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -61,9 +61,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bincode" @@ -92,15 +92,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "1.3.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" dependencies = [ "serde", ] @@ -114,12 +108,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "bytemuck" -version = "1.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" - [[package]] name = "byteorder" version = "1.5.0" @@ -128,18 +116,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" [[package]] name = "cfg-if" @@ -151,7 +136,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "chorus" version = "1.3.0" dependencies = [ - "chorus-lib", + "base64 0.22.1", "dashmap", "env_logger", "futures", @@ -160,8 +145,12 @@ dependencies = [ "lazy_static", "log", "parking_lot", + "pocket-db", + "pocket-types", "rustls-pemfile", + "secp256k1", "serde", + "speedy", "tempfile", "textnonce", "tokio", @@ -171,25 +160,10 @@ dependencies = [ ] [[package]] -name = "chorus-lib" -version = "1.3.0" -dependencies = [ - "base64 0.22.0", - "futures", - "heed", - "hyper", - "hyper-tungstenite", - "log", - "mmap-append", - "secp256k1", - "serde", - "speedy", - "tempfile", - "tokio", - "tokio-rustls", - "toml", - "url", -] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cpufeatures" @@ -240,9 +214,22 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] [[package]] name = "digest" @@ -294,9 +281,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fnv" @@ -369,7 +356,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -425,9 +412,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -442,17 +429,16 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heed" -version = "0.20.0-alpha.8" -source = "git+https://github.com/meilisearch/heed?rev=64fd6fec293c0dee94855b8267557ce03e7ce5d8#64fd6fec293c0dee94855b8267557ce03e7ce5d8" +version = "0.20.0-alpha.9" +source = "git+https://github.com/meilisearch/heed?rev=036ac23f73a021894974b9adc815bc95b3e0482a#036ac23f73a021894974b9adc815bc95b3e0482a" dependencies = [ - "bitflags 2.4.2", - "bytemuck", + "bitflags", "byteorder", "heed-traits", "heed-types", @@ -467,16 +453,15 @@ dependencies = [ [[package]] name = "heed-traits" -version = "0.20.0-alpha.8" -source = "git+https://github.com/meilisearch/heed?rev=64fd6fec293c0dee94855b8267557ce03e7ce5d8#64fd6fec293c0dee94855b8267557ce03e7ce5d8" +version = "0.20.0-alpha.9" +source = "git+https://github.com/meilisearch/heed?rev=036ac23f73a021894974b9adc815bc95b3e0482a#036ac23f73a021894974b9adc815bc95b3e0482a" [[package]] name = "heed-types" -version = "0.20.0-alpha.8" -source = "git+https://github.com/meilisearch/heed?rev=64fd6fec293c0dee94855b8267557ce03e7ce5d8#64fd6fec293c0dee94855b8267557ce03e7ce5d8" +version = "0.20.0-alpha.9" +source = "git+https://github.com/meilisearch/heed?rev=036ac23f73a021894974b9adc815bc95b3e0482a#036ac23f73a021894974b9adc815bc95b3e0482a" dependencies = [ "bincode", - "bytemuck", "byteorder", "heed-traits", "serde", @@ -485,9 +470,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex-conservative" @@ -497,9 +482,9 @@ checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -583,9 +568,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -604,9 +589,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "lazy_static" @@ -616,9 +601,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "linux-raw-sys" @@ -629,7 +614,7 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lmdb-master-sys" version = "0.1.0" -source = "git+https://github.com/meilisearch/heed?rev=64fd6fec293c0dee94855b8267557ce03e7ce5d8#64fd6fec293c0dee94855b8267557ce03e7ce5d8" +source = "git+https://github.com/meilisearch/heed?rev=036ac23f73a021894974b9adc815bc95b3e0482a#036ac23f73a021894974b9adc815bc95b3e0482a" dependencies = [ "cc", "doxygen-rs", @@ -638,9 +623,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -648,15 +633,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memmap2" @@ -669,9 +654,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -687,9 +672,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -733,9 +718,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "page_size" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b7663cbd190cfd818d08efa8497f6cd383076688c49a391ef7c0d03cd12b561" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" dependencies = [ "libc", "winapi", @@ -743,9 +728,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" dependencies = [ "lock_api", "parking_lot_core", @@ -753,15 +738,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -800,7 +785,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -814,9 +799,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -824,6 +809,25 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pocket-db" +version = "0.1.0" +source = "git+https://github.com/mikedilger/pocket?branch=master#257d096fb3ed2347f30b6c0b93346dff6f8ee395" +dependencies = [ + "heed", + "mmap-append", + "pocket-types", +] + +[[package]] +name = "pocket-types" +version = "0.1.0" +source = "git+https://github.com/mikedilger/pocket?branch=master#257d096fb3ed2347f30b6c0b93346dff6f8ee395" +dependencies = [ + "derive_more", + "secp256k1", +] + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -832,18 +836,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -907,7 +911,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", ] [[package]] @@ -921,18 +925,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -942,9 +946,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -953,9 +957,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "ring" @@ -965,7 +969,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.12", + "getrandom 0.2.15", "libc", "spin", "untrusted", @@ -979,12 +983,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] -name = "rustix" -version = "0.38.31" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "bitflags 2.4.2", + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags", "errno", "libc", "linux-raw-sys", @@ -993,9 +1006,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring", @@ -1065,30 +1078,36 @@ dependencies = [ ] [[package]] -name = "serde" -version = "1.0.197" +name = "semver" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.200" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ "itoa", "ryu", @@ -1117,9 +1136,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -1141,18 +1160,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1173,7 +1192,7 @@ checksum = "658f2ca5276b92c3dfd65fa88316b4e032ace68f88d7570b43967784c0bac5ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -1184,9 +1203,20 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "syn" -version = "2.0.50" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -1204,9 +1234,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -1235,22 +1265,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -1270,9 +1300,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -1295,7 +1325,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.60", ] [[package]] @@ -1322,9 +1352,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.10" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", @@ -1343,9 +1373,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.6" +version = "0.22.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" dependencies = [ "indexmap", "serde", @@ -1424,9 +1454,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -1499,11 +1529,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1527,7 +1557,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.5", ] [[package]] @@ -1547,17 +1577,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -1568,9 +1599,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -1580,9 +1611,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -1592,9 +1623,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -1604,9 +1641,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -1616,9 +1653,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -1628,9 +1665,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -1640,15 +1677,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.2" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index f700f67..28dbf53 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,33 @@ -[workspace] -members = [ - "chorus-lib", - "chorus-bin", -] -resolver = "2" +[package] +name = "chorus" +version = "1.3.0" +description = "A personal relay for nostr" +authors = ["Mike Dilger "] +license = "MIT" +repository = "https://github.com/mikedilger/chorus" +edition = "2021" + +[dependencies] +base64 = "0.22" +dashmap = "5.5" +env_logger = "0.10" +futures = "0.3" +hyper = { version = "0.14", features = [ "http1", "server", "runtime", "stream" ] } +hyper-tungstenite = "0.11" +lazy_static = "1.4" +log = "0.4" +pocket-types = { git = "https://github.com/mikedilger/pocket", branch = "master" } +pocket-db = { git = "https://github.com/mikedilger/pocket", branch = "master" } +parking_lot = "0.12" +rustls-pemfile = "1.0" +secp256k1 = { version = "0.28", features = [ "hashes", "global-context", "rand-std" ] } +serde = { version = "1.0", features = ["derive"] } +speedy = "0.8" +textnonce = "1" +tokio = { version = "1", features = [ "full" ] } +tokio-rustls = "0.24" +toml = "0.8" +url = "2.5" + +[dev-dependencies] +tempfile = "3" \ No newline at end of file diff --git a/chorus-bin/Cargo.toml b/chorus-bin/Cargo.toml deleted file mode 100644 index e9a3687..0000000 --- a/chorus-bin/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "chorus" -version = "1.3.0" -description = "A personal relay for nostr" -authors = ["Mike Dilger "] -license = "MIT" -repository = "https://github.com/mikedilger/chorus" -edition = "2021" - -[dependencies] -chorus-lib = { path = "../chorus-lib" } -dashmap = "5.5" -env_logger = "0.10" -futures = "0.3" -hyper = { version = "0.14", features = [ "http1", "server", "runtime", "stream" ] } -hyper-tungstenite = "0.11" -lazy_static = "1.4" -log = "0.4" -parking_lot = "0.12" -rustls-pemfile = "1.0" -serde = { version = "1.0", features = ["derive"] } -textnonce = "1" -tokio = { version = "1", features = [ "full" ] } -tokio-rustls = "0.24" -toml = "0.8" -url = "2.5" - -[dev-dependencies] -tempfile = "3" \ No newline at end of file diff --git a/chorus-bin/src/bin/chorus_compress.rs b/chorus-bin/src/bin/chorus_compress.rs deleted file mode 100644 index 0428765..0000000 --- a/chorus-bin/src/bin/chorus_compress.rs +++ /dev/null @@ -1,38 +0,0 @@ -use chorus_lib::config::{Config, FriendlyConfig}; -use chorus_lib::error::Error; -use chorus_lib::store::Store; -use std::env; -use std::fs::OpenOptions; -use std::io::Read; - -fn main() -> Result<(), Error> { - // Get args (config path) - let mut args = env::args(); - if args.len() <= 1 { - panic!("USAGE: chorus_compress "); - } - let _ = args.next(); // ignore program name - let config_path = args.next().unwrap(); - - // Read config file - let mut file = OpenOptions::new().read(true).open(config_path)?; - let mut contents = String::new(); - file.read_to_string(&mut contents)?; - let friendly_config: FriendlyConfig = toml::from_str(&contents)?; - let config: Config = friendly_config.into_config()?; - - env_logger::Builder::new() - .filter_level(config.library_log_level) - .filter(Some("Server"), config.server_log_level) - .filter(Some("Client"), config.client_log_level) - .format_target(true) - .format_module_path(false) - .format_timestamp_millis() - .init(); - - log::debug!(target: "Server", "Loaded config file."); - - Store::rebuild(&config)?; - - Ok(()) -} diff --git a/chorus-bin/src/bin/chorus_dump.rs b/chorus-bin/src/bin/chorus_dump.rs deleted file mode 100644 index 53c2884..0000000 --- a/chorus-bin/src/bin/chorus_dump.rs +++ /dev/null @@ -1,54 +0,0 @@ -use chorus_lib::config::{Config, FriendlyConfig}; -use chorus_lib::error::Error; -use chorus_lib::store::Store; -use chorus_lib::types::{Event, Filter}; -use std::env; -use std::fs::OpenOptions; -use std::io::Read; - -fn main() -> Result<(), Error> { - // Get args (config path) - let mut args = env::args(); - if args.len() <= 1 { - panic!("USAGE: chorus_dump "); - } - let _ = args.next(); // ignore program name - let config_path = args.next().unwrap(); - - // Read config file - let mut file = OpenOptions::new().read(true).open(config_path)?; - let mut contents = String::new(); - file.read_to_string(&mut contents)?; - let friendly_config: FriendlyConfig = toml::from_str(&contents)?; - let mut config: Config = friendly_config.into_config()?; - - env_logger::Builder::new() - .filter_level(config.library_log_level) - .filter(Some("Server"), config.server_log_level) - .filter(Some("Client"), config.client_log_level) - .format_target(true) - .format_module_path(false) - .format_timestamp_millis() - .init(); - - log::debug!(target: "Server", "Loaded config file."); - - // Force allow of scraping (this program is a scraper) - config.allow_scraping = true; - - // Setup store - let store = Store::new(&config)?; - - let mut buffer: [u8; 128] = [0; 128]; - let (_incount, _outcount, filter) = Filter::from_json(b"{}", &mut buffer)?; - let screen = |_: &Event<'_>| -> bool { true }; - - let mut events = store.find_events(filter, screen, &config)?; - for event in events.drain(..) { - let bytes = event.as_json()?; - let s = unsafe { std::str::from_utf8_unchecked(&bytes) }; - println!("{s}"); - } - - Ok(()) -} diff --git a/chorus-bin/src/bin/chorus_dump_approvals.rs b/chorus-bin/src/bin/chorus_dump_approvals.rs deleted file mode 100644 index 87d70b2..0000000 --- a/chorus-bin/src/bin/chorus_dump_approvals.rs +++ /dev/null @@ -1,50 +0,0 @@ -use chorus_lib::config::{Config, FriendlyConfig}; -use chorus_lib::error::Error; -use chorus_lib::store::Store; -use std::env; -use std::fs::OpenOptions; -use std::io::Read; - -fn main() -> Result<(), Error> { - // Get args (config path) - let mut args = env::args(); - if args.len() <= 1 { - panic!("USAGE: chorus_moderate "); - } - let _ = args.next(); // ignore program name - let config_path = args.next().unwrap(); - - // Read config file - let mut file = OpenOptions::new().read(true).open(config_path)?; - let mut contents = String::new(); - file.read_to_string(&mut contents)?; - let friendly_config: FriendlyConfig = toml::from_str(&contents)?; - let mut config: Config = friendly_config.into_config()?; - - env_logger::Builder::new() - .filter_level(config.library_log_level) - .filter(Some("Server"), config.server_log_level) - .filter(Some("Client"), config.client_log_level) - .format_target(true) - .format_module_path(false) - .format_timestamp_millis() - .init(); - - log::debug!(target: "Server", "Loaded config file."); - - // Force allow of scraping (this program is a scraper) - config.allow_scraping = true; - - // Setup store - let store = Store::new(&config)?; - - for (id, approved) in store.dump_event_approvals()? { - println!("ID {} = {}", id, approved); - } - - for (pubkey, approved) in store.dump_pubkey_approvals()? { - println!("PUBKEY {} = {}", pubkey, approved); - } - - Ok(()) -} diff --git a/chorus-lib/Cargo.toml b/chorus-lib/Cargo.toml deleted file mode 100644 index f7ea007..0000000 --- a/chorus-lib/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "chorus-lib" -version = "1.3.0" -description = "A personal relay for nostr" -authors = ["Mike Dilger "] -license = "MIT" -repository = "https://github.com/mikedilger/chorus" -edition = "2021" - -[dependencies] -base64 = "0.22" -futures = "0.3" -heed = { git = "https://github.com/meilisearch/heed", rev = "64fd6fec293c0dee94855b8267557ce03e7ce5d8" } -hyper = { version = "0.14", features = [ "http1", "server", "runtime", "stream" ] } -hyper-tungstenite = "0.11" -log = "0.4" -mmap-append = "0.2" -secp256k1 = { version = "0.28", features = [ "hashes", "global-context", "rand-std" ] } -serde = { version = "1.0", features = ["derive"] } -speedy = "0.8" -tokio = { version = "1", features = [ "full" ] } -tokio-rustls = "0.24" -toml = "0.8" -url = "2.5" - -[dev-dependencies] -tempfile = "3" \ No newline at end of file diff --git a/chorus-lib/src/lib.rs b/chorus-lib/src/lib.rs deleted file mode 100644 index ffd9f0c..0000000 --- a/chorus-lib/src/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -include!("macros.rs"); - -pub mod config; -pub mod error; -pub mod ip; -pub mod reply; -pub mod store; -pub mod types; diff --git a/chorus-lib/src/macros.rs b/chorus-lib/src/macros.rs deleted file mode 100644 index a24862b..0000000 --- a/chorus-lib/src/macros.rs +++ /dev/null @@ -1,75 +0,0 @@ -static HEX_CHARS: &[u8; 16] = b"0123456789abcdef"; -#[allow(clippy::zero_prefixed_literal)] -static HEX_INVERSE: [u8; 128] = { - const __: u8 = 255; - [ - // 1 2 3 4 5 6 7 8 9 A B C D E F - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 0 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 1 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 2 - 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, __, __, __, __, __, __, // 3 - __, 10, 11, 12, 13, 14, 15, __, __, __, __, __, __, __, __, __, // 4 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 5 - __, 10, 11, 12, 13, 14, 15, __, __, __, __, __, __, __, __, __, // 6 - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, // 7 - ] -}; - -macro_rules! write_hex { - ($input:expr, $output:expr, $bytelen:expr) => {{ - assert_eq!($input.len(), $bytelen); - if $output.len() != $bytelen * 2 { - Err(crate::error::ChorusError::BufferTooSmall.into()) - } else { - for (i, byte) in $input.iter().enumerate() { - $output[i * 2] = crate::HEX_CHARS[((byte & 0xF0) >> 4) as usize]; - $output[i * 2 + 1] = crate::HEX_CHARS[(byte & 0x0F) as usize]; - } - Ok(()) - } - }}; -} - -macro_rules! read_hex { - ($input:expr, $output:expr, $bytelen:expr) => {{ - assert_eq!($output.len(), $bytelen); - if $input.len() != $bytelen * 2 { - Err(Into::::into(crate::error::ChorusError::EndOfInput)) - } else { - let mut i = 0; - loop { - let high = crate::HEX_INVERSE[$input[i * 2] as usize]; - if high == 255 { - break Err(crate::error::ChorusError::BadHexInput.into()); - } - let low = crate::HEX_INVERSE[$input[i * 2 + 1] as usize]; - if low == 255 { - break Err(crate::error::ChorusError::BadHexInput.into()); - } - $output[i] = high * 16 + low; - i += 1; - if i == $bytelen { - break Ok(()); - } - } - } - }}; -} - -macro_rules! parse_u16 { - ($input:expr, $start:expr) => { - u16::from_ne_bytes($input[$start .. $start+2].try_into().unwrap()) - } -} - -macro_rules! parse_u32 { - ($input:expr, $start:expr) => { - u32::from_ne_bytes($input[$start .. $start+4].try_into().unwrap()) - } -} - -macro_rules! parse_u64 { - ($input:expr, $start:expr) => { - u64::from_ne_bytes($input[$start .. $start+8].try_into().unwrap()) - } -} diff --git a/chorus-lib/src/store/event_store.rs b/chorus-lib/src/store/event_store.rs deleted file mode 100644 index 55637a4..0000000 --- a/chorus-lib/src/store/event_store.rs +++ /dev/null @@ -1,245 +0,0 @@ -use crate::error::{ChorusError, Error}; -use crate::types::Event; -use mmap_append::MmapAppend; -use std::fs::{File, OpenOptions}; -use std::mem; -use std::path::Path; -use std::sync::atomic::{AtomicUsize, Ordering}; - -/// This is the size of the initial event map, and also how large it grows by -/// when we need to grow it. This should be a multiple of the page size (4096) -// While debugging, we like to use a small value to increase the frequency of -// resizing, to help detect if there are problems in the algorithm. -#[cfg(debug_assertions)] -const EVENT_MAP_CHUNK: usize = 2048; -#[cfg(not(debug_assertions))] -const EVENT_MAP_CHUNK: usize = 4096 * 1024; // grow by 4 megabytes at a time - -/// An EventStore is a fast storage facility for events. -#[derive(Debug)] -pub struct EventStore { - // the Mmap doesn't need us to keep the file, but we keep it for resizing. - event_map_file: File, - event_map_file_len: AtomicUsize, - - // This is a linear sequence of events in an append-only memory mapped file which - // internally remembers the 'end' pointer and internally prevents multiple writers. - event_map: MmapAppend, - - // Whether or not event offsets are aligned on 8-byte boundaries. If they are, - // event retrieval is more CPU efficient, and a tiny bit more space is used. - // Early code did not align the data. If you specify the wrong value here that - // doesnt match the data, the iterator will fail badly. - aligned: bool, -} - -impl EventStore { - /// Create a new `EventStore`. The `event_map_file` is the eventually large file - /// that holds all the events. - pub fn new>(event_map_file: P, aligned: bool) -> Result { - // Open the event map file, possibly creating if it isn't there - let event_map_file = OpenOptions::new() - .read(true) - .write(true) - .truncate(false) - .create(true) - .open(event_map_file)?; - - // Get it's size - let metadata = event_map_file.metadata()?; - let mut len = metadata.len() as usize; - - // Determine if we just created it - // (not long enough for the required end offset) - let new = len < mem::size_of::(); - - // If brand new: - if new { - // grow to initial size - len = EVENT_MAP_CHUNK; - event_map_file.set_len(EVENT_MAP_CHUNK as u64)?; - } - - // Memory map it - let event_map = unsafe { MmapAppend::new(&event_map_file, new)? }; - - log::info!( - "Event Store: new={:?} end={} len={}", - new, - event_map.get_end(), - len - ); - - Ok(EventStore { - event_map_file, - event_map_file_len: AtomicUsize::new(len), - event_map, - aligned, - }) - } - - /// Get whether events are aligned in the map - #[inline] - pub fn is_aligned(&self) -> bool { - self.aligned - } - - /// Get the number of bytes used in the event map - #[inline] - pub fn read_event_map_end(&self) -> usize { - self.event_map.get_end() - } - - /// Get an event by its offset in the map - pub fn get_event_by_offset(&self, offset: usize) -> Result { - if offset >= self.read_event_map_end() { - return Err(ChorusError::EndOfInput.into()); - } - let event = Event::delineate(&self.event_map[offset..])?; - Ok(event) - } - - // This stores an event - // It does NOT validate the event. - // It does NOT check first if the event is already stored, so it could store a duplicate - // It does NOT record the event into any indexes - // But it does grow the file if needed and returns the offset where it was stored - pub fn store_event(&self, event: &Event) -> Result { - if self.aligned { - let mut end = self.event_map.get_end(); - if end % 8 != 0 { - let padding = 8 - (end % 8); - end += padding; - assert_eq!(end % 8, 0); - self.event_map.append(padding, |_| Ok(padding))?; - } - } - - let event_size = event.length(); - - loop { - let result = self.event_map.append(event_size, |dst| event.macopy(dst)); - - match result { - Ok(offset) => return Ok(offset), - Err(e) => { - if e.kind() == std::io::ErrorKind::Other { - if e.to_string() == "Out of space" { - // Determine the new size - let new_file_len = { - let file_len = self.event_map_file_len.load(Ordering::Relaxed); - file_len + EVENT_MAP_CHUNK - }; - - // Grow the file - self.event_map_file.set_len(new_file_len as u64)?; - - // Resize the memory map - self.event_map.resize(new_file_len)?; - - // Save this new length - self.event_map_file_len - .store(new_file_len, Ordering::Relaxed); - - // Try again - continue; - } else { - return Err(e.into()); - } - } else { - return Err(e.into()); - } - } - } - } - } - - pub fn iter(&self) -> EventStoreIter<'_> { - EventStoreIter { - store: self, - offset: mmap_append::HEADER_SIZE, - } - } -} - -pub struct EventStoreIter<'a> { - store: &'a EventStore, - offset: usize, -} - -impl<'a> Iterator for EventStoreIter<'a> { - type Item = Result, Error>; - - fn next(&mut self) -> Option { - match self.store.get_event_by_offset(self.offset) { - Err(e) => { - if matches!(e.inner, ChorusError::EndOfInput) { - None - } else { - Some(Err(e)) - } - } - Ok(event) => { - self.offset += event.length(); - if self.store.aligned && self.offset % 8 != 0 { - self.offset += 8 - (self.offset % 8); - assert_eq!(self.offset % 8, 0); - } - Some(Ok(event)) - } - } - } -} - -#[cfg(test)] -mod tests { - use crate::store::EventStore; - use crate::types::Event; - - #[test] - fn test_event_store() { - let tempdir = tempfile::tempdir().unwrap(); - let path = tempdir.path().join("mmap"); - let store = EventStore::new(&path, false).unwrap(); - - println!("Event map has {} used bytes", store.read_event_map_end()); - - let e1str = br#"{"id":"000000005ccb8402fe9af2ecc72ca1dbbf2dbeb9a0c6353b7f8198a65106f04a","pubkey":"7bdef7be22dd8e59f4600e044aa53a1cf975a9dc7d27df5833bc77db784a5805","created_at":1677930312,"kind":1,"tags":[["p","fe1d10131ca6103715d261f1615a8cd31f6b68a3d1a3272aab8e9e83f787126e"],["e","f76a6f60df029c388e98d4e97c67424cb71e34455302580d3aa48d0be96dfaef","wss://nos.lol","root"],["e","f529676213b123f55117ae9b93ca7dd6c85c872b7c260da7dbf60d71875879f6","wss://brb.io","reply"],["nonce","12912720851603613541","25"]],"content":"https://www.nostr.guru/p/fe1d10131ca6103715d261f1615a8cd31f6b68a3d1a3272aab8e9e83f787126e\nHere I can see only the today contact list.\n\nI tried to query relay.damus.io and nostr.wine but I can get only this last contact list, perhaps they have a time limit; you could ask some relay owner for a backup.\nIf can be useful this is the REQ filter to use:\n{\"kinds\": [3], \"authors\": [\"fe1d10131ca6103715d261f1615a8cd31f6b68a3d1a3272aab8e9e83f787126e\"], \"since\": 1672569529}","sig":"7c72d15cf9b4244cb8c49564d3735d0ac620dca69253956975def12054bc50217307f062f3e9ea879de8bae756c844a9315f03aabbb5f5fd94f9fc9beb76f457"}"#; - let mut buffer1: Vec = Vec::with_capacity(4096); - buffer1.resize(4096, 0); - let (_insize, event1) = Event::from_json(&e1str[..], &mut buffer1).unwrap(); - let offset1 = store.store_event(&event1).unwrap(); - - let e2str = br#"{"id":"00000000a6fa8ee15b17fcc5bb49f09f85c15cddf5349986db09fddc0a123f7d","pubkey":"7cc328a08ddb2afdf9f9be77beff4c83489ff979721827d628a542f32a247c0e","created_at":1678835260,"kind":1,"tags":[["p","0000000033f569c7069cdec575ca000591a31831ebb68de20ed9fb783e3fc287"],["e","52338357568d06379ad2412a2a2033f23f224754d74148bbfc659b872c9477c4","wss://relay.damus.io/","root"],["nonce","9223372036941030112","32"]],"content":"oh shit, it got released?! no wayyy","sig":"ec9bcdcaa843a2a275857999556136d2b3cc47dac52c899d313dd70291b9661590d4c10b13680bbfa685d67d319798cdfa3ca58f61af5f8acffd0e25bca5ab95"}"#; - let mut buffer2: Vec = Vec::with_capacity(4096); - buffer2.resize(4096, 0); - let (_insize, event2) = Event::from_json(&e2str[..], &mut buffer2).unwrap(); - let offset2 = store.store_event(&event2).unwrap(); - - let e3str = br#"{"id":"00000000ad0efde5b63e9b24b12a586dc98df372e1fd6f96ac6ad24ea2ed1350","pubkey":"c5fb6ecc876e0458e3eca9918e370cbcd376901c58460512fe537a46e58c38bb","created_at":1681739201,"kind":7,"tags":[["e","193bd20beb8fc13f4218ea106928c3be81ee3b2ad2b1bdbdd2c55efd859a195a","wss://eden.nostr.land/"],["p","3f770d65d3a764a9c5cb503ae123e62ec7598ad035d836e2a810f3877a745b24"],["client","gossip"],["nonce","2305843009213833122","22"]],"content":"+","sig":"f344111c221d2fea5f006865b98b0767b40ed1cc2907d8a325a8dea4b98414d008296ff4f4bd4666d52ec86ffd4739e807c6655ce43de98b473326e30957fcb2"}"#; - let mut buffer3: Vec = Vec::with_capacity(4096); - buffer3.resize(4096, 0); - let (_insize, event3) = Event::from_json(&e3str[..], &mut buffer3).unwrap(); - let offset3 = store.store_event(&event3).unwrap(); - - println!("Event map has {} used bytes", store.read_event_map_end()); - - if let Ok(event) = store.get_event_by_offset(offset1) { - assert_eq!(event, event1); - } else { - panic!("EVENT 1 IS WRONG"); - } - - if let Ok(event) = store.get_event_by_offset(offset2) { - assert_eq!(event, event2); - } else { - panic!("EVENT 2 IS WRONG"); - } - - if let Ok(event) = store.get_event_by_offset(offset3) { - assert_eq!(event, event3); - } else { - panic!("EVENT 3 IS WRONG"); - } - } -} diff --git a/chorus-lib/src/store/lmdb/mod.rs b/chorus-lib/src/store/lmdb/mod.rs deleted file mode 100644 index ee88cfc..0000000 --- a/chorus-lib/src/store/lmdb/mod.rs +++ /dev/null @@ -1,766 +0,0 @@ -use crate::error::Error; -use crate::ip::{HashedIp, IpData}; -use crate::types::{Event, Id, Kind, Pubkey, Time}; -use heed::types::{OwnedType, UnalignedSlice, Unit, U8}; -use heed::{Database, Env, EnvFlags, EnvOpenOptions, RoIter, RoRange, RoTxn, RwTxn}; -use speedy::{Readable, Writable}; -use std::fs; -use std::ops::Bound; - -mod retired; - -const FALSE: &[u8] = &[0]; -const TRUE: &[u8] = &[1]; - -#[derive(Debug)] -pub struct Lmdb { - env: Env, - general: Database, UnalignedSlice>, - i_index: Database, OwnedType>, - ci_index: Database, OwnedType>, - tc_index: Database, OwnedType>, - ac_index: Database, OwnedType>, - akc_index: Database, OwnedType>, - atc_index: Database, OwnedType>, - ktc_index: Database, OwnedType>, - - // this is for events deleted by other events - deleted_ids: Database, Unit>, - approved_events: Database, U8>, - approved_pubkeys: Database, U8>, - ip_data: Database, UnalignedSlice>, -} - -impl Lmdb { - pub fn new(directory: &str) -> Result { - let mut builder = EnvOpenOptions::new(); - unsafe { - builder.flags(EnvFlags::NO_TLS); - } - builder.max_dbs(32); - builder.map_size(1048576 * 1024 * 24); // 24 GB - - fs::create_dir_all(directory)?; - - let env = match builder.open(directory) { - Ok(env) => env, - Err(e) => { - log::error!("Unable to open LMDB at {}", directory); - return Err(e.into()); - } - }; - - // Open/Create maps - let mut txn = env.write_txn()?; - let general = env - .database_options() - .types::, UnalignedSlice>() - .create(&mut txn)?; - let i_index = env - .database_options() - .types::, OwnedType>() - .name("ids") - .create(&mut txn)?; - let ci_index = env - .database_options() - .types::, OwnedType>() - .name("ci") - .create(&mut txn)?; - let tc_index = env - .database_options() - .types::, OwnedType>() - .name("tci") - .create(&mut txn)?; - let ac_index = env - .database_options() - .types::, OwnedType>() - .name("aci") - .create(&mut txn)?; - let akc_index = env - .database_options() - .types::, OwnedType>() - .name("akci") - .create(&mut txn)?; - let atc_index = env - .database_options() - .types::, OwnedType>() - .name("atci") - .create(&mut txn)?; - let ktc_index = env - .database_options() - .types::, OwnedType>() - .name("ktci") - .create(&mut txn)?; - let deleted_ids = env - .database_options() - .types::, Unit>() - .name("deleted-ids") - .create(&mut txn)?; - let approved_events = env - .database_options() - .types::, U8>() - .name("approved-events") - .create(&mut txn)?; - let approved_pubkeys = env - .database_options() - .types::, U8>() - .name("approved-pubkeys") - .create(&mut txn)?; - let ip_data = env - .database_options() - .types::, UnalignedSlice>() - .name("ip_data") - .create(&mut txn)?; - txn.commit()?; - - let lmdb = Lmdb { - env, - general, - i_index, - ci_index, - tc_index, - ac_index, - akc_index, - atc_index, - ktc_index, - deleted_ids, - approved_events, - approved_pubkeys, - ip_data, - }; - - Ok(lmdb) - } - - /// Sync the data to disk. This happens periodically, but sometimes it's useful to force - /// it. - pub fn sync(&self) -> Result<(), Error> { - self.env.force_sync()?; - Ok(()) - } - - /// Get a read transaction - pub fn read_txn(&self) -> Result { - Ok(self.env.read_txn()?) - } - - /// Get a write transaction - pub fn write_txn(&self) -> Result { - Ok(self.env.write_txn()?) - } - - pub fn log_stats(&self) -> Result<(), Error> { - let txn = self.read_txn()?; - - if !self.get_if_events_are_aligned()? { - log::warn!("Events are not aligned on 8-byte offsets. You should run `chorus_compress` to rebuild your data (but it will keep working regardless)"); - } - - if let Ok(count) = self.i_index.len(&txn) { - log::info!("Index: id ({} entries, {} bytes)", count, count * (32 + 8)); - } - if let Ok(count) = self.ci_index.len(&txn) { - log::info!( - "Index: created_at+id ({} entries, {} bytes)", - count, - count * (40 + 8) - ); - } - - if let Ok(count) = self.tc_index.len(&txn) { - log::info!( - "Index: tag+created_at+id ({} entries, {} bytes)", - count, - count * (223 + 8) - ); - } - if let Ok(count) = self.ac_index.len(&txn) { - log::info!( - "Index: author+created_at+id ({} entries, {} bytes)", - count, - count * (72 + 8) - ); - } - if let Ok(count) = self.akc_index.len(&txn) { - log::info!( - "Index: author+kind+created_at+id ({} entries, {} bytes)", - count, - count * (74 + 8) - ); - } - if let Ok(count) = self.atc_index.len(&txn) { - log::info!( - "Index: author+tags+created_at+id ({} entries, {} bytes)", - count, - count * (255 + 8) - ); - } - if let Ok(count) = self.ktc_index.len(&txn) { - log::info!( - "Index: kind+tags+created_at+id ({} entries, {} bytes)", - count, - count * (225 + 8) - ); - } - - if let Ok(count) = self.deleted_ids.len(&txn) { - log::info!("{} deleted events", count); - } - if let Ok(count) = self.ip_data.len(&txn) { - log::info!("{count} IP addresses reputationally tracked"); - } - - Ok(()) - } - - pub fn get_migration_level(&self, txn: &RoTxn<'_>) -> Result { - let zero_bytes = 0_u32.to_be_bytes(); - let migration_level_bytes = self - .general - .get(txn, b"migration_level")? - .unwrap_or(zero_bytes.as_slice()); - Ok(u32::from_be_bytes( - migration_level_bytes[..4].try_into().unwrap(), - )) - } - - pub fn set_migration_level(&self, txn: &mut RwTxn<'_>, level: u32) -> Result<(), Error> { - self.general - .put(txn, b"migration_level", level.to_be_bytes().as_slice())?; - - Ok(()) - } - - pub fn get_if_events_are_aligned(&self) -> Result { - let txn = self.read_txn()?; - match self.general.get(&txn, b"events_are_aligned")? { - None => Ok(false), - Some(bytes) => match bytes[0] { - 0 => Ok(false), - _ => Ok(true), - }, - } - } - - pub fn set_if_events_are_aligned( - &self, - txn: &mut RwTxn<'_>, - events_are_aligned: bool, - ) -> Result<(), Error> { - let slice = match events_are_aligned { - false => FALSE, - true => TRUE, - }; - self.general.put(txn, b"events_are_aligned", slice)?; - Ok(()) - } - - // Index the event - pub fn index(&self, txn: &mut RwTxn<'_>, event: &Event, offset: usize) -> Result<(), Error> { - // Index by id - self.i_index.put(txn, event.id().0.as_slice(), &offset)?; - - // Index by created_at and id - self.ci_index.put( - txn, - &Self::key_ci_index(event.created_at(), event.id()), - &offset, - )?; - - // Index by author and kind (with created_at and id) - self.akc_index.put( - txn, - &Self::key_akc_index(event.pubkey(), event.kind(), event.created_at(), event.id()), - &offset, - )?; - - self.ac_index.put( - txn, - &Self::key_ac_index(event.pubkey(), event.created_at(), event.id()), - &offset, - )?; - - for mut tsi in event.tags()?.iter() { - if let Some(tagname) = tsi.next() { - // FIXME make sure it is a letter too - if tagname.len() == 1 { - if let Some(tagvalue) = tsi.next() { - // Index by tag (with created_at and id) - self.tc_index.put( - txn, - &Self::key_tc_index( - tagname[0], - tagvalue, - event.created_at(), - event.id(), - ), - &offset, - )?; - - // Index by author and tag (with created_at and id) - self.atc_index.put( - txn, - &Self::key_atc_index( - event.pubkey(), - tagname[0], - tagvalue, - event.created_at(), - event.id(), - ), - &offset, - )?; - - // Index by kind and tag (with created_at and id) - self.ktc_index.put( - txn, - &Self::key_ktc_index( - event.kind(), - tagname[0], - tagvalue, - event.created_at(), - event.id(), - ), - &offset, - )?; - } - } - } - } - - Ok(()) - } - - // Remove the event from all indexes (except the 'id' index) - pub fn deindex(&self, txn: &mut RwTxn<'_>, event: &Event) -> Result<(), Error> { - for mut tsi in event.tags()?.iter() { - if let Some(tagname) = tsi.next() { - // FIXME make sure it is a letter too - if tagname.len() == 1 { - if let Some(tagvalue) = tsi.next() { - // Index by author and tag (with created_at and id) - self.atc_index.delete( - txn, - &Self::key_atc_index( - event.pubkey(), - tagname[0], - tagvalue, - event.created_at(), - event.id(), - ), - )?; - - // Index by kind and tag (with created_at and id) - self.ktc_index.delete( - txn, - &Self::key_ktc_index( - event.kind(), - tagname[0], - tagvalue, - event.created_at(), - event.id(), - ), - )?; - - // Index by tag (with created_at and id) - self.tc_index.delete( - txn, - &Self::key_tc_index( - tagname[0], - tagvalue, - event.created_at(), - event.id(), - ), - )?; - } - } - } - } - - self.ac_index.delete( - txn, - &Self::key_ac_index(event.pubkey(), event.created_at(), event.id()), - )?; - - self.ci_index - .delete(txn, &Self::key_ci_index(event.created_at(), event.id()))?; - - self.akc_index.delete( - txn, - &Self::key_akc_index(event.pubkey(), event.kind(), event.created_at(), event.id()), - )?; - - // We leave it in the id map. If someone wants to load the replaced event by id - // they can still do it. - // self.i_index.delete(&mut txn, event.id().0.as_slice())?; - - Ok(()) - } - - pub fn deindex_id(&self, txn: &mut RwTxn<'_>, id: Id) -> Result<(), Error> { - self.i_index.delete(txn, id.0.as_slice())?; - Ok(()) - } - - pub fn get_offset_by_id(&self, txn: &RoTxn<'_>, id: Id) -> Result, Error> { - Ok(self.i_index.get(txn, id.0.as_slice())?) - } - - pub fn is_deleted(&self, txn: &RoTxn<'_>, id: Id) -> Result { - Ok(self.deleted_ids.get(txn, id.as_slice())?.is_some()) - } - - pub fn mark_deleted(&self, txn: &mut RwTxn<'_>, id: Id) -> Result<(), Error> { - self.deleted_ids.put(txn, id.as_slice(), &())?; - Ok(()) - } - - pub fn dump_deleted(&self) -> Result, Error> { - let mut output: Vec = Vec::new(); - let txn = self.read_txn()?; - for i in self.deleted_ids.iter(&txn)? { - let (key, _val) = i?; - let id = Id(key[0..32].try_into().unwrap()); - output.push(id); - } - Ok(output) - } - - pub fn get_ip_data(&self, ip: HashedIp) -> Result { - let key = &ip.0; - let txn = self.read_txn()?; - let bytes = match self.ip_data.get(&txn, key)? { - Some(b) => b, - None => return Ok(Default::default()), - }; - Ok(IpData::read_from_buffer(bytes)?) - } - - pub fn update_ip_data(&self, ip: HashedIp, data: &IpData) -> Result<(), Error> { - let key = &ip.0; - let mut txn = self.write_txn()?; - let bytes = data.write_to_vec()?; - self.ip_data.put(&mut txn, key, &bytes)?; - txn.commit()?; - Ok(()) - } - - pub fn dump_ip_data(&self) -> Result, Error> { - let mut output: Vec<(HashedIp, IpData)> = Vec::new(); - let txn = self.read_txn()?; - for i in self.ip_data.iter(&txn)? { - let (key, val) = i?; - let hashedip = HashedIp::from_bytes(key); - let data = IpData::read_from_buffer(val)?; - output.push((hashedip, data)); - } - Ok(output) - } - - pub fn mark_event_approval(&self, id: Id, approval: bool) -> Result<(), Error> { - let mut txn = self.write_txn()?; - self.approved_events - .put(&mut txn, id.0.as_slice(), &(approval as u8))?; - txn.commit()?; - Ok(()) - } - - pub fn clear_event_approval(&self, id: Id) -> Result<(), Error> { - let mut txn = self.write_txn()?; - self.approved_events.delete(&mut txn, id.0.as_slice())?; - txn.commit()?; - Ok(()) - } - - pub fn get_event_approval(&self, id: Id) -> Result, Error> { - let txn = self.read_txn()?; - Ok(self - .approved_events - .get(&txn, id.0.as_slice())? - .map(|u| u != 0)) - } - - pub fn dump_event_approvals(&self) -> Result, Error> { - let mut output: Vec<(Id, bool)> = Vec::new(); - let txn = self.read_txn()?; - for i in self.approved_events.iter(&txn)? { - let (key, val) = i?; - let id = Id(key.try_into().unwrap()); - let approval: bool = val != 0; - output.push((id, approval)); - } - Ok(output) - } - - pub fn mark_pubkey_approval(&self, pubkey: Pubkey, approval: bool) -> Result<(), Error> { - let mut txn = self.write_txn()?; - self.approved_pubkeys - .put(&mut txn, pubkey.0.as_slice(), &(approval as u8))?; - txn.commit()?; - Ok(()) - } - - pub fn clear_pubkey_approval(&self, pubkey: Pubkey) -> Result<(), Error> { - let mut txn = self.write_txn()?; - self.approved_pubkeys - .delete(&mut txn, pubkey.0.as_slice())?; - txn.commit()?; - Ok(()) - } - - pub fn get_pubkey_approval(&self, pubkey: Pubkey) -> Result, Error> { - let txn = self.read_txn()?; - Ok(self - .approved_pubkeys - .get(&txn, pubkey.0.as_slice())? - .map(|u| u != 0)) - } - - pub fn dump_pubkey_approvals(&self) -> Result, Error> { - let mut output: Vec<(Pubkey, bool)> = Vec::new(); - let txn = self.read_txn()?; - for i in self.approved_pubkeys.iter(&txn)? { - let (key, val) = i?; - let pubkey = Pubkey(key.try_into().unwrap()); - let approval: bool = val != 0; - output.push((pubkey, approval)); - } - Ok(output) - } - - pub fn i_iter<'a>( - &'a self, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - Ok(self.i_index.iter(txn)?) - } - - pub fn ci_iter<'a>( - &'a self, - since: Time, - until: Time, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - let start_prefix = Self::key_ci_index(until, Id([0; 32])); - let end_prefix = Self::key_ci_index(since, Id([255; 32])); - let range = ( - Bound::Included(&*start_prefix), - Bound::Excluded(&*end_prefix), - ); - Ok(self.ci_index.range(txn, &range)?) - } - - pub fn tc_iter<'a>( - &'a self, - tagbyte: u8, - tagvalue: &[u8], - since: Time, - until: Time, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - let start_prefix = Self::key_tc_index( - tagbyte, - tagvalue, - until, // scan goes backwards in time - Id([0; 32]), - ); - let end_prefix = Self::key_tc_index(tagbyte, tagvalue, since, Id([255; 32])); - let range = ( - Bound::Included(&*start_prefix), - Bound::Excluded(&*end_prefix), - ); - Ok(self.tc_index.range(txn, &range)?) - } - - pub fn ac_iter<'a>( - &'a self, - author: Pubkey, - since: Time, - until: Time, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - let start_prefix = Self::key_ac_index(author, until, Id([0; 32])); - let end_prefix = Self::key_ac_index(author, since, Id([255; 32])); - let range = ( - Bound::Included(&*start_prefix), - Bound::Excluded(&*end_prefix), - ); - Ok(self.ac_index.range(txn, &range)?) - } - - pub fn akc_iter<'a>( - &'a self, - author: Pubkey, - kind: Kind, - since: Time, - until: Time, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - let start_prefix = Self::key_akc_index(author, kind, until, Id([0; 32])); - let end_prefix = Self::key_akc_index(author, kind, since, Id([255; 32])); - let range = ( - Bound::Included(&*start_prefix), - Bound::Excluded(&*end_prefix), - ); - Ok(self.akc_index.range(txn, &range)?) - } - - pub fn atc_iter<'a>( - &'a self, - author: Pubkey, - tagbyte: u8, - tagvalue: &[u8], - since: Time, - until: Time, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - let start_prefix = Self::key_atc_index( - author, - tagbyte, - tagvalue, - until, // scan goes backwards in time - Id([0; 32]), - ); - let end_prefix = Self::key_atc_index(author, tagbyte, tagvalue, since, Id([255; 32])); - let range = ( - Bound::Included(&*start_prefix), - Bound::Excluded(&*end_prefix), - ); - Ok(self.atc_index.range(txn, &range)?) - } - - pub fn ktc_iter<'a>( - &'a self, - kind: Kind, - tagbyte: u8, - tagvalue: &[u8], - since: Time, - until: Time, - txn: &'a RoTxn, - ) -> Result, OwnedType>, Error> { - let start_prefix = Self::key_ktc_index( - kind, - tagbyte, - tagvalue, - until, // scan goes backwards in time - Id([0; 32]), - ); - let end_prefix = Self::key_ktc_index(kind, tagbyte, tagvalue, since, Id([255; 32])); - let range = ( - Bound::Included(&*start_prefix), - Bound::Excluded(&*end_prefix), - ); - Ok(self.ktc_index.range(txn, &range)?) - } - - fn key_ci_index(created_at: Time, id: Id) -> Vec { - let mut key: Vec = - Vec::with_capacity(std::mem::size_of::