From eb28549a0f70dc4ae372bfdb15dda61b17153d31 Mon Sep 17 00:00:00 2001 From: Julia Lange Date: Thu, 22 May 2025 15:22:43 -0700 Subject: [PATCH] Global, mono-binary to libraries and binaries This separates the previous mono-binary setup into separate libraries and binaries. Specifically it split the old since api/ingestor binary into an Atproto, and DB library, as well as an api, and ingestor binary. Atproto Lib Was mostly untouched. The original URI implementation was changed to use FromStr, otherwise only imports were changed. DB Lib Is mostly unused, so there wasn't much that needed to be changed. Some new files were added so that future work on it can hit the ground running. Api Binary Is almost entirely the same. Imports were changed and the ingestor code of main was removed. Ingestor Binary Was almost entirely refactored. An interface to made injestors was added, and it was modularized. The only shared code is in Ingestor.start(), and collections.rs's macros, but that is mostly boilerplate. --- Cargo.lock | 729 ++++++------------ Cargo.toml | 27 +- api/Cargo.toml | 14 + {src => api/src}/main.rs | 28 +- {src => api/src}/router.rs | 14 +- {src => api/src}/router/xrpc.rs | 2 +- atproto/Cargo.toml | 12 + {src => atproto/src}/lexicons/mod.rs | 0 {src => atproto/src}/lexicons/my.rs | 0 {src => atproto/src}/lexicons/my/spoor.rs | 0 .../src}/lexicons/my/spoor/content.rs | 0 .../lexicons/my/spoor/content/external.rs | 0 .../src}/lexicons/my/spoor/content/media.rs | 0 .../src}/lexicons/my/spoor/content/title.rs | 0 {src => atproto/src}/lexicons/my/spoor/log.rs | 0 .../src}/lexicons/my/spoor/log/activity.rs | 0 .../src}/lexicons/my/spoor/log/session.rs | 0 {src => atproto/src}/lexicons/record.rs | 0 src/atproto.rs => atproto/src/lib.rs | 19 +- db/Cargo.toml | 8 + src/db.rs => db/src/connection.rs | 14 - db/src/interfaces.rs | 15 + db/src/lib.rs | 1 + ingestor/Cargo.toml | 15 + ingestor/src/collections.rs | 85 ++ .../src/collections/app_bsky_feed_post.rs | 26 + .../src/collections/my_spoor_log_activity.rs | 30 + .../src/collections/my_spoor_log_session.rs | 30 + ingestor/src/ingestor.rs | 53 ++ ingestor/src/main.rs | 21 + src/ingestor.rs | 75 -- 31 files changed, 582 insertions(+), 636 deletions(-) create mode 100644 api/Cargo.toml rename {src => api/src}/main.rs (73%) rename {src => api/src}/router.rs (91%) rename {src => api/src}/router/xrpc.rs (99%) create mode 100644 atproto/Cargo.toml rename {src => atproto/src}/lexicons/mod.rs (100%) rename {src => atproto/src}/lexicons/my.rs (100%) rename {src => atproto/src}/lexicons/my/spoor.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/content.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/content/external.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/content/media.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/content/title.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/log.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/log/activity.rs (100%) rename {src => atproto/src}/lexicons/my/spoor/log/session.rs (100%) rename {src => atproto/src}/lexicons/record.rs (100%) rename src/atproto.rs => atproto/src/lib.rs (90%) create mode 100644 db/Cargo.toml rename src/db.rs => db/src/connection.rs (93%) create mode 100644 db/src/interfaces.rs create mode 100644 db/src/lib.rs create mode 100644 ingestor/Cargo.toml create mode 100644 ingestor/src/collections.rs create mode 100644 ingestor/src/collections/app_bsky_feed_post.rs create mode 100644 ingestor/src/collections/my_spoor_log_activity.rs create mode 100644 ingestor/src/collections/my_spoor_log_session.rs create mode 100644 ingestor/src/ingestor.rs create mode 100644 ingestor/src/main.rs delete mode 100644 src/ingestor.rs diff --git a/Cargo.lock b/Cargo.lock index 796c756..dbe12ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,14 +19,14 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -65,6 +65,20 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "api" +version = "0.1.0" +dependencies = [ + "atproto", + "axum", + "http 1.3.1", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "async-lock" version = "3.4.0" @@ -96,11 +110,23 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atproto" +version = "0.1.0" +dependencies = [ + "atrium-api", + "lazy-regex", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + [[package]] name = "atrium-api" -version = "0.25.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4eb9b4787aba546015c8ccda1d3924c157cee13d67848997fba74ac8144a07" +checksum = "7225f0ca3c78564b784828e3db3e92619cf6e786530c3468df73f49deebc0bd4" dependencies = [ "atrium-common", "atrium-xrpc", @@ -118,9 +144,9 @@ dependencies = [ [[package]] name = "atrium-common" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba30d2f9e1a8b3db8fc97d0a5f91ee5a28f8acdddb771ad74c1b08eda357ca3d" +checksum = "9ed5610654043faa396a5a15afac0ac646d76aebe45aebd7cef4f8b96b0ab7f4" dependencies = [ "dashmap", "lru", @@ -131,21 +157,11 @@ dependencies = [ "web-time", ] -[[package]] -name = "atrium-lex" -version = "0.1.0" -source = "git+https://github.com/sugyan/atrium.git?rev=f162f815a04b5ecb0421b390d521c883c41d5f75#f162f815a04b5ecb0421b390d521c883c41d5f75" -dependencies = [ - "serde", - "serde_repr", - "serde_with", -] - [[package]] name = "atrium-xrpc" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a9e526cb2ed3e0a2ca78c3ce2a943d9041a68e067dadf42923b523771e07df" +checksum = "0216ad50ce34e9ff982e171c3659e65dedaa2ed5ac2994524debdc9a9647ffa8" dependencies = [ "http 1.3.1", "serde", @@ -163,9 +179,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ "axum-core", "bytes", @@ -215,22 +231,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "axum-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -247,12 +252,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -273,9 +272,9 @@ checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" dependencies = [ "serde", ] @@ -334,9 +333,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.2.20" +version = "1.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" dependencies = [ "jobserver", "libc", @@ -351,9 +350,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -429,9 +428,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -560,6 +559,14 @@ dependencies = [ "syn", ] +[[package]] +name = "db" +version = "0.1.0" +dependencies = [ + "sqlx", + "tokio", +] + [[package]] name = "der" version = "0.7.10" @@ -571,16 +578,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" -dependencies = [ - "powerfmt", - "serde", -] - [[package]] name = "derive_builder" version = "0.20.2" @@ -656,32 +653,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "errno" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "esquema-codegen" -version = "0.1.0" -source = "git+https://github.com/fatfingers23/esquema.git?branch=main#9ef00b9d631b746bd6396fb46ba255eb9360e43f" -dependencies = [ - "atrium-lex", - "heck 0.4.1", - "itertools", - "prettyplease", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn", -] - [[package]] name = "etcetera" version = "0.8.0" @@ -714,12 +685,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "flume" version = "0.11.1" @@ -839,10 +804,11 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" dependencies = [ + "cc", "cfg-if", "libc", "log", @@ -862,9 +828,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", @@ -875,9 +841,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", @@ -891,12 +857,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -905,9 +865,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -920,15 +880,9 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -1046,9 +1000,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "cf9f1e950e0d9d1d3c47184416723cf29c0d1f93bd8cccf37e4beb6b44f31710" dependencies = [ "bytes", "futures-util", @@ -1072,7 +1026,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.0", + "windows-core", ] [[package]] @@ -1086,21 +1040,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -1109,31 +1064,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -1141,67 +1076,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1221,25 +1143,14 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", ] -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - [[package]] name = "indexmap" version = "2.9.0" @@ -1247,7 +1158,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", +] + +[[package]] +name = "ingestor" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "atproto", + "rocketman", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", ] [[package]] @@ -1261,15 +1187,6 @@ dependencies = [ "serde_bytes", ] -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.15" @@ -1282,7 +1199,7 @@ version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "libc", ] @@ -1339,15 +1256,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libsqlite3-sys" @@ -1359,17 +1276,11 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -1406,7 +1317,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -1526,7 +1437,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -1556,12 +1467,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-integer" version = "0.1.46" @@ -1709,10 +1614,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] -name = "powerfmt" -version = "0.2.0" +name = "potential_utf" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] [[package]] name = "ppv-lite86" @@ -1720,7 +1628,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy", ] [[package]] @@ -1735,9 +1643,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1784,14 +1692,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ "bitflags", ] @@ -1828,15 +1736,6 @@ dependencies = [ "regex-syntax 0.8.5", ] -[[package]] -name = "regex-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d306632607af6ec61c0b117971d57a96381b6317cf18ae419b5558048fe016e" -dependencies = [ - "regex", -] - [[package]] name = "regex-syntax" version = "0.6.29" @@ -1857,7 +1756,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -1907,28 +1806,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rust" -version = "0.1.0" -dependencies = [ - "anyhow", - "async-trait", - "atrium-api", - "axum", - "axum-macros", - "esquema-codegen", - "http 1.3.1", - "lazy-regex", - "regex-macro", - "rocketman", - "serde", - "serde_json", - "sqlx", - "tokio", - "tracing", - "tracing-subscriber", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -1944,19 +1821,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.59.0", -] - [[package]] name = "rustls" version = "0.21.12" @@ -2002,9 +1866,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -2108,7 +1972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" dependencies = [ "form_urlencoded", - "indexmap 2.9.0", + "indexmap", "itoa", "ryu", "serde", @@ -2136,17 +2000,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2159,34 +2012,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sha1" version = "0.10.6" @@ -2200,9 +2025,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2283,9 +2108,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" +checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2296,9 +2121,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" +checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" dependencies = [ "base64 0.22.1", "bytes", @@ -2310,9 +2135,9 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "hashlink", - "indexmap 2.9.0", + "indexmap", "log", "memchr", "once_cell", @@ -2330,9 +2155,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" +checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" dependencies = [ "proc-macro2", "quote", @@ -2343,13 +2168,13 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" +checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" dependencies = [ "dotenvy", "either", - "heck 0.5.0", + "heck", "hex", "once_cell", "proc-macro2", @@ -2362,16 +2187,15 @@ dependencies = [ "sqlx-postgres", "sqlx-sqlite", "syn", - "tempfile", "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" +checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64 0.22.1", @@ -2411,9 +2235,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" +checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64 0.22.1", @@ -2448,9 +2272,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" +checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" dependencies = [ "atoi", "flume", @@ -2501,9 +2325,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -2518,9 +2342,9 @@ checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -2533,19 +2357,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" -[[package]] -name = "tempfile" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" -dependencies = [ - "fastrand", - "getrandom 0.3.2", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -2596,42 +2407,11 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.3.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -2654,9 +2434,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.2" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -2899,12 +2679,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -2917,7 +2691,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -3067,49 +2841,48 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.58.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" dependencies = [ - "windows-core 0.58.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" -dependencies = [ - "windows-implement 0.58.0", - "windows-interface 0.58.0", - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" -dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-collections", + "windows-core", + "windows-future", "windows-link", - "windows-result 0.3.2", - "windows-strings 0.4.0", + "windows-numerics", ] [[package]] -name = "windows-implement" -version = "0.58.0" +name = "windows-collections" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "proc-macro2", - "quote", - "syn", + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", ] [[package]] @@ -3123,17 +2896,6 @@ dependencies = [ "syn", ] -[[package]] -name = "windows-interface" -version = "0.58.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "windows-interface" version = "0.59.1" @@ -3152,38 +2914,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] -name = "windows-result" +name = "windows-numerics" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-targets 0.52.6", + "windows-core", + "windows-link", ] [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -3246,6 +2999,15 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3345,23 +3107,17 @@ dependencies = [ "bitflags", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -3371,9 +3127,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -3383,38 +3139,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive 0.8.24", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", @@ -3449,10 +3185,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] -name = "zerovec" -version = "0.10.4" +name = "zerotrie" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -3461,9 +3208,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 0dfa374..908c860 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,26 +1,11 @@ -[package] -name = "rust" -version = "0.1.0" -edition = "2021" +[workspace] +resolver = "3" +members = [ "api", "atproto","db", "ingestor"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -anyhow = "1.0.98" -async-trait = "0.1.88" -atrium-api = { version = "0.25.2", default-features = false } -axum = { version = "0.8.3", features = ["json"] } -axum-macros = "0.5.0" -http = "1.3.1" -lazy-regex = "3.4.1" -regex-macro = "0.3.0" -rocketman = "0.2.0" +[workspace.dependencies] +atproto = { path = "./atproto" } serde = "1.0.219" serde_json = "1.0.140" -sqlx = { version = "0.8.5", features = ["postgres", "runtime-tokio"] } -tokio = { version = "1.44.2", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.45.0", features = ["macros", "rt-multi-thread"] } tracing = "0.1.41" tracing-subscriber = "0.3.19" - -[build-dependencies] -esquema-codegen = { git = "https://github.com/fatfingers23/esquema.git", branch = "main" } diff --git a/api/Cargo.toml b/api/Cargo.toml new file mode 100644 index 0000000..1fc049c --- /dev/null +++ b/api/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "api" +version = "0.1.0" +edition = "2024" + +[dependencies] +atproto.workspace = true +axum = { version = "0.8.3", features = ["json"] } +http = "1.3.1" +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +tracing-subscriber.workspace = true +tracing.workspace = true diff --git a/src/main.rs b/api/src/main.rs similarity index 73% rename from src/main.rs rename to api/src/main.rs index 399d3be..46e17ae 100644 --- a/src/main.rs +++ b/api/src/main.rs @@ -1,24 +1,17 @@ -use crate::{ - atproto::Nsid, - ingestor::start_ingestor, - router::{ - Router, - Endpoint, - xrpc::{ - QueryInput, - ProcedureInput, - Response, - error, - }, +use crate::router::{ + Router, + Endpoint, + xrpc::{ + QueryInput, + ProcedureInput, + Response, + error, }, }; +use atproto::Nsid; use http::status::StatusCode; -mod atproto; -mod ingestor; -mod lexicons; mod router; -// mod db; #[tokio::main] async fn main() { @@ -30,9 +23,6 @@ async fn main() { let post_nsid = Nsid::new(String::from("me.woach.post")).expect("me.woach.post is a valid nsid"); router = router.add_endpoint(Endpoint::new_xrpc_query(get_nsid, test)); router = router.add_endpoint(Endpoint::new_xrpc_procedure(post_nsid, test2)); - tokio::spawn(async move { - start_ingestor().await; - }); router.serve().await; } diff --git a/src/router.rs b/api/src/router.rs similarity index 91% rename from src/router.rs rename to api/src/router.rs index f6c1b1b..bfa3b17 100644 --- a/src/router.rs +++ b/api/src/router.rs @@ -1,12 +1,10 @@ -use crate::{ - atproto::Nsid, - router::xrpc::{ - XrpcEndpoint, - XrpcHandler, - QueryInput, - ProcedureInput, - } +use crate::router::xrpc::{ + XrpcEndpoint, + XrpcHandler, + QueryInput, + ProcedureInput, }; +use atproto::Nsid; use axum::Router as AxumRouter; use core::net::SocketAddr; use std::net::{IpAddr, Ipv4Addr}; diff --git a/src/router/xrpc.rs b/api/src/router/xrpc.rs similarity index 99% rename from src/router/xrpc.rs rename to api/src/router/xrpc.rs index 3f4c74d..500f331 100644 --- a/src/router/xrpc.rs +++ b/api/src/router/xrpc.rs @@ -1,9 +1,9 @@ -use crate::atproto::Nsid; use std::{ collections::HashMap, pin::Pin, future::Future, }; +use atproto::Nsid; use axum::{ extract::{ Json, diff --git a/atproto/Cargo.toml b/atproto/Cargo.toml new file mode 100644 index 0000000..7d56725 --- /dev/null +++ b/atproto/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "atproto" +version = "0.1.0" +edition = "2024" + +[dependencies] +atrium-api = { version = "0.25.3", default-features = false } +lazy-regex = "3.4.1" +serde.workspace = true +serde_json.workspace = true +tracing-subscriber.workspace = true +tracing.workspace = true diff --git a/src/lexicons/mod.rs b/atproto/src/lexicons/mod.rs similarity index 100% rename from src/lexicons/mod.rs rename to atproto/src/lexicons/mod.rs diff --git a/src/lexicons/my.rs b/atproto/src/lexicons/my.rs similarity index 100% rename from src/lexicons/my.rs rename to atproto/src/lexicons/my.rs diff --git a/src/lexicons/my/spoor.rs b/atproto/src/lexicons/my/spoor.rs similarity index 100% rename from src/lexicons/my/spoor.rs rename to atproto/src/lexicons/my/spoor.rs diff --git a/src/lexicons/my/spoor/content.rs b/atproto/src/lexicons/my/spoor/content.rs similarity index 100% rename from src/lexicons/my/spoor/content.rs rename to atproto/src/lexicons/my/spoor/content.rs diff --git a/src/lexicons/my/spoor/content/external.rs b/atproto/src/lexicons/my/spoor/content/external.rs similarity index 100% rename from src/lexicons/my/spoor/content/external.rs rename to atproto/src/lexicons/my/spoor/content/external.rs diff --git a/src/lexicons/my/spoor/content/media.rs b/atproto/src/lexicons/my/spoor/content/media.rs similarity index 100% rename from src/lexicons/my/spoor/content/media.rs rename to atproto/src/lexicons/my/spoor/content/media.rs diff --git a/src/lexicons/my/spoor/content/title.rs b/atproto/src/lexicons/my/spoor/content/title.rs similarity index 100% rename from src/lexicons/my/spoor/content/title.rs rename to atproto/src/lexicons/my/spoor/content/title.rs diff --git a/src/lexicons/my/spoor/log.rs b/atproto/src/lexicons/my/spoor/log.rs similarity index 100% rename from src/lexicons/my/spoor/log.rs rename to atproto/src/lexicons/my/spoor/log.rs diff --git a/src/lexicons/my/spoor/log/activity.rs b/atproto/src/lexicons/my/spoor/log/activity.rs similarity index 100% rename from src/lexicons/my/spoor/log/activity.rs rename to atproto/src/lexicons/my/spoor/log/activity.rs diff --git a/src/lexicons/my/spoor/log/session.rs b/atproto/src/lexicons/my/spoor/log/session.rs similarity index 100% rename from src/lexicons/my/spoor/log/session.rs rename to atproto/src/lexicons/my/spoor/log/session.rs diff --git a/src/lexicons/record.rs b/atproto/src/lexicons/record.rs similarity index 100% rename from src/lexicons/record.rs rename to atproto/src/lexicons/record.rs diff --git a/src/atproto.rs b/atproto/src/lib.rs similarity index 90% rename from src/atproto.rs rename to atproto/src/lib.rs index a58f8b6..21f8919 100644 --- a/src/atproto.rs +++ b/atproto/src/lib.rs @@ -10,6 +10,8 @@ pub use atrium_api::types::{ } }; +pub mod lexicons; + pub struct Uri { whole: String, // These fields could be useful in the future, @@ -19,12 +21,9 @@ pub struct Uri { // rkey: Option, } -impl Uri { - pub fn as_str(&self) -> &str { - self.whole.as_str() - } - - pub fn from_str(uri: String) -> Result { +impl FromStr for Uri { + type Err = &'static str; + fn from_str(uri: &str) -> Result { if uri.len() > 8000 { return Err("Uri too long") } @@ -33,7 +32,7 @@ impl Uri { whole, unchecked_authority, unchecked_collection, unchecked_rkey )) = regex_captures!( r"/^at:\/\/([\w\.\-_~:]+)(?:\/([\w\.\-_~:]+)(?:)\/([\w\.\-_~:]+))?$/i", - &uri, + uri, ) else { return Err("Invalid Uri"); }; @@ -53,3 +52,9 @@ impl Uri { } } +impl Uri { + pub fn as_str(&self) -> &str { + self.whole.as_str() + } +} + diff --git a/db/Cargo.toml b/db/Cargo.toml new file mode 100644 index 0000000..ded38de --- /dev/null +++ b/db/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "db" +version = "0.1.0" +edition = "2024" + +[dependencies] +sqlx = { version = "0.8.6", features = ["postgres", "runtime-tokio"] } +tokio = "1.45.0" diff --git a/src/db.rs b/db/src/connection.rs similarity index 93% rename from src/db.rs rename to db/src/connection.rs index 78fb640..ba883cc 100644 --- a/src/db.rs +++ b/db/src/connection.rs @@ -1,7 +1,3 @@ -use crate::atproto::{ - Did, - Uri, -} use sqlx::{ query, Database, @@ -20,11 +16,6 @@ pub struct Db { pool: Pool } -pub struct User { - userdid: Did, - handle: Handle, -} - #[non_exhaustive] enum Role { Owner, @@ -40,11 +31,6 @@ impl ToString for Role { } } -struct Participant { - participantdid: Did, - role: Role, -} - pub struct Session { sessionuri: Uri, label: Option, diff --git a/db/src/interfaces.rs b/db/src/interfaces.rs new file mode 100644 index 0000000..d3629e1 --- /dev/null +++ b/db/src/interfaces.rs @@ -0,0 +1,15 @@ +use atproto::{ + Did, + Uri, +}; + +pub struct User { + userdid: Did, + handle: Handle, +} + +struct Participant { + participantdid: Did, + role: Role, +} + diff --git a/db/src/lib.rs b/db/src/lib.rs new file mode 100644 index 0000000..82e9c13 --- /dev/null +++ b/db/src/lib.rs @@ -0,0 +1 @@ +pub struct db; diff --git a/ingestor/Cargo.toml b/ingestor/Cargo.toml new file mode 100644 index 0000000..a177581 --- /dev/null +++ b/ingestor/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "ingestor" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = "1.0.98" +async-trait = "0.1.88" +atproto.workspace = true +rocketman = "0.2.0" +serde.workspace = true +serde_json.workspace = true +tokio.workspace = true +tracing-subscriber.workspace = true +tracing.workspace = true diff --git a/ingestor/src/collections.rs b/ingestor/src/collections.rs new file mode 100644 index 0000000..3b9cd5d --- /dev/null +++ b/ingestor/src/collections.rs @@ -0,0 +1,85 @@ +use rocketman::ingestion::LexiconIngestor; + +macro_rules! create_commit_collection { + ($collection:ident, $nsid:expr, + change => $change_fn:expr, + delete => $delete_fn:expr $(,)? + ) => ( + create_commit_collection!( + $collection, $nsid, + create => $change_fn, + update => $change_fn, + delete => $delete_fn, + ); + ); + ($collection:ident, $nsid:expr, + create => $create_fn:expr, + update => $update_fn:expr, + delete => $delete_fn:expr $(,)? + ) => ( + pub struct $collection; + struct Ingestor; + + impl $crate::collections::Collection for $collection { + fn new() -> Self { Self } + + fn get_nsid(&self) -> String { + $nsid + } + + fn get_ingestor( + &self + ) -> Box { + Box::new(Ingestor::new()) + } + } + + impl Ingestor { + pub fn new() -> Self { Self } + + pub async fn handle_commit( + &self, + message: rocketman::types::event::Event + ) -> anyhow::Result<()> { + use rocketman::types::event::Operation; + + let state = $crate::collections::CommitIngestorState { }; + + if let Some(commit) = &message.commit { + match commit.operation { + Operation::Create => ($create_fn)(state, message).await?, + Operation::Update => ($update_fn)(state, message).await?, + Operation::Delete => ($delete_fn)(state, message).await?, + } + } else { + return Err(anyhow::anyhow!("Message has no commit")); + } + Ok(()) + } + } + + #[async_trait::async_trait] + impl rocketman::ingestion::LexiconIngestor for Ingestor { + async fn ingest( + &self, + message: rocketman::types::event::Event + ) -> anyhow::Result<()> { + self.handle_commit(message).await + } + } + ); +} + +pub mod my_spoor_log_session; +pub use my_spoor_log_session::MySpoorLogSession; +pub mod my_spoor_log_activity; +pub use my_spoor_log_activity::MySpoorLogActivity; + +struct CommitIngestorState; + +pub trait Collection { + fn new() -> Self; + fn get_nsid(&self) -> String; + fn get_ingestor(&self) -> Box; +} + diff --git a/ingestor/src/collections/app_bsky_feed_post.rs b/ingestor/src/collections/app_bsky_feed_post.rs new file mode 100644 index 0000000..d57bb1d --- /dev/null +++ b/ingestor/src/collections/app_bsky_feed_post.rs @@ -0,0 +1,26 @@ +use crate::collections::CommitIngestorState; +use rocketman::types::event::Event; +use serde_json::Value; +use anyhow::Result; +use tracing::info; + +async fn handle_change( + _state: CommitIngestorState, + message: Event +) -> Result<()> { + info!("{:?}", message); + Ok(()) +} + +async fn handle_delete( + _state: CommitIngestorState, + message: Event +) -> Result<()> { + info!("{:?}", message); + Ok(()) +} + +create_commit_collection!(AppBskyFeedPost, "app.bsky.feed.post".to_string(), + change => handle_change, + delete => handle_delete, +); diff --git a/ingestor/src/collections/my_spoor_log_activity.rs b/ingestor/src/collections/my_spoor_log_activity.rs new file mode 100644 index 0000000..b664220 --- /dev/null +++ b/ingestor/src/collections/my_spoor_log_activity.rs @@ -0,0 +1,30 @@ +use crate::collections::CommitIngestorState; +use atproto::{ + Collection as AtprotoCollection, + lexicons::my::spoor::log::Activity, +}; +use rocketman::types::event::Event; +use serde_json::Value; +use anyhow::Result; +use tracing::info; + +async fn handle_change( + _state: CommitIngestorState, + message: Event +) -> Result<()> { + info!("{:?}", message); + Ok(()) +} + +async fn handle_delete( + _state: CommitIngestorState, + message: Event +) -> Result<()> { + info!("{:?}", message); + Ok(()) +} + +create_commit_collection!(MySpoorLogActivity, Activity::NSID.to_string(), + change => handle_change, + delete => handle_delete, +); diff --git a/ingestor/src/collections/my_spoor_log_session.rs b/ingestor/src/collections/my_spoor_log_session.rs new file mode 100644 index 0000000..c90e7de --- /dev/null +++ b/ingestor/src/collections/my_spoor_log_session.rs @@ -0,0 +1,30 @@ +use crate::collections::CommitIngestorState; +use atproto::{ + Collection as AtprotoCollection, + lexicons::my::spoor::log::Session, +}; +use rocketman::types::event::Event; +use serde_json::Value; +use anyhow::Result; +use tracing::info; + +async fn handle_change( + _state: CommitIngestorState, + message: Event +) -> Result<()> { + info!("{:?}", message); + Ok(()) +} + +async fn handle_delete( + _state: CommitIngestorState, + message: Event +) -> Result<()> { + info!("{:?}", message); + Ok(()) +} + +create_commit_collection!(MySpoorLogSession, Session::NSID.to_string(), + change => handle_change, + delete => handle_delete, +); diff --git a/ingestor/src/ingestor.rs b/ingestor/src/ingestor.rs new file mode 100644 index 0000000..76ef76b --- /dev/null +++ b/ingestor/src/ingestor.rs @@ -0,0 +1,53 @@ +use crate::collections::Collection; +use rocketman::{ + options::JetstreamOptions, + ingestion::LexiconIngestor, + connection::JetstreamConnection, + handler, +}; +use std::{ + collections::HashMap, + sync::{Arc, Mutex}, +}; +use tracing::{info, error}; + +pub struct Ingestor { + ingestors: HashMap>, +} + +impl Ingestor { + pub fn new() -> Self { + Self { ingestors: HashMap::new() } + } + + pub fn add_collection(&mut self, collection: C) { + self.ingestors.insert(collection.get_nsid(), collection.get_ingestor()); + } + + pub async fn start(self) { + info!("Starting ingestor with the following collections: {:?}", + self.ingestors.keys()); + let opts = JetstreamOptions::builder() + .wanted_collections(self.ingestors.keys().cloned().collect()) + .build(); + let jetstream = JetstreamConnection::new(opts); + let cursor: Arc>> = Arc::new(Mutex::new(None)); + let msg_rx = jetstream.get_msg_rx(); + let reconnect_tx = jetstream.get_reconnect_tx(); + + let cursor_clone = cursor.clone(); + tokio::spawn(async move { + while let Ok(message) = msg_rx.recv_async().await { + if let Err(e) = handler::handle_message(message, &self.ingestors, + reconnect_tx.clone(), cursor_clone.clone()).await { + error!("Error processing message: {}", e); + } + } + }); + + if let Err(e) = jetstream.connect(cursor.clone()).await { + error!("Failed to connect to Jetstream: {}", e); + std::process::exit(1); + } + } +} diff --git a/ingestor/src/main.rs b/ingestor/src/main.rs new file mode 100644 index 0000000..08af557 --- /dev/null +++ b/ingestor/src/main.rs @@ -0,0 +1,21 @@ +use crate::{ + collections::{ + Collection, + MySpoorLogActivity, MySpoorLogSession, + }, + ingestor::Ingestor, +}; + +mod ingestor; +mod collections; + +#[tokio::main] +async fn main() { + let subscriber = tracing_subscriber::FmtSubscriber::new(); + let _ = tracing::subscriber::set_global_default(subscriber); + + let mut ingestor = Ingestor::new(); + ingestor.add_collection(MySpoorLogActivity::new()); + ingestor.add_collection(MySpoorLogSession::new()); + ingestor.start().await; +} diff --git a/src/ingestor.rs b/src/ingestor.rs deleted file mode 100644 index 1dc31cc..0000000 --- a/src/ingestor.rs +++ /dev/null @@ -1,75 +0,0 @@ -use crate::lexicons::my::spoor::log::{Activity, Session}; -use async_trait::async_trait; -use atrium_api::types::Collection; -use rocketman::{ - options::JetstreamOptions, - ingestion::LexiconIngestor, - // types::event::{Event, Operation}, - types::event::Event, - connection::JetstreamConnection, - handler, -}; -use serde_json::value::Value; -use std::{ - collections::HashMap, - sync::{Arc, Mutex}, -}; -use tracing::{error, info}; -use anyhow::Result; - -enum Ingestor { - Jetstream(SpoorJetstream) -} - -struct SpoorJetstream; - -#[async_trait] -impl LexiconIngestor for SpoorJetstream { - async fn ingest(&self, message: Event) -> Result<()> { - info!("{:?}", message); - // if let Some(commit) = &message.commit { - // match commit.operation { - // Operation::Create | Operation::Update => {} - // Operation::Delete => {} - // } - // } else { - // return Err("Message has no commit"); - // } - Ok(()) - } -} - -pub async fn start_ingestor() { - info!("Starting ingestor"); - let nsids = vec![ - Activity::NSID.to_string(), - Session::NSID.to_string(), - ]; - let opts = JetstreamOptions::builder().wanted_collections(nsids.clone()).build(); - let jetstream = JetstreamConnection::new(opts); - - let mut ingesters: HashMap> = HashMap::new(); - for nsid in nsids { - ingesters.insert(nsid, Box::new(SpoorJetstream)); - } - - let cursor: Arc>> = Arc::new(Mutex::new(None)); - - let msg_rx = jetstream.get_msg_rx(); - let reconnect_tx = jetstream.get_reconnect_tx(); - - let cursor_clone = cursor.clone(); - tokio::spawn(async move { - while let Ok(message) = msg_rx.recv_async().await { - if let Err(e) = handler::handle_message(message, &ingesters, - reconnect_tx.clone(), cursor_clone.clone()).await { - error!("Error processing message: {}", e); - } - } - }); - - if let Err(e) = jetstream.connect(cursor.clone()).await { - error!("Failed to connect to Jetstream: {}", e); - std::process::exit(1); - } -}