diff --git a/src/pydase/server/web_server/api/v1/endpoints.py b/src/pydase/server/web_server/api/v1/endpoints.py index f09a8cf..dca28ab 100644 --- a/src/pydase/server/web_server/api/v1/endpoints.py +++ b/src/pydase/server/web_server/api/v1/endpoints.py @@ -1,4 +1,4 @@ -from typing import Any +from typing import TYPE_CHECKING, Any import pydase.utils.serialization.deserializer import pydase.utils.serialization.serializer @@ -7,6 +7,9 @@ from pydase.server.web_server.sio_setup import TriggerMethodDict, UpdateDict from pydase.utils.helpers import get_object_attr_from_path from pydase.utils.serialization.types import SerializedObject +if TYPE_CHECKING: + from collections.abc import Awaitable, Callable + loads = pydase.utils.serialization.deserializer.loads Serializer = pydase.utils.serialization.serializer.Serializer @@ -36,3 +39,19 @@ def trigger_method(state_manager: StateManager, data: TriggerMethodDict) -> Any: kwargs: dict[str, Any] = loads(serialized_kwargs) if serialized_kwargs else {} return Serializer.serialize_object(method(*args, **kwargs)) + + +async def trigger_async_method( + state_manager: StateManager, data: TriggerMethodDict +) -> Any: + method: Callable[..., Awaitable[Any]] = get_object_attr_from_path( + state_manager.service, data["access_path"] + ) + + serialized_args = data.get("args", None) + args = loads(serialized_args) if serialized_args else [] + + serialized_kwargs = data.get("kwargs", None) + kwargs: dict[str, Any] = loads(serialized_kwargs) if serialized_kwargs else {} + + return Serializer.serialize_object(await method(*args, **kwargs))