Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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" + '
Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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('^' + ".*" + ' Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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('^' + ".*" + ' Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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" + ' Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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('^' + ".*" + ' Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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('^' + ".*" + ' Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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); } })(); })(); Implement first set of Api's by G8XSU · Pull Request #5 · lightningdevkit/ldk-server · GitHub
Skip to content

Implement first set of Api's - #5

Merged
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis
Sep 25, 2024
Merged

Implement first set of Api's#5
tnull merged 9 commits into
lightningdevkit:mainfrom
G8XSU:impl-s1-apis

Conversation

@G8XSU

@G8XSUG8XSU commented Sep 5, 2024

Copy link
Copy Markdown
Contributor

Adds implementation for:

  • CloseChannel Api
  • Bolt12Send Api
  • Bolt12Receive Api
  • Bolt11Send Api
  • OpenChannel Api
  • BOLT11Receive Api
  • OnchainSend Api
  • OnchainReceive Api

Based on #2

@tnull

tnull commented Sep 9, 2024

Copy link
Copy Markdown
Collaborator

This needs a rebase now.

@G8XSUG8XSU changed the title [Draft Pr] Implement first set of Api'sImplement first set of Api'sSep 10, 2024
@G8XSU
G8XSU requested a review from tnullSeptember 10, 2024 22:12
Comment threadserver/src/service.rs Outdated
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?

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.

Should we import NodeError to avoid the prefix?

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 kept it to make it explicit when there are other error types floating around, specifically ldk-server specific.
But I dont mind it either way.

) -> Result<OnchainSendResponse, ldk_node::NodeError> {
let address = Address::from_str(&request.address)
.map_err(|_| ldk_node::NodeError::InvalidAddress)?
.require_network(node.config().network)

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.

I wonder if it would be worth retrieving the Config once and then giving a &Config to the handler methods rather than always calling in? Would at least avoid cloning it every time.

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 all api's need it, and there could be future such instances where a subset of api's need some field.
I think we shouldn't add it to common handler for now.


pub(crate) fn handle_onchain_send_request(
node: Arc<Node>, request: OnchainSendRequest,
) -> Result<OnchainSendResponse, ldk_node::NodeError> {

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.

Might be fine for the intial step, but we might need to introduce a separate error type that wraps the NodeError, i.e., will be a superset?

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.

Yeah currently it is only for initial step, will probably spend more time on error handling when we have it in api interface.

Comment threadserver/src/api/onchain_send.rs
Comment threadserver/src/api/open_channel.rs
Comment threadserver/src/api/open_channel.rs Outdated
request.announce_channel,
)?;
let response =
OpenChannelResponse { user_channel_id: user_channel_id.0.to_be_bytes().to_vec() };

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.

I wonder if it would be worth down the line defining some kind of de/ser traits to make sure the encoding from these types into their respective field types is always consistent and we can't accidentally, e.g., encode as little-endian in some places?

Comment threadserver/src/api/bolt12_receive.rs
Comment threadserver/src/api/close_channel.rs Outdated
pub(crate) fn handle_close_channel_request(
node: Arc<Node>, request: CloseChannelRequest,
) -> Result<CloseChannelResponse, ldk_node::NodeError> {
//TODO: Should this be string?

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.

IMO, since PaymentId is its dedicated proto type, UserChannelId/ChannelId, etc. should probably also follow the same pattern?

@G8XSUG8XSUSep 11, 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.

@tnull@jkczyz
The main problem is user interaction with these byte identifiers, for which I could use some ideas. Essentially, IDs such as ChannelId, UserChannelId, and PaymentId are not human-readable in byte form and cannot be easily input or output as bytes.

Using bytes is fine for programmatic access, but for CLI or while interacting with a lightning node through a UI, this isn't really feasible. We have a similar problem for the logs of these IDs as well. (See: lightningdevkit/rust-lightning#3306)

In my opinion, we need a standardized way of interacting with these in a human-friendly manner, not just for debug logs. For this, I was considering whether we can use a hex representation string in the interface. This could be just for the CLI/UI or as part of the main API interface.

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.

Mhh, I don't have a strong opinion, but I do think it should be uniform, at least across all *Id types.

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 thought more about this,
I don't think adding separate types for *Id helps from API perspective. It just introduces further nesting of types.
It might make sense in ldk-node api to introduce special types where you can have type checking but not in an api.

{
payment_id :PaymentId{data:[..]},
user_channel_id: UserChannelId{data:[..]},
channel_id: ChannelId{data:[..]},
}
compared to: {
payment_id :[..],
user_channel_id: [..],
channel_id: [..],
}
Bolt11SendResponse { payment_id: Some(PaymentId { data: payment_id.0.to_vec() }) }
compared to Bolt11SendResponse { payment_id: payment_id.0.to_vec() }

So to make it uniform, I am thinking of removing PaymentId type itself.

@tnulltnullSep 25, 2024

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.

So to make it uniform, I am thinking of removing PaymentId type itself.

Alright, fine by me as long as it's uniform and ~predictable by the user/dev so they don't have to look up every single detail in the docs when using the API. And, at this stage, we could still easily change anything if we find a reason why we need separate types in the future.

Feel free to add the commit dropping PaymentId here before we land this.

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 added a commit for it.
Squashed and rebased.

@G8XSU
G8XSU requested a review from tnullSeptember 16, 2024 20:12
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

@tnull Is there any additional feedback on this?

@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.

@tnull Is there any additional feedback on this?

Not really, but we should probably come to a conclusion on #5 (comment) and #5 (comment) before we move on?

Besides that, feel free to interleave and squash the fixups into their respective commits.

Comment threadserver/src/service.rs
use crate::api::onchain_send::*;
use crate::api::open_channel::*;
use crate::api::bolt11_receive::handle_bolt11_receive_request;
use crate::api::bolt11_receive::BOLT11_RECEIVE_PATH;

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.

nit: Could group the imports from each module, but doesn't matter too much.

@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed.
Need to rebase.

@G8XSU
G8XSU requested a review from tnullSeptember 25, 2024 05:20
@G8XSU

Copy link
Copy Markdown
ContributorAuthor

Squashed and rebased.

@tnull
tnull merged commit 1d702ed into lightningdevkit:mainSep 25, 2024
@G8XSUG8XSU mentioned this pull request Oct 14, 2024
13 tasks
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