@@ -65,7 +65,7 @@ use crate::offers::merkle::SignError;
6565use crate::offers::offer::{Offer, OfferBuilder};
6666use crate::offers::parse::Bolt12SemanticError;
6767use crate::offers::refund::{Refund, RefundBuilder};
68- use crate::onion_message::messenger::{Destination, MessageRouter, PendingOnionMessage, new_pending_onion_message };
68+ use crate::onion_message::messenger::{new_pending_onion_message, Destination, MessageRouter, PendingOnionMessage, Responder, ResponseInstruction };
6969use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
7070use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
7171use crate::sign::ecdsa::WriteableEcdsaChannelSigner;
@@ -76,6 +76,7 @@ use crate::util::string::UntrustedString;
7676use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
7777use crate::util::logger::{Level, Logger, WithContext};
7878use crate::util::errors::APIError;
79+
7980#[cfg(not(c_bindings))]
8081use {
8182 crate::offers::offer::DerivedMetadata,
@@ -9450,24 +9451,34 @@ where
94509451 R::Target: Router,
94519452 L::Target: Logger,
94529453{
9453- fn handle_message(&self, message: OffersMessage) -> Option<OffersMessage> {
9454+ fn handle_message(&self, message: OffersMessage, responder: Option<Responder<OffersMessage>>) -> ResponseInstruction<OffersMessage>
9455+ {
94549456 let secp_ctx = &self.secp_ctx;
94559457 let expanded_key = &self.inbound_payment_key;
94569458
9457- match message {
9459+ let respond = |response| {
9460+ match responder {
9461+ Some(responder) => responder.respond(response),
9462+ None => ResponseInstruction::NoResponse,
9463+ }
9464+ };
9465+
9466+ let response_opt = match &message {
94589467 OffersMessage::InvoiceRequest(invoice_request) => {
94599468 let amount_msats = match InvoiceBuilder::<DerivedSigningPubkey>::amount_msats(
94609469 &invoice_request
94619470 ) {
94629471 Ok(amount_msats) => amount_msats,
9463- Err(error) => return Some(OffersMessage::InvoiceError(error.into())),
9472+ Err(error) => {
9473+ return respond(OffersMessage::InvoiceError(error.into()));
9474+ }
94649475 };
9465- let invoice_request = match invoice_request.verify(expanded_key, secp_ctx) {
9476+ let invoice_request = match invoice_request.clone(). verify(expanded_key, secp_ctx) {
94669477 Ok(invoice_request) => invoice_request,
94679478 Err(()) => {
94689479 let error = Bolt12SemanticError::InvalidMetadata;
9469- return Some (OffersMessage::InvoiceError(error.into()));
9470- },
9480+ return respond (OffersMessage::InvoiceError(error.into()));
9481+ }
94719482 };
94729483
94739484 let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;
@@ -9477,8 +9488,8 @@ where
94779488 Ok((payment_hash, payment_secret)) => (payment_hash, payment_secret),
94789489 Err(()) => {
94799490 let error = Bolt12SemanticError::InvalidAmount;
9480- return Some (OffersMessage::InvoiceError(error.into()));
9481- },
9491+ return respond (OffersMessage::InvoiceError(error.into()));
9492+ }
94829493 };
94839494
94849495 let payment_paths = match self.create_blinded_payment_paths(
@@ -9487,8 +9498,8 @@ where
94879498 Ok(payment_paths) => payment_paths,
94889499 Err(()) => {
94899500 let error = Bolt12SemanticError::MissingPaths;
9490- return Some (OffersMessage::InvoiceError(error.into()));
9491- },
9501+ return respond (OffersMessage::InvoiceError(error.into()));
9502+ }
94929503 };
94939504
94949505 #[cfg(not(feature = "std"))]
@@ -9565,6 +9576,11 @@ where
95659576 log_trace!(self.logger, "Received invoice_error: {}", invoice_error);
95669577 None
95679578 },
9579+ };
9580+
9581+ match response_opt {
9582+ Some(response) => respond(response),
9583+ None => ResponseInstruction::NoResponse
95689584 }
95699585 }
95709586
0 commit comments