@@ -14,8 +14,10 @@ use bitcoin::hashes::{Hash, HashEngine};
1414use bitcoin:: hashes:: hmac:: { Hmac , HmacEngine } ;
1515use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
1616use bitcoin:: secp256k1:: { self , PublicKey , Scalar , Secp256k1 , SecretKey } ;
17+ use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
1718
1819use crate :: chain:: keysinterface:: { InMemorySigner , KeysInterface , KeysManager , Recipient , Sign } ;
20+ use crate :: ln:: PaymentHash ;
1921use crate :: ln:: features:: { InitFeatures , NodeFeatures } ;
2022use crate :: ln:: msgs:: { self , OnionMessageHandler } ;
2123use crate :: ln:: onion_utils;
@@ -29,6 +31,7 @@ use crate::util::logger::Logger;
2931use crate :: util:: ser:: Writeable ;
3032
3133use core:: ops:: Deref ;
34+ use crate :: io;
3235use crate :: sync:: { Arc , Mutex } ;
3336use crate :: prelude:: * ;
3437
@@ -47,7 +50,7 @@ use crate::prelude::*;
4750/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
4851/// # use lightning::onion_message::{BlindedRoute, CustomOnionMessageContents, Destination, OnionMessageContents, OnionMessenger};
4952/// # use lightning::util::logger::{Logger, Record};
50- /// # use lightning::util::ser::{MaybeReadableArgs, Writeable, Writer};
53+ /// # use lightning::util::ser::{Writeable, Writer};
5154/// # use lightning::io;
5255/// # use std::sync::Arc;
5356/// # struct FakeLogger {};
@@ -81,13 +84,6 @@ use crate::prelude::*;
8184/// your_custom_message_type
8285/// }
8386/// }
84- /// impl MaybeReadableArgs<u64> for YourCustomMessage {
85- /// fn read<R: io::Read>(r: &mut R, message_type: u64) -> Result<Option<Self>, DecodeError> {
86- /// # unreachable!()
87- /// // Read your custom onion message of type `message_type` from `r`, or return `None`
88- /// // if the message type is unknown
89- /// }
90- /// }
9187/// // Send a custom onion message to a node id.
9288/// let intermediate_hops = [hop_node_id1, hop_node_id2];
9389/// let reply_path = None;
@@ -178,6 +174,9 @@ pub trait CustomOnionMessageHandler {
178174 type CustomMessage : CustomOnionMessageContents ;
179175 /// Called with the custom message that was received.
180176 fn handle_custom_message ( & self , msg : Self :: CustomMessage ) ;
177+ /// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
178+ /// message type is unknown.
179+ fn read < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
181180}
182181
183182impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessenger < Signer , K , L , CMH >
@@ -276,10 +275,19 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
276275 false
277276}
278277
278+ impl < ' a , T : CustomOnionMessageHandler > onion_utils:: DecodeInput for ( SharedSecret , & ' a T ) {
279+ type Arg = ( SharedSecret , & ' a T ) ;
280+ fn payment_hash ( & self ) -> Option < & PaymentHash > {
281+ None
282+ }
283+ fn read_arg ( self ) -> Self :: Arg { self }
284+ }
285+
279286impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessageHandler for OnionMessenger < Signer , K , L , CMH >
280287 where K :: Target : KeysInterface < Signer = Signer > ,
281288 L :: Target : Logger ,
282- CMH :: Target : CustomOnionMessageHandler ,
289+ CMH :: Target : CustomOnionMessageHandler + Sized , // XXX: No idea why rustc desperately
290+ // wants Sized here, it's kinda dumb
283291{
284292 /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
285293 /// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -309,7 +317,7 @@ impl<Signer: Sign, K: Deref, L: Deref, CMH: Deref> OnionMessageHandler for Onion
309317 }
310318 } ;
311319 match onion_utils:: decode_next_hop ( onion_decode_ss, & msg. onion_routing_packet . hop_data [ ..] ,
312- msg. onion_routing_packet . hmac , control_tlvs_ss)
320+ msg. onion_routing_packet . hmac , ( control_tlvs_ss, & * self . custom_handler ) )
313321 {
314322 Ok ( ( Payload :: Receive :: < <<CMH as Deref >:: Target as CustomOnionMessageHandler >:: CustomMessage > {
315323 message, control_tlvs : ReceiveControlTlvs :: Unblinded ( ReceiveTlvs { path_id } ) , reply_path,
0 commit comments