UNPKG

@smartinvoicexyz/graphql

Version:

Unified source for helpers and schema used across the GraphQL services within the Smart Invoice protocol.

65 lines (64 loc) 2.38 kB
import { fetchTypedQuery } from './client'; const GRAPH_POLL_INTERVAL = 5000; const GRAPH_NUM_RETRIES = 20; export const timeout = (ms) => { // eslint-disable-next-line no-promise-executor-return return new Promise(resolve => setTimeout(resolve, ms)); }; export const getSubgraphStatus = async (chainId) => { const data = await fetchTypedQuery(chainId)({ _meta: [ {}, { block: { number: true, }, hasIndexingErrors: true, }, ], }, { fetchPolicy: 'network-only', }); const status = { // eslint-disable-next-line no-underscore-dangle syncedBlockNumber: data?._meta?.block?.number ?? 0, // eslint-disable-next-line no-underscore-dangle hasIndexingErrors: data?._meta?.hasIndexingErrors ?? false, }; setCachedSubgraphStatus(chainId, status); return status; }; const getSubgraphBlockNumber = async (chainId) => { try { const status = getCachedSubgraphStatus(chainId); if (status) return status.syncedBlockNumber; const { syncedBlockNumber } = await getSubgraphStatus(chainId); return syncedBlockNumber; } catch (e) { console.error(`Failed to get subgraph block number for chain ${chainId}: `, e); return BigInt(0); } }; export const waitForSubgraphSync = async (chainId, transactionBlockNumber) => { let subgraphBlockNumber = await getSubgraphBlockNumber(chainId); let tries = 0; while (subgraphBlockNumber < transactionBlockNumber && tries < GRAPH_NUM_RETRIES) { // eslint-disable-next-line no-await-in-loop await timeout(GRAPH_POLL_INTERVAL); tries += 1; // eslint-disable-next-line no-await-in-loop subgraphBlockNumber = await getSubgraphBlockNumber(chainId); } return subgraphBlockNumber >= transactionBlockNumber; }; const createStorageKey = (chainId) => `smart-invoice-subgraph-health-${chainId}`; export const getCachedSubgraphStatus = (chainId) => { const value = window.localStorage.getItem(createStorageKey(chainId)); if (value) return JSON.parse(value); return null; }; export const setCachedSubgraphStatus = (chainId, health) => window.localStorage.setItem(createStorageKey(chainId), JSON.stringify(health));