-
Notifications
You must be signed in to change notification settings - Fork 0
add delay and retry to mAIner topup backend call #149
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
Open
lopezi
wants to merge
2
commits into
releases/vici
Choose a base branch
from
fix/topup-queryable
base: releases/vici
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
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 hidden or 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 |
|---|---|---|
|
|
@@ -678,22 +678,83 @@ | |
| mainerAgent: cleanMainerAgent, | ||
| }; | ||
|
|
||
| // Create the backend promise based on token type | ||
| let backendPromise: Promise<any>; | ||
| if (selectedTokenSymbol === 'FUNNAI') { | ||
| // For FUNNAI, use the FUNNAI-specific endpoint | ||
| if (!$store.gameStateCanisterActor) { | ||
| throw new Error("Game state canister not available"); | ||
| // Helper function to call the backend topup with retry | ||
| async function callBackendTopupWithRetry(topUpInput: any, tokenSymbol: string): Promise<any> { | ||
| const DELAY_BEFORE_TOPUP_MS = 3000; // 3 second delay to ensure ledger transaction is queryable | ||
|
|
||
| // Wait before calling the backend to ensure the ledger transaction is queryable | ||
| console.log(`Waiting ${DELAY_BEFORE_TOPUP_MS}ms before calling backend topup...`); | ||
| await new Promise(resolve => setTimeout(resolve, DELAY_BEFORE_TOPUP_MS)); | ||
|
|
||
| const makeTopupCall = () => { | ||
| if (tokenSymbol === 'FUNNAI') { | ||
| if (!$store.gameStateCanisterActor) { | ||
| throw new Error("Game state canister not available"); | ||
| } | ||
| return $store.gameStateCanisterActor.topUpCyclesForMainerAgentWithFunnai(topUpInput); | ||
| } else { | ||
| if (!$store.gameStateCanisterActor) { | ||
| throw new Error("Game state canister not available"); | ||
| } | ||
| return $store.gameStateCanisterActor.topUpCyclesForMainerAgent(topUpInput); | ||
| } | ||
| }; | ||
| backendPromise = $store.gameStateCanisterActor.topUpCyclesForMainerAgentWithFunnai(topUpInput); | ||
| } else { | ||
| // For ICP, BOB, and ckBTC, use the standard ICP endpoint | ||
| if (!$store.gameStateCanisterActor) { | ||
| throw new Error("Game state canister not available"); | ||
|
|
||
| // Helper to check if result is an error (Err variant) | ||
| const isErrorResult = (result: any): boolean => { | ||
| return result && typeof result === 'object' && 'Err' in result; | ||
| }; | ||
|
|
||
| // Helper to get error from result | ||
| const getError = (result: any): any => { | ||
| return result?.Err; | ||
| }; | ||
| backendPromise = $store.gameStateCanisterActor.topUpCyclesForMainerAgent(topUpInput); | ||
|
|
||
| try { | ||
| const result = await makeTopupCall(); | ||
|
|
||
| // Check if result is an Err variant - if so, retry | ||
| if (isErrorResult(result)) { | ||
| console.warn("First backend topup call returned Err, retrying in 2 seconds...", getError(result)); | ||
|
|
||
| // Wait 2 seconds before retry | ||
| await new Promise(resolve => setTimeout(resolve, 2000)); | ||
|
|
||
| const retryResult = await makeTopupCall(); | ||
| if (isErrorResult(retryResult)) { | ||
| console.error("Backend topup retry also returned Err", getError(retryResult)); | ||
| } else { | ||
| console.log("Backend topup retry succeeded"); | ||
| } | ||
| return retryResult; | ||
| } | ||
|
|
||
| return result; | ||
| } catch (firstError) { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if the backend call doesn't return properly (OK but Err), we need to retry as well |
||
| console.warn("First backend topup call threw exception, retrying in 2 seconds...", firstError); | ||
|
|
||
| // Wait 2 seconds before retry | ||
| await new Promise(resolve => setTimeout(resolve, 2000)); | ||
|
|
||
| // Retry once | ||
| try { | ||
| const retryResult = await makeTopupCall(); | ||
| if (isErrorResult(retryResult)) { | ||
| console.error("Backend topup retry returned Err after exception", getError(retryResult)); | ||
| } else { | ||
| console.log("Backend topup retry succeeded"); | ||
| } | ||
| return retryResult; | ||
| } catch (retryError) { | ||
| console.error("Backend topup retry also threw exception", retryError); | ||
| throw retryError; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| // Create the backend promise with delay and retry logic | ||
| let backendPromise: Promise<any> = callBackendTopupWithRetry(topUpInput, selectedTokenSymbol); | ||
|
|
||
| // Handle celebration for max amounts (only for ICP) | ||
| const shouldCelebrate = isMaxAmount && CELEBRATION_ENABLED && selectedTokenSymbol === 'ICP'; | ||
|
|
||
|
|
||
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.
before we didn't await the backend response ("backendPromise") to avoid keeping the user on the screen too long. As we now await it, the user has to wait on the topup modal. Is there a good way to reconcile this with the retry?
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.
but it still closes the modal before the transaction completes. is that what you are considering here?
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.
cool, then this sounds good