-
Notifications
You must be signed in to change notification settings - Fork 105
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor - Faucet: clean up faucet API & pow utils #627
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
import { | ||
ChallengeResponse, | ||
Data, | ||
ErrorResponse, | ||
SettingsResponse, | ||
TransferResponse, | ||
} from "./types"; | ||
|
||
enum Endpoint { | ||
Settings = "/setting", | ||
Challenge = "/challenge", | ||
Transfer = "", | ||
} | ||
|
||
export class API { | ||
constructor(protected readonly url: string) {} | ||
|
||
/** | ||
* Wrapper for fetch requests to handle ReadableStream response when errors are received from API | ||
* | ||
* @param {string} endpoint | ||
* @param {RequestInit} options | ||
* | ||
* @returns Object | ||
*/ | ||
async request<T = unknown>( | ||
endpoint: string, | ||
options: RequestInit = { method: "GET" } | ||
): Promise<T> { | ||
return await fetch(new URL(`${this.url}${endpoint}`), { | ||
...options, | ||
}) | ||
.then((response) => { | ||
if (response.ok) { | ||
return response.json(); | ||
} | ||
const reader = response?.body?.getReader(); | ||
const errors = reader | ||
?.read() | ||
.then( | ||
(data): Promise<ErrorResponse> => | ||
Promise.reject(JSON.parse(new TextDecoder().decode(data.value))) | ||
); | ||
if (!errors) { | ||
throw new Error("Unable to parse error response"); | ||
} | ||
return errors; | ||
}) | ||
.catch((e) => { | ||
console.error(e); | ||
return Promise.reject(e); | ||
}); | ||
} | ||
|
||
/** | ||
* Request faucet settings | ||
* | ||
* @returns Object | ||
*/ | ||
async settings(): Promise<SettingsResponse> { | ||
return this.request(Endpoint.Settings); | ||
} | ||
|
||
/** | ||
* Request challenge from endpoint url | ||
* | ||
* @param {string} publicKey | ||
* @returns Object | ||
*/ | ||
async challenge(publicKey: string): Promise<ChallengeResponse> { | ||
return this.request(`${Endpoint.Challenge}/${publicKey}`); | ||
} | ||
|
||
/** | ||
* Submit a transfer request | ||
* | ||
* @param {Data} data | ||
* @returns {Object} | ||
*/ | ||
async submitTransfer(data: Data): Promise<TransferResponse> { | ||
return this.request(Endpoint.Transfer, { | ||
method: "POST", | ||
body: JSON.stringify(data), | ||
headers: { | ||
"Content-Type": "application/json", | ||
}, | ||
}); | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if it matters, but I think this can still return a resolved
Promise<undefined>
even though the methods that use this returnPromise<ChallengeResponse>
etc.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, I was trying to figure out why TypeScript doesn't catch that. I'm not 100% sure, but if you add a return type to the
then
callback, it will catch it:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! I'll take a look. I think in the case it can return
undefined
, we should throw an exception so it can be caught in the app. I wanted to remove any case ofundefined
as it's very tediousThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added a type for that error response, with
{ message, code }
, so a correctly parsed error should always be this type, and in the case ofundefined
(if it can't get the reader and parse the error response) it will instead throw an error