This commit is contained in:
Arc
2026-02-25 13:39:26 +00:00
parent ee6ff7179e
commit 64ad19a65b
+45 -1
View File
@@ -14,7 +14,9 @@ from fastapi.staticfiles import StaticFiles
from lnbits.core.crud.extensions import get_user_extension
from lnbits.core.models import User
from lnbits.core.crud.payments import get_standalone_payment, update_payment
from lnbits.core.services import websocket_updater
from loguru import logger
from lnbits.db import Database
from lnbits.decorators import check_user_exists
from lnbits.helpers import template_renderer
@@ -440,20 +442,62 @@ def _start_payment_watch(
queue_name = f"wasm:{ext_id}:{payment_hash}:{time.time()}"
invoice_queue: asyncio.Queue = asyncio.Queue()
register_invoice_listener(invoice_queue, queue_name)
logger.debug(f"wasm watch registered ext={ext_id} hash={payment_hash} store_key={store_key}")
async def _watch():
try:
existing = await get_standalone_payment(payment_hash, incoming=True)
if existing and existing.pending is False:
logger.debug(f"wasm watch already paid ext={ext_id} hash={payment_hash}")
if tag:
extra = existing.extra or {}
if extra.get("tag") != tag:
extra["tag"] = tag
existing.extra = extra
existing.tag = tag
await update_payment(existing, conn=db)
payload_json = json.dumps(existing.dict(exclude={"preimage"}))
await _kv_set(db, ext_id, store_key, payload_json)
await websocket_updater(f"{ext_id}:{store_key}", payload_json)
watch_payload = {
"payment_hash": payment_hash,
"store_key": store_key,
"tag": tag,
}
await _kv_set(db, ext_id, "watch_request", json.dumps(watch_payload))
watch_value = store_key.rsplit(":", 1)[-1]
await _kv_set(db, ext_id, "public_request", watch_value)
await wasm_call(
ext_id,
handler,
[],
upgrade_hash=upgrade_hash,
)
return
while True:
payment = await invoice_queue.get()
if payment.payment_hash != payment_hash:
continue
logger.debug(f"wasm watch event ext={ext_id} hash={payment_hash} pending={payment.pending}")
if tag:
extra = payment.extra or {}
if extra.get("tag") != tag:
continue
extra["tag"] = tag
payment.extra = extra
payment.tag = tag
await update_payment(payment, conn=db)
if payment.pending is False:
payload_json = json.dumps(payment.dict(exclude={"preimage"}))
await _kv_set(db, ext_id, store_key, payload_json)
await websocket_updater(f"{ext_id}:{store_key}", payload_json)
watch_payload = {
"payment_hash": payment_hash,
"store_key": store_key,
"tag": tag,
}
await _kv_set(db, ext_id, "watch_request", json.dumps(watch_payload))
watch_value = store_key.rsplit(":", 1)[-1]
await _kv_set(db, ext_id, "public_request", watch_value)
await wasm_call(
ext_id,
handler,