/** * Raft Consensus Protocol Implementation * * Implements the Raft consensus algorithm for distributed systems: * - Leader election * - Log replication * - Safety guarantees * - Membership changes * * Raft requires a majority quorum: Math.floor(n/2) + 1 */ /// import { EventEmitter } from "events"; export interface RaftNode { id: string; address: string; state: "follower" | "candidate" | "leader"; currentTerm: number; votedFor: string | null; lastHeartbeat: Date; isActive: boolean; } export interface LogEntry { index: number; term: number; command: any; timestamp: Date; committed: boolean; } export interface RaftMessage { type: "request-vote" | "vote-response" | "append-entries" | "append-response"; term: number; senderId: string; targetId?: string; candidateId?: string; lastLogIndex?: number; lastLogTerm?: number; leaderId?: string; prevLogIndex?: number; prevLogTerm?: number; entries?: LogEntry[]; leaderCommit?: number; success?: boolean; voteGranted?: boolean; matchIndex?: number; timestamp: Date; } export interface RaftState { currentTerm: number; votedFor: string | null; log: LogEntry[]; commitIndex: number; lastApplied: number; nextIndex: Map; matchIndex: Map; votesReceived: Set; electionTimeout: number; heartbeatInterval: number; } export declare class RaftConsensus extends EventEmitter { private nodeId; private nodes; private state; private currentState; private electionTimer; private heartbeatTimer; private readonly minQuorum; private readonly electionTimeoutMin; private readonly electionTimeoutMax; private readonly heartbeatInterval; private performance; constructor(nodeId: string, totalNodes?: number); /** * Add a node to the Raft cluster */ addNode(node: RaftNode): void; /** * Remove a node from the Raft cluster */ removeNode(nodeId: string): void; /** * Append a command to the log (leader only) */ appendCommand(command: any): Promise; /** * Process incoming Raft message */ processMessage(message: RaftMessage): Promise; /** * Start election process */ private startElection; /** * Handle RequestVote RPC */ private handleRequestVote; /** * Handle vote response */ private handleVoteResponse; /** * Handle AppendEntries RPC */ private handleAppendEntries; /** * Handle append entries response */ private handleAppendResponse; /** * Replicate log entry to followers */ private replicateEntry; /** * Send AppendEntries to a specific node */ private sendAppendEntries; /** * Update commit index based on majority replication */ private updateCommitIndex; /** * Apply committed log entries */ private applyLogEntries; /** * Transition to follower state */ private becomeFollower; /** * Transition to candidate state */ private becomeCandidate; /** * Transition to leader state */ private becomeLeader; /** * Start sending heartbeats (leader only) */ private startHeartbeat; /** * Send heartbeat to all followers */ private sendHeartbeats; /** * Start election timeout */ private startElectionTimeout; /** * Reset election timeout */ private resetElectionTimeout; /** * Generate random election timeout */ private randomElectionTimeout; /** * Clear election timer */ private clearElectionTimer; /** * Clear heartbeat timer */ private clearHeartbeatTimer; /** * Update election time statistics */ private updateElectionTime; /** * Send message to specific node */ private sendMessage; /** * Broadcast message to all nodes */ private broadcastMessage; /** * Get minimum quorum size for Raft consensus */ getMinQuorum(): number; /** * Check if we have sufficient nodes for quorum */ hasQuorum(): boolean; /** * Get current state */ getCurrentState(): "follower" | "candidate" | "leader"; /** * Get current term */ getCurrentTerm(): number; /** * Get current leader */ getCurrentLeader(): string | null; /** * Get log entries */ getLog(): LogEntry[]; /** * Get performance metrics */ getPerformanceMetrics(): typeof this.performance; /** * Get Raft state information */ getRaftState(): { nodeId: string; state: string; term: number; logLength: number; commitIndex: number; lastApplied: number; quorumSize: number; hasQuorum: boolean; }; /** * Shutdown the Raft node */ shutdown(): void; } export default RaftConsensus; //# sourceMappingURL=raft-consensus.d.ts.map