forked from Rockachopa/Timmy-time-dashboard
Co-authored-by: Kimi Agent <kimi@timmy.local> Co-committed-by: Kimi Agent <kimi@timmy.local>
70 lines
1.9 KiB
Python
70 lines
1.9 KiB
Python
"""Lightning backend factory.
|
|
|
|
Returns a mock or real LND backend based on ``settings.lightning_backend``.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import logging
|
|
import secrets
|
|
from dataclasses import dataclass
|
|
|
|
from config import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@dataclass
|
|
class Invoice:
|
|
"""Minimal Lightning invoice representation."""
|
|
|
|
payment_hash: str
|
|
payment_request: str
|
|
amount_sats: int
|
|
memo: str
|
|
|
|
|
|
class MockBackend:
|
|
"""In-memory mock Lightning backend for development and testing."""
|
|
|
|
def create_invoice(self, amount_sats: int, memo: str = "") -> Invoice:
|
|
"""Create a fake invoice with a random payment hash."""
|
|
raw = secrets.token_bytes(32)
|
|
payment_hash = hashlib.sha256(raw).hexdigest()
|
|
payment_request = f"lnbc{amount_sats}mock{payment_hash[:20]}"
|
|
logger.debug("Mock invoice: %s sats — %s", amount_sats, payment_hash[:12])
|
|
return Invoice(
|
|
payment_hash=payment_hash,
|
|
payment_request=payment_request,
|
|
amount_sats=amount_sats,
|
|
memo=memo,
|
|
)
|
|
|
|
|
|
# Singleton — lazily created
|
|
_backend: MockBackend | None = None
|
|
|
|
|
|
def get_backend() -> MockBackend:
|
|
"""Return the configured Lightning backend (currently mock-only).
|
|
|
|
Raises ``ValueError`` if an unsupported backend is requested.
|
|
"""
|
|
global _backend # noqa: PLW0603
|
|
if _backend is not None:
|
|
return _backend
|
|
|
|
kind = settings.lightning_backend
|
|
if kind == "mock":
|
|
_backend = MockBackend()
|
|
elif kind == "lnd":
|
|
# LND gRPC integration is on the roadmap — for now fall back to mock.
|
|
logger.warning("LND backend not yet implemented — using mock")
|
|
_backend = MockBackend()
|
|
else:
|
|
raise ValueError(f"Unknown lightning_backend: {kind!r}")
|
|
|
|
logger.info("Lightning backend: %s", kind)
|
|
return _backend
|