Fallback Transport
A function to create a Fallback Transport for a Client
The fallback Transport consumes multiple Transports. If a Transport request fails, it will fall back to the next one in the list.
Import
import { } from 'viem'Usage
import { , , } from 'viem'
import { } from 'viem/chains'
const = ({
: ,
: ([
('https://1.rpc.thirdweb.com/...'),
('https://mainnet.infura.io/v3/...')
]),
})Transport Ranking
Transport Ranking enables each of the Transports passed to the fallback Transport are automatically ranked based on their latency & stability via a weighted moving score algorithm.
Every 10 seconds (interval), the fallback Transport will ping each transport in the list. For the past 10 pings (sampleCount), they will be ranked based on if they responded (stability) and how fast they responded (latency). The algorithm applies a weight of 0.7 to the stability score, and a weight of 0.3 to the latency score to derive the final score which it is ranked on.
The Transport that has the best latency & stability score over the sample period is prioritized first.
You can turn on automated ranking with the rank option:
const = ({
: ,
: ([
('https://1.rpc.thirdweb.com/...'),
('https://mainnet.infura.io/v3/...')
], { : true }),
})You can also modify the default rank config:
const = ({
: ,
: (
[
('https://1.rpc.thirdweb.com/...'),
('https://mainnet.infura.io/v3/...')
],
{
: {
: 60_000,
: 5,
: 500,
: {
: 0.3,
: 0.7
}
}
}
),
})Parameters
rank (optional)
- Type:
boolean | RankOptions - Default:
false
Whether or not to automatically rank the Transports based on their latency & stability. Set to false to disable automatic ranking.
const = ([, ], {
: false,
})rank.interval (optional)
- Type:
number - Default:
client.pollingInterval
The polling interval (in ms) at which the ranker should ping the RPC URL.
const = ([, ], {
: {
: 5_000
},
})rank.ping (optional)
- Type:
({ transport }: { transport: Transport }) => Promise<unknown> - Default:
({ transport }) => transport.request({ method: 'net_listening' })
Function to call to ping the Transport. Defaults to calling the net_listening method to check if the Transport is online.
const = ([, ], {
: {
: ({ }) => .({ : 'eth_blockNumber' })
},
})rank.sampleCount (optional)
- Type:
number - Default:
10
The number of previous samples to perform ranking on.
const = ([, ], {
: {
: 10
},
})rank.timeout (optional)
- Type:
number - Default:
1_000
Timeout when sampling transports.
const = ([, ], {
: {
: 500
},
})rank.weights.latency (optional)
- Type:
number - Default:
0.3
The weight to apply to the latency score. The weight is proportional to the other values in the weights object.
const = ([, ], {
: {
: {
: 0.4,
: 0.6
}
},
})rank.weights.stability (optional)
- Type:
number - Default:
0.7
The weight to apply to the stability score. The weight is proportional to the other values in the weights object.
const = ([, ], {
: {
: {
: 0.4,
: 0.6
}
},
})retryCount (optional)
- Type:
number - Default:
3
The max number of times to retry when a request fails.
Note: The fallback will first try all the Transports before retrying.
const = ([, ], {
: 5,
})retryDelay (optional)
- Type:
number - Default:
150
The base delay (in ms) between retries. By default, the Transport will use exponential backoff (~~(1 << count) * retryDelay), which means the time between retries is not constant.
const = ([, ], {
: 100,
})shouldThrow (optional)
- Type:
function
Whether the fallback Transport should immediately throw an error, or continue and try the next Transport.
const = ([, ], {
: (: Error) => {
return ..('sad times')
},
})