Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

@wvanlint@tnull@G8XSU
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

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

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

@wvanlint@tnull@G8XSU
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

@wvanlint@tnull@G8XSU
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

@wvanlint@tnull@G8XSU
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

@wvanlint@tnull@G8XSU
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

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

Introduce header provider trait - #31

Merged
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider
Jul 17, 2024
Merged

Introduce header provider trait#31
G8XSU merged 1 commit into
lightningdevkit:mainfrom
wvanlint:header_provider

Conversation

@wvanlint

Copy link
Copy Markdown
Contributor

Introduces a HeaderProvider trait that will provide headers for each VSS call.

This change is split off from #26, which will introduce a JWT header provider based on LNURL Auth.

Comment threadsrc/headers/mod.rs Outdated
pub trait VssHeaderProvider {
/// Returns the HTTP headers to be used for a VSS request.
/// This method is called on each request, and should likely perform some form of caching.
async fn get_headers(&self, request: &[u8]) -> Result<HashMap<String, String>, VssError>;

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.

++
request: A reference to serialized request body. It can be used to perform operations such as request signing.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

@G8XSUG8XSUMay 15, 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.

returning some of the errors in VssError can have unintended consequences such as NoSuchKey/Conflict, or in some cases misleading.

the alternative is, we use io::Result<HashMap<String,String>> here and blanket convert all errors to VssError::AuthError in VssClient. (i think this would be much easier to debug and easy to understand from api perspective)

or we could document that only

InvalidRequestError, (invalid request by user or invalid input)
AuthError, (in case of auth failure) (or blanket convert all errors to authError)
InternalServerError, (auth server unavailable)
InternalError (unexpected code failure) (if the failure could be because of user provided input, it should still be invalid request, for example an error due to user provided headers or seed)

should be used here and explain how they will be used for auth_provider.

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 I agree, this was the main reason I initially created a separate error type. Moved to io::Result which will be embedded in VssError::AuthError.

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.

sounds good,
I was also good with the way we have done error handling in lnurlauthprovider, it would just need some explaining in trait docs.

@tnulltnullMay 22, 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.

I'm afraid if we want to expose/use this interface in LDK Node bindings, we need to revert the recent changes as discussed in #26. We need to keep the simpler error types as io::Error is probably not feasible to expose in bindings.

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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

@tnulltnullMay 23, 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.

Ah right, I forgot whether this will turn out internal in ldk-node or exposed as bindings. We did discuss the option of having this exposed as bindings, so I changed this into Result<_, String> to not have different semantics around VssError for different cases.

Unfortunately the error type must be an enum and implement std::error::Error (see https://mozilla.github.io/uniffi-rs/udl/errors.html), so I think we really have to revert to what we had discussed before.

@G8XSUG8XSUMay 23, 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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR.
and have some docs in this trait as discussed in first comment.

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.

Ah, thanks for mentioning that! I should have double-checked UniFFI. Reverted back to VssError and added documentation in the trait. Enforced all VssHeaderProvider errors to be a single variant i.e. VssError::AuthError to not conflate semantics.

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

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.

Reverted back to the original UniFFI compatible error type previous to #26 (comment).

Comment threadCargo.lock Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.map_err(|e| VssError::InternalError(e.to_string()))?;
let headermap = get_headermap(&headers).map_err(VssError::InternalError)?;

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.

if we can't get string value header map from headers, then there is probably some user provided invalid input.
i think this can be InvalidRequestError.

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.

Similar to the discussion above, using io::Error that will be embedded in VssError::AuthError. These might also be invalid headers by the provider.

@wvanlint
wvanlintforce-pushed the header_provider branch 2 times, most recently from c2d1d00 to 9e151a4CompareMay 16, 2024 23:13
@wvanlint
wvanlint requested a review from G8XSUMay 16, 2024 23:17
@wvanlint
wvanlint requested review from G8XSU and tnullMay 22, 2024 23:06
@wvanlint

Copy link
Copy Markdown
ContributorAuthor

FYI I am aiming to get this merged first before rebasing #26 if that sounds good.

@wvanlint
wvanlint requested a review from G8XSUMay 23, 2024 22:23
Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/client.rs Outdated
Comment threadsrc/client.rs Outdated
.get_headers(&request_body)
.await
.and_then(get_headermap)
.map_err(|e| match e {

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.

should we add a simple testcase for 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.

Done.

Comment threadsrc/client.rs Outdated
@@ -34,7 +39,19 @@ impl<R: RetryPolicy<E = VssError>> VssClient<R> {

/// Constructs a [`VssClient`] from a given [`reqwest::Client`], using `base_url` as the VSS server endpoint.
pub fn from_client(base_url: &str, client: Client, retry_policy: R) -> Self {

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.

nit: If we end up owning the value anyways, we could consider just taking a String here and below.

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.

Done.

Comment threadsrc/headers/mod.rs Outdated
Comment threadsrc/headers/mod.rs Outdated

#[async_trait]
impl VssHeaderProvider for FixedHeaders {
async fn get_headers(&self, _request: &[u8]) -> Result<HashMap<String, String>, VssError> {

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.

ok, in that case lets just revert to using VssError, we are using it correctly in lnurl PR. and have some docs in this trait as discussed in first comment.

No, I really meant it, we should revert to the simple error type: UniFFI doesn't support tuple structs/enums. If we want to use VssError, it can't have any such variants, i.e., VssError::AuthError(String) would need to become AuthError(error: String) etc. It also shouldn't rely on any constructors/methods, as otherwise needs to be exposed differently.

Reverting back to what we previously discussed seems much simpler.

@wvanlint
wvanlint requested review from G8XSU and tnullJuly 9, 2024 22:47

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

Just two tiny nits, but happy to have this land as is.

Comment threadsrc/client.rs Outdated
use std::sync::Arc;

use crate::error::VssError;
use crate::headers::get_headermap;

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.

nit: Could group these imports.

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.

Done.

Comment threadsrc/client.rs
}

/// Constructs a [`VssClient`] using `base_url` as the VSS server endpoint.
/// HTTP headers will be provided by the given `header_provider`.

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.

nit: Add newline after initial paragraph to improve doc rendering.

Suggested change
/// HTTP headers will be provided by the given `header_provider`.
///
/// HTTP headers will be provided by the given `header_provider`.

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.

Done.

@G8XSUG8XSU 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! Feel free to squash.

@wvanlint

Copy link
Copy Markdown
ContributorAuthor

Thanks! Squashed.

@G8XSU
G8XSU merged commit 59769c9 into lightningdevkit:mainJul 17, 2024
@wvanlint
wvanlint deleted the header_provider branch July 17, 2024 21:45
@G8XSUG8XSU mentioned this pull request Aug 23, 2024
G8XSU added a commit to G8XSU/vss-rust-client that referenced this pull request Aug 23, 2024
Major Changes include:
* Signature change in vss-client constructor. (in lightningdevkit#31 )
* Vss-client can now also return AuthError if AuthException is returned from server. (lightningdevkit#30)
* Adds VssHeaderProvider, can be used for auth and request signing.(lightningdevkit#31)
* Adds LnurlAuthToJwtProvider, provides LnUrl based JWT auth. (lightningdevkit#26)
* Adds KeyObfuscator, to provide client-side key obfuscation. (lightningdevkit#32)
* Package now has enforced MSRV of 1.63.0. (lightningdevkit#19)
This is a minor version bump because there are non-backward compatible changes in vss-client usage.
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

@wvanlint@tnull@G8XSU