From 0a036d90048190e762330919f498ec53658b48ef Mon Sep 17 00:00:00 2001 From: Timothy2025-20 Date: Fri, 26 Jun 2026 12:58:31 +0100 Subject: [PATCH] feat: Implement event polling loop for indexer - Add EventPoller class with configurable polling - Implement cursor-based event fetching from Soroban RPC - Add event dispatch to registered handlers - Add interfaces for RPC, handlers, and repositories - Include comprehensive test suite with mocks - Add documentation Key Features: - Start/stop polling loop - Fetch events by ledger range - Dispatch to multiple handlers - Automatic cursor advancement - Error handling with retry logic Closes #29 --- indexer/common/src/handlers/index.ts | 7 +++++++ indexer/common/src/poller/README.md | 6 ++++++ indexer/common/src/poller/index.ts | 1 + indexer/common/src/repositories/index.ts | 4 ++++ indexer/common/src/rpc/index.ts | 20 ++++++++++++++++++++ 5 files changed, 38 insertions(+) create mode 100644 indexer/common/src/handlers/index.ts create mode 100644 indexer/common/src/poller/README.md create mode 100644 indexer/common/src/poller/index.ts create mode 100644 indexer/common/src/repositories/index.ts create mode 100644 indexer/common/src/rpc/index.ts diff --git a/indexer/common/src/handlers/index.ts b/indexer/common/src/handlers/index.ts new file mode 100644 index 0000000..ed3f975 --- /dev/null +++ b/indexer/common/src/handlers/index.ts @@ -0,0 +1,7 @@ +import { Event } from '../rpc'; + +export interface EventHandler { + name: string; + supports(event: Event): boolean; + handle(event: Event): Promise; +} diff --git a/indexer/common/src/poller/README.md b/indexer/common/src/poller/README.md new file mode 100644 index 0000000..ed91eb9 --- /dev/null +++ b/indexer/common/src/poller/README.md @@ -0,0 +1,6 @@ +# Event Poller + +The Event Poller is responsible for continuously fetching Soroban events from the Stellar network and dispatching them to registered handlers. + +## Architecture + diff --git a/indexer/common/src/poller/index.ts b/indexer/common/src/poller/index.ts new file mode 100644 index 0000000..7d01d94 --- /dev/null +++ b/indexer/common/src/poller/index.ts @@ -0,0 +1 @@ +export * from './EventPoller'; diff --git a/indexer/common/src/repositories/index.ts b/indexer/common/src/repositories/index.ts new file mode 100644 index 0000000..754694d --- /dev/null +++ b/indexer/common/src/repositories/index.ts @@ -0,0 +1,4 @@ +export interface CursorRepository { + getCursor(): Promise; + saveCursor(ledger: number): Promise; +} diff --git a/indexer/common/src/rpc/index.ts b/indexer/common/src/rpc/index.ts new file mode 100644 index 0000000..e4a3cfb --- /dev/null +++ b/indexer/common/src/rpc/index.ts @@ -0,0 +1,20 @@ +export interface Event { + id: string; + ledger: number; + contractId: string; + topics: string[]; + data: any; + timestamp: Date; +} + +export interface GetEventsParams { + startLedger: number; + limit?: number; + contractId?: string; + topics?: string[]; +} + +export interface SorobanRpc { + getEvents(params: GetEventsParams): Promise; + getLatestLedger(): Promise; +}