lightning/onion_message/
async_payments.rs1use crate::blinded_path::message::AsyncPaymentsContext;
13use crate::io;
14use crate::ln::msgs::DecodeError;
15use crate::onion_message::messenger::{MessageSendInstructions, Responder, ResponseInstruction};
16use crate::onion_message::packet::OnionMessageContents;
17use crate::prelude::*;
18use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
19
20const HELD_HTLC_AVAILABLE_TLV_TYPE: u64 = 72;
22const RELEASE_HELD_HTLC_TLV_TYPE: u64 = 74;
23
24pub trait AsyncPaymentsMessageHandler {
28 fn handle_held_htlc_available(
31 &self, message: HeldHtlcAvailable, responder: Option<Responder>,
32 ) -> Option<(ReleaseHeldHtlc, ResponseInstruction)>;
33
34 fn handle_release_held_htlc(&self, message: ReleaseHeldHtlc, context: AsyncPaymentsContext);
37
38 fn release_pending_messages(&self) -> Vec<(AsyncPaymentsMessage, MessageSendInstructions)> {
43 vec![]
44 }
45}
46
47#[derive(Clone, Debug)]
51pub enum AsyncPaymentsMessage {
52 HeldHtlcAvailable(HeldHtlcAvailable),
55
56 ReleaseHeldHtlc(ReleaseHeldHtlc),
58}
59
60#[derive(Clone, Debug)]
64pub struct HeldHtlcAvailable {}
65
66#[derive(Clone, Debug)]
68pub struct ReleaseHeldHtlc {}
69
70impl OnionMessageContents for ReleaseHeldHtlc {
71 fn tlv_type(&self) -> u64 {
72 RELEASE_HELD_HTLC_TLV_TYPE
73 }
74 #[cfg(c_bindings)]
75 fn msg_type(&self) -> String {
76 "Release Held HTLC".to_string()
77 }
78 #[cfg(not(c_bindings))]
79 fn msg_type(&self) -> &'static str {
80 "Release Held HTLC"
81 }
82}
83
84impl_writeable_tlv_based!(HeldHtlcAvailable, {});
85
86impl_writeable_tlv_based!(ReleaseHeldHtlc, {});
87
88impl AsyncPaymentsMessage {
89 pub fn is_known_type(tlv_type: u64) -> bool {
91 match tlv_type {
92 HELD_HTLC_AVAILABLE_TLV_TYPE | RELEASE_HELD_HTLC_TLV_TYPE => true,
93 _ => false,
94 }
95 }
96}
97
98impl OnionMessageContents for AsyncPaymentsMessage {
99 fn tlv_type(&self) -> u64 {
100 match self {
101 Self::HeldHtlcAvailable(_) => HELD_HTLC_AVAILABLE_TLV_TYPE,
102 Self::ReleaseHeldHtlc(msg) => msg.tlv_type(),
103 }
104 }
105 #[cfg(c_bindings)]
106 fn msg_type(&self) -> String {
107 match &self {
108 Self::HeldHtlcAvailable(_) => "Held HTLC Available".to_string(),
109 Self::ReleaseHeldHtlc(msg) => msg.msg_type(),
110 }
111 }
112 #[cfg(not(c_bindings))]
113 fn msg_type(&self) -> &'static str {
114 match &self {
115 Self::HeldHtlcAvailable(_) => "Held HTLC Available",
116 Self::ReleaseHeldHtlc(msg) => msg.msg_type(),
117 }
118 }
119}
120
121impl Writeable for AsyncPaymentsMessage {
122 fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
123 match self {
124 Self::HeldHtlcAvailable(message) => message.write(w),
125 Self::ReleaseHeldHtlc(message) => message.write(w),
126 }
127 }
128}
129
130impl ReadableArgs<u64> for AsyncPaymentsMessage {
131 fn read<R: io::Read>(r: &mut R, tlv_type: u64) -> Result<Self, DecodeError> {
132 match tlv_type {
133 HELD_HTLC_AVAILABLE_TLV_TYPE => Ok(Self::HeldHtlcAvailable(Readable::read(r)?)),
134 RELEASE_HELD_HTLC_TLV_TYPE => Ok(Self::ReleaseHeldHtlc(Readable::read(r)?)),
135 _ => Err(DecodeError::InvalidValue),
136 }
137 }
138}