Version: next
This documentation is for an unreleased version of Taquito. Features and APIs may change before the final release. View the latest stable version.
Fallback RPC URLs
Written by Maxwell Ward
There are times where it’s beneficial to have a fallback URL when initializing your TezosToolkit instance. While this behaviour is not support by Taquito directly, you can extend the TezosToolkit class using a proxy to achieve the fallback behaviour yourself.
import { RpcClient, type RpcClientInterface } from '@taquito/rpc';
export function createFallbackRpcClient(rpcUrls: string[], chain: string = 'main'): RpcClientInterface {
if (rpcUrls.length === 0) {
throw new Error('At least one RPC URL is required');
}
const clients = rpcUrls.map(url => new RpcClient(url, chain));
let currentIndex = 0;
const handler: ProxyHandler<RpcClient> = {
get(target, prop, receiver) {
const value = Reflect.get(target, prop, receiver);
// Only wrap methods (functions), not properties
if (typeof value !== 'function') {
return value;
}
// Return a wrapped function with fallback logic
return async (...args: unknown[]) => {
const startIndex = currentIndex;
let lastError: unknown;
do {
try {
const client = clients[currentIndex];
const method = client[prop as keyof RpcClient];
if (typeof method === 'function') {
return await method.apply(client, args);
}
} catch (error) {
lastError = error;
console.warn(`RPC ${clients[currentIndex].getRpcUrl()} failed, trying next...`);
currentIndex = (currentIndex + 1) % clients.length;
}
} while (currentIndex !== startIndex);
throw lastError;
};
},
};
// Used for TypeScript type inference
return new Proxy({} as RpcClientInterface, handler);
}
You can then import the createFallbackRpcClient function where you initialize your TezosToolkit and use it like so:
const fallbackClient = createFallbackRpcClient([
'https://example.com',
'https://example.org',
'https://tezos-shadownet.octez.io'
])
const Tezos = new TezosToolkit(fallbackClient);