') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Add concrete `NO_*` consts to avoid users having to specify types by TheBlueMatt · Pull Request #4100 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions lightning-background-processor/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,8 @@ use std::time::Instant;

#[cfg(not(feature = "std"))]
use alloc::boxed::Box;
#[cfg(all(not(c_bindings), not(feature = "std")))]
use alloc::sync::Arc;

/// `BackgroundProcessor` takes care of tasks that (1) need to happen periodically to keep
/// Rust-Lightning running properly, and (2) either can or should be run in the background. Its
Expand DownExpand Up@@ -331,6 +333,104 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
true
}

#[cfg(not(c_bindings))]
type DynRouter = lightning::routing::router::DefaultRouter<
&'static NetworkGraph<&'static dyn Logger>,
&'static dyn Logger,
&'static dyn EntropySource,
&'static core::cell::RefCell<
lightning::routing::scoring::ProbabilisticScorer<
&'static NetworkGraph<&'static dyn Logger>,
&'static dyn Logger,
>,
>,
lightning::routing::scoring::ProbabilisticScoringFeeParameters,
lightning::routing::scoring::ProbabilisticScorer<
&'static NetworkGraph<&'static dyn Logger>,
&'static dyn Logger,
>,
>;

#[cfg(not(c_bindings))]
type DynMessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
&'static NetworkGraph<&'static dyn Logger>,
&'static dyn Logger,
&'static dyn EntropySource,
>;

#[cfg(all(not(c_bindings), not(taproot)))]
type DynSignerProvider =
dyn lightning::sign::SignerProvider<EcdsaSigner = lightning::sign::InMemorySigner>;

#[cfg(all(not(c_bindings), taproot))]
type DynSignerProvider = dyn lightning::sign::SignerProvider<
EcdsaSigner = lightning::sign::InMemorySigner,
TaprootSigner = lightning::sign::InMemorySigner,
>;

#[cfg(not(c_bindings))]
type DynChannelManager = lightning::ln::channelmanager::ChannelManager<
&'static dyn chain::Watch<lightning::sign::InMemorySigner>,
&'static dyn BroadcasterInterface,
&'static dyn EntropySource,
&'static dyn lightning::sign::NodeSigner,
&'static DynSignerProvider,
&'static dyn FeeEstimator,
&'static DynRouter,
&'static DynMessageRouter,
&'static dyn Logger,
>;

/// When initializing a background processor without an onion messenger, this can be used to avoid
/// specifying a concrete `OnionMessenger` type.
#[cfg(not(c_bindings))]
pub const NO_ONION_MESSENGER: Option<
Arc<
dyn AOnionMessenger<
EntropySource = dyn EntropySource,
ES = &dyn EntropySource,
NodeSigner = dyn lightning::sign::NodeSigner,
NS = &dyn lightning::sign::NodeSigner,
Logger = dyn Logger,
L = &'static dyn Logger,
NodeIdLookUp = DynChannelManager,
NL = &'static DynChannelManager,
MessageRouter = DynMessageRouter,
MR = &'static DynMessageRouter,
OffersMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler,
OMH = &'static lightning::ln::peer_handler::IgnoringMessageHandler,
AsyncPaymentsMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler,
APH = &'static lightning::ln::peer_handler::IgnoringMessageHandler,
DNSResolverMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler,
DRH = &'static lightning::ln::peer_handler::IgnoringMessageHandler,
CustomOnionMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler,
CMH = &'static lightning::ln::peer_handler::IgnoringMessageHandler,
> + Send
+ Sync,
>,
> = None;

/// When initializing a background processor without a liquidity manager, this can be used to avoid
/// specifying a concrete `LiquidityManager` type.
#[cfg(not(c_bindings))]
pub const NO_LIQUIDITY_MANAGER: Option<
Arc<
dyn ALiquidityManager<
EntropySource = dyn EntropySource,
ES = &dyn EntropySource,
NodeSigner = dyn lightning::sign::NodeSigner,
NS = &dyn lightning::sign::NodeSigner,
AChannelManager = DynChannelManager,
CM = &DynChannelManager,
Filter = dyn chain::Filter,
C = &dyn chain::Filter,
TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider,
TP = &dyn lightning_liquidity::utils::time::TimeProvider,
> + Send
+ Sync,
>,
> = None;

pub(crate) mod futures_util {
use core::future::Future;
use core::marker::Unpin;
Expand DownExpand Up@@ -3384,4 +3484,30 @@ mod tests {
r1.unwrap().unwrap();
r2.unwrap()
}

#[test]
#[cfg(not(c_bindings))]
fn test_no_consts() {
// Compile-test the NO_* constants can be used.
let (_, nodes) = create_nodes(1, "test_no_consts");
let data_dir = nodes[0].kv_store.get_data_dir();
let persister = Arc::new(Persister::new(data_dir));
let bg_processor = BackgroundProcessor::start(
persister,
move |_: Event| Ok(()),
Arc::clone(&nodes[0].chain_monitor),
Arc::clone(&nodes[0].node),
crate::NO_ONION_MESSENGER,
nodes[0].no_gossip_sync(),
Arc::clone(&nodes[0].peer_manager),
crate::NO_LIQUIDITY_MANAGER,
Some(Arc::clone(&nodes[0].sweeper)),
Arc::clone(&nodes[0].logger),
Some(Arc::clone(&nodes[0].scorer)),
);

if !std::thread::panicking() {
bg_processor.stop().unwrap();
}
}
}
Loading