-- ========================================== -- Chat Switchboard — 020 Multi-Replica HA -- ========================================== -- Shared state tables for multi-replica operation. -- v0.32.0: ws_tickets, rate_limit_counters. -- ========================================== -- ========================================= -- WEBSOCKET TICKETS (replaces in-memory sync.Map) -- ========================================= -- Short-lived, single-use tokens for WebSocket authentication. -- Ticket issued on pod-1 must validate on pod-2. CREATE TABLE IF NOT EXISTS ws_tickets ( id TEXT PRIMARY KEY, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, expires_at TIMESTAMPTZ NOT NULL ); CREATE INDEX IF NOT EXISTS idx_ws_tickets_expires ON ws_tickets (expires_at); -- ========================================= -- RATE LIMIT COUNTERS (replaces in-memory token bucket) -- ========================================= -- Fixed-window counters keyed by scope:identifier and time bucket. -- Key format: "{scope}:{identifier}" e.g. "auth:192.168.1.1" CREATE TABLE IF NOT EXISTS rate_limit_counters ( key TEXT NOT NULL, window_start TIMESTAMPTZ NOT NULL, tokens REAL NOT NULL DEFAULT 0, PRIMARY KEY (key, window_start) ); CREATE INDEX IF NOT EXISTS idx_rate_limit_counters_window ON rate_limit_counters (window_start);