more work on websockets

This commit is contained in:
AAGaming
2023-04-06 12:51:13 -04:00
committed by marios8543
parent 4a9b45b98e
commit 18d89e76fd
3 changed files with 68 additions and 8 deletions
+1 -1
View File
@@ -91,7 +91,7 @@ class Loader:
self.ws = WSRouter()
server_instance.web_app.add_routes([
web.get("/socket", self.ws.handle),
web.get("/ws", self.ws.handle),
web.get("/frontend/{path:.*}", self.handle_frontend_assets),
web.get("/locales/{path:.*}", self.handle_frontend_locales),
web.get("/plugins", self.get_plugins),
+40 -7
View File
@@ -1,11 +1,32 @@
from logging import getLogger
from aiohttp import web
from asyncio import Future
from aiohttp import web, WSMsgType
from enum import Enum
from typing import Dict, Any, Callable
from traceback import format_exc
class MessageType(Enum):
# Call-reply
CALL = 0
REPLY = 1
ERROR = 2
# Pub/sub
running_calls: Dict[str, Future] = {}
subscriptions: Dict[str, Callable[[Any]]]
# {type: MessageType, data: dta, id: id}
class WSRouter:
def __init__(self) -> None:
self.ws = None
self.req_id = 0
self.routes = {}
self.logger = getLogger("WSRouter")
@@ -23,16 +44,28 @@ class WSRouter:
try:
async for msg in ws:
self.logger.debug(msg)
if msg.type == aiohttp.WSMsgType.TEXT:
if msg.type == WSMsgType.TEXT:
self.logger.debug(msg.data)
if msg.data == 'close':
# DO NOT RELY ON THIS!
# TODO DO NOT RELY ON THIS!
break
else:
# do stuff with the message
data = msg.json()
if self.routes[data.route]:
res = await self.routes[data.route](data.data)
match data.type:
case MessageType.CALL:
# do stuff with the message
data = msg.json()
if self.routes[data.route]:
try:
res = await self.routes[data.route](data.data)
await ws.send_json({type: MessageType.REPLY, id: data.id, data: res})
except:
await ws.send_json({type: MessageType.ERROR, id: data.ud, data: format_exc()})
case MessageType.REPLY:
if running_calls[data.id]:
running_calls[data.id].set_result(data.data)
case MessageType.ERROR:
if running_calls[data.id]:
running_calls[data.id].set_exception(data.data)
finally:
try:
await ws.close()
+27
View File
@@ -0,0 +1,27 @@
import Logger from './logger';
enum MessageType {
CALL,
REPLY,
ERROR,
}
class WSRouter extends Logger {
routes: Map<string, (args: any) => any> = new Map();
ws?: WebSocket;
constructor() {
super('WSRouter');
}
connect() {
this.ws = new WebSocket('ws://127.0.0.1:1337/ws');
this.ws.addEventListener('message', this.onMessage.bind(this));
this.ws.addEventListener('close', this.onError.bind(this));
this.ws.addEventListener('message', this.onError.bind(this));
}
onMessage() {}
onError() {}
}