From 6d71526b885f7bd84a58f5b355929c2e0bc991c1 Mon Sep 17 00:00:00 2001 From: Vlad Stan Date: Tue, 30 Jun 2026 14:39:25 +0300 Subject: [PATCH] refactor: `app` usage --- lnbits/core/extensions/loader.py | 5 ++--- lnbits/core/extensions/wasm.py | 12 ++++++------ lnbits/core/models/__init__.py | 2 ++ lnbits/core/models/misc.py | 17 +++++++++++++++++ lnbits/core/tasks.py | 3 +-- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/lnbits/core/extensions/loader.py b/lnbits/core/extensions/loader.py index 540934f91..ffbb5503f 100644 --- a/lnbits/core/extensions/loader.py +++ b/lnbits/core/extensions/loader.py @@ -16,6 +16,7 @@ from pydantic import UUID4 from starlette.staticfiles import PathLike as StaticFilesPathLike from starlette.types import Scope +from lnbits.core.db import core_app_extra from lnbits.decorators import ( check_access_token, check_user_exists, @@ -141,9 +142,7 @@ def register_wasm_extension(app: FastAPI, ext_id: str) -> WasmExtension: _register_wasm_extension_ui_routes(app, loaded) _register_wasm_extension_api_routes(app, loaded) - extensions = getattr(app.state, "lnbits_wasm_extensions", {}) - extensions[ext_id] = loaded - app.state.lnbits_wasm_extensions = extensions + core_app_extra.wasm_extension_registry.register(loaded) settings.activate_extension_paths(ext_id, "", []) logger.info( diff --git a/lnbits/core/extensions/wasm.py b/lnbits/core/extensions/wasm.py index 7717c17b3..8356fa7ba 100644 --- a/lnbits/core/extensions/wasm.py +++ b/lnbits/core/extensions/wasm.py @@ -10,9 +10,10 @@ from typing import Any from fastapi import FastAPI from lnbits.core.crud.extensions import get_installed_extension +from lnbits.core.db import core_app_extra from .api import ExtensionAPI, list_extension_api_methods -from .loader import WasmExtension, register_wasm_extension +from .loader import WasmExtension from .runtime import ExtensionAPIHost @@ -26,7 +27,7 @@ async def invoke_wasm_extension_export( context: str = "user", owner_id: str | None = None, ) -> dict[str, Any]: - extension = _get_registered_extension(app, ext_id) + extension = _get_registered_extension(ext_id) permissions = await _extension_permissions(extension) api = ExtensionAPI( extension.id, @@ -190,12 +191,11 @@ def _parse_wasm_export_result(extension: WasmExtension, value: Any) -> dict[str, return {"ok": True, "data": parsed} -def _get_registered_extension(app: FastAPI, ext_id: str) -> WasmExtension: - extensions = getattr(app.state, "lnbits_wasm_extensions", {}) - extension = extensions.get(ext_id) +def _get_registered_extension(ext_id: str) -> WasmExtension: + extension = core_app_extra.wasm_extension_registry.get(ext_id) if extension: return extension - return register_wasm_extension(app, ext_id) + raise RuntimeError(f"WASM extension '{ext_id}' is not registered.") async def _extension_permissions(extension: WasmExtension) -> list[Any]: diff --git a/lnbits/core/models/__init__.py b/lnbits/core/models/__init__.py index f845e5486..1f40595fa 100644 --- a/lnbits/core/models/__init__.py +++ b/lnbits/core/models/__init__.py @@ -7,6 +7,7 @@ from .misc import ( CoreAppExtra, DbVersion, SimpleStatus, + WasmExtensionRegistry, ) from .payments import ( CancelInvoice, @@ -102,5 +103,6 @@ __all__ = [ "Wallet", "WalletInfo", "WalletTypeInfo", + "WasmExtensionRegistry", "WebPushSubscription", ] diff --git a/lnbits/core/models/misc.py b/lnbits/core/models/misc.py index 4417079de..7ca9d7e15 100644 --- a/lnbits/core/models/misc.py +++ b/lnbits/core/models/misc.py @@ -22,6 +22,23 @@ class CoreAppExtra: _do_nothing_async ) + def __init__(self) -> None: + self.wasm_extension_registry = WasmExtensionRegistry() + + +class WasmExtensionRegistry: + def __init__(self) -> None: + self._extensions: dict[str, Any] = {} + + def register(self, extension: Any) -> None: + self._extensions[extension.id] = extension + + def get(self, ext_id: str) -> Any | None: + return self._extensions.get(ext_id) + + def list(self) -> list[Any]: + return list(self._extensions.values()) + class ConversionData(BaseModel): from_: str = "sat" diff --git a/lnbits/core/tasks.py b/lnbits/core/tasks.py index 481f174ff..336ea131d 100644 --- a/lnbits/core/tasks.py +++ b/lnbits/core/tasks.py @@ -112,8 +112,7 @@ async def dispatch_wasm_invoice_paid(app: FastAPI, payment: Any) -> None: if not extension_id: return - extensions = getattr(app.state, "lnbits_wasm_extensions", {}) - extension = extensions.get(extension_id) + extension = core_app_extra.wasm_extension_registry.get(extension_id) if not extension: return