refactoring

This commit is contained in:
Maxim Devaev 2022-04-11 16:34:07 +03:00
parent 6bd2b9c680
commit 80b5546d21
3 changed files with 25 additions and 21 deletions

View File

@ -100,14 +100,12 @@ def main(argv: Optional[List[str]]=None) -> None:
**config.snapshot._unpack(), **config.snapshot._unpack(),
), ),
heartbeat=config.server.heartbeat,
keymap_path=config.hid.keymap, keymap_path=config.hid.keymap,
ignore_keys=config.hid.ignore_keys, ignore_keys=config.hid.ignore_keys,
mouse_x_range=(config.hid.mouse_x_range.min, config.hid.mouse_x_range.max), mouse_x_range=(config.hid.mouse_x_range.min, config.hid.mouse_x_range.max),
mouse_y_range=(config.hid.mouse_y_range.min, config.hid.mouse_y_range.max), mouse_y_range=(config.hid.mouse_y_range.min, config.hid.mouse_y_range.max),
stream_forever=config.streamer.forever, stream_forever=config.streamer.forever,
).run(**config.server._unpack(ignore=["heartbeat"])) ).run(**config.server._unpack())
get_logger(0).info("Bye-bye") get_logger(0).info("Bye-bye")

View File

@ -157,8 +157,6 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
streamer: Streamer, streamer: Streamer,
snapshoter: Snapshoter, snapshoter: Snapshoter,
heartbeat: float,
keymap_path: str, keymap_path: str,
ignore_keys: List[str], ignore_keys: List[str],
mouse_x_range: Tuple[int, int], mouse_x_range: Tuple[int, int],
@ -173,8 +171,6 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
self.__snapshoter = snapshoter # Not a component: No state or cleanup self.__snapshoter = snapshoter # Not a component: No state or cleanup
self.__user_gpio = user_gpio # Has extra state "gpio_scheme_state" self.__user_gpio = user_gpio # Has extra state "gpio_scheme_state"
self.__heartbeat = heartbeat
self.__stream_forever = stream_forever self.__stream_forever = stream_forever
self.__components = [ self.__components = [
@ -254,13 +250,9 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
@exposed_http("GET", "/ws") @exposed_http("GET", "/ws")
async def __ws_handler(self, request: aiohttp.web.Request) -> aiohttp.web.WebSocketResponse: async def __ws_handler(self, request: aiohttp.web.Request) -> aiohttp.web.WebSocketResponse:
logger = get_logger(0) stream = valid_bool(request.query.get("stream", "true"))
ws = await self._make_ws_response(request)
client = _WsClient( client = _WsClient(ws, stream)
ws=aiohttp.web.WebSocketResponse(heartbeat=self.__heartbeat),
stream=valid_bool(request.query.get("stream", "true")),
)
await client.ws.prepare(request)
await self.__register_ws_client(client) await self.__register_ws_client(client)
try: try:
@ -281,27 +273,27 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
)) ))
for stage in [stage1, stage2]: for stage in [stage1, stage2]:
await asyncio.gather(*[ await asyncio.gather(*[
send_ws_event(client.ws, event_type, events.pop(event_type)) send_ws_event(ws, event_type, events.pop(event_type))
for (event_type, _) in stage for (event_type, _) in stage
]) ])
await send_ws_event(client.ws, "loop", {}) await send_ws_event(ws, "loop", {})
async for msg in client.ws: async for msg in ws:
if msg.type != aiohttp.web.WSMsgType.TEXT: if msg.type != aiohttp.web.WSMsgType.TEXT:
break break
try: try:
(event_type, event) = parse_ws_event(msg.data) (event_type, event) = parse_ws_event(msg.data)
except Exception as err: except Exception as err:
logger.error("Can't parse JSON event from websocket: %r", err) get_logger(0).error("Can't parse JSON event from websocket: %r", err)
else: else:
handler = self.__ws_handlers.get(event_type) handler = self.__ws_handlers.get(event_type)
if handler: if handler:
await handler(client.ws, event) await handler(ws, event)
else: else:
logger.error("Unknown websocket event: %r", msg.data) get_logger(0).error("Unknown websocket event: %r", msg.data)
return client.ws return ws
finally: finally:
await self.__remove_ws_client(client) await self.__remove_ws_client(client)

View File

@ -255,9 +255,12 @@ class HttpServer:
unix_path: str, unix_path: str,
unix_rm: bool, unix_rm: bool,
unix_mode: int, unix_mode: int,
heartbeat: float,
access_log_format: str, access_log_format: str,
) -> None: ) -> None:
self.__heartbeat = heartbeat # pylint: disable=attribute-defined-outside-init
if unix_rm and os.path.exists(unix_path): if unix_rm and os.path.exists(unix_path):
os.remove(unix_path) os.remove(unix_path)
server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) server_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
@ -274,6 +277,15 @@ class HttpServer:
loop=asyncio.get_event_loop(), loop=asyncio.get_event_loop(),
) )
# =====
async def _make_ws_response(self, request: Request) -> WebSocketResponse:
ws = WebSocketResponse(heartbeat=self.__heartbeat)
await ws.prepare(request)
return ws
# =====
async def _init_app(self, app: Application) -> None: async def _init_app(self, app: Application) -> None:
raise NotImplementedError raise NotImplementedError
@ -283,6 +295,8 @@ class HttpServer:
async def _on_cleanup(self, app: Application) -> None: async def _on_cleanup(self, app: Application) -> None:
_ = app _ = app
# =====
async def __make_app(self) -> Application: async def __make_app(self) -> Application:
app = Application(middlewares=[normalize_path_middleware( app = Application(middlewares=[normalize_path_middleware(
append_slash=False, append_slash=False,