1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! Message bridge between blvm-consensus and transport layer
//!
//! Converts [`NetworkMessage`](blvm_protocol::network::NetworkMessage) values to/from transport bytes
//! via [`ProtocolAdapter`]. Outgoing [`NetworkResponse`] values are turned into wire payloads here.
//!
//! **Incoming message processing** (handshake, inv/getdata, block validation) is implemented in
//! [`NetworkManager`](crate::network::network_manager::NetworkManager) (`handle_incoming_wire_tcp`,
//! `wire_dispatch`). This module intentionally does not duplicate that path.
use crate::network::protocol_adapter::ProtocolAdapter;
use crate::network::transport::TransportType;
use anyhow::Result;
use blvm_protocol::network::{NetworkMessage as ConsensusNetworkMessage, NetworkResponse};
use tracing::debug;
/// Message bridge for connecting blvm-consensus message processing
/// with the transport layer
pub struct MessageBridge;
impl MessageBridge {
/// Convert blvm-consensus NetworkMessage to transport wire format
pub fn to_transport_message(
msg: &ConsensusNetworkMessage,
transport: TransportType,
) -> Result<Vec<u8>> {
debug!(
"Converting consensus message to transport format: {:?}",
transport
);
ProtocolAdapter::serialize_message(msg, transport)
}
/// Convert transport wire format to blvm-consensus NetworkMessage
pub fn from_transport_message(
data: &[u8],
transport: TransportType,
) -> Result<ConsensusNetworkMessage> {
debug!(
"Converting transport message to consensus format: {:?}",
transport
);
ProtocolAdapter::deserialize_message(data, transport)
}
/// Process a blvm-consensus NetworkResponse and extract messages to send
///
/// NetworkResponse can indicate sending one or multiple messages,
/// or other actions (Ok, Reject).
pub fn extract_send_messages(
response: &NetworkResponse,
transport: TransportType,
) -> Result<Vec<Vec<u8>>> {
match response {
NetworkResponse::Ok => {
Ok(Vec::new()) // No messages to send
}
NetworkResponse::SendMessage(msg) => {
let wire = Self::to_transport_message(msg, transport)?;
Ok(vec![wire])
}
NetworkResponse::SendMessages(msgs) => {
let mut wires = Vec::new();
for msg in msgs {
let wire = Self::to_transport_message(msg, transport)?;
wires.push(wire);
}
Ok(wires)
}
NetworkResponse::Reject(reason) => {
debug!("Message rejected: {}", reason);
Ok(Vec::new()) // Rejection doesn't send a message
}
}
}
}