From 2b4359f23d20b14bae1896512f678d02b7f3c34c Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 3 Nov 2026 03:25:00 +0100 Subject: introduce eager links --- src/transport/libp2p/tests.rs | 1 + src/transport/mod.rs | 4 ++++ src/transport/mycelium/mod.rs | 1 + src/transport/paths.rs | 1 + src/transport/sim.rs | 1 + src/transport/wire.rs | 8 ++++++-- 6 files changed, 14 insertions(+), 2 deletions(-) (limited to 'src/transport') diff --git a/src/transport/libp2p/tests.rs b/src/transport/libp2p/tests.rs index 1d7c6ac..8f77bf7 100644 --- a/src/transport/libp2p/tests.rs +++ b/src/transport/libp2p/tests.rs @@ -60,6 +60,7 @@ fn status() -> ParsedMessage { syncs_with_you: false, leaving: false, announcing: false, + eager: false, }) } diff --git a/src/transport/mod.rs b/src/transport/mod.rs index 25f9b7c..7f1aa98 100644 --- a/src/transport/mod.rs +++ b/src/transport/mod.rs @@ -206,6 +206,10 @@ pub(crate) struct Status { /// STATUS answered only if the recipient's heads differ. Most announcements reach a /// neighbour that has the changes already, which has nothing to tell. pub(crate) announcing: bool, + /// The sender wants the recipient's changes as soon as the recipient applies them, + /// sent as sync messages (an eager link, `swarm::relay`), not only announced. Every + /// STATUS says so, or not, again: one lost changes nothing for long. + pub(crate) eager: bool, } /// Cheap to clone: large parts are shared (`bytes::Bytes`). diff --git a/src/transport/mycelium/mod.rs b/src/transport/mycelium/mod.rs index 9850ef0..0562e72 100644 --- a/src/transport/mycelium/mod.rs +++ b/src/transport/mycelium/mod.rs @@ -718,6 +718,7 @@ mod tests { syncs_with_you: true, leaving: false, announcing: false, + eager: false, }; let payload = wire::encode(&ParsedMessage::StatusReply(status.clone())).unwrap(); // Mycelium's message data: a length byte, the topic, then our payload. diff --git a/src/transport/paths.rs b/src/transport/paths.rs index 29b3c23..1cd21e8 100644 --- a/src/transport/paths.rs +++ b/src/transport/paths.rs @@ -1514,6 +1514,7 @@ mod tests { syncs_with_you: false, leaving: false, announcing: false, + eager: false, }) } diff --git a/src/transport/sim.rs b/src/transport/sim.rs index 7a679fc..af262aa 100644 --- a/src/transport/sim.rs +++ b/src/transport/sim.rs @@ -388,6 +388,7 @@ mod tests { syncs_with_you: false, leaving: false, announcing: false, + eager: false, }) } diff --git a/src/transport/wire.rs b/src/transport/wire.rs index d3bf39d..40976ee 100644 --- a/src/transport/wire.rs +++ b/src/transport/wire.rs @@ -14,7 +14,7 @@ use super::{EncodedMessage, MessageKind, ParsedMessage}; /// The wire format's version, the first byte of every payload. Bump it with every change /// to a message type or a codec (`golden_bytes` fails then). -pub(crate) const VERSION: u8 = 16; +pub(crate) const VERSION: u8 = 17; /// What the second byte of a payload says. fn tag(kind: MessageKind) -> u8 { @@ -370,6 +370,7 @@ pub(crate) fn samples() -> Vec { syncs_with_you: true, leaving: false, announcing: false, + eager: false, }; let proof = IdentityProof { key: [8; 32], @@ -551,6 +552,7 @@ mod tests { syncs_with_you: false, leaving: false, announcing: false, + eager: false, }; let decoded = decode(&encode(&ParsedMessage::StatusReply(status.clone())).unwrap()).unwrap(); @@ -575,6 +577,7 @@ mod tests { syncs_with_you: true, leaving: false, announcing: false, + eager: false, }; assert!(decode(&encode(&ParsedMessage::Status(status)).unwrap()).is_err()); } @@ -673,10 +676,11 @@ mod tests { syncs_with_you: false, leaving: false, announcing: true, + eager: false, }); assert_eq!( hex(&encode(&status).unwrap()), - format!("{v}03979290c400{epoch_hex}01c3c2c2c3") + format!("{v}03989290c400{epoch_hex}01c3c2c2c3c2") ); let who = ParsedMessage::Who(IdentityProof { -- cgit v1.3.1