e2d7b51a9b5255703108e7c4e1563d8b2fceb13c
[rust-lightning] / lightning / src / onion_message / messenger.rs
1 // This file is Copyright its original authors, visible in version control
2 // history.
3 //
4 // This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5 // or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7 // You may not use this file except in accordance with one or both of these
8 // licenses.
9
10 //! LDK sends, receives, and forwards onion messages via the [`OnionMessenger`]. See its docs for
11 //! more information.
12
13 use bitcoin::secp256k1::{self, PublicKey, Secp256k1};
14
15 use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Sign};
16 use ln::msgs;
17 use util::logger::Logger;
18
19 use core::ops::Deref;
20 use sync::{Arc, Mutex};
21 use prelude::*;
22
23 /// A sender, receiver and forwarder of onion messages. In upcoming releases, this object will be
24 /// used to retrieve invoices and fulfill invoice requests from [offers].
25 ///
26 /// [offers]: <https://github.com/lightning/bolts/pull/798>
27 pub struct OnionMessenger<Signer: Sign, K: Deref, L: Deref>
28         where K::Target: KeysInterface<Signer = Signer>,
29               L::Target: Logger,
30 {
31         keys_manager: K,
32         logger: L,
33         pending_messages: Mutex<HashMap<PublicKey, Vec<msgs::OnionMessage>>>,
34         secp_ctx: Secp256k1<secp256k1::All>,
35         // Coming soon:
36         // invoice_handler: InvoiceHandler,
37         // custom_handler: CustomHandler, // handles custom onion messages
38 }
39
40 impl<Signer: Sign, K: Deref, L: Deref> OnionMessenger<Signer, K, L>
41         where K::Target: KeysInterface<Signer = Signer>,
42               L::Target: Logger,
43 {
44         /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
45         /// their respective handlers.
46         pub fn new(keys_manager: K, logger: L) -> Self {
47                 let mut secp_ctx = Secp256k1::new();
48                 secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
49                 OnionMessenger {
50                         keys_manager,
51                         pending_messages: Mutex::new(HashMap::new()),
52                         secp_ctx,
53                         logger,
54                 }
55         }
56 }
57
58 // TODO: parameterize the below Simple* types with OnionMessenger and handle the messages it
59 // produces
60 /// Useful for simplifying the parameters of [`SimpleArcChannelManager`] and
61 /// [`SimpleArcPeerManager`]. See their docs for more details.
62 ///
63 ///[`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
64 ///[`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
65 pub type SimpleArcOnionMessenger<L> = OnionMessenger<InMemorySigner, Arc<KeysManager>, Arc<L>>;
66 /// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
67 /// [`SimpleRefPeerManager`]. See their docs for more details.
68 ///
69 ///[`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
70 ///[`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
71 pub type SimpleRefOnionMessenger<'a, 'b, L> = OnionMessenger<InMemorySigner, &'a KeysManager, &'b L>;