From 07805458fdcf3cdfc51062a806f7dea2e99da107 Mon Sep 17 00:00:00 2001 From: Arie Trouw Date: Sun, 21 Jan 2024 16:31:48 -0800 Subject: [PATCH] retry in won function --- .vscode/settings.json | 1 + .yarn/versions/37922f8f.yml | 49 +++++++++++++++++++ .../support/divineSingleIndexedResults.tsx | 14 ++---- .../src/hooks/support/retry.tsx | 23 +++++++++ 4 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 .yarn/versions/37922f8f.yml create mode 100644 packages/sdk/packages/indexed-results/src/hooks/support/retry.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index edb8261a9d..1dcace04c6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -90,6 +90,7 @@ "Overridable", "pako", "payloadset", + "Promisable", "quadkey", "quadkeys", "rdns", diff --git a/.yarn/versions/37922f8f.yml b/.yarn/versions/37922f8f.yml new file mode 100644 index 0000000000..1ea5b5cbbc --- /dev/null +++ b/.yarn/versions/37922f8f.yml @@ -0,0 +1,49 @@ +releases: + "@xyo-network/react-address": patch + "@xyo-network/react-address-history": patch + "@xyo-network/react-address-plugin": patch + "@xyo-network/react-address-render": patch + "@xyo-network/react-aggregate-price-plugin": patch + "@xyo-network/react-app-settings": patch + "@xyo-network/react-appbar": patch + "@xyo-network/react-archivist": patch + "@xyo-network/react-block": patch + "@xyo-network/react-boundwitness-plugin": patch + "@xyo-network/react-card": patch + "@xyo-network/react-coin-gecko-prices-plugin": patch + "@xyo-network/react-connected-accounts": patch + "@xyo-network/react-crypto-market-uniswap-plugin": patch + "@xyo-network/react-crypto-prices-plugin": patch + "@xyo-network/react-default-plugin": patch + "@xyo-network/react-details-plugin": patch + "@xyo-network/react-diviner": patch + "@xyo-network/react-elevation-map-quadkey-plugin": patch + "@xyo-network/react-embed": patch + "@xyo-network/react-ethereum-gas-price-blocknative-plugin": patch + "@xyo-network/react-ethereum-gas-price-etherchain-plugins": patch + "@xyo-network/react-ethereum-gas-price-etherchain-v2-plugin": patch + "@xyo-network/react-ethereum-gas-price-ethers-plugin": patch + "@xyo-network/react-ethereum-gas-price-etherscan-plugin": patch + "@xyo-network/react-ethereum-gas-price-ethgasstation-plugin": patch + "@xyo-network/react-ethereum-gas-price-payload-plugins": patch + "@xyo-network/react-ethereum-gas-price-plugin": patch + "@xyo-network/react-location-heatmap-quadkey-plugin": patch + "@xyo-network/react-location-point-map-plugin": patch + "@xyo-network/react-location-points-map-plugin": patch + "@xyo-network/react-module": patch + "@xyo-network/react-modules": patch + "@xyo-network/react-nft-score-plugin": patch + "@xyo-network/react-node": patch + "@xyo-network/react-node-context": patch + "@xyo-network/react-node-provider": patch + "@xyo-network/react-plugins": patch + "@xyo-network/react-pointer-plugin": patch + "@xyo-network/react-price-forecast-plugin": patch + "@xyo-network/react-schema-plugin": patch + "@xyo-network/react-sdk": patch + "@xyo-network/react-sentinel": patch + "@xyo-network/react-witness": patch + "@xyo-network/sdk-xyo-react": patch + +undecided: + - "@xyo-network/react-indexed-results" diff --git a/packages/sdk/packages/indexed-results/src/hooks/support/divineSingleIndexedResults.tsx b/packages/sdk/packages/indexed-results/src/hooks/support/divineSingleIndexedResults.tsx index 30a898a1be..bf4d1216ab 100644 --- a/packages/sdk/packages/indexed-results/src/hooks/support/divineSingleIndexedResults.tsx +++ b/packages/sdk/packages/indexed-results/src/hooks/support/divineSingleIndexedResults.tsx @@ -1,8 +1,8 @@ -import { delay } from '@xylabs/delay' import { DivinerInstance } from '@xyo-network/diviner-model' import { Payload } from '@xyo-network/payload-model' import { ParseIndexedResults } from '../../interfaces' +import { retry } from './retry' const divineSingleIndexedResultsInner = async ( diviner: DivinerInstance, @@ -24,14 +24,6 @@ export const divineSingleIndexedResults = async => { - const results = await divineSingleIndexedResultsInner(diviner, indexedQueries, parseIndexedResults) - if (results) { - return results - } - if (retries <= 0) { - return null - } - await delay(interval) - return divineSingleIndexedResults(diviner, indexedQueries, parseIndexedResults, retries - 1, interval * backoff, backoff) +): Promise => { + return await retry(() => divineSingleIndexedResultsInner(diviner, indexedQueries, parseIndexedResults), { backoff, interval, retries }) } diff --git a/packages/sdk/packages/indexed-results/src/hooks/support/retry.tsx b/packages/sdk/packages/indexed-results/src/hooks/support/retry.tsx new file mode 100644 index 0000000000..14b9f36004 --- /dev/null +++ b/packages/sdk/packages/indexed-results/src/hooks/support/retry.tsx @@ -0,0 +1,23 @@ +import { delay } from '@xylabs/delay' +import { Promisable } from '@xylabs/promise' +import { AnyObject } from '@xyo-network/object' + +export interface RetryConfig { + backoff?: number + complete?: (result?: T) => boolean + interval?: number + retries?: number +} + +export const retry = async (func: () => Promisable, config?: RetryConfig): Promise => { + const { complete = (value: T | undefined) => value !== undefined, retries = 0, interval = 100, backoff = 2 } = config ?? {} + const result = await func() + if (complete(result)) { + return result + } + if (retries <= 0) { + return undefined + } + await delay(interval) + return retry(func, { backoff, complete, interval: interval * backoff, retries: retries - 1 }) +}