From 879bc78366f10678cd24d4660b899dc5bc177f9e Mon Sep 17 00:00:00 2001 From: Mark Davison Date: Mon, 16 May 2022 10:58:30 +0100 Subject: [PATCH 1/3] Add reconnect logic --- graphql-server/src/substrateApi.ts | 68 ++++++++++++++++-------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/graphql-server/src/substrateApi.ts b/graphql-server/src/substrateApi.ts index a0445d2..3da92ad 100644 --- a/graphql-server/src/substrateApi.ts +++ b/graphql-server/src/substrateApi.ts @@ -3,38 +3,42 @@ import { ApiPromise, WsProvider } from '@polkadot/api'; export type SubstrateNetwork = 'kusama' | 'polkadot' | 'litmus' | 'khala'; // TODO: get ws providers from .env -const polkadotWsProvider = new WsProvider('wss://rpc.polkadot.io'); -const kusamaWsProvider = new WsProvider( - 'wss://kusama.api.onfinality.io/public-ws' -); -const khalaWsProvider = new WsProvider( - 'wss://khala.api.onfinality.io/public-ws' -); -const litmusWsProvider = new WsProvider( - 'wss://rpc.litmus-parachain.litentry.io' -); - export async function initSubstrateApi() { - const polkadotApi = await ApiPromise.create({ provider: polkadotWsProvider }); - await polkadotApi.isReady; - - const kusamaApi = await ApiPromise.create({ provider: kusamaWsProvider }); - await kusamaApi.isReady; - - const khalaApi = await ApiPromise.create({ provider: khalaWsProvider }); - await khalaApi.isReady; - - const litmusApi = await ApiPromise.create({ provider: litmusWsProvider }); - await litmusApi.isReady; - - return (network?: SubstrateNetwork) => { - if (network === 'kusama') { - return kusamaApi; - } else if (network === 'khala') { - return khalaApi; - } else if (network === 'litmus') { - return litmusApi; - } - return polkadotApi; + + const providers = { + polkadot: new WsProvider('wss://rpc.polkadot.io'), + kusama: new WsProvider( + 'wss://kusama.api.onfinality.io/public-ws' + ), + khala: new WsProvider( + 'wss://khala.api.onfinality.io/public-ws' + ), + litmus: new WsProvider( + 'wss://rpc.litmus-parachain.litentry.io' + ) }; + + const apiPromises = []; + const apis = {}; + + for (const [network, wsProvider] of Object.entries(providers)) { + apiPromises.push(async () => { + const api = await ApiPromise.create({provider: wsProvider}); + await api.isReady; + api.once('error', async error => { + console.error(error); + if (!api.isConnected) { + console.log("Disconnected - reconnecting"); + await api.connect(); + } + }); + + api.once('disconnected', () => api.connect()) + + apis[network] = api; + }) + } + + await Promise.allSettled(apiPromises); + return (network?: SubstrateNetwork) => apis[network]; } From ea74b05030fc3dd2a50f8566305596ab6abb192c Mon Sep 17 00:00:00 2001 From: Mark Davison Date: Mon, 16 May 2022 11:11:03 +0100 Subject: [PATCH 2/3] Improve logging --- graphql-server/src/substrateApi.ts | 31 +++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/graphql-server/src/substrateApi.ts b/graphql-server/src/substrateApi.ts index 3da92ad..e562b92 100644 --- a/graphql-server/src/substrateApi.ts +++ b/graphql-server/src/substrateApi.ts @@ -1,4 +1,4 @@ -import { ApiPromise, WsProvider } from '@polkadot/api'; +import {ApiPromise, WsProvider} from '@polkadot/api'; export type SubstrateNetwork = 'kusama' | 'polkadot' | 'litmus' | 'khala'; @@ -21,19 +21,36 @@ export async function initSubstrateApi() { const apiPromises = []; const apis = {}; + const reconnect = async (api, network) => { + + if (api.isConnected) { + console.log(`${network} is connected`); + return; + } + + console.log(`${network} is disconnected - reconnecting`); + await api.connect(); + + if (api.isConnected) { + console.log(`${network} has reconnected`); + } else { + console.error(`${network} failed to reconnect`); + } + } + for (const [network, wsProvider] of Object.entries(providers)) { apiPromises.push(async () => { const api = await ApiPromise.create({provider: wsProvider}); await api.isReady; + api.once('error', async error => { - console.error(error); - if (!api.isConnected) { - console.log("Disconnected - reconnecting"); - await api.connect(); - } + console.error(`${network}: ${JSON.stringify(error)}`); + await reconnect(api, network); }); - api.once('disconnected', () => api.connect()) + api.once('disconnected', async () => { + await reconnect(api, network); + }) apis[network] = api; }) From 0fe9a890c5e7e2db5c589ba471608475fa6b051f Mon Sep 17 00:00:00 2001 From: Mark Davison Date: Tue, 17 May 2022 10:05:12 +0200 Subject: [PATCH 3/3] Default to Polkadot --- graphql-server/src/substrateApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphql-server/src/substrateApi.ts b/graphql-server/src/substrateApi.ts index 828d91f..a0f1a57 100644 --- a/graphql-server/src/substrateApi.ts +++ b/graphql-server/src/substrateApi.ts @@ -56,5 +56,5 @@ export async function initSubstrateApi() { } await Promise.allSettled(apiPromises); - return (network?: SubstrateNetwork) => apis[network]; + return (network?: SubstrateNetwork) => apis[network || 'polkadot']; }