Restored simple RSGI support on KayaApp instances

This commit is contained in:
2026-07-15 22:19:16 +08:00
parent fa3ff32f66
commit 0d6ecce415
5 changed files with 22 additions and 28 deletions
-1
View File
@@ -3,7 +3,6 @@ from typing import List
app = KayaApp() app = KayaApp()
@app.GET('/hello') @app.GET('/hello')
@app.GET('/hello2') @app.GET('/hello2')
async def handle_request(ctx: HttpContext) -> None: async def handle_request(ctx: HttpContext) -> None:
+20 -1
View File
@@ -2,7 +2,7 @@ from abc import ABC, abstractmethod
from asyncio import Queue, AbstractEventLoop from asyncio import Queue, AbstractEventLoop
from asyncio import get_running_loop from asyncio import get_running_loop
from logging import getLogger 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 pwo import Maybe, AsyncQueueIterator
from ._http_context import HttpContext from ._http_context import HttpContext
from ._http_method import HttpMethod from ._http_method import HttpMethod
@@ -12,6 +12,7 @@ from ._websocket import WebSocket
from ._asgi import AsgiContext, AsgiWebSocket from ._asgi import AsgiContext, AsgiWebSocket
from ._tree import Tree from ._tree import Tree
from ._types.asgi import LifespanScope, HTTPScope as ASGIHTTPScope, WebSocketScope as ASGIWebSocketScope from ._types.asgi import LifespanScope, HTTPScope as ASGIHTTPScope, WebSocketScope as ASGIWebSocketScope
from typing_extensions import Unpack
log = getLogger(__name__) log = getLogger(__name__)
@@ -69,6 +70,22 @@ class AbstractKayaApp(ABC):
async def handle_websocket(self, ws: WebSocket) -> None: async def handle_websocket(self, ws: WebSocket) -> None:
raise NotImplementedError() 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): class KayaApp(AbstractKayaApp):
_tree: Tree _tree: Tree
@@ -145,3 +162,5 @@ class KayaApp(AbstractKayaApp):
def PATCH(self, path: str, recursive: bool = False) -> Callable[[HttpHandler], HttpHandler]: def PATCH(self, path: str, recursive: bool = False) -> Callable[[HttpHandler], HttpHandler]:
return self.route(path, (HttpMethod.PATCH,), recursive) return self.route(path, (HttpMethod.PATCH,), recursive)
+1 -1
View File
@@ -2,4 +2,4 @@
RSGI/Granian integration for the Kaya web framework. RSGI/Granian integration for the Kaya web framework.
Provides `RsgiContext`, `RsgiWebSocket`, and `RsgiApplication` to run Kaya apps on Granian's RSGI protocol. Provides `RsgiContext`, `RsgiWebSocket` to run Kaya apps on Granian's RSGI protocol.
+1 -2
View File
@@ -1,9 +1,8 @@
from ._rsgi import RsgiApplication, RsgiContext, RsgiWebSocket from ._rsgi import RsgiContext, RsgiWebSocket
from ._types import HTTPScope, WebSocketScope from ._types import HTTPScope, WebSocketScope
__all__ = [ __all__ = [
'RsgiApplication',
'RsgiContext', 'RsgiContext',
'RsgiWebSocket', 'RsgiWebSocket',
'HTTPScope', 'HTTPScope',
-23
View File
@@ -175,26 +175,3 @@ class RsgiWebSocket(WebSocket):
if message.kind == 'close': if message.kind == 'close':
raise StopAsyncIteration raise StopAsyncIteration
return message return message
class RsgiApplication:
_app: AbstractKayaApp
def __init__(self, app: AbstractKayaApp) -> None:
self._app = app
def __rsgi_init__(self, loop: Any) -> None:
self._app.setup(loop)
def __rsgi_del__(self, loop: Any) -> None:
self._app.shutdown(loop)
async def __rsgi__(self,
scope: RSGIHTTPScope | RSGIWebsocketScope,
protocol: RSGIHTTPProtocol | RSGIWebsocketProtocol) -> None:
if scope.proto == 'ws':
ws = RsgiWebSocket(scope, protocol) # type: ignore[arg-type]
await self._app.handle_websocket(ws)
else:
ctx = RsgiContext(scope, protocol) # type: ignore[arg-type]
await self._app.handle_request(ctx)