feat: answer REQ with CLOSED when no relay is configured
Ported from the upstream PR (lnbits/nostrclient#74, idea from #68). Nothing will ever serve a subscription when nostrclient has no relay at all, so refuse it per NIP-01 instead of registering it silently. Keyed on "no relay configured" rather than "none connected": a configured relay that is merely reconnecting gets the cached subscription replayed, so refusing the REQ there would be a regression. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013Tbyw6FwjhEJg3gHfPHxWt
This commit is contained in:
parent
ab1017ba4d
commit
7e7120fa82
3 changed files with 43 additions and 3 deletions
18
router.py
18
router.py
|
|
@ -195,7 +195,7 @@ class NostrRouter:
|
|||
assert len(json_data), "Bad JSON array"
|
||||
|
||||
if json_data[0] == "REQ":
|
||||
self._handle_client_req(json_data)
|
||||
await self._handle_client_req(json_data)
|
||||
return
|
||||
|
||||
if json_data[0] == "CLOSE":
|
||||
|
|
@ -223,15 +223,29 @@ class NostrRouter:
|
|||
self.pending_publishes[event_id] = PendingPublish(event_id, len(connected))
|
||||
nostr_client.relay_manager.publish_message(json_str)
|
||||
|
||||
def _handle_client_req(self, json_data):
|
||||
async def _handle_client_req(self, json_data):
|
||||
subscription_id = json_data[1]
|
||||
logger.info(f"New subscription: '{subscription_id}'")
|
||||
if not nostr_client.relay_manager.relays:
|
||||
# NIP-01: nothing will ever serve this subscription, so refuse it.
|
||||
# Only when no relay is configured at all: a configured relay that
|
||||
# is merely reconnecting gets the cached subscription replayed.
|
||||
await self._send_closed(subscription_id, "error: no relay connections")
|
||||
return
|
||||
subscription_id_rewritten = urlsafe_short_hash()
|
||||
self.original_subscription_ids[subscription_id_rewritten] = subscription_id
|
||||
filters = json_data[2:]
|
||||
|
||||
nostr_client.relay_manager.add_subscription(subscription_id_rewritten, filters)
|
||||
|
||||
async def _send_closed(self, subscription_id: str, message: str):
|
||||
try:
|
||||
await self.websocket.send_text(
|
||||
json.dumps(["CLOSED", subscription_id, message])
|
||||
)
|
||||
except Exception as e:
|
||||
logger.debug(f"Failed to send CLOSED for '{subscription_id}': {e}")
|
||||
|
||||
def _handle_client_close(self, subscription_id):
|
||||
subscription_id_rewritten = next(
|
||||
(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue