lib.rs
1 // Copyright (c) 2025 ADnet Contributors 2 // This file is part of the AlphaOS library. 3 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 8 // http://www.apache.org/licenses/LICENSE-2.0 9 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 #![forbid(unsafe_code)] 17 18 #[macro_use] 19 extern crate async_trait; 20 21 use std::{io, net::SocketAddr}; 22 use tokio::sync::oneshot; 23 24 /// Abstract communication service. 25 /// 26 /// Implemented by `Gateway` and `Client`. 27 #[async_trait] 28 pub trait CommunicationService: Send + Sync { 29 /// The message type used by this communication service. 30 type Message: Clone; 31 32 /// Generates the service-specific message for a block request. 33 fn prepare_block_request(start: u32, end: u32) -> Self::Message; 34 35 /// Sends the given message to specified peer. 36 /// 37 /// This function returns as soon as the message is queued to be sent, 38 /// without waiting for the actual delivery; instead, the caller is provided with a [`oneshot::Receiver`] 39 /// which can be used to determine when and whether the message has been delivered. 40 /// If no peer with the given IP exists, this function returns None. 41 async fn send(&self, peer_ip: SocketAddr, message: Self::Message) -> Option<oneshot::Receiver<io::Result<()>>>; 42 } 43 44 #[cfg(any(test, feature = "test-helpers"))] 45 pub mod test_helpers { 46 use super::*; 47 48 #[derive(Clone)] 49 pub struct DummyMessage {} 50 51 /// A communication service that does not do anything (for testing). 52 #[derive(Default)] 53 pub struct DummyCommunicationService; 54 55 #[async_trait] 56 impl CommunicationService for DummyCommunicationService { 57 type Message = DummyMessage; 58 59 fn prepare_block_request(_start: u32, _end: u32) -> Self::Message { 60 Self::Message {} 61 } 62 63 async fn send( 64 &self, 65 _peer_ip: SocketAddr, 66 _message: Self::Message, 67 ) -> Option<oneshot::Receiver<io::Result<()>>> { 68 None 69 } 70 } 71 }