@@ -16,6 +16,7 @@ use crate::ln::msgs::DecodeError;
1616use crate :: ln:: onion_utils;
1717use super :: blinded_path:: { BlindedPath , ForwardTlvs , ReceiveTlvs } ;
1818use super :: messenger:: CustomOnionMessageHandler ;
19+ use super :: offers:: OffersMessage ;
1920use crate :: util:: chacha20poly1305rfc:: { ChaChaPolyReadAdapter , ChaChaPolyWriteAdapter } ;
2021use crate :: util:: ser:: { BigSize , FixedLengthReader , LengthRead , LengthReadable , LengthReadableArgs , Readable , ReadableArgs , Writeable , Writer } ;
2122
@@ -108,10 +109,8 @@ pub(super) enum Payload<T: CustomOnionMessageContents> {
108109/// The contents of an onion message. In the context of offers, this would be the invoice, invoice
109110/// request, or invoice error.
110111pub enum OnionMessageContents < T : CustomOnionMessageContents > {
111- // Coming soon:
112- // Invoice,
113- // InvoiceRequest,
114- // InvoiceError,
112+ /// A message related to BOLT 12 Offers.
113+ Offers ( OffersMessage ) ,
115114 /// A custom onion message specified by the user.
116115 Custom ( T ) ,
117116}
@@ -122,6 +121,7 @@ impl<T: CustomOnionMessageContents> OnionMessageContents<T> {
122121 /// (C-not exported) as methods on non-cloneable enums are not currently exportable
123122 pub fn tlv_type ( & self ) -> u64 {
124123 match self {
124+ & OnionMessageContents :: Offers ( ref msg) => msg. tlv_type ( ) ,
125125 & OnionMessageContents :: Custom ( ref msg) => msg. tlv_type ( ) ,
126126 }
127127 }
@@ -131,6 +131,7 @@ impl<T: CustomOnionMessageContents> OnionMessageContents<T> {
131131impl < T : CustomOnionMessageContents > Writeable for OnionMessageContents < T > {
132132 fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
133133 match self {
134+ OnionMessageContents :: Offers ( msg) => Ok ( msg. write ( w) ?) ,
134135 OnionMessageContents :: Custom ( msg) => Ok ( msg. write ( w) ?) ,
135136 }
136137 }
@@ -215,19 +216,30 @@ impl<H: CustomOnionMessageHandler> ReadableArgs<(SharedSecret, &H)> for Payload<
215216 decode_tlv_stream_with_custom_tlv_decode ! ( & mut rd, {
216217 ( 2 , reply_path, option) ,
217218 ( 4 , read_adapter, ( option: LengthReadableArgs , rho) ) ,
218- } , |msg_type, msg_reader| {
219+ } , |msg_type, msg_reader: & mut FixedLengthReader <_> | {
219220 if msg_type < 64 { return Ok ( false ) }
220221 // Don't allow reading more than one data TLV from an onion message.
221222 if message_type. is_some( ) { return Err ( DecodeError :: InvalidValue ) }
222223
223224 message_type = Some ( msg_type) ;
224- match handler. read_custom_message( msg_type, msg_reader) {
225- Ok ( Some ( msg) ) => {
226- message = Some ( msg) ;
227- Ok ( true )
225+ match msg_type {
226+ tlv_type if OffersMessage :: is_known_type( tlv_type) => {
227+ match OffersMessage :: read( msg_reader, tlv_type) {
228+ Ok ( msg) => {
229+ message = Some ( OnionMessageContents :: Offers ( msg) ) ;
230+ Ok ( true )
231+ } ,
232+ Err ( e) => Err ( e) ,
233+ }
234+ } ,
235+ _ => match handler. read_custom_message( msg_type, msg_reader) {
236+ Ok ( Some ( msg) ) => {
237+ message = Some ( OnionMessageContents :: Custom ( msg) ) ;
238+ Ok ( true )
239+ } ,
240+ Ok ( None ) => Ok ( false ) ,
241+ Err ( e) => Err ( e) ,
228242 } ,
229- Ok ( None ) => Ok ( false ) ,
230- Err ( e) => Err ( e) ,
231243 }
232244 } ) ;
233245 rd. eat_remaining ( ) . map_err ( |_| DecodeError :: ShortRead ) ?;
@@ -245,7 +257,7 @@ impl<H: CustomOnionMessageHandler> ReadableArgs<(SharedSecret, &H)> for Payload<
245257 Ok ( Payload :: Receive {
246258 control_tlvs : ReceiveControlTlvs :: Unblinded ( tlvs) ,
247259 reply_path,
248- message : OnionMessageContents :: Custom ( message. unwrap ( ) ) ,
260+ message : message. unwrap ( ) ,
249261 } )
250262 }
251263 }
0 commit comments