From c89f8efeec837ec42df3dd6739035d37350980f1 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 24 Dec 2025 14:34:15 +0000 Subject: [PATCH] feat(db): add RelayPerformanceEntry interface and schema v15 Add database table for tracking relay performance metrics: - Response time (exponential moving average) - Connection time - Session stability/duration - Success/failure rate - Timestamps for last success/failure This is the foundation for relay performance scoring in outbox selection. --- src/services/db.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/services/db.ts b/src/services/db.ts index 0bb2fa9..28df2b5 100644 --- a/src/services/db.ts +++ b/src/services/db.ts @@ -54,6 +54,35 @@ export interface RelayLivenessEntry { backoffUntil?: number; } +/** + * Relay performance metrics for scoring + * Tracks response time, connection time, stability, and success rate + */ +export interface RelayPerformanceEntry { + url: string; + + // Response time (how fast relay answers queries) + responseTimeMs: number; // Exponential moving average + responseTimeCount: number; // Number of samples + + // Connection time (how fast WebSocket connects) + connectTimeMs: number; // Exponential moving average + connectTimeCount: number; // Number of samples + + // Stability (how long before relay disconnects) + avgSessionDurationMs: number; // Average time connected before disconnect + sessionCount: number; // Number of sessions + + // Success rate + successfulQueries: number; + failedQueries: number; + + // Timestamps + lastUpdated: number; + lastSuccess: number; + lastFailure: number; +} + export interface LocalSpell { id: string; // UUID for local-only spells, or event ID for published spells alias?: string; // Optional local-only quick name (e.g., "btc") @@ -88,6 +117,7 @@ class GrimoireDb extends Dexie { relayAuthPreferences!: Table; relayLists!: Table; relayLiveness!: Table; + relayPerformance!: Table; spells!: Table; spellbooks!: Table; @@ -311,6 +341,20 @@ class GrimoireDb extends Dexie { spells: "&id, alias, createdAt, isPublished, deletedAt", spellbooks: "&id, slug, title, createdAt, isPublished, deletedAt", }); + + // Version 15: Add relay performance tracking for scoring + this.version(15).stores({ + profiles: "&pubkey", + nip05: "&nip05", + nips: "&id", + relayInfo: "&url", + relayAuthPreferences: "&url", + relayLists: "&pubkey, updatedAt", + relayLiveness: "&url", + relayPerformance: "&url", + spells: "&id, alias, createdAt, isPublished, deletedAt", + spellbooks: "&id, slug, title, createdAt, isPublished, deletedAt", + }); } }