diff --git a/Cargo.lock b/Cargo.lock index 2adca97e4..a4d2005b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,22 +6,22 @@ version = 4 name = "add-node-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "add-rpcurl-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -101,10 +101,10 @@ name = "alias" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -830,7 +830,7 @@ dependencies = [ "alloy-sol-types", "anyhow", "bincode", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "rand 0.8.5", "serde", @@ -839,7 +839,7 @@ dependencies = [ "sha3", "url", "urlencoding 2.1.3", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -1058,6 +1058,18 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auditable-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5" +dependencies = [ + "semver 1.0.26", + "serde", + "serde_json", + "topological-sort", +] + [[package]] name = "auto_impl" version = "1.3.0" @@ -1173,6 +1185,25 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "binding-cacher" +version = "0.1.0" +dependencies = [ + "alloy", + "alloy-primitives", + "alloy-sol-types", + "anyhow", + "chrono", + "hex", + "hyperware_process_lib 2.3.0", + "process_macros", + "rand 0.8.5", + "rmp-serde", + "serde", + "serde_json", + "wit-bindgen 0.42.1", +] + [[package]] name = "binstring" version = "0.1.7" @@ -1450,10 +1481,10 @@ name = "cat" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -1514,7 +1545,8 @@ dependencies = [ "alloy-sol-types", "anyhow", "bincode", - "hyperware_process_lib 2.1.0", + "hex", + "hyperware_process_lib 2.2.1", "process_macros", "rand 0.8.5", "serde", @@ -1523,7 +1555,7 @@ dependencies = [ "sha3", "url", "urlencoding 2.1.3", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -1609,10 +1641,10 @@ name = "clear-state" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -1767,11 +1799,11 @@ checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" name = "contacts" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2445,11 +2477,11 @@ name = "download" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2457,7 +2489,7 @@ name = "downloads" version = "0.5.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "rand 0.8.5", "serde", @@ -2466,7 +2498,7 @@ dependencies = [ "sha3", "url", "urlencoding 2.1.3", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -2512,8 +2544,8 @@ dependencies = [ name = "echo" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", - "wit-bindgen", + "hyperware_process_lib 2.3.0", + "wit-bindgen 0.42.1", ] [[package]] @@ -2641,15 +2673,15 @@ name = "explorer" version = "0.1.0" dependencies = [ "anyhow", - "hyperprocess_macro 0.1.0 (git+https://github.com/hyperware-ai/hyperprocess-macro?rev=66884c0)", - "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=4beff93)", + "hyperapp_macro 0.1.1", + "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=1a6ad9d)", "md5", "process_macros", "serde", "serde_json", "serde_urlencoded", "tracing", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -2823,13 +2855,13 @@ version = "0.2.0" dependencies = [ "anyhow", "bincode", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "rand 0.8.5", "serde", "serde_json", "sha2", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 1.1.4", ] @@ -2999,21 +3031,21 @@ dependencies = [ name = "get-block" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "get-providers" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3208,8 +3240,8 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" name = "help" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", - "wit-bindgen", + "hyperware_process_lib 2.3.0", + "wit-bindgen 0.42.1", ] [[package]] @@ -3232,21 +3264,21 @@ name = "hfetch" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "hi" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3311,13 +3343,13 @@ dependencies = [ "alloy-sol-types", "anyhow", "hex", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.2.1", "process_macros", "rmp-serde", "serde", "serde_json", "thiserror 1.0.69", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3326,10 +3358,10 @@ version = "0.1.2" dependencies = [ "anyhow", "bincode", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3516,9 +3548,32 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "hyperapp_macro" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e694a2a3dd6c4d1ba3ec2110b054dca52834ae10d98630b39efd7a59ed4887c8" +dependencies = [ + "hyperware_process_lib 2.3.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "hyperapp_macro" +version = "0.1.2" +source = "git+https://github.com/hyperware-ai/hyperapp-macro?rev=5c7cc7a#5c7cc7a8dfb366bdc767d9dc3e2b954dc2cc786c" +dependencies = [ + "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=41f25ce)", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "hyperdrive" -version = "1.8.3" +version = "1.9.2" dependencies = [ "aes-gcm", "alloy", @@ -3578,7 +3633,7 @@ dependencies = [ [[package]] name = "hyperdrive_lib" -version = "1.8.3" +version = "1.9.2" dependencies = [ "lib", ] @@ -3593,43 +3648,21 @@ dependencies = [ "anyhow", "chrono", "hex", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "rand 0.8.5", "rmp-serde", "serde", "serde_json", - "wit-bindgen", -] - -[[package]] -name = "hyperprocess_macro" -version = "0.1.0" -source = "git+https://github.com/hyperware-ai/hyperprocess-macro?rev=66884c0#66884c0a22b845d1db632f0fb8985a7e5bdad3fb" -dependencies = [ - "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=b9f1ead)", - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "hyperprocess_macro" -version = "0.1.0" -source = "git+https://github.com/hyperware-ai/hyperprocess-macro?rev=98fac21#98fac2177df21a39a0950d48b248e1b12013f7f0" -dependencies = [ - "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=232fe25)", - "proc-macro2", - "quote", - "syn 2.0.104", + "wit-bindgen 0.42.1", ] [[package]] name = "hyperware-anthropic-sdk" version = "0.1.0" -source = "git+https://github.com/hyperware-ai/hyperware-anthropic-sdk?rev=607bbc6#607bbc6da2601b06f13729a846ebe2419e1dcf6c" +source = "git+https://github.com/hyperware-ai/hyperware-anthropic-sdk?rev=1fc7b0c#1fc7b0c1a0a8f6e8f706cf837bea8173c3198b31" dependencies = [ - "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=232fe25)", + "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=41f25ce)", "rand 0.8.5", "serde", "serde_json", @@ -3649,9 +3682,8 @@ dependencies = [ [[package]] name = "hyperware_process_lib" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3abd008d22c3b96ee43300c4c8dffbf1d072a680a13635b5f9da11a0ce9395" +version = "2.2.0" +source = "git+https://github.com/hyperware-ai/process_lib?rev=1a6ad9d#1a6ad9d00e98bd6b268a7d434a7e78a0bb3cce7b" dependencies = [ "alloy", "alloy-primitives", @@ -3661,7 +3693,8 @@ dependencies = [ "base64 0.22.1", "bincode", "color-eyre", - "hex", + "futures-channel", + "futures-util", "http 1.3.1", "mime_guess", "rand 0.8.5", @@ -3669,19 +3702,19 @@ dependencies = [ "rmp-serde", "serde", "serde_json", - "sha3", "thiserror 1.0.69", "tracing", "tracing-error", "tracing-subscriber", "url", - "wit-bindgen", + "uuid 1.17.0", + "wit-bindgen 0.42.1", ] [[package]] name = "hyperware_process_lib" version = "2.2.0" -source = "git+https://github.com/hyperware-ai/process_lib?rev=232fe25#232fe2526f383c88efc2ef3a289deba2e193d68f" +source = "git+https://github.com/hyperware-ai/process_lib?rev=41f25ce#41f25ceb30935929416137162eb90f101dc720c5" dependencies = [ "alloy", "alloy-primitives", @@ -3691,6 +3724,7 @@ dependencies = [ "base64 0.22.1", "bincode", "color-eyre", + "futures-channel", "futures-util", "http 1.3.1", "mime_guess", @@ -3705,13 +3739,13 @@ dependencies = [ "tracing-subscriber", "url", "uuid 1.17.0", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "hyperware_process_lib" -version = "2.2.0" -source = "git+https://github.com/hyperware-ai/process_lib?rev=4beff93#4beff9389598978d2f97e4cd6d1d0f74a7acac0f" +version = "2.2.1" +source = "git+https://github.com/hyperware-ai/process_lib?rev=4e91521#4e915218b382e4b3f7f93cddeec30415f02a504b" dependencies = [ "alloy", "alloy-primitives", @@ -3721,7 +3755,6 @@ dependencies = [ "base64 0.22.1", "bincode", "color-eyre", - "futures-util", "http 1.3.1", "mime_guess", "rand 0.8.5", @@ -3734,14 +3767,14 @@ dependencies = [ "tracing-error", "tracing-subscriber", "url", - "uuid 1.17.0", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "hyperware_process_lib" -version = "2.2.0" -source = "git+https://github.com/hyperware-ai/process_lib?rev=b9f1ead#b9f1ead63356bfd4b60b337a380fef1be81d81c6" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe2b6795488c3f7d3410808cf7e29404725f862ad42a3822886464b92451a21" dependencies = [ "alloy", "alloy-primitives", @@ -3751,6 +3784,7 @@ dependencies = [ "base64 0.22.1", "bincode", "color-eyre", + "futures-channel", "futures-util", "http 1.3.1", "mime_guess", @@ -3765,7 +3799,7 @@ dependencies = [ "tracing-subscriber", "url", "uuid 1.17.0", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -3996,11 +4030,11 @@ name = "install" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4257,16 +4291,16 @@ name = "kill" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "kit" version = "3.1.1" -source = "git+https://github.com/hyperware-ai/kit?rev=0d0469e#0d0469ec89ce5ff8f25223e3d968cd5760554251" +source = "git+https://github.com/hyperware-ai/kit?rev=3a4d666#3a4d66602bc3edec049bfa406f09005677adcf18" dependencies = [ "alloy", "alloy-sol-macro", @@ -4281,7 +4315,7 @@ dependencies = [ "fs-err", "git2", "hex", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "nix 0.27.1", "proc-macro2", "regex", @@ -4302,7 +4336,7 @@ dependencies = [ "tracing-error", "tracing-subscriber", "walkdir", - "wit-bindgen", + "wit-bindgen 0.42.1", "zip 0.6.6", ] @@ -4335,7 +4369,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "lib" -version = "1.8.3" +version = "1.9.2" dependencies = [ "alloy", "anyhow", @@ -4555,11 +4589,11 @@ version = "0.1.0" dependencies = [ "anyhow", "clap", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "regex", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4726,10 +4760,10 @@ dependencies = [ name = "net-diagnostics" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -4769,11 +4803,11 @@ dependencies = [ name = "node-info" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5154,20 +5188,20 @@ dependencies = [ name = "peer" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "peers" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5756,11 +5790,11 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" name = "remove-provider" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5807,22 +5841,22 @@ dependencies = [ name = "reset" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "reset-cache" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -5830,11 +5864,11 @@ name = "reset-store" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6344,11 +6378,11 @@ dependencies = [ name = "set-nodes" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6357,12 +6391,12 @@ version = "0.1.0" dependencies = [ "anyhow", "base64 0.22.1", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rmp-serde", "serde", "serde_json", "url", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6427,12 +6461,12 @@ name = "sign" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "rmp-serde", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6563,6 +6597,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "spdx" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" +dependencies = [ + "smallvec", +] + [[package]] name = "spider" version = "0.1.0" @@ -6571,10 +6614,10 @@ dependencies = [ "base64 0.21.7", "chrono", "http 1.3.1", - "hyperprocess_macro 0.1.0 (git+https://github.com/hyperware-ai/hyperprocess-macro?rev=98fac21)", + "hyperapp_macro 0.1.2", "hyperware-anthropic-sdk", "hyperware-parse-wit", - "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=232fe25)", + "hyperware_process_lib 2.2.0 (git+https://github.com/hyperware-ai/process_lib?rev=41f25ce)", "process_macros", "rmp-serde", "serde", @@ -6582,7 +6625,7 @@ dependencies = [ "sha2", "url", "uuid 1.17.0", - "wit-bindgen", + "wit-bindgen 0.42.1", "wit-parser 0.220.1", ] @@ -6628,22 +6671,22 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "start-providing" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] name = "state" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6673,11 +6716,11 @@ dependencies = [ name = "stop-providing" version = "0.1.0" dependencies = [ - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6863,12 +6906,12 @@ version = "0.1.1" dependencies = [ "anyhow", "bincode", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "rand 0.8.5", "regex", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -6877,12 +6920,12 @@ version = "0.1.1" dependencies = [ "anyhow", "bincode", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", "thiserror 1.0.69", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -7158,12 +7201,18 @@ version = "0.2.0" dependencies = [ "anyhow", "clap", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + [[package]] name = "tower" version = "0.5.2" @@ -7520,11 +7569,11 @@ name = "uninstall" version = "0.1.0" dependencies = [ "anyhow", - "hyperware_process_lib 2.1.0", + "hyperware_process_lib 2.3.0", "process_macros", "serde", "serde_json", - "wit-bindgen", + "wit-bindgen 0.42.1", ] [[package]] @@ -7782,6 +7831,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822" +dependencies = [ + "leb128fmt", + "wasmparser 0.227.1", +] + [[package]] name = "wasm-encoder" version = "0.229.0" @@ -7812,6 +7871,25 @@ dependencies = [ "wasmparser 0.235.0", ] +[[package]] +name = "wasm-metadata" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d" +dependencies = [ + "anyhow", + "auditable-serde", + "flate2", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "url", + "wasm-encoder 0.227.1", + "wasmparser 0.227.1", +] + [[package]] name = "wasm-metadata" version = "0.230.0" @@ -7835,6 +7913,18 @@ dependencies = [ "semver 1.0.26", ] +[[package]] +name = "wasmparser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" +dependencies = [ + "bitflags 2.9.1", + "hashbrown 0.15.4", + "indexmap", + "semver 1.0.26", +] + [[package]] name = "wasmparser" version = "0.229.0" @@ -8676,6 +8766,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wit-bindgen" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de" +dependencies = [ + "wit-bindgen-rt 0.41.0", + "wit-bindgen-rust-macro 0.41.0", +] + [[package]] name = "wit-bindgen" version = "0.42.1" @@ -8683,7 +8783,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8" dependencies = [ "wit-bindgen-rt 0.42.1", - "wit-bindgen-rust-macro", + "wit-bindgen-rust-macro 0.42.1", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser 0.227.1", ] [[package]] @@ -8706,6 +8817,17 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621" +dependencies = [ + "bitflags 2.9.1", + "futures", + "once_cell", +] + [[package]] name = "wit-bindgen-rt" version = "0.42.1" @@ -8717,6 +8839,22 @@ dependencies = [ "once_cell", ] +[[package]] +name = "wit-bindgen-rust" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.104", + "wasm-metadata 0.227.1", + "wit-bindgen-core 0.41.0", + "wit-component 0.227.1", +] + [[package]] name = "wit-bindgen-rust" version = "0.42.1" @@ -8728,9 +8866,24 @@ dependencies = [ "indexmap", "prettyplease", "syn 2.0.104", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", + "wasm-metadata 0.230.0", + "wit-bindgen-core 0.42.1", + "wit-component 0.230.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.104", + "wit-bindgen-core 0.41.0", + "wit-bindgen-rust 0.41.0", ] [[package]] @@ -8744,8 +8897,27 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.104", - "wit-bindgen-core", - "wit-bindgen-rust", + "wit-bindgen-core 0.42.1", + "wit-bindgen-rust 0.42.1", +] + +[[package]] +name = "wit-component" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676" +dependencies = [ + "anyhow", + "bitflags 2.9.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.227.1", + "wasm-metadata 0.227.1", + "wasmparser 0.227.1", + "wit-parser 0.227.1", ] [[package]] @@ -8762,7 +8934,7 @@ dependencies = [ "serde_derive", "serde_json", "wasm-encoder 0.230.0", - "wasm-metadata", + "wasm-metadata 0.230.0", "wasmparser 0.230.0", "wit-parser 0.230.0", ] @@ -8785,6 +8957,24 @@ dependencies = [ "wasmparser 0.220.1", ] +[[package]] +name = "wit-parser" +version = "0.227.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver 1.0.26", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.227.1", +] + [[package]] name = "wit-parser" version = "0.229.0" diff --git a/Cargo.toml b/Cargo.toml index 870e08170..ffa7d7559 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "hyperdrive_lib" authors = ["Sybil Technologies AG"] -version = "1.9.1" +version = "1.9.2" edition = "2021" description = "A general-purpose sovereign cloud computing platform" homepage = "https://hyperware.ai" diff --git a/hyperdrive/Cargo.toml b/hyperdrive/Cargo.toml index 8eb657bdb..e430f62e8 100644 --- a/hyperdrive/Cargo.toml +++ b/hyperdrive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "hyperdrive" authors = ["Sybil Technologies AG"] -version = "1.9.1" +version = "1.9.2" edition = "2021" description = "A general-purpose sovereign cloud computing platform" homepage = "https://hyperware.ai" diff --git a/hyperdrive/packages/app-store/chain/src/lib.rs b/hyperdrive/packages/app-store/chain/src/lib.rs index 89cf33ce4..d4070ce4b 100644 --- a/hyperdrive/packages/app-store/chain/src/lib.rs +++ b/hyperdrive/packages/app-store/chain/src/lib.rs @@ -733,43 +733,45 @@ fn handle_message(our: &Address, state: &mut State, message: &Message) -> anyhow } else { if message.source().process == "eth:distro:sys" { let eth_result = serde_json::from_slice::(message.body())?; - if let Ok(eth::EthSub { id, result }) = eth_result { - if let Ok(eth::SubscriptionResult::Log(ref log)) = - serde_json::from_value::(result) - { - // Determine which subscription this is from - // Note: log is Box, we need to dereference it - let log_ref: ð::Log = &**log; - let context = if id == SUBSCRIPTION_NUMBER { - LogContext::Hypermap(log_ref.clone()) - } else if id == BINDINGS_SUBSCRIPTION { - LogContext::Bindings(log_ref.clone()) - } else { - return Ok(false); // Unknown subscription - }; - // delay handling of ETH RPC subscriptions by DELAY_MS - // to allow hns to have a chance to process block - timer::set_timer(DELAY_MS, Some(serde_json::to_vec(&context)?)); + match eth_result { + Ok(eth::EthSub { id, result }) => { + if let Ok(eth::SubscriptionResult::Log(ref log)) = + serde_json::from_value::(result) + { + // Determine which subscription this is from + // Note: log is Box, we need to dereference it + let log_ref: ð::Log = &**log; + let context = if id == SUBSCRIPTION_NUMBER { + LogContext::Hypermap(log_ref.clone()) + } else if id == BINDINGS_SUBSCRIPTION { + LogContext::Bindings(log_ref.clone()) + } else { + return Ok(false); // Unknown subscription + }; + // delay handling of ETH RPC subscriptions by DELAY_MS + // to allow hns to have a chance to process block + timer::set_timer(DELAY_MS, Some(serde_json::to_vec(&context)?)); + } + } + Err(err) => { + if err.id == SUBSCRIPTION_NUMBER { + let _ = state.hypermap.provider.unsubscribe(SUBSCRIPTION_NUMBER); + state.hypermap.provider.subscribe_loop( + SUBSCRIPTION_NUMBER, + app_store_filter(state), + 1, + 0, + ); + } else if err.id == BINDINGS_SUBSCRIPTION { + let _ = state.bindings.provider.unsubscribe(BINDINGS_SUBSCRIPTION); + state.bindings.provider.subscribe_loop( + BINDINGS_SUBSCRIPTION, + bindings_filter(&state.bindings), + 1, + 0, + ); + } } - } else { - // unsubscribe to make sure we have cleaned up after ourselves; - // drop Result since we don't care if no subscription exists, - // just being diligent in case it does! - let _ = state.hypermap.provider.unsubscribe(SUBSCRIPTION_NUMBER); - let _ = state.bindings.provider.unsubscribe(BINDINGS_SUBSCRIPTION); - // re-subscribe if error - state.hypermap.provider.subscribe_loop( - SUBSCRIPTION_NUMBER, - app_store_filter(state), - 1, - 0, - ); - state.bindings.provider.subscribe_loop( - BINDINGS_SUBSCRIPTION, - bindings_filter(&state.bindings), - 1, - 0, - ); } } else { let req = serde_json::from_slice::(message.body())?; diff --git a/hyperdrive/packages/app-store/downloads/src/lib.rs b/hyperdrive/packages/app-store/downloads/src/lib.rs index 044def476..e3aa42a87 100644 --- a/hyperdrive/packages/app-store/downloads/src/lib.rs +++ b/hyperdrive/packages/app-store/downloads/src/lib.rs @@ -105,6 +105,7 @@ type ManualDownloads = HashMap<(PackageId, String), ManualDownloadStatus>; #[derive(Debug, Serialize, Deserialize)] pub struct State { // persisted metadata about which packages we are mirroring + #[serde(default)] mirroring: HashSet, // note, pending auto_updates are not persisted. } diff --git a/hyperdrive/packages/hypermap-cacher/binding-cacher/src/lib.rs b/hyperdrive/packages/hypermap-cacher/binding-cacher/src/lib.rs index 497dc3306..d026da31e 100644 --- a/hyperdrive/packages/hypermap-cacher/binding-cacher/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/binding-cacher/src/lib.rs @@ -49,6 +49,10 @@ const DEFAULT_NODES: &[&str] = &[ #[cfg(feature = "simulation-mode")] const DEFAULT_NODES: &[&str] = &["fake.os"]; +fn default_nodes() -> Vec { + DEFAULT_NODES.iter().map(|s| s.to_string()).collect() +} + // Internal representation of LogsMetadata, similar to WIT but for Rust logic. #[derive(Serialize, Deserialize, Debug, Clone)] struct LogsMetadataInternal { @@ -105,7 +109,9 @@ struct State { block_batch_size: u64, is_cache_timer_live: bool, drive_path: String, + #[serde(default)] is_providing: bool, + #[serde(default = "default_nodes")] nodes: Vec, #[serde(skip)] is_starting: bool, diff --git a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs index 08483465f..cc98c1549 100644 --- a/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs +++ b/hyperdrive/packages/hypermap-cacher/hypermap-cacher/src/lib.rs @@ -46,6 +46,10 @@ const DEFAULT_NODES: &[&str] = &[ #[cfg(feature = "simulation-mode")] const DEFAULT_NODES: &[&str] = &["fake.os"]; +fn default_nodes() -> Vec { + DEFAULT_NODES.iter().map(|s| s.to_string()).collect() +} + // Internal representation of LogsMetadata, similar to WIT but for Rust logic. #[derive(Serialize, Deserialize, Debug, Clone)] struct LogsMetadataInternal { @@ -102,7 +106,9 @@ struct State { block_batch_size: u64, is_cache_timer_live: bool, drive_path: String, + #[serde(default)] is_providing: bool, + #[serde(default = "default_nodes")] nodes: Vec, #[serde(skip)] is_starting: bool, diff --git a/hyperdrive/src/eth/mod.rs b/hyperdrive/src/eth/mod.rs index 04e4a5dca..a549a1898 100644 --- a/hyperdrive/src/eth/mod.rs +++ b/hyperdrive/src/eth/mod.rs @@ -2,6 +2,7 @@ use alloy::providers::{Provider, RootProvider}; use alloy::pubsub::PubSubFrontend; use alloy::rpc::json_rpc::RpcError; use anyhow::Result; +use dashmap::mapref::entry::Entry; use dashmap::DashMap; use indexmap::IndexMap; use lib::types::core::*; @@ -18,6 +19,13 @@ use utils::*; mod subscription; mod utils; +const DELAY_MS: u64 = 1_000; +const MAX_REQUEST_CACHE_LEN: usize = 500; +const REMOTE_QUEUE_CAPACITY: usize = 100; +const DELAYED_QUEUE_CAPACITY: usize = 1_000; +const REMOTE_QUEUE_IDLE_TIMEOUT_SECS: u64 = 5; +const REMOTE_REQUEST_DELAY_MS: u64 = 200; + /// meta-type for all incoming requests we need to handle #[derive(Debug, Serialize, Deserialize)] #[serde(untagged)] @@ -34,6 +42,12 @@ enum IncomingReq { /// mapping of chain id to ordered lists of providers type Providers = Arc>; +/// existing subscriptions held by local OR remote processes +type ActiveSubscriptions = Arc>>; +type ResponseChannels = Arc>; +type LocalToRemoteSubs = Arc>>; +type PerNodeQueues = Arc>>; +type RequestCache = Arc, (EthResponse, Instant)>>>; #[derive(Debug)] struct ActiveProviders { @@ -66,6 +80,41 @@ struct UrlProvider { pub method_failures: MethodFailures, } +#[derive(Debug)] +enum ActiveSub { + Local((tokio::sync::mpsc::Sender, JoinHandle<()>)), + Remote { + provider_node: String, + handle: JoinHandle<()>, + sender: tokio::sync::mpsc::Sender, + }, +} + +struct ModuleState { + /// the name of this node + our: Arc, + /// the home directory path + home_directory_path: PathBuf, + /// the access settings for this provider + access_settings: AccessSettings, + /// the set of providers we have available for all chains + providers: Providers, + /// the set of active subscriptions we are currently maintaining + active_subscriptions: ActiveSubscriptions, + /// map local subscription ids to remote ids (per requester) + local_to_remote_subs: LocalToRemoteSubs, + /// per-node request queues for throttling + per_node_queues: PerNodeQueues, + /// the set of response channels we have open for outstanding request tasks + response_channels: ResponseChannels, + /// our sender for kernel event loop + send_to_loop: MessageSender, + /// our sender for terminal prints + print_tx: PrintSender, + /// cache of ETH requests + request_cache: RequestCache, +} + #[derive(Debug, Clone)] struct NodeProvider { /// NOT CURRENTLY USED @@ -84,6 +133,85 @@ struct NodeProvider { pub method_failures: MethodFailures, } +fn spawn_node_worker( + node_name: String, + mut rx: tokio::sync::mpsc::Receiver, + delayed_tx: tokio::sync::mpsc::Sender, + queues: PerNodeQueues, + sender: tokio::sync::mpsc::Sender, +) { + tokio::spawn(async move { + let mut next_allowed = Instant::now(); + loop { + match tokio::time::timeout(Duration::from_secs(REMOTE_QUEUE_IDLE_TIMEOUT_SECS), rx.recv()) + .await + { + Ok(Some(km)) => { + let now = Instant::now(); + if now < next_allowed { + tokio::time::sleep(next_allowed - now).await; + } + if delayed_tx.send(km).await.is_err() { + break; + } + next_allowed = Instant::now() + Duration::from_millis(REMOTE_REQUEST_DELAY_MS); + } + Ok(None) => { + if let Some(entry) = queues.get(&node_name) { + if entry.same_channel(&sender) { + drop(entry); + queues.remove(&node_name); + } + } + break; + } + Err(_) => { + if let Some(entry) = queues.get(&node_name) { + if entry.same_channel(&sender) { + drop(entry); + queues.remove(&node_name); + } + } + break; + } + } + } + }); +} + +async fn enqueue_remote_request( + state: &ModuleState, + km: KernelMessage, + delayed_tx: tokio::sync::mpsc::Sender, +) -> Result<(), EthError> { + let node_name = km.source.node.clone(); + let sender = match state.per_node_queues.entry(node_name.clone()) { + Entry::Occupied(entry) => entry.get().clone(), + Entry::Vacant(entry) => { + let (tx, rx) = tokio::sync::mpsc::channel(REMOTE_QUEUE_CAPACITY); + entry.insert(tx.clone()); + spawn_node_worker( + node_name, + rx, + delayed_tx, + state.per_node_queues.clone(), + tx.clone(), + ); + tx + } + }; + match sender.try_send(km) { + Ok(()) => {} + Err(tokio::sync::mpsc::error::TrySendError::Full(_)) => { + return Err(EthError::RateLimited); + } + Err(tokio::sync::mpsc::error::TrySendError::Closed(_)) => { + return Err(EthError::RpcTimeout); + } + } + Ok(()) +} + impl MethodFailures { /// Check if a method should be skipped for this provider fn should_skip_method(&self, method: &str, params: &serde_json::Value) -> bool { @@ -236,21 +364,6 @@ impl ActiveProviders { } } -/// existing subscriptions held by local OR remote processes -type ActiveSubscriptions = Arc>>; - -type ResponseChannels = Arc>; - -#[derive(Debug)] -enum ActiveSub { - Local((tokio::sync::mpsc::Sender, JoinHandle<()>)), - Remote { - provider_node: String, - handle: JoinHandle<()>, - sender: tokio::sync::mpsc::Sender, - }, -} - impl ActiveSub { async fn close(&self, sub_id: u64, state: &ModuleState, is_error: bool) { match self { @@ -284,32 +397,6 @@ impl ActiveSub { } } -struct ModuleState { - /// the name of this node - our: Arc, - /// the home directory path - home_directory_path: PathBuf, - /// the access settings for this provider - access_settings: AccessSettings, - /// the set of providers we have available for all chains - providers: Providers, - /// the set of active subscriptions we are currently maintaining - active_subscriptions: ActiveSubscriptions, - /// the set of response channels we have open for outstanding request tasks - response_channels: ResponseChannels, - /// our sender for kernel event loop - send_to_loop: MessageSender, - /// our sender for terminal prints - print_tx: PrintSender, - /// cache of ETH requests - request_cache: RequestCache, -} - -type RequestCache = Arc, (EthResponse, Instant)>>>; - -const DELAY_MS: u64 = 1_000; -const MAX_REQUEST_CACHE_LEN: usize = 500; - /// TODO replace with alloy abstraction fn valid_method(method: &str) -> Option<&'static str> { match method { @@ -355,6 +442,7 @@ pub async fn provider( caps_oracle: CapMessageSender, print_tx: PrintSender, ) -> Result<()> { + let (delayed_tx, mut delayed_rx) = tokio::sync::mpsc::channel(DELAYED_QUEUE_CAPACITY); // load access settings if they've been persisted to disk // this merely describes whether our provider is available to other nodes // and if so, which nodes are allowed to access it (public/whitelist/blacklist) @@ -386,6 +474,8 @@ pub async fn provider( access_settings, providers: Arc::new(DashMap::new()), active_subscriptions: Arc::new(DashMap::new()), + local_to_remote_subs: Arc::new(DashMap::new()), + per_node_queues: Arc::new(DashMap::new()), response_channels: Arc::new(DashMap::new()), send_to_loop, print_tx, @@ -416,6 +506,40 @@ pub async fn provider( ).await; } Some(km) = recv_in_client.recv() => { + if km.source.node != *state.our { + let km_id = km.id; + let response_target = km.rsvp.as_ref().unwrap_or(&km.source).clone(); + if let Err(e) = enqueue_remote_request(&state, km, delayed_tx.clone()).await { + error_message( + &state.our, + km_id, + response_target, + e, + &state.send_to_loop, + ) + .await; + } + } else { + let km_id = km.id; + let response_target = km.rsvp.as_ref().unwrap_or(&km.source).clone(); + if let Err(e) = handle_message( + &mut state, + km, + &caps_oracle, + ) + .await + { + error_message( + &state.our, + km_id, + response_target, + e, + &state.send_to_loop + ).await; + }; + } + } + Some(km) = delayed_rx.recv() => { let km_id = km.id; let response_target = km.rsvp.as_ref().unwrap_or(&km.source).clone(); if let Err(e) = handle_message( @@ -741,8 +865,30 @@ async fn handle_eth_action( } EthAction::UnsubscribeLogs(sub_id) => { // Remove the subscription from the map first, releasing the guard + let mut resolved_sub_id = sub_id; + let mut had_mapping = false; let sub = { let Some(mut sub_map) = state.active_subscriptions.get_mut(&km.source) else { + if let Some(mut map) = state.local_to_remote_subs.get_mut(&km.source) { + map.remove(&sub_id); + let should_remove = map.is_empty(); + drop(map); + if should_remove { + state.local_to_remote_subs.remove(&km.source); + } + kernel_message( + &state.our, + km.id, + km.rsvp.unwrap_or(km.source.clone()), + None, + false, + None, + EthResponse::Ok, + &state.send_to_loop, + ) + .await; + return Ok(()); + } verbose_print( &state.print_tx, &format!( @@ -761,12 +907,32 @@ async fn handle_eth_action( .await; return Ok(()); }; - sub_map.remove(&sub_id) + let mut sub = sub_map.remove(&sub_id); + if sub.is_none() { + if let Some(remote_id) = state + .local_to_remote_subs + .get(&km.source) + .and_then(|map| map.get(&sub_id).copied()) + { + had_mapping = true; + resolved_sub_id = remote_id; + sub = sub_map.remove(&remote_id); + } + } + sub }; // Guard is released here if let Some(sub) = sub { + if let Some(mut map) = state.local_to_remote_subs.get_mut(&km.source) { + map.remove(&sub_id); + let should_remove = map.is_empty(); + drop(map); + if should_remove { + state.local_to_remote_subs.remove(&km.source); + } + } // Now we can safely call close without holding the guard - sub.close(sub_id, state, false).await; + sub.close(resolved_sub_id, state, false).await; verbose_print( &state.print_tx, &format!("eth: closed subscription {} for {}", sub_id, km.source.node), @@ -783,6 +949,26 @@ async fn handle_eth_action( &state.send_to_loop, ) .await; + } else if had_mapping { + if let Some(mut map) = state.local_to_remote_subs.get_mut(&km.source) { + map.remove(&sub_id); + let should_remove = map.is_empty(); + drop(map); + if should_remove { + state.local_to_remote_subs.remove(&km.source); + } + } + kernel_message( + &state.our, + km.id, + km.rsvp.unwrap_or(km.source.clone()), + None, + false, + None, + EthResponse::Ok, + &state.send_to_loop, + ) + .await; } else { verbose_print( &state.print_tx, @@ -835,7 +1021,7 @@ async fn handle_eth_action( Ok(response) => { if let EthResponse::Err(EthError::RpcError(_)) = response { // try one more time after 1s delay in case RPC is rate limiting - std::thread::sleep(std::time::Duration::from_millis(DELAY_MS)); + tokio::time::sleep(std::time::Duration::from_millis(DELAY_MS)).await; match tokio::time::timeout( std::time::Duration::from_secs(timeout), fulfill_request( diff --git a/hyperdrive/src/eth/subscription.rs b/hyperdrive/src/eth/subscription.rs index ea9a56d95..813ac306d 100644 --- a/hyperdrive/src/eth/subscription.rs +++ b/hyperdrive/src/eth/subscription.rs @@ -14,6 +14,7 @@ pub async fn create_new_subscription( let our = state.our.clone(); let send_to_loop = state.send_to_loop.clone(); let active_subscriptions = state.active_subscriptions.clone(); + let local_to_remote_subs = state.local_to_remote_subs.clone(); let providers = state.providers.clone(); let response_channels = state.response_channels.clone(); let print_tx = state.print_tx.clone(); @@ -71,6 +72,7 @@ pub async fn create_new_subscription( let send_to_loop = send_to_loop.clone(); let print_tx = print_tx.clone(); let active_subscriptions = active_subscriptions.clone(); + let local_to_remote_subs = local_to_remote_subs.clone(); let (close_sender, close_receiver) = tokio::sync::mpsc::channel(1); match maybe_raw_sub { Ok((rx, _chain_id)) => { @@ -124,6 +126,10 @@ pub async fn create_new_subscription( let (keepalive_err_sender, keepalive_err_receiver) = tokio::sync::mpsc::channel(1); response_channels.insert(keepalive_km_id, keepalive_err_sender); + local_to_remote_subs + .entry(target.clone()) + .or_insert(HashMap::new()) + .insert(sub_id, remote_sub_id); subs.insert( remote_sub_id, ActiveSub::Remote { @@ -140,6 +146,7 @@ pub async fn create_new_subscription( &target, &send_to_loop, &active_subscriptions, + &local_to_remote_subs, &response_channels, ) .await; @@ -456,6 +463,7 @@ async fn maintain_remote_subscription( target: &Address, send_to_loop: &MessageSender, active_subscriptions: &ActiveSubscriptions, + local_to_remote_subs: &LocalToRemoteSubs, response_channels: &ResponseChannels, ) -> EthSubError { let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(30)); @@ -547,6 +555,14 @@ async fn maintain_remote_subscription( .and_modify(|sub_map| { sub_map.remove(&remote_sub_id); }); + if let Some(mut map) = local_to_remote_subs.get_mut(target) { + map.remove(&sub_id); + let should_remove = map.is_empty(); + drop(map); + if should_remove { + local_to_remote_subs.remove(target); + } + } response_channels.remove(&keepalive_km_id); e } diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 2f9f6eb0a..93258205a 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "lib" authors = ["Sybil Technologies AG"] -version = "1.9.1" +version = "1.9.2" edition = "2021" description = "A general-purpose sovereign cloud computing platform" homepage = "https://hyperware.ai" diff --git a/lib/src/eth.rs b/lib/src/eth.rs index fc00d1fd9..5d0563b49 100644 --- a/lib/src/eth.rs +++ b/lib/src/eth.rs @@ -120,6 +120,8 @@ pub enum EthError { RpcTimeout, /// RPC gave garbage back RpcMalformedResponse, + /// Request was rate limited before processing + RateLimited, } /// The action type used for configuring eth:distro:sys. Only processes which have the "root"