ws api refactoring

This commit is contained in:
Devaev Maxim 2019-12-10 05:53:29 +03:00
parent 3048fc7923
commit f5a6fe35a9
5 changed files with 30 additions and 41 deletions

View File

@ -64,7 +64,7 @@ def get_exposed_http(obj: object) -> List[HttpExposed]:
handler=handler, handler=handler,
) )
for name in dir(obj) for name in dir(obj)
if inspect.ismethod(handler := getattr(obj, name)) and getattr(handler, _HTTP_EXPOSED, False) if inspect.ismethod(handler := getattr(obj, name)) and getattr(handler, _HTTP_EXPOSED, False) # noqa: E203
] ]
@ -94,7 +94,7 @@ def get_exposed_ws(obj: object) -> List[WsExposed]:
handler=handler, handler=handler,
) )
for name in dir(obj) for name in dir(obj)
if inspect.ismethod(handler := getattr(obj, name)) and getattr(handler, _WS_EXPOSED, False) if inspect.ismethod(handler := getattr(obj, name)) and getattr(handler, _WS_EXPOSED, False) # noqa: E203
] ]

View File

@ -249,22 +249,24 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
async for msg in ws: async for msg in ws:
if msg.type == aiohttp.web.WSMsgType.TEXT: if msg.type == aiohttp.web.WSMsgType.TEXT:
try: try:
event = json.loads(msg.data) data = json.loads(msg.data)
event_type = data.get("event_type")
event = data["event"]
except Exception as err: except Exception as err:
logger.error("Can't parse JSON event from websocket: %s", err) logger.error("Can't parse JSON event from websocket: %r", err)
else: else:
handler = self.__ws_handlers.get(event.get("event_type")) handler = self.__ws_handlers.get(event_type)
if handler: if handler:
await handler(ws, event) await handler(ws, event)
else: else:
logger.error("Unknown websocket event: %r", event) logger.error("Unknown websocket event: %r", data)
else: else:
break break
return ws return ws
@exposed_ws("ping") @exposed_ws("ping")
async def __ws_ping_handler(self, ws: aiohttp.web.WebSocketResponse, _: Dict) -> None: async def __ws_ping_handler(self, ws: aiohttp.web.WebSocketResponse, _: Dict) -> None:
await ws.send_str(json.dumps({"msg_type": "pong"})) await ws.send_str(json.dumps({"event_type": "pong", "event": {}}))
# ===== SYSTEM STUFF # ===== SYSTEM STUFF
@ -377,15 +379,12 @@ class KvmdServer(HttpServer): # pylint: disable=too-many-arguments,too-many-ins
except Exception: except Exception:
logger.exception("Cleanup error on %s", name) logger.exception("Cleanup error on %s", name)
async def __broadcast_event(self, event_type: _Events, event_attrs: Dict) -> None: async def __broadcast_event(self, event_type: _Events, event: Dict) -> None:
if self.__sockets: if self.__sockets:
await asyncio.gather(*[ await asyncio.gather(*[
ws.send_str(json.dumps({ ws.send_str(json.dumps({
"msg_type": "event", "event_type": event_type.value,
"msg": { "event": event,
"event": event_type.value,
"event_attrs": event_attrs,
},
})) }))
for ws in list(self.__sockets) for ws in list(self.__sockets)
if not ws.closed and ws._req is not None and ws._req.transport is not None # pylint: disable=protected-access if not ws.closed and ws._req is not None and ws._req.transport is not None # pylint: disable=protected-access

View File

@ -126,9 +126,8 @@ export function Keyboard() {
tools.debug("Keyboard: key", (state ? "pressed:" : "released:"), code); tools.debug("Keyboard: key", (state ? "pressed:" : "released:"), code);
if (__ws) { if (__ws) {
__ws.send(JSON.stringify({ __ws.send(JSON.stringify({
event_type: "key", "event_type": "key",
key: code, "event": {"key": code, "state": state},
state: state,
})); }));
} }
}; };

View File

@ -147,9 +147,8 @@ export function Mouse() {
__sendMove(); __sendMove();
if (__ws) { if (__ws) {
__ws.send(JSON.stringify({ __ws.send(JSON.stringify({
event_type: "mouse_button", "event_type": "mouse_button",
button: button, "event": {"button": button, "state": state},
state: state,
})); }));
} }
}; };
@ -166,8 +165,8 @@ export function Mouse() {
tools.debug("Mouse: moved:", to); tools.debug("Mouse: moved:", to);
if (__ws) { if (__ws) {
__ws.send(JSON.stringify({ __ws.send(JSON.stringify({
event_type: "mouse_move", "event_type": "mouse_move",
to: to, "event": {"to": to},
})); }));
} }
__sent_pos = pos; __sent_pos = pos;
@ -202,8 +201,8 @@ export function Mouse() {
tools.debug("Mouse: scrolled:", delta); tools.debug("Mouse: scrolled:", delta);
if (__ws) { if (__ws) {
__ws.send(JSON.stringify({ __ws.send(JSON.stringify({
event_type: "mouse_wheel", "event_type": "mouse_wheel",
delta: delta, "event": {"delta": delta},
})); }));
} }
} }

View File

@ -114,23 +114,15 @@ export function Session() {
var __wsMessageHandler = function(event) { var __wsMessageHandler = function(event) {
// tools.debug("Session: received socket data:", event.data); // tools.debug("Session: received socket data:", event.data);
event = JSON.parse(event.data); let data = JSON.parse(event.data);
if (event.msg_type === "pong") { switch (data.event_type) {
__missed_heartbeats = 0; case "pong": __missed_heartbeats = 0; break;
} else if (event.msg_type === "event") { case "info_state": __setKvmdInfo(data.event); break;
if (event.msg.event === "info_state") { case "wol_state": __wol.setState(data.event); break;
__setKvmdInfo(event.msg.event_attrs); case "hid_state": __hid.setState(data.event); break;
} else if (event.msg.event === "hid_state") { case "atx_state": __atx.setState(data.event); break;
__hid.setState(event.msg.event_attrs); case "msd_state": __msd.setState(data.event); break;
} else if (event.msg.event === "atx_state") { case "streamer_state": __streamer.setState(data.event); break;
__atx.setState(event.msg.event_attrs);
} else if (event.msg.event === "msd_state") {
__msd.setState(event.msg.event_attrs);
} else if (event.msg.event === "streamer_state") {
__streamer.setState(event.msg.event_attrs);
} else if (event.msg.event === "wol_state") {
__wol.setState(event.msg.event_attrs);
}
} }
}; };
@ -171,7 +163,7 @@ export function Session() {
if (__missed_heartbeats >= 5) { if (__missed_heartbeats >= 5) {
throw new Error("Too many missed heartbeats"); throw new Error("Too many missed heartbeats");
} }
__ws.send(JSON.stringify({"event_type": "ping"})); __ws.send(JSON.stringify({"event_type": "ping", "event": {}}));
} catch (err) { } catch (err) {
tools.error("Session: ping error:", err.message); tools.error("Session: ping error:", err.message);
if (__ws) { if (__ws) {