Files
c-relay-pg/plans/caching_status_fix_plan.md

4.0 KiB

Caching Status "Not Implemented" Fix Plan

Root Cause

The caching page shows "Service status unavailable (caching_status command not implemented on relay)" — but the command is implemented at src/config.c:4128. The real problem is admin authorization failure: every admin command from the browser is rejected at publish time with:

Unauthorized admin event attempt: invalid admin pubkey

This rejection happens at src/main.c:2249 because the browser's pubkey is not in the relay's admin_pubkey config list. The kind 23456 event never reaches the command handler, so caching_status never executes, and the placeholder text persists.

Confirmed admin key

  • Relay admin pubkey (hex): 6a04ab98d9e4774ad806e302dddeb63bea16b5cb5f223ee77478e861bb583eb3
  • Relay admin npub: npub13lm5wf8dvsdnc2894pkhch9uf8phvw9varrv8zf4sc885hhdmc8q6lx7ks
  • Source: .relay.laantungir.net.keys

The browser extension (nos2x) was using pubkey 8ff74724..., which is not an admin on the port 7777 relay.

Secondary Issue (latent)

Even after auth is fixed, the caching status UI would render empty blocks due to a schema mismatch between backend and frontend:

Frontend expects (api/index.js:7046) Backend emits (src/config.c:4135)
data.service.enabled data.caching_enabled
data.service.running (not emitted)
data.inbox.enabled data.caching_inbox_enabled
data.inbox.queue_depth data.inbox_pending_live + data.inbox_pending_backfill
(not expected) data.inbox_total_dequeued, data.inbox_total_accepted, data.inbox_total_rejected, data.inbox_oldest_age_seconds

Fix Steps

flowchart TD
    A[Step 1: Fix admin auth] --> B[Step 2: Align response schema]
    B --> C[Step 3: Fix frontend handler]
    C --> D[Step 4: Improve error messaging]
    D --> E[Step 5: Test end-to-end]

Step 1 — Fix admin authorization (config, user action)

Load the admin private key (corresponding to 6a04ab98... / npub13lm5wf8dvsdnc2894pkhch9uf8phvw9varrv8zf4sc885hhdmc8q6lx7ks) into the nos2x browser extension so admin commands authenticate. Use nak on the command line to convert/derive the nsec if needed.

This unblocks all admin commands, not just caching.

Step 2 — Align backend response schema (code, src/config.c:4128)

Restructure the data object in the caching_status handler to emit nested service and inbox objects matching the frontend handler:

{
  "command": "caching_status",
  "status": "success",
  "data": {
    "service": {
      "enabled": false,
      "running": false,
      "connected_relays": 0,
      "events_cached": 0
    },
    "inbox": {
      "enabled": false,
      "running": true,
      "queue_depth": 0,
      "last_poll": 0,
      "total_dequeued": 0,
      "total_accepted": 0,
      "total_rejected": 0,
      "total_duplicates": 0,
      "pending_live": 0,
      "pending_backfill": 0,
      "oldest_age_seconds": 0
    }
  }
}

Populate service.running / connected_relays / events_cached from the caching service launcher state if available; otherwise emit zeros/defaults.

Step 3 — Update frontend handler (code, api/index.js:7027)

Update handleCachingStatusResponse() to render the inbox poller stats the backend actually produces (dequeued/accepted/rejected/pending/oldest_age), and map data.inbox.pending_live + pending_backfill to queue depth.

Step 4 — Replace misleading placeholder (code, api/index.js:6889)

  • Change the pre-send placeholder from "caching_status command not implemented" to a neutral "Loading..." message.
  • On auth failure, show the actual error (e.g., "Not authorized: pubkey not registered as admin") instead of the generic "unavailable" text.

Step 5 — Test end-to-end on port 7777

Verify the caching page shows real service/inbox status after auth is fixed and the schema is aligned.