@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
JavaScript
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));