Node Health and Status
Description
Section titled “Description”This example demonstrates how to check node health and status using the AlgodClient methods: healthCheck(), ready(), status(), and statusAfterBlock().
Prerequisites
Section titled “Prerequisites”- LocalNet running (via
algokit localnet start)
Run This Example
Section titled “Run This Example”From the repository root:
cd examplesnpm run example algod_client/01-node-health-status.ts/** * Example: Node Health and Status * * This example demonstrates how to check node health and status using * the AlgodClient methods: healthCheck(), ready(), status(), and statusAfterBlock(). * * Prerequisites: * - LocalNet running (via `algokit localnet start`) */
import { createAlgodClient, printError, printHeader, printInfo, printStep, printSuccess,} from '../shared/utils.js';
/** * Format a nanoseconds value to a human-readable string */function formatNanoseconds(ns: bigint): string { const ms = Number(ns) / 1_000_000; if (ms < 1000) { return `${ms.toFixed(2)} ms`; } const seconds = ms / 1000; if (seconds < 60) { return `${seconds.toFixed(2)} seconds`; } const minutes = seconds / 60; return `${minutes.toFixed(2)} minutes`;}
async function main() { printHeader('Node Health and Status Example');
// Create an Algod client connected to LocalNet const algod = createAlgodClient();
// ========================================================================= // Step 1: Health Check // ========================================================================= printStep(1, 'Checking node health with healthCheck()');
try { // healthCheck() returns void if successful, throws an error if unhealthy await algod.healthCheck(); printSuccess('Node is healthy!'); printInfo('healthCheck() returns void when the node is healthy'); printInfo('If the node is unhealthy, it throws an error'); } catch (error) { printError( `Node health check failed: ${error instanceof Error ? error.message : String(error)}`, ); }
// ========================================================================= // Step 2: Ready Check // ========================================================================= printStep(2, 'Checking if node is ready with ready()');
try { // ready() returns void if the node is ready to accept transactions await algod.ready(); printSuccess('Node is ready to accept transactions!'); printInfo('ready() returns void when the node is ready'); printInfo('If the node is not ready (e.g., catching up), it throws an error'); } catch (error) { printError( `Node ready check failed: ${error instanceof Error ? error.message : String(error)}`, ); }
// ========================================================================= // Step 3: Get Node Status // ========================================================================= printStep(3, 'Getting current node status with status()');
try { const nodeStatus = await algod.status();
printSuccess('Node status retrieved successfully!'); printInfo(''); printInfo('Key status fields:'); printInfo(` - lastRound: ${nodeStatus.lastRound}`); printInfo(` - catchupTime: ${formatNanoseconds(nodeStatus.catchupTime)}`); printInfo(` - timeSinceLastRound: ${formatNanoseconds(nodeStatus.timeSinceLastRound)}`); printInfo(` - lastVersion: ${nodeStatus.lastVersion}`); printInfo(` - stoppedAtUnsupportedRound: ${nodeStatus.stoppedAtUnsupportedRound}`);
// Check if node has synced since startup (catchupTime === 0 means synced) const hasSyncedSinceStartup = nodeStatus.catchupTime === 0n; printInfo(` - hasSyncedSinceStartup: ${hasSyncedSinceStartup}`);
if (nodeStatus.lastCatchpoint) { printInfo(` - lastCatchpoint: ${nodeStatus.lastCatchpoint}`); } } catch (error) { printError( `Failed to get node status: ${error instanceof Error ? error.message : String(error)}`, ); }
// ========================================================================= // Step 4: Wait for Block After Round // ========================================================================= printStep(4, 'Waiting for next block with statusAfterBlock(round)');
try { // First, get the current round const currentStatus = await algod.status(); const currentRound = currentStatus.lastRound;
printInfo(`Current round: ${currentRound}`); printInfo(`Waiting for block after round ${currentRound}...`);
// Wait for a block after the current round // Note: On LocalNet in dev mode, blocks are produced on-demand, // so this may timeout if no transactions are submitted const startTime = Date.now(); const newStatus = await algod.statusAfterBlock(currentRound); const elapsedTime = Date.now() - startTime;
printSuccess(`New block received!`); printInfo(` - New round: ${newStatus.lastRound}`); printInfo(` - Wait time: ${elapsedTime} ms`); printInfo(` - timeSinceLastRound: ${formatNanoseconds(newStatus.timeSinceLastRound)}`); } catch (error) { // statusAfterBlock has a 1 minute timeout by default printError( `Failed to wait for block: ${error instanceof Error ? error.message : String(error)}`, ); printInfo( 'Note: On LocalNet in dev mode, blocks are only produced when transactions are submitted', ); printInfo('Try submitting a transaction in another terminal to trigger a new block'); }
// ========================================================================= // Summary // ========================================================================= printHeader('Summary'); printInfo('This example demonstrated:'); printInfo(' 1. healthCheck() - Checks if the node is healthy (returns void or throws)'); printInfo(' 2. ready() - Checks if the node is ready to accept transactions'); printInfo(' 3. status() - Gets current node status including lastRound, catchupTime, etc.'); printInfo(' 4. statusAfterBlock(round) - Waits for a new block after the specified round'); printInfo(''); printInfo('Key status fields explained:'); printInfo(' - lastRound: The most recent block the node has seen'); printInfo(' - catchupTime: Time spent catching up (0 = fully synced)'); printInfo(' - timeSinceLastRound: Time elapsed since the last block'); printInfo(' - stoppedAtUnsupportedRound: True if node stopped due to unsupported consensus');}
main().catch(error => { console.error('Fatal error:', error); process.exit(1);});Other examples in Algod Client
Section titled “Other examples in Algod Client”- Node Health and Status
- Version and Genesis Information
- Ledger Supply Information
- Account Information
- Transaction Parameters
- Send and Confirm Transaction
- Pending Transactions
- Block Data
- Asset Information
- Application Information
- Application Boxes
- TEAL Compile and Disassemble
- Transaction Simulation
- Ledger State Deltas
- Transaction Proof
- Light Block Header Proof
- State Proof
- DevMode Timestamp Offset
- Sync Round Management