Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', '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('^' + ".*" + ' Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, '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" + ' Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, '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('^' + ".*" + ' Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, '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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add Api impl for ListForwardedPayments. by G8XSU · Pull Request #32 · lightningdevkit/ldk-server · GitHub
Skip to content

Add Api impl for ListForwardedPayments. - #32

Merged
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments
Dec 13, 2024
Merged

Add Api impl for ListForwardedPayments.#32
G8XSU merged 5 commits into
lightningdevkit:mainfrom
G8XSU:forwarded-payments

Conversation

@G8XSU

@G8XSUG8XSU commented Dec 7, 2024

Copy link
Copy Markdown
Contributor

Based on #35

@G8XSU
G8XSU requested a review from jkczyzDecember 7, 2024 00:04
Comment threadldk-server/src/main.rs Outdated
outbound_amount_forwarded_msat.unwrap_or(0), total_fee_earned_msat.unwrap_or(0), prev_channel_id, next_channel_id
);

let forwarded_payment = forwarded_payment_to_proto(payment_forwarded_event);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to use the proto version here? Seems it would better not to to the translation and allocate a vec.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Main reason for doing this is so that this data is easily accessible outside of LDK if need be.
We have APIs that are protobuf-defined, and eventually, we will have events that are protobuf-defined, along with some data that makes sense to be easily accessible outside of LDK in protobuf format. (However, this doesn't apply to all types of data that we store.)

For example, when a user has a Postgres backend for storage with read replicas, it might make sense for them to query data directly from the database-read-replica using a simple utility for batch queries and analytics.
This becomes even more important as LDK-server itself isn't horizontally scalable, and users might want to offload simple but large read queries to another system.

Comment on lines +43 to +53
pub(crate) struct Context {
pub(crate) node: Arc<Node>,
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you remind me why PaginatedKvStore can't be in NodeService? Is it just to save passing two parameters to the relevant handlers? If this is only need for one handler, then I'm not sure if we should bother adding the wrapper.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is to avoid passing two parameters; otherwise, every time there is a new parameter, we need a signature change for all handlers.
Currently, the way the code is structured, we have some common handler code in handle_request, and it is enforcing every handler to have the same signature.

I believe it is okay to have the same signature for every handler and only have these common context members exposed to them; some future additions could include logger, metrics etc.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, that makes sense. Alternatively, you could have everything take Arc<NodeService> instead. Though we may need a wrapper on that to implement Service<Request<Incoming>> since we can't implement that trait on Arc<NodeService> directly. Then you could remove the Arc from Node and have the event handler access it through an Arc. I'm more inclined towards that than introducing a Context wrapper, unless I'm missing something.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if i completely understand this approach but it seems very complicated.
Why not go with something simpler such as service-context? what is the advantage of the other approach over it?

Currently, the whole reason for NodeService to exist is to implement Service<Request<Incoming>>, which in turn calls api-handlers. Giving api-handlers access to nodeService seems like a circular dependency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm... seems less complicated if we don't add another struct. I don't see it as a circular dependency. The only reason why these functions aren't methods on NodeService is to get around the fact that Service uses Future instead of being an async trait. Using Arc<NodeService> is just like a &self parameter that works with async.

The wrapper is only needed because both Service and Arc don't belong to this crate, so we need another type to implement Service on. But that is only needed locally.

@G8XSUG8XSUDec 13, 2024

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with that, we can create context inside call method.
Will use call instead of handle_request so that we don't need a signature change (for new context members) for all these methods : https://github.com/lightningdevkit/ldk-server/blob/main/ldk-server/src/service.rs#L53-L76

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, inside call is accurate. I misspoke earlier.

@jkczyzjkczyzDec 13, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Err... actually you need to create Context in handle_request to pass it to call, IIUC, since you need both the Arc<Node> and Arc<PaginatedKVStore> from NodeService to create Context.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checkout current diff with the Context being created in call

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that looks good. Seems I was just mixing up the names for some reason. 😛

@G8XSU
G8XSU marked this pull request as ready for review December 11, 2024 23:44
Comment threadldk-server/src/api/onchain_send.rs
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server-protos/src/proto/types.proto Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/main.rs Outdated
Comment threadldk-server/src/util/proto_adapter.rs Outdated
@G8XSU
G8XSU requested review from jkczyz and tnullDecember 12, 2024 22:55
@G8XSUG8XSU mentioned this pull request Dec 12, 2024
9 tasks

@tnulltnull left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM from my side I think, mod pending discussions.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed current fixups since it would have been difficult to do context refactoring.

Comment threadldk-server/src/api/list_forwarded_payments.rs
@G8XSU
G8XSU requested a review from jkczyzDecember 13, 2024 22:03

@jkczyzjkczyz left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Please squash

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed fixups !

@G8XSU
G8XSU merged commit f28b20d into lightningdevkit:mainDec 13, 2024
rsafier pushed a commit to rsafier/ldk-server that referenced this pull request Apr 20, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@G8XSU@tnull@jkczyz