This commit is contained in:
John Smith 2023-02-27 21:29:51 -05:00
parent 584ce05a10
commit 5a4c2cb37e
8 changed files with 135 additions and 32 deletions

View File

@ -30,7 +30,7 @@ impl RouteNode {
match self { match self {
RouteNode::NodeId(id) => { RouteNode::NodeId(id) => {
// //
routing_table.lookup_node_ref(TypedKey::new(crypto_kind, id)) routing_table.lookup_node_ref(TypedKey::new(crypto_kind, *id))
} }
RouteNode::PeerInfo(pi) => { RouteNode::PeerInfo(pi) => {
// //
@ -46,10 +46,10 @@ impl RouteNode {
pub fn describe(&self, crypto_kind: CryptoKind) -> String { pub fn describe(&self, crypto_kind: CryptoKind) -> String {
match self { match self {
RouteNode::NodeId(id) => { RouteNode::NodeId(id) => {
format!("{}", TypedKey::new(crypto_kind, id)) format!("{}", TypedKey::new(crypto_kind, *id))
} }
RouteNode::PeerInfo(pi) => match pi.node_ids.get(crypto_kind) { RouteNode::PeerInfo(pi) => match pi.node_ids.get(crypto_kind) {
Some(id) => format!("{}", TypedKey::new(crypto_kind, id)), Some(id) => format!("{}", id),
None => { None => {
format!("({})?{}", crypto_kind, pi.node_ids) format!("({})?{}", crypto_kind, pi.node_ids)
} }

View File

@ -84,22 +84,22 @@ impl RPCAnswerDetail {
} }
veilid_capnp::answer::detail::GetValueA(r) => { veilid_capnp::answer::detail::GetValueA(r) => {
let op_reader = r.map_err(RPCError::protocol)?; let op_reader = r.map_err(RPCError::protocol)?;
let out = RPCOperationGetValueA::decode(&op_reader)?; let out = RPCOperationGetValueA::decode(&op_reader, crypto)?;
RPCAnswerDetail::GetValueA(out) RPCAnswerDetail::GetValueA(out)
} }
veilid_capnp::answer::detail::SetValueA(r) => { veilid_capnp::answer::detail::SetValueA(r) => {
let op_reader = r.map_err(RPCError::protocol)?; let op_reader = r.map_err(RPCError::protocol)?;
let out = RPCOperationSetValueA::decode(&op_reader)?; let out = RPCOperationSetValueA::decode(&op_reader, crypto)?;
RPCAnswerDetail::SetValueA(out) RPCAnswerDetail::SetValueA(out)
} }
veilid_capnp::answer::detail::WatchValueA(r) => { veilid_capnp::answer::detail::WatchValueA(r) => {
let op_reader = r.map_err(RPCError::protocol)?; let op_reader = r.map_err(RPCError::protocol)?;
let out = RPCOperationWatchValueA::decode(&op_reader)?; let out = RPCOperationWatchValueA::decode(&op_reader, crypto)?;
RPCAnswerDetail::WatchValueA(out) RPCAnswerDetail::WatchValueA(out)
} }
veilid_capnp::answer::detail::SupplyBlockA(r) => { veilid_capnp::answer::detail::SupplyBlockA(r) => {
let op_reader = r.map_err(RPCError::protocol)?; let op_reader = r.map_err(RPCError::protocol)?;
let out = RPCOperationSupplyBlockA::decode(&op_reader)?; let out = RPCOperationSupplyBlockA::decode(&op_reader, crypto)?;
RPCAnswerDetail::SupplyBlockA(out) RPCAnswerDetail::SupplyBlockA(out)
} }
veilid_capnp::answer::detail::FindBlockA(r) => { veilid_capnp::answer::detail::FindBlockA(r) => {

View File

@ -10,7 +10,7 @@ impl RPCOperationFindBlockQ {
reader: &veilid_capnp::operation_find_block_q::Reader, reader: &veilid_capnp::operation_find_block_q::Reader,
) -> Result<RPCOperationFindBlockQ, RPCError> { ) -> Result<RPCOperationFindBlockQ, RPCError> {
let bi_reader = reader.get_block_id().map_err(RPCError::protocol)?; let bi_reader = reader.get_block_id().map_err(RPCError::protocol)?;
let block_id = decode_key256(&bi_reader); let block_id = decode_typed_key(&bi_reader)?;
Ok(RPCOperationFindBlockQ { block_id }) Ok(RPCOperationFindBlockQ { block_id })
} }
@ -19,7 +19,7 @@ impl RPCOperationFindBlockQ {
builder: &mut veilid_capnp::operation_find_block_q::Builder, builder: &mut veilid_capnp::operation_find_block_q::Builder,
) -> Result<(), RPCError> { ) -> Result<(), RPCError> {
let mut bi_builder = builder.reborrow().init_block_id(); let mut bi_builder = builder.reborrow().init_block_id();
encode_key256(&self.block_id, &mut bi_builder)?; encode_typed_key(&self.block_id, &mut bi_builder);
Ok(()) Ok(())
} }

View File

@ -2,7 +2,8 @@ use super::*;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct RPCOperationGetValueQ { pub struct RPCOperationGetValueQ {
pub key: ValueKey, pub key: TypedKey,
pub subkey: ValueSubkey,
} }
impl RPCOperationGetValueQ { impl RPCOperationGetValueQ {
@ -10,15 +11,17 @@ impl RPCOperationGetValueQ {
reader: &veilid_capnp::operation_get_value_q::Reader, reader: &veilid_capnp::operation_get_value_q::Reader,
) -> Result<RPCOperationGetValueQ, RPCError> { ) -> Result<RPCOperationGetValueQ, RPCError> {
let k_reader = reader.get_key().map_err(RPCError::protocol)?; let k_reader = reader.get_key().map_err(RPCError::protocol)?;
let key = decode_value_key(&k_reader)?; let key = decode_typed_key(&k_reader)?;
Ok(RPCOperationGetValueQ { key }) let subkey = reader.get_subkey();
Ok(RPCOperationGetValueQ { key, subkey })
} }
pub fn encode( pub fn encode(
&self, &self,
builder: &mut veilid_capnp::operation_get_value_q::Builder, builder: &mut veilid_capnp::operation_get_value_q::Builder,
) -> Result<(), RPCError> { ) -> Result<(), RPCError> {
let mut k_builder = builder.reborrow().init_key(); let mut k_builder = builder.reborrow().init_key();
encode_value_key(&self.key, &mut k_builder)?; encode_typed_key(&self.key, &mut k_builder);
builder.set_subkey(self.subkey);
Ok(()) Ok(())
} }
} }
@ -32,6 +35,7 @@ pub enum RPCOperationGetValueA {
impl RPCOperationGetValueA { impl RPCOperationGetValueA {
pub fn decode( pub fn decode(
reader: &veilid_capnp::operation_get_value_a::Reader, reader: &veilid_capnp::operation_get_value_a::Reader,
crypto: Crypto,
) -> Result<RPCOperationGetValueA, RPCError> { ) -> Result<RPCOperationGetValueA, RPCError> {
match reader.which().map_err(RPCError::protocol)? { match reader.which().map_err(RPCError::protocol)? {
veilid_capnp::operation_get_value_a::Which::Data(r) => { veilid_capnp::operation_get_value_a::Which::Data(r) => {
@ -47,7 +51,7 @@ impl RPCOperationGetValueA {
.map_err(RPCError::map_internal("too many peers"))?, .map_err(RPCError::map_internal("too many peers"))?,
); );
for p in peers_reader.iter() { for p in peers_reader.iter() {
let peer_info = decode_peer_info(&p)?; let peer_info = decode_peer_info(&p, crypto.clone())?;
peers.push(peer_info); peers.push(peer_info);
} }

View File

@ -2,7 +2,8 @@ use super::*;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct RPCOperationSetValueQ { pub struct RPCOperationSetValueQ {
pub key: ValueKey, pub key: TypedKey,
pub subkey: ValueSubkey,
pub value: ValueData, pub value: ValueData,
} }
@ -11,17 +12,19 @@ impl RPCOperationSetValueQ {
reader: &veilid_capnp::operation_set_value_q::Reader, reader: &veilid_capnp::operation_set_value_q::Reader,
) -> Result<RPCOperationSetValueQ, RPCError> { ) -> Result<RPCOperationSetValueQ, RPCError> {
let k_reader = reader.get_key().map_err(RPCError::protocol)?; let k_reader = reader.get_key().map_err(RPCError::protocol)?;
let key = decode_value_key(&k_reader)?; let key = decode_typed_key(&k_reader)?;
let subkey = reader.get_subkey();
let v_reader = reader.get_value().map_err(RPCError::protocol)?; let v_reader = reader.get_value().map_err(RPCError::protocol)?;
let value = decode_value_data(&v_reader)?; let value = decode_value_data(&v_reader)?;
Ok(RPCOperationSetValueQ { key, value }) Ok(RPCOperationSetValueQ { key, subkey, value })
} }
pub fn encode( pub fn encode(
&self, &self,
builder: &mut veilid_capnp::operation_set_value_q::Builder, builder: &mut veilid_capnp::operation_set_value_q::Builder,
) -> Result<(), RPCError> { ) -> Result<(), RPCError> {
let mut k_builder = builder.reborrow().init_key(); let mut k_builder = builder.reborrow().init_key();
encode_value_key(&self.key, &mut k_builder)?; encode_typed_key(&self.key, &mut k_builder);
builder.set_subkey(self.subkey);
let mut v_builder = builder.reborrow().init_value(); let mut v_builder = builder.reborrow().init_value();
encode_value_data(&self.value, &mut v_builder)?; encode_value_data(&self.value, &mut v_builder)?;
Ok(()) Ok(())
@ -37,6 +40,7 @@ pub enum RPCOperationSetValueA {
impl RPCOperationSetValueA { impl RPCOperationSetValueA {
pub fn decode( pub fn decode(
reader: &veilid_capnp::operation_set_value_a::Reader, reader: &veilid_capnp::operation_set_value_a::Reader,
crypto: Crypto,
) -> Result<RPCOperationSetValueA, RPCError> { ) -> Result<RPCOperationSetValueA, RPCError> {
match reader.which().map_err(RPCError::protocol)? { match reader.which().map_err(RPCError::protocol)? {
veilid_capnp::operation_set_value_a::Which::Data(r) => { veilid_capnp::operation_set_value_a::Which::Data(r) => {
@ -52,7 +56,7 @@ impl RPCOperationSetValueA {
.map_err(RPCError::map_internal("too many peers"))?, .map_err(RPCError::map_internal("too many peers"))?,
); );
for p in peers_reader.iter() { for p in peers_reader.iter() {
let peer_info = decode_peer_info(&p)?; let peer_info = decode_peer_info(&p, crypto.clone())?;
peers.push(peer_info); peers.push(peer_info);
} }

View File

@ -2,7 +2,7 @@ use super::*;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct RPCOperationSupplyBlockQ { pub struct RPCOperationSupplyBlockQ {
pub block_id: PublicKey, pub block_id: TypedKey,
} }
impl RPCOperationSupplyBlockQ { impl RPCOperationSupplyBlockQ {
@ -10,7 +10,7 @@ impl RPCOperationSupplyBlockQ {
reader: &veilid_capnp::operation_supply_block_q::Reader, reader: &veilid_capnp::operation_supply_block_q::Reader,
) -> Result<RPCOperationSupplyBlockQ, RPCError> { ) -> Result<RPCOperationSupplyBlockQ, RPCError> {
let bi_reader = reader.get_block_id().map_err(RPCError::protocol)?; let bi_reader = reader.get_block_id().map_err(RPCError::protocol)?;
let block_id = decode_key256(&bi_reader); let block_id = decode_typed_key(&bi_reader)?;
Ok(RPCOperationSupplyBlockQ { block_id }) Ok(RPCOperationSupplyBlockQ { block_id })
} }
@ -19,7 +19,7 @@ impl RPCOperationSupplyBlockQ {
builder: &mut veilid_capnp::operation_supply_block_q::Builder, builder: &mut veilid_capnp::operation_supply_block_q::Builder,
) -> Result<(), RPCError> { ) -> Result<(), RPCError> {
let mut bi_builder = builder.reborrow().init_block_id(); let mut bi_builder = builder.reborrow().init_block_id();
encode_key256(&self.block_id, &mut bi_builder)?; encode_typed_key(&self.block_id, &mut bi_builder);
Ok(()) Ok(())
} }
@ -34,6 +34,7 @@ pub enum RPCOperationSupplyBlockA {
impl RPCOperationSupplyBlockA { impl RPCOperationSupplyBlockA {
pub fn decode( pub fn decode(
reader: &veilid_capnp::operation_supply_block_a::Reader, reader: &veilid_capnp::operation_supply_block_a::Reader,
crypto: Crypto,
) -> Result<RPCOperationSupplyBlockA, RPCError> { ) -> Result<RPCOperationSupplyBlockA, RPCError> {
match reader.which().map_err(RPCError::protocol)? { match reader.which().map_err(RPCError::protocol)? {
veilid_capnp::operation_supply_block_a::Which::Expiration(r) => { veilid_capnp::operation_supply_block_a::Which::Expiration(r) => {
@ -48,7 +49,7 @@ impl RPCOperationSupplyBlockA {
.map_err(RPCError::map_internal("too many peers"))?, .map_err(RPCError::map_internal("too many peers"))?,
); );
for p in peers_reader.iter() { for p in peers_reader.iter() {
let peer_info = decode_peer_info(&p)?; let peer_info = decode_peer_info(&p, crypto.clone())?;
peers.push(peer_info); peers.push(peer_info);
} }

View File

@ -2,7 +2,9 @@ use super::*;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct RPCOperationValueChanged { pub struct RPCOperationValueChanged {
pub key: ValueKey, pub key: TypedKey,
pub subkeys: Vec<ValueSubkeyRange>,
pub count: u32,
pub value: ValueData, pub value: ValueData,
} }
@ -11,17 +13,60 @@ impl RPCOperationValueChanged {
reader: &veilid_capnp::operation_value_changed::Reader, reader: &veilid_capnp::operation_value_changed::Reader,
) -> Result<RPCOperationValueChanged, RPCError> { ) -> Result<RPCOperationValueChanged, RPCError> {
let k_reader = reader.get_key().map_err(RPCError::protocol)?; let k_reader = reader.get_key().map_err(RPCError::protocol)?;
let key = decode_value_key(&k_reader)?; let key = decode_typed_key(&k_reader)?;
let sk_reader = reader.get_subkeys().map_err(RPCError::protocol)?;
let mut subkeys = Vec::<ValueSubkeyRange>::with_capacity(
sk_reader
.len()
.try_into()
.map_err(RPCError::map_protocol("too many subkey ranges"))?,
);
for skr in sk_reader.iter() {
let vskr = (skr.get_start(), skr.get_end());
if vskr.0 > vskr.1 {
return Err(RPCError::protocol("invalid subkey range"));
}
if let Some(lvskr) = subkeys.last() {
if lvskr.1 >= vskr.0 {
return Err(RPCError::protocol(
"subkey range out of order or not merged",
));
}
}
subkeys.push(vskr);
}
let count = reader.get_count();
let v_reader = reader.get_value().map_err(RPCError::protocol)?; let v_reader = reader.get_value().map_err(RPCError::protocol)?;
let value = decode_value_data(&v_reader)?; let value = decode_value_data(&v_reader)?;
Ok(RPCOperationValueChanged { key, value }) Ok(RPCOperationValueChanged {
key,
subkeys,
count,
value,
})
} }
pub fn encode( pub fn encode(
&self, &self,
builder: &mut veilid_capnp::operation_value_changed::Builder, builder: &mut veilid_capnp::operation_value_changed::Builder,
) -> Result<(), RPCError> { ) -> Result<(), RPCError> {
let mut k_builder = builder.reborrow().init_key(); let mut k_builder = builder.reborrow().init_key();
encode_value_key(&self.key, &mut k_builder)?; encode_typed_key(&self.key, &mut k_builder);
let mut sk_builder = builder.reborrow().init_subkeys(
self.subkeys
.len()
.try_into()
.map_err(RPCError::map_internal("invalid subkey range list length"))?,
);
for (i, skr) in self.subkeys.iter().enumerate() {
let mut skr_builder = sk_builder.reborrow().get(i as u32);
skr_builder.set_start(skr.0);
skr_builder.set_end(skr.1);
}
builder.set_count(self.count);
let mut v_builder = builder.reborrow().init_value(); let mut v_builder = builder.reborrow().init_value();
encode_value_data(&self.value, &mut v_builder)?; encode_value_data(&self.value, &mut v_builder)?;
Ok(()) Ok(())

View File

@ -2,7 +2,10 @@ use super::*;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct RPCOperationWatchValueQ { pub struct RPCOperationWatchValueQ {
pub key: ValueKey, pub key: TypedKey,
pub subkeys: Vec<ValueSubkeyRange>,
pub expiration: u64,
pub count: u32,
} }
impl RPCOperationWatchValueQ { impl RPCOperationWatchValueQ {
@ -10,15 +13,60 @@ impl RPCOperationWatchValueQ {
reader: &veilid_capnp::operation_watch_value_q::Reader, reader: &veilid_capnp::operation_watch_value_q::Reader,
) -> Result<RPCOperationWatchValueQ, RPCError> { ) -> Result<RPCOperationWatchValueQ, RPCError> {
let k_reader = reader.get_key().map_err(RPCError::protocol)?; let k_reader = reader.get_key().map_err(RPCError::protocol)?;
let key = decode_value_key(&k_reader)?; let key = decode_typed_key(&k_reader)?;
Ok(RPCOperationWatchValueQ { key })
let sk_reader = reader.get_subkeys().map_err(RPCError::protocol)?;
let mut subkeys = Vec::<ValueSubkeyRange>::with_capacity(
sk_reader
.len()
.try_into()
.map_err(RPCError::map_protocol("too many subkey ranges"))?,
);
for skr in sk_reader.iter() {
let vskr = (skr.get_start(), skr.get_end());
if vskr.0 > vskr.1 {
return Err(RPCError::protocol("invalid subkey range"));
}
if let Some(lvskr) = subkeys.last() {
if lvskr.1 >= vskr.0 {
return Err(RPCError::protocol(
"subkey range out of order or not merged",
));
}
}
subkeys.push(vskr);
}
let expiration = reader.get_expiration();
let count = reader.get_count();
Ok(RPCOperationWatchValueQ {
key,
subkeys,
expiration,
count,
})
} }
pub fn encode( pub fn encode(
&self, &self,
builder: &mut veilid_capnp::operation_watch_value_q::Builder, builder: &mut veilid_capnp::operation_watch_value_q::Builder,
) -> Result<(), RPCError> { ) -> Result<(), RPCError> {
let mut k_builder = builder.reborrow().init_key(); let mut k_builder = builder.reborrow().init_key();
encode_value_key(&self.key, &mut k_builder)?; encode_typed_key(&self.key, &mut k_builder);
let mut sk_builder = builder.reborrow().init_subkeys(
self.subkeys
.len()
.try_into()
.map_err(RPCError::map_internal("invalid subkey range list length"))?,
);
for (i, skr) in self.subkeys.iter().enumerate() {
let mut skr_builder = sk_builder.reborrow().get(i as u32);
skr_builder.set_start(skr.0);
skr_builder.set_end(skr.1);
}
builder.set_expiration(self.expiration);
builder.set_count(self.count);
Ok(()) Ok(())
} }
} }
@ -32,6 +80,7 @@ pub struct RPCOperationWatchValueA {
impl RPCOperationWatchValueA { impl RPCOperationWatchValueA {
pub fn decode( pub fn decode(
reader: &veilid_capnp::operation_watch_value_a::Reader, reader: &veilid_capnp::operation_watch_value_a::Reader,
crypto: Crypto,
) -> Result<RPCOperationWatchValueA, RPCError> { ) -> Result<RPCOperationWatchValueA, RPCError> {
let expiration = reader.get_expiration(); let expiration = reader.get_expiration();
let peers_reader = reader.get_peers().map_err(RPCError::protocol)?; let peers_reader = reader.get_peers().map_err(RPCError::protocol)?;
@ -42,7 +91,7 @@ impl RPCOperationWatchValueA {
.map_err(RPCError::map_internal("too many peers"))?, .map_err(RPCError::map_internal("too many peers"))?,
); );
for p in peers_reader.iter() { for p in peers_reader.iter() {
let peer_info = decode_peer_info(&p)?; let peer_info = decode_peer_info(&p, crypto.clone())?;
peers.push(peer_info); peers.push(peer_info);
} }