Skip to content

Commit 29cd1c5

Browse files
committed
Add onion message handler
1 parent 4b0de09 commit 29cd1c5

3 files changed

Lines changed: 50 additions & 12 deletions

File tree

src/builder.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use crate::types::{
1414
use crate::wallet::Wallet;
1515
use crate::LogLevel;
1616
use crate::{
17-
Config, Node, BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP, DEFAULT_ESPLORA_SERVER_URL,
18-
WALLET_KEYS_SEED_LEN,
17+
Config, Node, OnionMessageHandler, BDK_CLIENT_CONCURRENCY, BDK_CLIENT_STOP_GAP,
18+
DEFAULT_ESPLORA_SERVER_URL, WALLET_KEYS_SEED_LEN,
1919
};
2020

2121
use lightning::chain::keysinterface::EntropySource;
@@ -42,6 +42,7 @@ use bip39::Mnemonic;
4242

4343
use bitcoin::BlockHash;
4444

45+
use std::collections::VecDeque;
4546
use std::convert::TryInto;
4647
use std::default::Default;
4748
use std::fmt;
@@ -394,11 +395,8 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
394395
};
395396

396397
// Initialize the Logger
397-
let log_file_path = format!(
398-
"{}/ldk_node_{}.log",
399-
log_dir,
400-
chrono::offset::Local::now().format("%Y_%m_%d")
401-
);
398+
let log_file_path =
399+
format!("{}/ldk_node_{}.log", log_dir, chrono::offset::Local::now().format("%Y_%m_%d"));
402400
let logger = Arc::new(
403401
FilesystemLogger::new(log_file_path.clone(), config.log_level)
404402
.map_err(|_| BuildError::LoggerSetupFailed)?,
@@ -611,12 +609,15 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
611609
chain_monitor.watch_channel(funding_outpoint, channel_monitor);
612610
}
613611

612+
let onion_message_handler =
613+
Arc::new(OnionMessageHandler { messages: Mutex::new(VecDeque::new()) });
614+
614615
// Initialize the PeerManager
615616
let onion_messenger: Arc<OnionMessenger> = Arc::new(OnionMessenger::new(
616617
Arc::clone(&keys_manager),
617618
Arc::clone(&keys_manager),
618619
Arc::clone(&logger),
619-
IgnoringMessageHandler {},
620+
Arc::clone(&onion_message_handler),
620621
));
621622
let ephemeral_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
622623

@@ -738,6 +739,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
738739
scorer,
739740
peer_store,
740741
payment_store,
741-
onion_messenger: onion_messenger,
742+
onion_messenger,
743+
custom_handler: onion_message_handler,
742744
})
743745
}

src/lib.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,17 @@ use logger::{log_error, log_info, log_trace, FilesystemLogger, Logger};
128128

129129
use lightning::chain::keysinterface::EntropySource;
130130
use lightning::chain::Confirm;
131+
use lightning::io::Read;
131132
use lightning::ln::channelmanager::{self, PaymentId, RecipientOnionFields, Retry};
133+
use lightning::ln::msgs::DecodeError;
132134
use lightning::ln::{PaymentHash, PaymentPreimage};
133-
use lightning::onion_message::{CustomOnionMessageContents, Destination, OnionMessageContents};
135+
use lightning::onion_message::{
136+
CustomOnionMessageContents, CustomOnionMessageHandler, Destination, OnionMessageContents,
137+
};
134138

135-
use lightning::util::ser::{Writeable, Writer};
136139
use lightning::util::config::{ChannelConfig, ChannelHandshakeConfig, UserConfig};
137140
pub use lightning::util::logger::Level as LogLevel;
141+
use lightning::util::ser::{Writeable, Writer};
138142

139143
use lightning_background_processor::process_events_async;
140144

@@ -152,8 +156,10 @@ use bitcoin::{Address, Txid};
152156

153157
use rand::Rng;
154158

159+
use std::collections::VecDeque;
155160
use std::default::Default;
156161
use std::net::ToSocketAddrs;
162+
use std::ops::Deref;
157163
use std::sync::{Arc, Mutex, RwLock};
158164
use std::time::{Duration, Instant, SystemTime};
159165

@@ -214,6 +220,34 @@ impl Writeable for UserOnionMessageContents {
214220
}
215221
}
216222

223+
// An extremely basic message handler needed for our integration tests.
224+
pub struct OnionMessageHandler {
225+
pub messages: Mutex<VecDeque<UserOnionMessageContents>>,
226+
}
227+
228+
impl CustomOnionMessageHandler for OnionMessageHandler {
229+
type CustomMessage = UserOnionMessageContents;
230+
231+
fn handle_custom_message(&self, msg: Self::CustomMessage) {
232+
println!("Received a new custom message!");
233+
self.messages.lock().unwrap().push_back(msg);
234+
}
235+
236+
fn read_custom_message<R: Read>(
237+
&self, message_type: u64, buffer: &mut R,
238+
) -> Result<Option<Self::CustomMessage>, DecodeError> {
239+
unimplemented!();
240+
}
241+
}
242+
243+
impl Deref for OnionMessageHandler {
244+
type Target = OnionMessageHandler;
245+
246+
fn deref(&self) -> &Self::Target {
247+
&self
248+
}
249+
}
250+
217251
#[derive(Debug, Clone)]
218252
/// Represents the configuration of an [`Node`] instance.
219253
///
@@ -309,6 +343,7 @@ pub struct Node<K: KVStore + Sync + Send + 'static> {
309343
peer_store: Arc<PeerStore<K, Arc<FilesystemLogger>>>,
310344
payment_store: Arc<PaymentStore<K, Arc<FilesystemLogger>>>,
311345
onion_messenger: Arc<OnionMessenger>,
346+
pub custom_handler: Arc<OnionMessageHandler>,
312347
}
313348

314349
impl<K: KVStore + Sync + Send + 'static> Node<K> {

src/types.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::logger::FilesystemLogger;
22
use crate::wallet::{Wallet, WalletKeysManager};
3+
use crate::OnionMessageHandler;
34

45
use lightning::chain::chainmonitor;
56
use lightning::chain::keysinterface::InMemorySigner;
@@ -84,7 +85,7 @@ pub(crate) type OnionMessenger = lightning::onion_message::OnionMessenger<
8485
Arc<WalletKeysManager<bdk::database::SqliteDatabase, Arc<FilesystemLogger>>>,
8586
Arc<WalletKeysManager<bdk::database::SqliteDatabase, Arc<FilesystemLogger>>>,
8687
Arc<FilesystemLogger>,
87-
IgnoringMessageHandler,
88+
Arc<OnionMessageHandler>,
8889
>;
8990

9091
/// The global identifier of a channel.

0 commit comments

Comments
 (0)