refactor checkpoint
This commit is contained in:
@@ -7,8 +7,10 @@ mod node_status;
|
||||
mod nonce;
|
||||
mod peer_info;
|
||||
mod private_safety_route;
|
||||
mod protocol_set;
|
||||
mod public_key;
|
||||
mod sender_info;
|
||||
mod signal_info;
|
||||
mod socket_address;
|
||||
|
||||
pub use address::*;
|
||||
@@ -20,6 +22,8 @@ pub use node_status::*;
|
||||
pub use nonce::*;
|
||||
pub use peer_info::*;
|
||||
pub use private_safety_route::*;
|
||||
pub use protocol_set::*;
|
||||
pub use public_key::*;
|
||||
pub use sender_info::*;
|
||||
pub use signal_info::*;
|
||||
pub use socket_address::*;
|
||||
|
@@ -7,38 +7,34 @@ pub fn encode_node_info(
|
||||
) -> Result<(), RPCError> {
|
||||
builder.set_network_class(encode_network_class(node_info.network_class));
|
||||
|
||||
let mut ps_builder = builder.reborrow().init_outbound_protocols();
|
||||
encode_protocol_set(&node_info.outbound_protocols, &mut ps_builder)?;
|
||||
|
||||
let mut dil_builder = builder.reborrow().init_dial_info_list(
|
||||
node_info
|
||||
.dial_infos
|
||||
.dial_info_list
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(map_error_protocol!("too many dial infos in node info"))?,
|
||||
);
|
||||
|
||||
for idx in 0..node_info.dial_infos.len() {
|
||||
for idx in 0..node_info.dial_info_list.len() {
|
||||
let mut di_builder = dil_builder.reborrow().get(idx as u32);
|
||||
encode_dial_info(&node_info.dial_infos[idx], &mut di_builder)?;
|
||||
encode_dial_info(&node_info.dial_info_list[idx], &mut di_builder)?;
|
||||
}
|
||||
|
||||
let mut rdil_builder = builder.reborrow().init_relay_dial_info_list(
|
||||
node_info
|
||||
.relay_dial_infos
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(map_error_protocol!(
|
||||
"too many relay dial infos in node info"
|
||||
))?,
|
||||
);
|
||||
|
||||
for idx in 0..node_info.relay_dial_infos.len() {
|
||||
let mut rdi_builder = rdil_builder.reborrow().get(idx as u32);
|
||||
encode_dial_info(&node_info.relay_dial_infos[idx], &mut rdi_builder)?;
|
||||
if let Some(rpi) = node_info.relay_peer_info {
|
||||
let mut rpi_builder = builder.reborrow().init_relay_peer_info();
|
||||
encode_peer_info(&rpi, &mut rpi_builder)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_node_info(reader: &veilid_capnp::node_info::Reader) -> Result<NodeInfo, RPCError> {
|
||||
pub fn decode_node_info(
|
||||
reader: &veilid_capnp::node_info::Reader,
|
||||
allow_relay_peer_info: bool,
|
||||
) -> Result<NodeInfo, RPCError> {
|
||||
let network_class = decode_network_class(
|
||||
reader
|
||||
.reborrow()
|
||||
@@ -46,37 +42,47 @@ pub fn decode_node_info(reader: &veilid_capnp::node_info::Reader) -> Result<Node
|
||||
.map_err(map_error_capnp_notinschema!())?,
|
||||
);
|
||||
|
||||
let outbound_protocols = decode_protocol_set(
|
||||
&reader
|
||||
.reborrow()
|
||||
.get_outbound_protocols()
|
||||
.map_err(map_error_capnp_notinschema!())?,
|
||||
)?;
|
||||
|
||||
let dil_reader = reader
|
||||
.reborrow()
|
||||
.get_dial_info_list()
|
||||
.map_err(map_error_capnp_error!())?;
|
||||
let mut dial_infos = Vec::<DialInfo>::with_capacity(
|
||||
let mut dial_info_list = Vec::<DialInfo>::with_capacity(
|
||||
dil_reader
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(map_error_protocol!("too many dial infos"))?,
|
||||
);
|
||||
for di in dil_reader.iter() {
|
||||
dial_infos.push(decode_dial_info(&di)?)
|
||||
dial_info_list.push(decode_dial_info(&di)?)
|
||||
}
|
||||
|
||||
let rdil_reader = reader
|
||||
.reborrow()
|
||||
.get_relay_dial_info_list()
|
||||
.map_err(map_error_capnp_error!())?;
|
||||
let mut relay_dial_infos = Vec::<DialInfo>::with_capacity(
|
||||
rdil_reader
|
||||
.len()
|
||||
.try_into()
|
||||
.map_err(map_error_protocol!("too many relay dial infos"))?,
|
||||
);
|
||||
for di in rdil_reader.iter() {
|
||||
relay_dial_infos.push(decode_dial_info(&di)?)
|
||||
}
|
||||
let relay_peer_info = if allow_relay_peer_info {
|
||||
if reader.has_relay_peer_info() {
|
||||
Some(Box::new(decode_peer_info(
|
||||
&reader
|
||||
.reborrow()
|
||||
.get_relay_peer_info()
|
||||
.map_err(map_error_capnp_notinschema!())?,
|
||||
false,
|
||||
)?))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
Ok(NodeInfo {
|
||||
network_class,
|
||||
dial_infos,
|
||||
relay_dial_infos,
|
||||
outbound_protocols,
|
||||
dial_info_list,
|
||||
relay_peer_info,
|
||||
})
|
||||
}
|
||||
|
@@ -14,7 +14,10 @@ pub fn encode_peer_info(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_peer_info(reader: &veilid_capnp::peer_info::Reader) -> Result<PeerInfo, RPCError> {
|
||||
pub fn decode_peer_info(
|
||||
reader: &veilid_capnp::peer_info::Reader,
|
||||
allow_relay_peer_info: bool,
|
||||
) -> Result<PeerInfo, RPCError> {
|
||||
let nid_reader = reader
|
||||
.reborrow()
|
||||
.get_node_id()
|
||||
@@ -23,7 +26,7 @@ pub fn decode_peer_info(reader: &veilid_capnp::peer_info::Reader) -> Result<Peer
|
||||
.reborrow()
|
||||
.get_node_info()
|
||||
.map_err(map_error_capnp_error!())?;
|
||||
let node_info = decode_node_info(&ni_reader)?;
|
||||
let node_info = decode_node_info(&ni_reader, allow_relay_peer_info)?;
|
||||
|
||||
Ok(PeerInfo {
|
||||
node_id: NodeId::new(decode_public_key(&nid_reader)),
|
||||
|
25
veilid-core/src/rpc_processor/coders/protocol_set.rs
Normal file
25
veilid-core/src/rpc_processor/coders/protocol_set.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use crate::*;
|
||||
use rpc_processor::*;
|
||||
|
||||
pub fn encode_protocol_set(
|
||||
protocol_set: &ProtocolSet,
|
||||
builder: &mut veilid_capnp::protocol_set::Builder,
|
||||
) -> Result<(), RPCError> {
|
||||
builder.set_udp(protocol_set.udp);
|
||||
builder.set_tcp(protocol_set.tcp);
|
||||
builder.set_ws(protocol_set.ws);
|
||||
builder.set_wss(protocol_set.wss);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_protocol_set(
|
||||
reader: &veilid_capnp::protocol_set::Reader,
|
||||
) -> Result<ProtocolSet, RPCError> {
|
||||
Ok(ProtocolSet {
|
||||
udp: reader.reborrow().get_udp(),
|
||||
tcp: reader.reborrow().get_tcp(),
|
||||
ws: reader.reborrow().get_ws(),
|
||||
wss: reader.reborrow().get_wss(),
|
||||
})
|
||||
}
|
86
veilid-core/src/rpc_processor/coders/signal_info.rs
Normal file
86
veilid-core/src/rpc_processor/coders/signal_info.rs
Normal file
@@ -0,0 +1,86 @@
|
||||
use crate::*;
|
||||
use rpc_processor::*;
|
||||
|
||||
pub fn encode_signal_info(
|
||||
signal_info: &SignalInfo,
|
||||
builder: &mut veilid_capnp::operation_signal::Builder,
|
||||
) -> Result<(), RPCError> {
|
||||
match signal_info {
|
||||
SignalInfo::HolePunch { receipt, node_info } => {
|
||||
let mut hp_builder = builder.init_hole_punch();
|
||||
let rcpt_builder =
|
||||
hp_builder
|
||||
.reborrow()
|
||||
.init_receipt(receipt.len().try_into().map_err(map_error_protocol!(
|
||||
"invalid receipt length in hole punch signal info"
|
||||
))?);
|
||||
rcpt_builder.copy_from_slice(receipt.as_slice());
|
||||
let mut ni_builder = hp_builder.init_node_info();
|
||||
encode_node_info(&node_info, &mut ni_builder)?;
|
||||
}
|
||||
SignalInfo::ReverseConnect { receipt, node_info } => {
|
||||
let mut hp_builder = builder.init_reverse_connect();
|
||||
let rcpt_builder =
|
||||
hp_builder
|
||||
.reborrow()
|
||||
.init_receipt(receipt.len().try_into().map_err(map_error_protocol!(
|
||||
"invalid receipt length in reverse connect signal info"
|
||||
))?);
|
||||
rcpt_builder.copy_from_slice(receipt.as_slice());
|
||||
let mut ni_builder = hp_builder.init_node_info();
|
||||
encode_node_info(&node_info, &mut ni_builder)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn decode_signal_info(
|
||||
reader: &veilid_capnp::operation_signal::Reader,
|
||||
) -> Result<SignalInfo, RPCError> {
|
||||
Ok(
|
||||
match reader
|
||||
.which()
|
||||
.map_err(map_error_internal!("invalid signal operation"))?
|
||||
{
|
||||
veilid_capnp::operation_signal::HolePunch(r) => {
|
||||
// Extract hole punch reader
|
||||
let r = match r {
|
||||
Ok(r) => r,
|
||||
Err(_) => return Err(rpc_error_internal("invalid hole punch")),
|
||||
};
|
||||
let receipt = r
|
||||
.get_receipt()
|
||||
.map_err(map_error_protocol!(
|
||||
"invalid receipt in hole punch signal info"
|
||||
))?
|
||||
.to_vec();
|
||||
let ni_reader = r.get_node_info().map_err(map_error_protocol!(
|
||||
"invalid node info in hole punch signal info"
|
||||
))?;
|
||||
let node_info = decode_node_info(&ni_reader, true)?;
|
||||
|
||||
SignalInfo::HolePunch { receipt, node_info }
|
||||
}
|
||||
veilid_capnp::operation_signal::ReverseConnect(r) => {
|
||||
// Extract reverse connect reader
|
||||
let r = match r {
|
||||
Ok(r) => r,
|
||||
Err(_) => return Err(rpc_error_internal("invalid reverse connect")),
|
||||
};
|
||||
let receipt = r
|
||||
.get_receipt()
|
||||
.map_err(map_error_protocol!(
|
||||
"invalid receipt in reverse connect signal info"
|
||||
))?
|
||||
.to_vec();
|
||||
let ni_reader = r.get_node_info().map_err(map_error_protocol!(
|
||||
"invalid node info in reverse connect signal info"
|
||||
))?;
|
||||
let node_info = decode_node_info(&ni_reader, true)?;
|
||||
|
||||
SignalInfo::ReverseConnect { receipt, node_info }
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user