Merge pull request #75 from PR0M3TH3AN/codex/fix-nostr-relay-connection-issues

Fix async Nostr client
This commit is contained in:
thePR0M3TH3AN
2025-06-30 23:49:52 -04:00
committed by GitHub
2 changed files with 36 additions and 34 deletions

View File

@@ -5,6 +5,7 @@ import json
import logging
from typing import List, Optional
import hashlib
import asyncio
# Imports from the nostr-sdk library
from nostr_sdk import (
@@ -73,12 +74,15 @@ class NostrClient:
def initialize_client_pool(self) -> None:
"""Add relays to the client and connect."""
asyncio.run(self._initialize_client_pool())
async def _initialize_client_pool(self) -> None:
if hasattr(self.client, "add_relays"):
self.client.add_relays(self.relays)
await self.client.add_relays(self.relays)
else:
for relay in self.relays:
self.client.add_relay(relay)
self.client.connect()
await self.client.add_relay(relay)
await self.client.connect()
logger.info(f"NostrClient connected to relays: {self.relays}")
def publish_json_to_nostr(
@@ -106,44 +110,42 @@ class NostrClient:
def publish_event(self, event):
"""Publish a prepared event to the configured relays."""
return self.client.send_event(event)
return asyncio.run(self._publish_event(event))
async def _publish_event(self, event):
return await self.client.send_event(event)
def retrieve_json_from_nostr_sync(self) -> Optional[bytes]:
"""Retrieves the latest Kind 1 event from the author."""
try:
# Filter for the latest text note (Kind 1) from our public key
pubkey = self.keys.public_key()
f = (
Filter()
.author(pubkey)
.kind(Kind.from_std(KindStandard.TEXT_NOTE))
.limit(1)
)
# Use the synchronous fetch_events method
timeout = timedelta(seconds=10)
events = self.client.fetch_events(f, timeout).to_vec()
if not events:
logger.warning("No events found on relays for this user.")
return None
# The SDK returns the list of events, newest first due to limit=1
latest_event = events[0]
content_b64 = latest_event.content()
if content_b64:
return base64.b64decode(content_b64.encode("utf-8"))
return None
return asyncio.run(self._retrieve_json_from_nostr())
except Exception as e:
logger.error("Failed to retrieve events from Nostr: %s", e)
return None
async def _retrieve_json_from_nostr(self) -> Optional[bytes]:
# Filter for the latest text note (Kind 1) from our public key
pubkey = self.keys.public_key()
f = Filter().author(pubkey).kind(Kind.from_std(KindStandard.TEXT_NOTE)).limit(1)
timeout = timedelta(seconds=10)
events = (await self.client.fetch_events(f, timeout)).to_vec()
if not events:
logger.warning("No events found on relays for this user.")
return None
latest_event = events[0]
content_b64 = latest_event.content()
if content_b64:
return base64.b64decode(content_b64.encode("utf-8"))
return None
def close_client_pool(self) -> None:
"""Disconnects the client from all relays."""
try:
self.client.disconnect()
asyncio.run(self.client.disconnect())
logger.info("NostrClient disconnected from relays.")
except Exception as e:
logger.error("Error during NostrClient shutdown: %s", e)

View File

@@ -31,10 +31,10 @@ class FakeAddRelaysClient:
self.added = []
self.connected = False
def add_relays(self, relays):
async def add_relays(self, relays):
self.added.append(relays)
def connect(self):
async def connect(self):
self.connected = True
@@ -43,10 +43,10 @@ class FakeAddRelayClient:
self.added = []
self.connected = False
def add_relay(self, relay):
async def add_relay(self, relay):
self.added.append(relay)
def connect(self):
async def connect(self):
self.connected = True