diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1242de749..4f67d2350 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,12 +41,9 @@ jobs: export PATH="$PWD/target/debug:$PATH" make -C apps/freenet-ping -f run-ping.mk build - - name: Test - legacy mode + - name: Test run: cargo test --workspace --no-default-features --features trace,websocket,redb - - name: Test - actor mode - run: FREENET_ACTOR_CLIENTS=true cargo test --workspace --no-default-features --features trace,websocket,redb - clippy_check: name: Clippy diff --git a/Cargo.lock b/Cargo.lock index b4aef8476..9e17518cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,11 +4,11 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ - "gimli 0.31.1", + "gimli 0.32.3", ] [[package]] @@ -106,9 +106,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -213,7 +213,7 @@ dependencies = [ "polling 3.11.0", "rustix", "slab", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -315,17 +315,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", "libc", "miniz_oxide", - "object 0.36.7", + "object 0.37.3", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.0", ] [[package]] @@ -452,12 +452,12 @@ dependencies = [ [[package]] name = "bytecheck" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50690fb3370fb9fe3550372746084c46f2ac8c9685c583d2be10eefd89d3d1a3" +checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" dependencies = [ - "bytecheck_derive 0.8.1", - "ptr_meta 0.3.0", + "bytecheck_derive 0.8.2", + "ptr_meta 0.3.1", "rancor", "simdutf8", ] @@ -475,9 +475,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb7846e0cb180355c2dec69e721edafa36919850f1a9f52ffba4ebc0393cb71" +checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" dependencies = [ "proc-macro2", "quote", @@ -526,9 +526,9 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.2.38" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ "find-msvc-tools", "shlex", @@ -959,7 +959,7 @@ checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" dependencies = [ "dispatch", "nix", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -1071,12 +1071,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -1141,7 +1141,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -1321,7 +1321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -1871,9 +1871,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" @@ -1935,6 +1935,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "hashlink" version = "0.10.0" @@ -2201,7 +2207,7 @@ dependencies = [ "rustls 0.23.32", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.3", + "tokio-rustls 0.26.4", "tower-service", ] @@ -2259,7 +2265,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.1", ] [[package]] @@ -2402,7 +2408,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.16.0", "serde", "serde_core", ] @@ -2576,9 +2582,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -2781,9 +2787,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" @@ -2863,18 +2869,18 @@ checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" [[package]] name = "munge" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7feb0b48aa0a25f9fe0899482c6e1379ee7a11b24a53073eacdecb9adb6dc60" +checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" dependencies = [ "munge_macro", ] [[package]] name = "munge_macro" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2e3795a5d2da581a8b252fec6022eee01aea10161a4d1bf237d4cbe47f7e988" +checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" dependencies = [ "proc-macro2", "quote", @@ -3080,9 +3086,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -3505,7 +3511,7 @@ dependencies = [ "hermit-abi", "pin-project-lite", "rustix", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -3683,11 +3689,11 @@ dependencies = [ [[package]] name = "ptr_meta" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" +checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" dependencies = [ - "ptr_meta_derive 0.3.0", + "ptr_meta_derive 0.3.1", ] [[package]] @@ -3703,9 +3709,9 @@ dependencies = [ [[package]] name = "ptr_meta_derive" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1" +checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" dependencies = [ "proc-macro2", "quote", @@ -3714,9 +3720,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -3729,11 +3735,11 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rancor" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" +checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" dependencies = [ - "ptr_meta 0.3.0", + "ptr_meta 0.3.1", ] [[package]] @@ -3873,18 +3879,18 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", @@ -3906,9 +3912,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.2" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -3918,9 +3924,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -3947,11 +3953,11 @@ dependencies = [ [[package]] name = "rend" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35e8a6bf28cd121053a66aa2e6a2e3eaffad4a60012179f0e864aa5ffeff215" +checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" dependencies = [ - "bytecheck 0.8.1", + "bytecheck 0.8.2", ] [[package]] @@ -4018,16 +4024,16 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f5c3e5da784cd8c69d32cdc84673f3204536ca56e1fa01be31a74b92c932ac" +checksum = "35a640b26f007713818e9a9b65d34da1cf58538207b052916a83d80e43f3ffa4" dependencies = [ - "bytecheck 0.8.1", + "bytecheck 0.8.2", "bytes 1.10.1", "hashbrown 0.15.5", "indexmap 2.11.4", "munge", - "ptr_meta 0.3.0", + "ptr_meta 0.3.1", "rancor", "rend", "rkyv_derive", @@ -4037,9 +4043,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4270433626cffc9c4c1d3707dd681f2a2718d3d7b09ad754bec137acecda8d22" +checksum = "bd83f5f173ff41e00337d97f6572e416d022ef8a19f371817259ae960324c482" dependencies = [ "proc-macro2", "quote", @@ -4098,7 +4104,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -4123,7 +4129,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.6", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] @@ -4158,9 +4164,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -4214,7 +4220,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -4945,7 +4951,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -5196,9 +5202,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls 0.23.32", "tokio", @@ -5532,9 +5538,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ulid" @@ -5739,9 +5745,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", @@ -5754,9 +5760,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", @@ -5768,9 +5774,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -5781,9 +5787,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5791,9 +5797,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", @@ -5804,9 +5810,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -6038,9 +6044,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -6135,7 +6141,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.1", ] [[package]] @@ -6151,7 +6157,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", - "windows-core", + "windows-core 0.61.2", "windows-future", "windows-link 0.1.3", "windows-numerics", @@ -6163,7 +6169,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core", + "windows-core 0.61.2", ] [[package]] @@ -6175,8 +6181,21 @@ dependencies = [ "windows-implement", "windows-interface", "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", ] [[package]] @@ -6185,16 +6204,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link 0.1.3", "windows-threading", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", @@ -6203,9 +6222,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", @@ -6230,7 +6249,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core", + "windows-core 0.61.2", "windows-link 0.1.3", ] @@ -6241,8 +6260,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -6254,6 +6273,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -6263,6 +6291,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -6296,14 +6333,14 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.4", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ "windows-link 0.2.0", ] @@ -6341,11 +6378,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -6537,7 +6574,7 @@ dependencies = [ "serde", "thiserror 2.0.17", "windows", - "windows-core", + "windows-core 0.61.2", ] [[package]] @@ -6640,9 +6677,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" diff --git a/apps/freenet-ping/Cargo.lock b/apps/freenet-ping/Cargo.lock index cdfad83ed..d86c7ed63 100644 --- a/apps/freenet-ping/Cargo.lock +++ b/apps/freenet-ping/Cargo.lock @@ -1200,6 +1200,16 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "flatbuffers" +version = "25.9.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b6620799e7340ebd9968d2e0708eb82cf1971e9a16821e2091b6d6e475eed5" +dependencies = [ + "bitflags 2.9.1", + "rustc_version", +] + [[package]] name = "flate2" version = "1.1.2" @@ -1242,7 +1252,7 @@ dependencies = [ [[package]] name = "freenet" -version = "0.1.25" +version = "0.1.29" dependencies = [ "aes-gcm", "ahash", @@ -1263,7 +1273,7 @@ dependencies = [ "delegate", "directories", "either", - "flatbuffers", + "flatbuffers 25.9.23", "freenet-stdlib", "futures", "headers", @@ -1357,9 +1367,9 @@ dependencies = [ [[package]] name = "freenet-stdlib" -version = "0.1.15" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34eceef281df7747dc9f813a632d2d25eaa37a80732bbe2d729775ffe842dea8" +checksum = "6efc8b4956becbe20ee6a437202b0ae2ee1fc2a8a02f8dfb60a427fdf5dcc665" dependencies = [ "arbitrary", "bincode", @@ -1367,7 +1377,7 @@ dependencies = [ "bs58", "byteorder", "chrono", - "flatbuffers", + "flatbuffers 24.12.23", "freenet-macros", "futures", "js-sys", @@ -2596,9 +2606,9 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.29.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e87237e2775f74896f9ad219d26a2081751187eb7c9f5c58dde20a23b95d16c" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" dependencies = [ "futures-core", "futures-sink", diff --git a/crates/core/src/client_events/integration_verification.rs b/crates/core/src/client_events/integration_verification.rs index 06a634d50..bc4f55e47 100644 --- a/crates/core/src/client_events/integration_verification.rs +++ b/crates/core/src/client_events/integration_verification.rs @@ -117,34 +117,6 @@ async fn test_result_router_receives_host_responses() { router_handle.abort(); } -#[tokio::test] -async fn test_flag_disabled_no_router() { - // Test that router is not spawned when flag is false - - // Save original state - let original = std::env::var("FREENET_ACTOR_CLIENTS").ok(); - - // Disable flag - std::env::remove_var("FREENET_ACTOR_CLIENTS"); - - // Verify flag is disabled - let enabled = std::env::var("FREENET_ACTOR_CLIENTS").unwrap_or_default() == "true"; - assert!(!enabled, "Flag should be disabled"); - - // When flag is disabled, router should not be active - // This is tested by the NodeP2P::build() logic - when flag is false, - // result_router_tx is None, so no router is spawned - - // In a real scenario, we would test NodeP2P::build() directly, - // but for this unit test, we verify the flag behavior - - // Restore original state - match original { - Some(val) => std::env::set_var("FREENET_ACTOR_CLIENTS", val), - None => std::env::remove_var("FREENET_ACTOR_CLIENTS"), - } -} - #[tokio::test] async fn test_dual_path_identical_results() { // Test that dual-path delivery sends identical results to both legacy and router paths @@ -246,40 +218,6 @@ async fn test_router_receives_results_without_legacy_callback() { assert!(router_result.1.is_ok()); } -#[test] -fn test_actor_infrastructure_flag_behavior() { - // Test environment flag behavior in different scenarios - - // Save original state - let original = std::env::var("FREENET_ACTOR_CLIENTS").ok(); - - // Test default (disabled) behavior - std::env::remove_var("FREENET_ACTOR_CLIENTS"); - let disabled = std::env::var("FREENET_ACTOR_CLIENTS").unwrap_or_default() == "true"; - assert!(!disabled, "Should be disabled by default"); - - // Test enabled behavior - std::env::set_var("FREENET_ACTOR_CLIENTS", "true"); - let enabled = std::env::var("FREENET_ACTOR_CLIENTS").unwrap_or_default() == "true"; - assert!(enabled, "Should be enabled when set to 'true'"); - - // Test case sensitivity - std::env::set_var("FREENET_ACTOR_CLIENTS", "TRUE"); - let case_sensitive = std::env::var("FREENET_ACTOR_CLIENTS").unwrap_or_default() == "true"; - assert!(!case_sensitive, "Should be case-sensitive (TRUE != true)"); - - // Test other values - std::env::set_var("FREENET_ACTOR_CLIENTS", "1"); - let numeric = std::env::var("FREENET_ACTOR_CLIENTS").unwrap_or_default() == "true"; - assert!(!numeric, "Should only accept 'true', not '1'"); - - // Restore original state - match original { - Some(val) => std::env::set_var("FREENET_ACTOR_CLIENTS", val), - None => std::env::remove_var("FREENET_ACTOR_CLIENTS"), - } -} - #[tokio::test] async fn test_zero_performance_overhead_correlation() { // Test that correlation adds minimal overhead diff --git a/crates/core/src/client_events/mod.rs b/crates/core/src/client_events/mod.rs index 402a04e01..9470eaf98 100644 --- a/crates/core/src/client_events/mod.rs +++ b/crates/core/src/client_events/mod.rs @@ -232,12 +232,8 @@ pub async fn client_event_handling( where ClientEv: ClientEventsProxy + Send + 'static, { - // Create RequestRouter for centralized request deduplication (actor mode only) - let request_router = if op_manager.actor_clients { - Some(std::sync::Arc::new(crate::node::RequestRouter::new())) - } else { - None - }; + // Create RequestRouter for centralized request deduplication + let request_router = Some(std::sync::Arc::new(crate::node::RequestRouter::new())); let mut results = FuturesUnordered::new(); loop { tokio::select! { @@ -473,19 +469,21 @@ async fn process_open_request( if let Err(err) = put::request_put(&op_manager, op).await { tracing::error!("Local PUT request error: {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("PUT operation failed: {}", err).into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("PUT operation failed: {}", err).into(), + } + .into()); - if let Err(e) = router_tx.send((op_id, error_response)).await { - tracing::error!( - "Failed to send PUT error to result router: {}. Transaction: {}", - e, op_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((op_id, error_response)) + .await + { + tracing::error!( + "Failed to send PUT error to result router: {}. Transaction: {}", + e, op_id + ); } } @@ -553,23 +551,21 @@ async fn process_open_request( if let Err(err) = put::request_put(&op_manager, op).await { tracing::error!("Put request error: {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("PUT operation failed: {}", err) - .into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("PUT operation failed: {}", err).into(), + } + .into()); - if let Err(e) = router_tx - .send((transaction_id, error_response)) - .await - { - tracing::error!( - "Failed to send PUT error to result router: {}. Transaction: {}", - e, transaction_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((transaction_id, error_response)) + .await + { + tracing::error!( + "Failed to send PUT error to result router: {}. Transaction: {}", + e, transaction_id + ); } } } else { @@ -610,21 +606,21 @@ async fn process_open_request( if let Err(err) = put::request_put(&op_manager, op).await { tracing::error!("Put request error: {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("PUT operation failed: {}", err).into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("PUT operation failed: {}", err).into(), + } + .into()); - if let Err(e) = - router_tx.send((op_id, error_response)).await - { - tracing::error!( - "Failed to send PUT error to result router: {}. Transaction: {}", - e, op_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((op_id, error_response)) + .await + { + tracing::error!( + "Failed to send PUT error to result router: {}. Transaction: {}", + e, op_id + ); } } } @@ -783,22 +779,21 @@ async fn process_open_request( if let Err(err) = update::request_update(&op_manager, op).await { tracing::error!("request update error {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("UPDATE operation failed: {}", err) - .into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("UPDATE operation failed: {}", err).into(), + } + .into()); - if let Err(e) = - router_tx.send((transaction_id, error_response)).await - { - tracing::error!( - "Failed to send UPDATE error to result router: {}. Transaction: {}", - e, transaction_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((transaction_id, error_response)) + .await + { + tracing::error!( + "Failed to send UPDATE error to result router: {}. Transaction: {}", + e, transaction_id + ); } } } else { @@ -840,19 +835,21 @@ async fn process_open_request( if let Err(err) = update::request_update(&op_manager, op).await { tracing::error!("request update error {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("UPDATE operation failed: {}", err).into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("UPDATE operation failed: {}", err).into(), + } + .into()); - if let Err(e) = router_tx.send((op_id, error_response)).await { - tracing::error!( - "Failed to send UPDATE error to result router: {}. Transaction: {}", - e, op_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((op_id, error_response)) + .await + { + tracing::error!( + "Failed to send UPDATE error to result router: {}. Transaction: {}", + e, op_id + ); } } } @@ -1006,23 +1003,21 @@ async fn process_open_request( { tracing::error!("get::request_get error: {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("GET operation failed: {}", err) - .into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("GET operation failed: {}", err).into(), + } + .into()); - if let Err(e) = router_tx - .send((transaction_id, error_response)) - .await - { - tracing::error!( - "Failed to send GET error to result router: {}. Transaction: {}", - e, transaction_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((transaction_id, error_response)) + .await + { + tracing::error!( + "Failed to send GET error to result router: {}. Transaction: {}", + e, transaction_id + ); } } } else { @@ -1058,21 +1053,21 @@ async fn process_open_request( { tracing::error!("Get request error: {}", err); - // Notify client of error via result router (actor mode) - if let Some(router_tx) = &op_manager.result_router_tx { - let error_response = Err(ErrorKind::OperationError { - cause: format!("GET operation failed: {}", err).into(), - } - .into()); + // Notify client of error via result router + let error_response = Err(ErrorKind::OperationError { + cause: format!("GET operation failed: {}", err).into(), + } + .into()); - if let Err(e) = - router_tx.send((op_id, error_response)).await - { - tracing::error!( - "Failed to send GET error to result router: {}. Transaction: {}", - e, op_id - ); - } + if let Err(e) = op_manager + .result_router_tx + .send((op_id, error_response)) + .await + { + tracing::error!( + "Failed to send GET error to result router: {}. Transaction: {}", + e, op_id + ); } } } diff --git a/crates/core/src/config/mod.rs b/crates/core/src/config/mod.rs index 728812d4a..4f9d6c183 100644 --- a/crates/core/src/config/mod.rs +++ b/crates/core/src/config/mod.rs @@ -76,11 +76,6 @@ pub struct ConfigArgs { #[arg(long, hide = true)] pub id: Option, - /// Enable actor-based client management system for improved scalability and monitoring. - /// This is now enabled by default. Set to false to use legacy client management. - #[arg(long, env = "FREENET_ACTOR_CLIENTS", default_value = "true", action = clap::ArgAction::Set)] - pub actor_clients: bool, - /// Show the version of the application. #[arg(long, short)] pub version: bool, @@ -111,7 +106,6 @@ impl Default for ConfigArgs { log_level: Some(tracing::log::LevelFilter::Info), config_paths: Default::default(), id: None, - actor_clients: true, version: false, } } @@ -374,7 +368,6 @@ impl ConfigArgs { gateways: gateways.gateways.clone(), is_gateway: self.network_api.is_gateway, location: self.network_api.location, - actor_clients: self.actor_clients, }; fs::create_dir_all(this.config_dir())?; @@ -458,9 +451,6 @@ pub struct Config { pub(crate) gateways: Vec, pub(crate) is_gateway: bool, pub(crate) location: Option, - /// Enable actor-based client management system for improved scalability and monitoring - #[serde(default)] - pub actor_clients: bool, } impl Config { diff --git a/crates/core/src/message.rs b/crates/core/src/message.rs index 3e49151f3..792f8a6fc 100644 --- a/crates/core/src/message.rs +++ b/crates/core/src/message.rs @@ -326,6 +326,8 @@ pub(crate) enum NodeEvent { callback: tokio::sync::mpsc::Sender, }, TransactionTimedOut(Transaction), + /// Transaction completed successfully - cleanup client subscription + TransactionCompleted(Transaction), /// Local subscription completed - deliver SubscribeResponse to client via result router LocalSubscribeComplete { tx: Transaction, @@ -395,6 +397,9 @@ impl Display for NodeEvent { NodeEvent::TransactionTimedOut(transaction) => { write!(f, "Transaction timed out ({transaction})") } + NodeEvent::TransactionCompleted(transaction) => { + write!(f, "Transaction completed ({transaction})") + } NodeEvent::LocalSubscribeComplete { tx, key, diff --git a/crates/core/src/node/message_processor.rs b/crates/core/src/node/message_processor.rs index 331b693e8..eb19050d9 100644 --- a/crates/core/src/node/message_processor.rs +++ b/crates/core/src/node/message_processor.rs @@ -19,15 +19,13 @@ pub enum ProcessingError { /// MessageProcessor for pure network-to-actor routing /// -/// This processor only handles actor mode - legacy mode bypasses this entirely -/// and uses the original direct client notification path. +/// Routes network operation results to the session actor for client notification pub struct MessageProcessor { result_tx: mpsc::Sender, } impl MessageProcessor { - /// Create a new MessageProcessor for actor mode - /// Legacy mode doesn't use MessageProcessor at all + /// Create a new MessageProcessor pub fn new(result_tx: mpsc::Sender) -> Self { Self { result_tx } } diff --git a/crates/core/src/node/mod.rs b/crates/core/src/node/mod.rs index 67fe7d186..7e1ab1bb7 100644 --- a/crates/core/src/node/mod.rs +++ b/crates/core/src/node/mod.rs @@ -38,8 +38,8 @@ use crate::{ client_events::{BoxedClient, ClientEventsProxy, ClientId, OpenRequest}, config::{Address, GatewayConfig, WebsocketApiConfig}, contract::{ - Callback, ClientResponsesSender, ExecutorError, ExecutorToEventLoopChannel, - NetworkContractHandler, WaitingTransaction, + Callback, ExecutorError, ExecutorToEventLoopChannel, NetworkContractHandler, + WaitingTransaction, }, local_node::Executor, message::{InnerMessage, NetMessage, Transaction, TransactionType}, @@ -389,7 +389,6 @@ async fn report_result( op_result: Result, OpError>, op_manager: &OpManager, executor_callback: Option>, - client_req_handler_callback: Option<(Vec, ClientResponsesSender)>, event_listener: &mut dyn NetEventRegister, ) { // Add UPDATE-specific debug logging at the start @@ -410,11 +409,11 @@ async fn report_result( ); } - // NEW: Send to result router if feature flag is enabled and transaction exists - // (independent of legacy callback presence) - if let (Some(transaction), Some(router_tx)) = (tx, &op_manager.result_router_tx) { + // Send to result router + if let Some(transaction) = tx { let host_result = op_res.to_host_result(); - let router_tx_clone = router_tx.clone(); + let router_tx_clone = op_manager.result_router_tx.clone(); + let event_notifier = op_manager.to_event_listener.clone(); // Spawn fire-and-forget task to avoid blocking report_result() // while still guaranteeing message delivery @@ -423,64 +422,23 @@ async fn report_result( tracing::error!( "CRITICAL: Result router channel closed - dual-path delivery broken. \ Router or session actor has crashed. Transaction: {}. Error: {}. \ - Consider restarting node or disabling FREENET_ACTOR_CLIENTS flag.", + Consider restarting node.", transaction, e ); // TODO: Consider implementing circuit breaker or automatic recovery + } else { + // Transaction completed successfully, notify to clean up subscriptions + use crate::message::NodeEvent; + use either::Either; + let _ = event_notifier + .notifications_sender + .send(Either::Right(NodeEvent::TransactionCompleted(transaction))) + .await; } }); } - // EXISTING: Legacy client delivery (only when actor_clients is disabled) - // When actor_clients is enabled, SessionActor handles all client communication - if !op_manager.actor_clients { - if let Some((client_ids, cb)) = client_req_handler_callback { - for client_id in client_ids { - // Enhanced logging for UPDATE operations - if let crate::operations::OpEnum::Update(ref update_op) = op_res { - tracing::debug!( - "Sending UPDATE response to client {} for transaction {}", - client_id, - update_op.id - ); - - // Log the result being sent - let host_result = op_res.to_host_result(); - match &host_result { - Ok(response) => { - tracing::debug!( - "Client {} callback found, sending successful UPDATE response: {:?}", - client_id, - response - ); - } - Err(error) => { - tracing::error!( - "Client {} callback found, sending UPDATE error: {:?}", - client_id, - error - ); - } - } - } else { - tracing::debug!(?tx, %client_id, "Sending response to client"); - } - // Legacy delivery needs a RequestId - generate one for backward compatibility - use crate::client_events::RequestId; - let _ = cb.send((client_id, RequestId::new(), op_res.to_host_result())); - } - } else { - // Log when no client callback is found for UPDATE operations - if let crate::operations::OpEnum::Update(ref update_op) = op_res { - tracing::debug!( - "No client callback found for UPDATE transaction {} - this may indicate a missing client subscription", - update_op.id - ); - } - } - } // End skip_legacy_delivery check - // check operations.rs:handle_op_result to see what's the meaning of each state // in case more cases want to be handled when feeding information to the OpManager @@ -612,15 +570,14 @@ macro_rules! handle_op_not_available { }; } -#[allow(clippy::too_many_arguments)] -async fn process_message( +/// Legacy process_message - only kept for testing_impl +/// Production code uses process_message_decoupled instead +pub(super) async fn process_message( msg: NetMessage, op_manager: Arc, conn_manager: CB, event_listener: Box, executor_callback: Option>, - client_req_handler_callback: Option, - client_ids: Option>, pending_op_result: Option>, ) where CB: NetworkBridge, @@ -635,8 +592,6 @@ async fn process_message( conn_manager, event_listener, executor_callback, - client_req_handler_callback, - client_ids, pending_op_result, ) .await @@ -708,7 +663,6 @@ where } } -#[allow(clippy::too_many_arguments)] async fn process_message_v1( tx: Option, msg: NetMessageV1, @@ -716,13 +670,10 @@ async fn process_message_v1( mut conn_manager: CB, mut event_listener: Box, executor_callback: Option>, - client_req_handler_callback: Option, - client_id: Option>, pending_op_result: Option>, ) where CB: NetworkBridge, { - let cli_req = client_id.zip(client_req_handler_callback); event_listener .register_events(NetEventLog::from_inbound_msg_v1(&msg, &op_manager)) .await; @@ -750,7 +701,6 @@ async fn process_message_v1( op_result, &op_manager, executor_callback, - cli_req, &mut *event_listener, ) .await; @@ -777,7 +727,6 @@ async fn process_message_v1( op_result, &op_manager, executor_callback, - cli_req, &mut *event_listener, ) .await; @@ -800,7 +749,6 @@ async fn process_message_v1( op_result, &op_manager, executor_callback, - cli_req, &mut *event_listener, ) .await; @@ -827,7 +775,6 @@ async fn process_message_v1( op_result, &op_manager, executor_callback, - cli_req, &mut *event_listener, ) .await; @@ -851,7 +798,6 @@ async fn process_message_v1( op_result, &op_manager, executor_callback, - cli_req, &mut *event_listener, ) .await; diff --git a/crates/core/src/node/network_bridge/p2p_protoc.rs b/crates/core/src/node/network_bridge/p2p_protoc.rs index 3cdd27182..b1b043c53 100644 --- a/crates/core/src/node/network_bridge/p2p_protoc.rs +++ b/crates/core/src/node/network_bridge/p2p_protoc.rs @@ -5,7 +5,6 @@ use crate::node::subscribe::SubscribeMsg; use crate::ring::Location; use dashmap::DashSet; use either::{Either, Left, Right}; -use freenet_stdlib::client_api::ErrorKind; use futures::future::BoxFuture; use futures::stream::FuturesUnordered; use futures::{FutureExt, StreamExt}; @@ -38,14 +37,11 @@ use crate::{ client_events::ClientId, config::GlobalExecutor, contract::{ - ClientResponsesSender, ContractHandlerChannel, ExecutorToEventLoopChannel, - NetworkEventListenerHalve, WaitingResolution, + ContractHandlerChannel, ExecutorToEventLoopChannel, NetworkEventListenerHalve, + WaitingResolution, }, message::{MessageStats, NetMessage, NodeEvent, Transaction}, - node::{ - handle_aborted_op, process_message, process_message_decoupled, NetEventRegister, - NodeConfig, OpManager, - }, + node::{handle_aborted_op, process_message_decoupled, NetEventRegister, NodeConfig, OpManager}, ring::PeerKeyLocation, tracing::NetEventLog, }; @@ -131,7 +127,7 @@ pub(in crate::node) struct P2pConnManager { bandwidth_limit: Option, blocked_addresses: Option>, /// MessageProcessor for clean client handling separation - message_processor: Option>, + message_processor: Arc, } impl P2pConnManager { @@ -139,6 +135,7 @@ impl P2pConnManager { config: &NodeConfig, op_manager: Arc, event_listener: impl NetEventRegister + Clone, + message_processor: Arc, ) -> anyhow::Result { let listen_port = config.network_listener_port; let listener_ip = config.network_listener_ip; @@ -162,16 +159,10 @@ impl P2pConnManager { check_version: !config.config.network_api.ignore_protocol_version, bandwidth_limit: config.config.network_api.bandwidth_limit, blocked_addresses: config.blocked_addresses.clone(), - message_processor: None, // Will be set later based on configuration + message_processor, }) } - /// Set the MessageProcessor for Phase 4 network decoupling - pub fn with_message_processor(mut self, message_processor: Arc) -> Self { - self.message_processor = Some(message_processor); - self - } - #[allow(clippy::too_many_arguments)] #[tracing::instrument(name = "network_event_listener", fields(peer = %self.bridge.op_manager.ring.connection_manager.pub_key), skip_all)] pub async fn run_event_listener( @@ -180,7 +171,6 @@ impl P2pConnManager { mut client_wait_for_transaction: ContractHandlerChannel, mut notification_channel: EventLoopNotificationsReceiver, mut executor_listener: ExecutorToEventLoopChannel, - cli_response_sender: ClientResponsesSender, mut node_controller: Receiver, ) -> anyhow::Result { tracing::info!(%self.listening_port, %self.listening_ip, %self.is_gateway, key = %self.key_pair.public(), "Opening network listener"); @@ -239,7 +229,6 @@ impl P2pConnManager { &op_manager, &mut state, &executor_listener, - &cli_response_sender, ) .await?; } @@ -586,19 +575,16 @@ impl P2pConnManager { })??; } NodeEvent::TransactionTimedOut(tx) => { - let Some(clients) = state.tx_to_client.remove(&tx) else { - continue; - }; - for client in clients { - // Legacy delivery needs a RequestId - generate one for error cases - use crate::client_events::RequestId; - cli_response_sender.send(( - client, - RequestId::new(), - Err(ErrorKind::FailedOperation.into()), - ))?; + // Clean up client subscription to prevent memory leak + // Clients are not notified - transactions simply expire silently + if let Some(clients) = state.tx_to_client.remove(&tx) { + tracing::debug!("Cleaned up {} client subscriptions for timed out transaction: {}", clients.len(), tx); } } + NodeEvent::TransactionCompleted(tx) => { + // Clean up client subscription after successful completion + state.tx_to_client.remove(&tx); + } NodeEvent::LocalSubscribeComplete { tx, key, @@ -606,23 +592,20 @@ impl P2pConnManager { } => { tracing::info!("Received LocalSubscribeComplete event for transaction: {tx}, contract: {key}"); - // Deliver SubscribeResponse directly to result router (actor mode) - // Following Nacho's suggestion to tap into result router without state transitions - if let Some(result_router) = &op_manager.result_router_tx { - tracing::info!("Sending SubscribeResponse to result router for transaction: {tx}"); - use freenet_stdlib::client_api::{ - ContractResponse, HostResponse, - }; - let response = Ok(HostResponse::ContractResponse( - ContractResponse::SubscribeResponse { key, subscribed }, - )); - - match result_router.send((tx, response)).await { - Ok(()) => tracing::info!("Successfully sent SubscribeResponse to result router for transaction: {tx}"), - Err(e) => tracing::error!("Failed to send local subscribe response to result router: {}", e), + // Deliver SubscribeResponse directly to result router + tracing::info!("Sending SubscribeResponse to result router for transaction: {tx}"); + use freenet_stdlib::client_api::{ContractResponse, HostResponse}; + let response = Ok(HostResponse::ContractResponse( + ContractResponse::SubscribeResponse { key, subscribed }, + )); + + match op_manager.result_router_tx.send((tx, response)).await { + Ok(()) => { + tracing::info!("Successfully sent SubscribeResponse to result router for transaction: {tx}"); + // Clean up client subscription after successful delivery + state.tx_to_client.remove(&tx); } - } else { - tracing::warn!("No result router available for local subscribe completion (legacy mode)"); + Err(e) => tracing::error!("Failed to send local subscribe response to result router: {}", e), } } NodeEvent::Disconnect { cause } => { @@ -698,7 +681,6 @@ impl P2pConnManager { op_manager: &Arc, state: &mut EventListenerState, executor_listener: &ExecutorToEventLoopChannel, - cli_response_sender: &ClientResponsesSender, ) -> anyhow::Result<()> { match msg { NetMessage::V1(NetMessageV1::Aborted(tx)) => { @@ -709,14 +691,8 @@ impl P2pConnManager { // Forward message to transient joiner outbound_message.send_to(*addr, msg).await?; } else { - self.process_message( - msg, - op_manager, - executor_listener, - cli_response_sender, - state, - ) - .await; + self.process_message(msg, op_manager, executor_listener, state) + .await; } } } @@ -728,34 +704,12 @@ impl P2pConnManager { msg: NetMessage, op_manager: &Arc, executor_listener: &ExecutorToEventLoopChannel, - cli_response_sender: &ClientResponsesSender, state: &mut EventListenerState, ) { let executor_callback = state .pending_from_executor .remove(msg.id()) .then(|| executor_listener.callback()); - let pending_client_req = state - .tx_to_client - .get(msg.id()) - .cloned() - .map(|clients| clients.into_iter().collect::>()) - .or(state - .client_waiting_transaction - .iter_mut() - .find_map(|(tx, clients)| match (&msg, &tx) { - ( - NetMessage::V1(NetMessageV1::Subscribe(SubscribeMsg::ReturnSub { - key, - .. - })), - WaitingTransaction::Subscription { contract_key }, - ) if contract_key == key.id() => Some(clients.drain().collect::>()), - _ => None, - })); - let client_req_handler_callback = pending_client_req - .is_some() - .then(|| cli_response_sender.clone()); let span = tracing::info_span!( "process_network_message", @@ -765,37 +719,23 @@ impl P2pConnManager { let pending_op_result = state.pending_op_results.get(msg.id()).cloned(); - // Phase 4: Use MessageProcessor for clean client handling separation when available - if let Some(message_processor) = &self.message_processor { - tracing::debug!("Using PURE network processing - zero client types in network layer for transaction {}", msg.id()); - GlobalExecutor::spawn( - process_message_decoupled( - msg, - op_manager.clone(), - self.bridge.clone(), - self.event_listener.trait_clone(), - executor_callback, - message_processor.clone(), - pending_op_result, - ) - .instrument(span), - ); - } else { - // Legacy path - existing behavior - GlobalExecutor::spawn( - process_message( - msg, - op_manager.clone(), - self.bridge.clone(), - self.event_listener.trait_clone(), - executor_callback, - client_req_handler_callback, - pending_client_req, - pending_op_result, - ) - .instrument(span), - ); - } + // Use MessageProcessor for clean client handling separation + tracing::debug!( + "Using PURE network processing - zero client types in network layer for transaction {}", + msg.id() + ); + GlobalExecutor::spawn( + process_message_decoupled( + msg, + op_manager.clone(), + self.bridge.clone(), + self.event_listener.trait_clone(), + executor_callback, + self.message_processor.clone(), + pending_op_result, + ) + .instrument(span), + ); } async fn handle_connect_peer( diff --git a/crates/core/src/node/op_state_manager.rs b/crates/core/src/node/op_state_manager.rs index 45c0fc691..0c36b1210 100644 --- a/crates/core/src/node/op_state_manager.rs +++ b/crates/core/src/node/op_state_manager.rs @@ -67,11 +67,10 @@ struct Ops { pub(crate) struct OpManager { pub ring: Arc, ops: Arc, - to_event_listener: EventLoopNotificationsSender, + pub(crate) to_event_listener: EventLoopNotificationsSender, pub ch_outbound: ContractHandlerChannel, new_transactions: tokio::sync::mpsc::Sender, - pub result_router_tx: Option>, - pub actor_clients: bool, + pub result_router_tx: mpsc::Sender<(Transaction, HostResult)>, /// Indicates whether the peer is ready to process client operations. /// For gateways: always true (peer_id is set from config) /// For regular peers: true only after first successful network handshake sets peer_id @@ -87,7 +86,7 @@ impl OpManager { config: &NodeConfig, event_register: ER, connection_manager: ConnectionManager, - result_router_tx: Option>, + result_router_tx: mpsc::Sender<(Transaction, HostResult)>, ) -> anyhow::Result { let ring = Ring::new( config, @@ -134,7 +133,6 @@ impl OpManager { ch_outbound, new_transactions, result_router_tx, - actor_clients: config.config.actor_clients, peer_ready, is_gateway, }) diff --git a/crates/core/src/node/p2p_impl.rs b/crates/core/src/node/p2p_impl.rs index af9f1539f..985f6557f 100644 --- a/crates/core/src/node/p2p_impl.rs +++ b/crates/core/src/node/p2p_impl.rs @@ -17,8 +17,8 @@ use crate::{ client_events::{combinator::ClientEventsCombinator, BoxedClient}, config::GlobalExecutor, contract::{ - self, ClientResponsesSender, ContractHandler, ContractHandlerChannel, - ExecutorToEventLoopChannel, NetworkEventListenerHalve, WaitingResolution, + self, ContractHandler, ContractHandlerChannel, ExecutorToEventLoopChannel, + NetworkEventListenerHalve, WaitingResolution, }, message::{NetMessage, NodeEvent, Transaction}, node::NodeConfig, @@ -37,7 +37,6 @@ pub(crate) struct NodeP2P { notification_channel: EventLoopNotificationsReceiver, client_wait_for_transaction: ContractHandlerChannel, executor_listener: ExecutorToEventLoopChannel, - cli_response_sender: ClientResponsesSender, node_controller: tokio::sync::mpsc::Receiver, should_try_connect: bool, client_events_task: BoxFuture<'static, anyhow::Error>, @@ -188,7 +187,6 @@ impl NodeP2P { self.client_wait_for_transaction, self.notification_channel, self.executor_listener, - self.cli_response_sender, self.node_controller, ); @@ -223,39 +221,31 @@ impl NodeP2P { // Prepare session adapter channel for actor-based client management let (session_tx, session_rx) = tokio::sync::mpsc::channel(1000); - // Install session adapter in contract handler if migration enabled - let result_router_tx = if config.config.actor_clients { - ch_outbound.with_session_adapter(session_tx.clone()); - - // Create result router channel for dual-path result delivery - let (result_router_tx, result_router_rx) = tokio::sync::mpsc::channel(1000); - - // Spawn Session Actor - use crate::client_events::session_actor::SessionActor; - let session_actor = SessionActor::new(session_rx, cli_response_sender.clone()); - GlobalExecutor::spawn(async move { - tracing::info!("Session actor starting"); - session_actor.run().await; - tracing::warn!("Session actor stopped"); - }); - - // Spawn ResultRouter task - use crate::client_events::result_router::ResultRouter; - let router = ResultRouter::new(result_router_rx, session_tx.clone()); - GlobalExecutor::spawn(async move { - tracing::info!("Result router starting"); - router.run().await; - tracing::warn!("Result router stopped"); - }); - - tracing::info!( - "Actor-based client management infrastructure installed with result router" - ); - Some(result_router_tx) - } else { - tracing::debug!("Actor-based client management disabled"); - None - }; + // Install session adapter in contract handler + ch_outbound.with_session_adapter(session_tx.clone()); + + // Create result router channel for dual-path result delivery + let (result_router_tx, result_router_rx) = tokio::sync::mpsc::channel(1000); + + // Spawn Session Actor + use crate::client_events::session_actor::SessionActor; + let session_actor = SessionActor::new(session_rx, cli_response_sender.clone()); + GlobalExecutor::spawn(async move { + tracing::info!("Session actor starting"); + session_actor.run().await; + tracing::warn!("Session actor stopped"); + }); + + // Spawn ResultRouter task + use crate::client_events::result_router::ResultRouter; + let router = ResultRouter::new(result_router_rx, session_tx.clone()); + GlobalExecutor::spawn(async move { + tracing::info!("Result router starting"); + router.run().await; + tracing::warn!("Result router stopped"); + }); + + tracing::info!("Actor-based client management infrastructure installed with result router"); let connection_manager = ConnectionManager::new(&config); let op_manager = Arc::new(OpManager::new( @@ -271,25 +261,18 @@ impl NodeP2P { .await .map_err(|e| anyhow::anyhow!(e))?; - let mut conn_manager = - P2pConnManager::build(&config, op_manager.clone(), event_register).await?; - - // Phase 4: Configure MessageProcessor for clean client handling separation - let use_actor_clients = config.config.actor_clients; - if use_actor_clients { - // Clone session_tx before using it in MessageProcessor - let session_tx_for_processor = session_tx.clone(); - - // Create MessageProcessor for actor mode - direct to SessionActor - use crate::node::MessageProcessor; - let message_processor = Arc::new(MessageProcessor::new(session_tx_for_processor)); - conn_manager = conn_manager.with_message_processor(message_processor); - tracing::info!("P2P layer configured with MessageProcessor in ACTOR mode - network processing will be decoupled from client handling"); - } else { - tracing::info!( - "P2P layer using legacy client handling - MessageProcessor not configured" - ); - } + // Create MessageProcessor - direct to SessionActor + use crate::node::MessageProcessor; + let message_processor = Arc::new(MessageProcessor::new(session_tx.clone())); + + let conn_manager = P2pConnManager::build( + &config, + op_manager.clone(), + event_register, + message_processor, + ) + .await?; + tracing::info!("P2P layer configured with MessageProcessor - network processing decoupled from client handling"); let parent_span = tracing::Span::current(); let contract_executor_task = GlobalExecutor::spawn({ @@ -340,7 +323,6 @@ impl NodeP2P { client_wait_for_transaction: wait_for_event, op_manager, executor_listener, - cli_response_sender, node_controller: node_controller_rx, should_try_connect: config.should_connect, peer_id: config.peer_id, diff --git a/crates/core/src/node/testing_impl.rs b/crates/core/src/node/testing_impl.rs index 8ba650a6e..d3a0714fa 100644 --- a/crates/core/src/node/testing_impl.rs +++ b/crates/core/src/node/testing_impl.rs @@ -781,7 +781,7 @@ where UsrEv: ClientEventsProxy + Send + 'static, { connect::initial_join_procedure(config.op_manager.clone(), &config.gateways).await?; - let (client_responses, cli_response_sender) = contract::client_responses_channel(); + let (client_responses, _cli_response_sender) = contract::client_responses_channel(); let span = { config .parent_span @@ -811,14 +811,13 @@ where .parent_span .clone() .unwrap_or_else(|| tracing::info_span!("event_listener", peer = %config.peer_key)); - run_event_listener(cli_response_sender, node_controller_rx, config) + run_event_listener(node_controller_rx, config) .instrument(parent_span) .await } /// Starts listening to incoming events. Will attempt to join the ring if any gateways have been provided. async fn run_event_listener( - cli_response_sender: contract::ClientResponsesSender, mut node_controller_rx: tokio::sync::mpsc::Receiver, RunnerConfig { peer_key, @@ -924,6 +923,9 @@ where NodeEvent::TransactionTimedOut(_) => { unimplemented!() } + NodeEvent::TransactionCompleted(_) => { + unimplemented!() + } NodeEvent::LocalSubscribeComplete { .. } => { unimplemented!() } @@ -940,7 +942,6 @@ where Err(err.into()), &op_manager, None, - None, &mut *event_register as &mut _, ) .await; @@ -974,12 +975,6 @@ where let executor_callback = pending_from_executor .remove(msg.id()) .then(|| executor_listener.callback()); - let pending_client_req = tx_to_client.get(msg.id()).copied().map(|c| vec![c]); - let client_req_handler_callback = if pending_client_req.is_some() { - Some(cli_response_sender.clone()) - } else { - None - }; let msg = super::process_message( msg, @@ -987,8 +982,6 @@ where conn_manager.clone(), event_listener, executor_callback, - client_req_handler_callback, - pending_client_req, None, ) .instrument(span); diff --git a/crates/core/src/node/testing_impl/in_memory.rs b/crates/core/src/node/testing_impl/in_memory.rs index 4881b8d38..785db58a2 100644 --- a/crates/core/src/node/testing_impl/in_memory.rs +++ b/crates/core/src/node/testing_impl/in_memory.rs @@ -34,13 +34,17 @@ impl Builder { let _guard = parent_span.enter(); let connection_manager = ConnectionManager::new(&self.config); + + // Create a dummy result router channel for testing + let (result_router_tx, _result_router_rx) = tokio::sync::mpsc::channel(100); + let op_manager = Arc::new(OpManager::new( notification_tx, ops_ch_channel, &self.config, self.event_register.clone(), connection_manager.clone(), - None, // No result router for testing + result_router_tx, )?); std::mem::drop(_guard); let (executor_listener, executor_sender) = executor_channel(op_manager.clone());