From e2b0038cafd54c552874381e9026ae99b202f53f Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Sun, 13 Sep 2026 20:15:22 -0700 Subject: [PATCH] refactor(nostr): derive metrics contracts from producers (#147766) --- extensions/nostr/src/metrics.ts | 80 +++++---------------------------- 1 file changed, 10 insertions(+), 70 deletions(-) diff --git a/extensions/nostr/src/metrics.ts b/extensions/nostr/src/metrics.ts index 7e02e58e01fe..681add64bccb 100644 --- a/extensions/nostr/src/metrics.ts +++ b/extensions/nostr/src/metrics.ts @@ -89,72 +89,7 @@ type OnMetricCallback = (event: MetricEvent) => void; // Metrics Snapshot (for getMetrics()) // ============================================================================ -export interface MetricsSnapshot { - /** Total events received (before any filtering) */ - eventsReceived: number; - /** Events successfully processed */ - eventsProcessed: number; - /** Duplicate events skipped */ - eventsDuplicate: number; - /** Events rejected by reason */ - eventsRejected: { - invalidShape: number; - wrongKind: number; - stale: number; - future: number; - rateLimited: number; - invalidSignature: number; - oversizedCiphertext: number; - oversizedPlaintext: number; - decryptFailed: number; - selfMessage: number; - }; - - /** Relay stats by URL */ - relays: Record; - - /** Rate limiting stats */ - rateLimiting: { - perSenderHits: number; - globalHits: number; - }; - - /** Decrypt stats */ - decrypt: { - success: number; - failure: number; - }; - - /** Memory/capacity stats */ - memory: { - seenTrackerSize: number; - rateLimiterEntries: number; - }; - - /** Snapshot timestamp */ - snapshotAt: number; -} - -// ============================================================================ -// Metrics Collector -// ============================================================================ - -export interface NostrMetrics { - /** Emit a metric event */ - emit: (name: MetricName, value?: number, labels?: Record) => void; - - /** Get current metrics snapshot */ - getSnapshot: () => MetricsSnapshot; - - /** Reset all metrics to zero */ - reset: () => void; -} - -type MetricsState = Omit & { - relays: Map; -}; - -function createZeroMetricsState(): MetricsState { +function createZeroMetricsState() { return { eventsReceived: 0, eventsProcessed: 0, @@ -171,15 +106,17 @@ function createZeroMetricsState(): MetricsState { decryptFailed: 0, selfMessage: 0, }, - relays: new Map(), + relays: new Map(), rateLimiting: { perSenderHits: 0, globalHits: 0 }, decrypt: { success: 0, failure: 0 }, memory: { seenTrackerSize: 0, rateLimiterEntries: 0 }, }; } -function createMetricsSnapshot(state: MetricsState, snapshotAt?: number): MetricsSnapshot { - const relays: MetricsSnapshot["relays"] = {}; +type MetricsState = ReturnType; + +function createMetricsSnapshot(state: MetricsState, snapshotAt?: number) { + const relays: Record = {}; for (const [url, stats] of state.relays) { relays[url] = { ...stats, messagesReceived: { ...stats.messagesReceived } }; } @@ -199,7 +136,7 @@ function createMetricsSnapshot(state: MetricsState, snapshotAt?: number): Metric * Create a metrics collector instance. * Optionally pass an onMetric callback to receive real-time metric events. */ -export function createMetrics(onMetric?: OnMetricCallback): NostrMetrics { +export function createMetrics(onMetric?: OnMetricCallback) { let state = createZeroMetricsState(); function getOrCreateRelay(url: string) { @@ -391,6 +328,9 @@ export function createMetrics(onMetric?: OnMetricCallback): NostrMetrics { return { emit, getSnapshot, reset }; } +export type MetricsSnapshot = ReturnType; +export type NostrMetrics = ReturnType; + /** * Create a no-op metrics instance (for when metrics are disabled). */