Stabilize (#24)
* refactor: clean-up * refactor: extra logs plus try-catch * refactor: do not use bare `except` * refactor: clean-up redundant fields * chore: pass code checks * chore: code format * refactor: code clean-up * fix: refactoring stuff * refactor: remove un-used file * chore: code clean-up * chore: code clean-up * chore: code-format fix * refactor: remove nostr.client wrapper * refactor: code clean-up * chore: code format * refactor: remove `RelayList` class * refactor: extract smaller methods with try-catch * fix: better exception handling * fix: remove redundant filters * fix: simplify event * chore: code format * fix: code check * fix: code check * fix: simplify `REQ` * fix: more clean-ups * refactor: use simpler method * refactor: re-order and rename * fix: stop logic * fix: subscription close before disconnect * chore: play commit
This commit is contained in:
parent
ab185bd2c4
commit
16ae9d15a1
20 changed files with 522 additions and 717 deletions
62
views_api.py
62
views_api.py
|
|
@ -1,6 +1,6 @@
|
|||
import asyncio
|
||||
from http import HTTPStatus
|
||||
from typing import Optional
|
||||
from typing import List
|
||||
|
||||
from fastapi import Depends, WebSocket
|
||||
from loguru import logger
|
||||
|
|
@ -9,23 +9,23 @@ from starlette.exceptions import HTTPException
|
|||
from lnbits.decorators import check_admin
|
||||
from lnbits.helpers import urlsafe_short_hash
|
||||
|
||||
from . import nostr, nostrclient_ext, scheduled_tasks
|
||||
from . import nostr_client, nostrclient_ext, scheduled_tasks
|
||||
from .crud import add_relay, delete_relay, get_relays
|
||||
from .helpers import normalize_public_key
|
||||
from .models import Relay, RelayList, TestMessage, TestMessageResponse
|
||||
from .models import Relay, TestMessage, TestMessageResponse
|
||||
from .nostr.key import EncryptedDirectMessage, PrivateKey
|
||||
from .router import NostrRouter, nostr
|
||||
from .router import NostrRouter
|
||||
|
||||
# we keep this in
|
||||
all_routers: list[NostrRouter] = []
|
||||
|
||||
|
||||
@nostrclient_ext.get("/api/v1/relays")
|
||||
async def api_get_relays() -> RelayList:
|
||||
relays = RelayList(__root__=[])
|
||||
for url, r in nostr.client.relay_manager.relays.items():
|
||||
async def api_get_relays() -> List[Relay]:
|
||||
relays = []
|
||||
for url, r in nostr_client.relay_manager.relays.items():
|
||||
relay_id = urlsafe_short_hash()
|
||||
relays.__root__.append(
|
||||
relays.append(
|
||||
Relay(
|
||||
id=relay_id,
|
||||
url=url,
|
||||
|
|
@ -47,12 +47,12 @@ async def api_get_relays() -> RelayList:
|
|||
@nostrclient_ext.post(
|
||||
"/api/v1/relay", status_code=HTTPStatus.OK, dependencies=[Depends(check_admin)]
|
||||
)
|
||||
async def api_add_relay(relay: Relay) -> Optional[RelayList]:
|
||||
async def api_add_relay(relay: Relay) -> List[Relay]:
|
||||
if not relay.url:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST, detail=f"Relay url not provided."
|
||||
status_code=HTTPStatus.BAD_REQUEST, detail="Relay url not provided."
|
||||
)
|
||||
if relay.url in nostr.client.relay_manager.relays:
|
||||
if relay.url in nostr_client.relay_manager.relays:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST,
|
||||
detail=f"Relay: {relay.url} already exists.",
|
||||
|
|
@ -60,9 +60,7 @@ async def api_add_relay(relay: Relay) -> Optional[RelayList]:
|
|||
relay.id = urlsafe_short_hash()
|
||||
await add_relay(relay)
|
||||
|
||||
nostr.client.relays.append(relay.url)
|
||||
nostr.client.relay_manager.add_relay(relay.url)
|
||||
|
||||
nostr_client.relay_manager.add_relay(relay.url)
|
||||
|
||||
return await get_relays()
|
||||
|
||||
|
|
@ -73,10 +71,10 @@ async def api_add_relay(relay: Relay) -> Optional[RelayList]:
|
|||
async def api_delete_relay(relay: Relay) -> None:
|
||||
if not relay.url:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST, detail=f"Relay url not provided."
|
||||
status_code=HTTPStatus.BAD_REQUEST, detail="Relay url not provided."
|
||||
)
|
||||
# we can remove relays during runtime
|
||||
nostr.client.relay_manager.remove_relay(relay.url)
|
||||
nostr_client.relay_manager.remove_relay(relay.url)
|
||||
await delete_relay(relay)
|
||||
|
||||
|
||||
|
|
@ -88,14 +86,18 @@ async def api_test_endpoint(data: TestMessage) -> TestMessageResponse:
|
|||
to_public_key = normalize_public_key(data.reciever_public_key)
|
||||
|
||||
pk = bytes.fromhex(data.sender_private_key) if data.sender_private_key else None
|
||||
private_key = PrivateKey(pk)
|
||||
private_key = PrivateKey(pk) if pk else PrivateKey()
|
||||
|
||||
dm = EncryptedDirectMessage(
|
||||
recipient_pubkey=to_public_key, cleartext_content=data.message
|
||||
)
|
||||
private_key.sign_event(dm)
|
||||
|
||||
return TestMessageResponse(private_key=private_key.hex(), public_key=to_public_key, event_json=dm.to_message())
|
||||
return TestMessageResponse(
|
||||
private_key=private_key.hex(),
|
||||
public_key=to_public_key,
|
||||
event_json=dm.to_message(),
|
||||
)
|
||||
except (ValueError, AssertionError) as ex:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.BAD_REQUEST,
|
||||
|
|
@ -109,23 +111,18 @@ async def api_test_endpoint(data: TestMessage) -> TestMessageResponse:
|
|||
)
|
||||
|
||||
|
||||
|
||||
@nostrclient_ext.delete(
|
||||
"/api/v1", status_code=HTTPStatus.OK, dependencies=[Depends(check_admin)]
|
||||
)
|
||||
async def api_stop():
|
||||
for router in all_routers:
|
||||
try:
|
||||
for s in router.subscriptions:
|
||||
nostr.client.relay_manager.close_subscription(s)
|
||||
await router.stop()
|
||||
all_routers.remove(router)
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
try:
|
||||
nostr.client.relay_manager.close_connections()
|
||||
except Exception as e:
|
||||
logger.error(e)
|
||||
|
||||
nostr_client.close()
|
||||
|
||||
for scheduled_task in scheduled_tasks:
|
||||
try:
|
||||
|
|
@ -141,13 +138,14 @@ async def ws_relay(websocket: WebSocket) -> None:
|
|||
"""Relay multiplexer: one client (per endpoint) <-> multiple relays"""
|
||||
await websocket.accept()
|
||||
router = NostrRouter(websocket)
|
||||
await router.start()
|
||||
router.start()
|
||||
all_routers.append(router)
|
||||
|
||||
# we kill this websocket and the subscriptions if the user disconnects and thus `connected==False`
|
||||
while True:
|
||||
# we kill this websocket and the subscriptions
|
||||
# if the user disconnects and thus `connected==False`
|
||||
while router.connected:
|
||||
await asyncio.sleep(10)
|
||||
if not router.connected:
|
||||
await router.stop()
|
||||
all_routers.remove(router)
|
||||
break
|
||||
|
||||
await router.stop()
|
||||
all_routers.remove(router)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue