mirror of
https://github.com/aljazceru/nutshell.git
synced 2026-01-04 01:14:21 +01:00
Mint: add websockets for quote updates (#413)
* add websockets for quote updates * add test (not working) * wip: emit events to everyone * wip: emit events to everyone * wip, lots of things broken but invoice callback works * wip * add wip files * tests almost passing * add task * refactor nut constants * startup fix * works with old mints * wip cli * fix mypy * remove automatic invoice test now with websockets * remove comment * better logging * send back response * add rate limiter to websocket * add rate limiter to subscriptions * refactor websocket ratelimit * websocket tests * subscription kinds * doesnt start * remove circular import * update * fix mypy * move test file in test because it fails if it runs later... dunno why * adjust websocket NUT-06 settings * local import and small fix * disable websockets in CLI if "no_check" is selected * move subscription test to where it was * check proof state with callback, add tests * tests: run mint fixture per module instead of per session * subscription command name fix * test per session again * update test race conditions * fix tests * clean up * tmp * fix db issues and remove cached secrets * fix tests * blindly try pipeline * remove comments * comments
This commit is contained in:
45
cashu/mint/tasks.py
Normal file
45
cashu/mint/tasks.py
Normal file
@@ -0,0 +1,45 @@
|
||||
import asyncio
|
||||
from typing import Mapping
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from ..core.base import Method, Unit
|
||||
from ..core.db import Database
|
||||
from ..lightning.base import LightningBackend
|
||||
from ..mint.crud import LedgerCrud
|
||||
from .events.events import LedgerEventManager
|
||||
from .protocols import SupportsBackends, SupportsDb, SupportsEvents
|
||||
|
||||
|
||||
class LedgerTasks(SupportsDb, SupportsBackends, SupportsEvents):
|
||||
backends: Mapping[Method, Mapping[Unit, LightningBackend]] = {}
|
||||
db: Database
|
||||
crud: LedgerCrud
|
||||
events: LedgerEventManager
|
||||
|
||||
async def dispatch_listeners(self) -> None:
|
||||
for method, unitbackends in self.backends.items():
|
||||
for unit, backend in unitbackends.items():
|
||||
logger.debug(
|
||||
f"Dispatching backend invoice listener for {method} {unit} {backend.__class__.__name__}"
|
||||
)
|
||||
asyncio.create_task(self.invoice_listener(backend))
|
||||
|
||||
async def invoice_listener(self, backend: LightningBackend) -> None:
|
||||
async for checking_id in backend.paid_invoices_stream():
|
||||
await self.invoice_callback_dispatcher(checking_id)
|
||||
|
||||
async def invoice_callback_dispatcher(self, checking_id: str) -> None:
|
||||
logger.debug(f"Invoice callback dispatcher: {checking_id}")
|
||||
# TODO: Explicitly check for the quote payment state before setting it as paid
|
||||
# db read, quote.paid = True, db write should be refactored and moved to ledger.py
|
||||
quote = await self.crud.get_mint_quote(checking_id=checking_id, db=self.db)
|
||||
if not quote:
|
||||
logger.error(f"Quote not found for {checking_id}")
|
||||
return
|
||||
# set the quote as paid
|
||||
if not quote.paid:
|
||||
quote.paid = True
|
||||
await self.crud.update_mint_quote(quote=quote, db=self.db)
|
||||
logger.trace(f"Quote {quote} set as paid and ")
|
||||
await self.events.submit(quote)
|
||||
Reference in New Issue
Block a user