From 2662efe6a8188a1eedd9dfe58c6d4dd4755c5a84 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Wed, 15 Jul 2026 14:10:48 +0000 Subject: [PATCH] Restore RSGI support directly on KayaApp instances --- packages/kaya-core/src/kaya/core/_app.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/kaya-core/src/kaya/core/_app.py b/packages/kaya-core/src/kaya/core/_app.py index 3292241..0602671 100644 --- a/packages/kaya-core/src/kaya/core/_app.py +++ b/packages/kaya-core/src/kaya/core/_app.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from asyncio import Queue, AbstractEventLoop from asyncio import get_running_loop from logging import getLogger -from typing import Callable, Awaitable, Any, Mapping, Sequence, Optional, Unpack, Tuple, cast +from typing import Callable, Awaitable, Any, Mapping, Sequence, Optional, Tuple, cast from pwo import Maybe, AsyncQueueIterator from ._http_context import HttpContext from ._http_method import HttpMethod @@ -12,6 +12,7 @@ from ._websocket import WebSocket from ._asgi import AsgiContext, AsgiWebSocket from ._tree import Tree from ._types.asgi import LifespanScope, HTTPScope as ASGIHTTPScope, WebSocketScope as ASGIWebSocketScope +from typing_extensions import Unpack log = getLogger(__name__) @@ -69,6 +70,22 @@ class AbstractKayaApp(ABC): async def handle_websocket(self, ws: WebSocket) -> None: raise NotImplementedError() + def __rsgi_init__(self, loop: AbstractEventLoop) -> None: + self.setup(loop) + + def __rsgi_del__(self, loop: AbstractEventLoop) -> None: + self.shutdown(loop) + + async def __rsgi__(self, scope: Any, protocol: Any) -> None: + try: + from kaya.rsgi import RsgiContext, RsgiWebSocket + except ImportError as exc: + raise RuntimeError("RSGI support requires kaya-rsgi to be installed") from exc + if scope.proto == 'ws': + await self.handle_websocket(RsgiWebSocket(scope, protocol)) + else: + await self.handle_request(RsgiContext(scope, protocol)) + class KayaApp(AbstractKayaApp): _tree: Tree @@ -145,3 +162,5 @@ class KayaApp(AbstractKayaApp): def PATCH(self, path: str, recursive: bool = False) -> Callable[[HttpHandler], HttpHandler]: return self.route(path, (HttpMethod.PATCH,), recursive) + +