From b461dc39a79acde75429498cf249fc7b1513b041 Mon Sep 17 00:00:00 2001 From: fluo10 Date: Thu, 4 Sep 2025 08:25:22 +0900 Subject: [PATCH] Implement protobuf for iroh peer info --- core/build.rs | 2 + core/proto/iroh.proto | 43 +++++++++++++++++++ core/src/proto/cached_address.rs | 16 ------- core/src/proto/cached_peer.rs | 14 ------ .../proto/iroh/direct_addr_info_message.rs | 18 ++++++++ core/src/proto/iroh/last_control_message.rs | 16 +++++++ core/src/proto/iroh/mod.rs | 8 ++++ .../proto/iroh/remote_info_iter_request.rs | 7 +++ core/src/proto/iroh/remote_info_message.rs | 20 +++++++++ core/src/proto/iroh/remote_info_request.rs | 11 +++++ core/src/proto/iroh/source_message.rs | 16 +++++++ core/src/proto/mod.rs | 6 +-- 12 files changed, 143 insertions(+), 34 deletions(-) create mode 100644 core/proto/iroh.proto delete mode 100644 core/src/proto/cached_address.rs delete mode 100644 core/src/proto/cached_peer.rs create mode 100644 core/src/proto/iroh/direct_addr_info_message.rs create mode 100644 core/src/proto/iroh/last_control_message.rs create mode 100644 core/src/proto/iroh/mod.rs create mode 100644 core/src/proto/iroh/remote_info_iter_request.rs create mode 100644 core/src/proto/iroh/remote_info_message.rs create mode 100644 core/src/proto/iroh/remote_info_request.rs create mode 100644 core/src/proto/iroh/source_message.rs diff --git a/core/build.rs b/core/build.rs index c8a4f87..e2bad9d 100644 --- a/core/build.rs +++ b/core/build.rs @@ -1,4 +1,6 @@ fn main() -> Result<(), Box> { tonic_prost_build::compile_protos("proto/caretta_sync.proto")?; + tonic_prost_build::compile_protos("proto/iroh.proto")?; + Ok(()) } \ No newline at end of file diff --git a/core/proto/iroh.proto b/core/proto/iroh.proto new file mode 100644 index 0000000..09d01a1 --- /dev/null +++ b/core/proto/iroh.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; +package iroh; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; + +service Iroh { + rpc RemoteInfo(RemoteInfoRequest) returns (RemoteInfoMessage); + rpc RemoteInfoIter(RemoteInfoIterRequest) returns (stream RemoteInfoMessage); +} + +message RemoteInfoRequest { + string node_id = 1; +} + +message RemoteInfoIterRequest {} + +message RemoteInfoMessage { + string node_id = 1; + string relay_url = 2; + repeated DirectAddrInfoMessage addrs = 3; + string conn_type = 4; + google.protobuf.Duration latency = 5; + google.protobuf.Duration last_used = 6; +} + +message DirectAddrInfoMessage { + string addr = 1; + google.protobuf.Duration latency = 2; + LastControlMessage last_control = 3; + google.protobuf.Duration last_payload = 4; + google.protobuf.Duration last_alive = 5; + repeated SourceMessage sources = 6; +} + +message LastControlMessage { + google.protobuf.Duration duration = 1; + string control_msg = 2; +} + +message SourceMessage { + string source = 1; + google.protobuf.Duration duration = 2; +} diff --git a/core/src/proto/cached_address.rs b/core/src/proto/cached_address.rs deleted file mode 100644 index ef26c98..0000000 --- a/core/src/proto/cached_address.rs +++ /dev/null @@ -1,16 +0,0 @@ -use libp2p::Multiaddr; - -use crate::cache::entity::CachedAddressModel; -use crate::utils::utc_to_timestamp; -use crate::proto::CachedAddressMessage; - -impl From<&CachedAddressModel> for CachedAddressMessage { - fn from(a: &CachedAddressModel) -> Self { - Self { - number: a.id, - created_at: Some(utc_to_timestamp(&a.created_at)), - updated_at: Some(utc_to_timestamp(&a.updated_at)), - multiaddress: Multiaddr::from(a.multiaddress.clone()).to_string(), - } - } -} \ No newline at end of file diff --git a/core/src/proto/cached_peer.rs b/core/src/proto/cached_peer.rs deleted file mode 100644 index d6393c9..0000000 --- a/core/src/proto/cached_peer.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::{cache::entity::{CachedAddressModel, CachedPeerModel}, proto::{CachedAddressMessage, CachedPeerMessage}, utils::utc_to_timestamp}; - -impl From<(&CachedPeerModel, &Vec)> for CachedPeerMessage { - fn from(source: (&CachedPeerModel, &Vec)) -> Self { - let (peer, addresses) = source; - - Self { - number: peer.id, - peer_id: peer.peer_id.to_string(), - created_at: Some(utc_to_timestamp(&peer.created_at)), - addresses: addresses.iter().map(|x| CachedAddressMessage::from(x)).collect(), - } - } -} \ No newline at end of file diff --git a/core/src/proto/iroh/direct_addr_info_message.rs b/core/src/proto/iroh/direct_addr_info_message.rs new file mode 100644 index 0000000..30d2a0b --- /dev/null +++ b/core/src/proto/iroh/direct_addr_info_message.rs @@ -0,0 +1,18 @@ +use iroh::endpoint::DirectAddrInfo; +use prost_types::DurationError; + +use crate::proto::iroh::{DirectAddrInfoMessage, SourceMessage}; + +impl TryFrom for DirectAddrInfoMessage { + type Error = DurationError; + fn try_from(value: DirectAddrInfo) -> Result { + Ok(DirectAddrInfoMessage { + addr: value.addr.to_string(), + latency: value.latency.map(|x| x.try_into()).transpose()?, + last_control: value.last_control.map(|x| super::LastControlMessage::try_from(x)).transpose()?, + last_payload: value.last_payload.map(|x| x.try_into()).transpose()?, + last_alive: value.last_alive.map(|x| x.try_into()).transpose()?, + sources: value.sources.into_iter().map(|x| SourceMessage::try_from(x)).collect::, DurationError>>()? + }) + } +} \ No newline at end of file diff --git a/core/src/proto/iroh/last_control_message.rs b/core/src/proto/iroh/last_control_message.rs new file mode 100644 index 0000000..79aeab6 --- /dev/null +++ b/core/src/proto/iroh/last_control_message.rs @@ -0,0 +1,16 @@ +use std::time::Duration; + +use iroh::endpoint::ControlMsg; +use prost_types::DurationError; + +use crate::proto::iroh::LastControlMessage; + +impl TryFrom<(Duration, ControlMsg)> for LastControlMessage { + type Error = DurationError; + fn try_from(value: (Duration, ControlMsg)) -> Result { + Ok(LastControlMessage { + duration: Some(value.0.try_into()?), + control_msg: value.1.to_string() + }) + } +} \ No newline at end of file diff --git a/core/src/proto/iroh/mod.rs b/core/src/proto/iroh/mod.rs new file mode 100644 index 0000000..3449309 --- /dev/null +++ b/core/src/proto/iroh/mod.rs @@ -0,0 +1,8 @@ +mod direct_addr_info_message; +mod last_control_message; +mod remote_info_iter_request; +mod remote_info_message; +mod remote_info_request; +mod source_message; + +tonic::include_proto!("iroh"); \ No newline at end of file diff --git a/core/src/proto/iroh/remote_info_iter_request.rs b/core/src/proto/iroh/remote_info_iter_request.rs new file mode 100644 index 0000000..a6f09a2 --- /dev/null +++ b/core/src/proto/iroh/remote_info_iter_request.rs @@ -0,0 +1,7 @@ +use crate::proto::iroh::RemoteInfoIterRequest; + +impl RemoteInfoIterRequest { + pub fn new() -> Self { + Self{} + } +} \ No newline at end of file diff --git a/core/src/proto/iroh/remote_info_message.rs b/core/src/proto/iroh/remote_info_message.rs new file mode 100644 index 0000000..b81f66a --- /dev/null +++ b/core/src/proto/iroh/remote_info_message.rs @@ -0,0 +1,20 @@ +use iroh::endpoint::RemoteInfo; +use prost_types::DurationError; + +use crate::proto::iroh::{DirectAddrInfoMessage, RemoteInfoMessage}; + +impl TryFrom for RemoteInfoMessage { + type Error = DurationError; + fn try_from(value: RemoteInfo) -> Result { + Ok(Self { + node_id: value.node_id.to_string(), + relay_url: value.relay_url.map_or(String::from(""), |x| x.relay_url.to_string()), + addrs: value.addrs.into_iter() + .map(|x| DirectAddrInfoMessage::try_from(x)) + .collect::,DurationError>>()?, + conn_type: value.conn_type.to_string(), + latency: value.latency.map(|x| x.try_into()).transpose()?, + last_used: value.last_used.map(|x| x.try_into()).transpose()?, + }) + } +} \ No newline at end of file diff --git a/core/src/proto/iroh/remote_info_request.rs b/core/src/proto/iroh/remote_info_request.rs new file mode 100644 index 0000000..dee8a7a --- /dev/null +++ b/core/src/proto/iroh/remote_info_request.rs @@ -0,0 +1,11 @@ +use iroh::NodeId; + +use crate::proto::iroh::RemoteInfoRequest; + +impl From for RemoteInfoRequest { + fn from(value: NodeId) -> Self { + Self { + node_id : value.to_string() + } + } +} \ No newline at end of file diff --git a/core/src/proto/iroh/source_message.rs b/core/src/proto/iroh/source_message.rs new file mode 100644 index 0000000..dc984b5 --- /dev/null +++ b/core/src/proto/iroh/source_message.rs @@ -0,0 +1,16 @@ +use std::time::Duration; + +use iroh::endpoint::Source; + +use crate::proto::iroh::SourceMessage; + +impl TryFrom<(Source, Duration)> for SourceMessage { + type Error = prost_types::DurationError; + fn try_from(src: (Source, Duration)) -> Result { + let (source, duration )= src; + Ok(Self { + source: source.to_string(), + duration: Some(duration.try_into()?), + }) + } +} \ No newline at end of file diff --git a/core/src/proto/mod.rs b/core/src/proto/mod.rs index 6e7bbd4..3b7ae71 100644 --- a/core/src/proto/mod.rs +++ b/core/src/proto/mod.rs @@ -1,5 +1,3 @@ -mod cached_address; -mod cached_peer; - -tonic::include_proto!("caretta_sync"); +pub mod iroh; +tonic::include_proto!("caretta_sync"); \ No newline at end of file