//! Wire messages, traits representing wire message handlers, and a few error types live here.
+//!
//! For a normal node you probably don't need to use anything here, however, if you wish to split a
//! node into an internet-facing route/message socket handling daemon and a separate daemon (or
//! server entirely) which handles only channel-related messages you may wish to implement
//! ChannelMessageHandler yourself and use it to re-serialize messages and pass them across
//! daemons/servers.
+//!
//! Note that if you go with such an architecture (instead of passing raw socket events to a
//! non-internet-facing system) you trust the frontend internet-facing system to not lie about the
//! source node_id of the mssage, however this does allow you to significantly reduce bandwidth
/// An error in decoding a message or struct.
#[derive(Debug)]
pub enum DecodeError {
- /// Unknown realm byte in an OnionHopData packet
- UnknownRealmByte,
+ /// A version byte specified something we don't know how to handle.
+ /// Includes unknown realm byte in an OnionHopData packet
+ UnknownVersion,
/// Unknown feature mandating we fail to parse message
UnknownRequiredFeature,
- /// Failed to decode a public key (ie it's invalid)
- BadPublicKey,
- /// Failed to decode a signature (ie it's invalid)
- BadSignature,
- /// Value expected to be text wasn't decodable as text
- BadText,
+ /// Value was invalid, eg a byte which was supposed to be a bool was something other than a 0
+ /// or 1, a public key/private key/signature was invalid, text wasn't UTF-8, etc
+ InvalidValue,
/// Buffer too short
ShortRead,
/// node_announcement included more than one address of a given type!
BadLengthDescriptor,
/// Error from std::io
Io(::std::io::Error),
- /// 1 or 0 is not found for boolean value
- InvalidValue,
}
/// Tracks localfeatures which are only in init messages
pub(crate) update_fulfill_htlcs: Vec<UpdateFulfillHTLC>,
pub(crate) update_fail_htlcs: Vec<UpdateFailHTLC>,
pub(crate) update_fail_malformed_htlcs: Vec<UpdateFailMalformedHTLC>,
+ pub(crate) update_fee: Option<UpdateFee>,
pub(crate) commitment_signed: CommitmentSigned,
}
},
}
-/// A trait to describe an object which can receive channel messages. Messages MAY be called in
-/// parallel when they originate from different their_node_ids, however they MUST NOT be called in
-/// parallel when the two calls have the same their_node_id.
+/// A trait to describe an object which can receive channel messages.
+///
+/// Messages MAY be called in parallel when they originate from different their_node_ids, however
+/// they MUST NOT be called in parallel when the two calls have the same their_node_id.
pub trait ChannelMessageHandler : events::EventsProvider + Send + Sync {
//Channel init:
/// Handle an incoming open_channel message from the given peer.
impl Error for DecodeError {
fn description(&self) -> &str {
match *self {
- DecodeError::UnknownRealmByte => "Unknown realm byte in Onion packet",
+ DecodeError::UnknownVersion => "Unknown realm byte in Onion packet",
DecodeError::UnknownRequiredFeature => "Unknown required feature preventing decode",
- DecodeError::BadPublicKey => "Invalid public key in packet",
- DecodeError::BadSignature => "Invalid signature in packet",
- DecodeError::BadText => "Invalid text in packet",
+ DecodeError::InvalidValue => "Nonsense bytes didn't map to the type they were interpreted as",
DecodeError::ShortRead => "Packet extended beyond the provided bytes",
DecodeError::ExtraAddressesPerType => "More than one address of a single type",
DecodeError::BadLengthDescriptor => "A length descriptor in the packet didn't describe the later data correctly",
DecodeError::Io(ref e) => e.description(),
- DecodeError::InvalidValue => "0 or 1 is not found for boolean",
}
}
}
realm: {
let r: u8 = Readable::read(r)?;
if r != 0 {
- return Err(DecodeError::UnknownRealmByte);
+ return Err(DecodeError::UnknownVersion);
}
r
},
sz = cmp::min(data_len, sz);
match String::from_utf8(data[..sz as usize].to_vec()) {
Ok(s) => s,
- Err(_) => return Err(DecodeError::BadText),
+ Err(_) => return Err(DecodeError::InvalidValue),
}
}
})