|
@@ -5,84 +5,31 @@ import websockets
|
|
|
import json
|
|
import json
|
|
|
import sys
|
|
import sys
|
|
|
import os
|
|
import os
|
|
|
-from storage import Storage
|
|
|
|
|
|
|
+from routes import Routes
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+routes = Routes()
|
|
|
|
|
|
|
|
-CONNECTIONS = set()
|
|
|
|
|
-STORAGES = { "users": Storage("users") }
|
|
|
|
|
|
|
|
|
|
class UserInfoProtocol(websockets.BasicAuthWebSocketServerProtocol):
|
|
class UserInfoProtocol(websockets.BasicAuthWebSocketServerProtocol):
|
|
|
async def check_credentials(self, username, password):
|
|
async def check_credentials(self, username, password):
|
|
|
- all_users = storage("users").read()
|
|
|
|
|
- self.user = all_users[username] if username in all_users else None
|
|
|
|
|
|
|
+ all_users = routes.users()
|
|
|
|
|
+ self.user = all_users.get(username, None)
|
|
|
return self.user != None
|
|
return self.user != None
|
|
|
|
|
|
|
|
-def storage(name):
|
|
|
|
|
- if not name in STORAGES:
|
|
|
|
|
- STORAGES[name] = Storage(name)
|
|
|
|
|
- return STORAGES[name]
|
|
|
|
|
-
|
|
|
|
|
-def _get_entity(event):
|
|
|
|
|
- return event.get("entity", None)
|
|
|
|
|
-
|
|
|
|
|
-def _get_data(event):
|
|
|
|
|
- return event.get("data", {})
|
|
|
|
|
-
|
|
|
|
|
-async def add_entity(websocket, event):
|
|
|
|
|
- name = _get_entity(event)
|
|
|
|
|
- data = _get_data(event)
|
|
|
|
|
- if name and data:
|
|
|
|
|
- storage(name).create(data)
|
|
|
|
|
- await broadcast(websocket, { "entity": name, "event": "created", "data": data })
|
|
|
|
|
-
|
|
|
|
|
-async def get_entity(websocket, event):
|
|
|
|
|
- name = _get_entity(event)
|
|
|
|
|
- ts = _get_data(event).get("ts", 0)
|
|
|
|
|
- data = storage(name).read(ts)
|
|
|
|
|
- await websocket.send(json.dumps({ "entity": name, "event": "received", "data": data }))
|
|
|
|
|
-
|
|
|
|
|
-async def mod_entity(websocket, event):
|
|
|
|
|
- name = _get_entity(event)
|
|
|
|
|
- data = _get_data(event)
|
|
|
|
|
- if name and data:
|
|
|
|
|
- storage(name).update(data)
|
|
|
|
|
- await broadcast(websocket, { "entity": name, "event": "modified", "data": data })
|
|
|
|
|
-
|
|
|
|
|
-async def del_entity(websocket, event):
|
|
|
|
|
- name = _get_entity(event)
|
|
|
|
|
- entity_id = _get_data(event).get("id", None)
|
|
|
|
|
- if storage(name).delete(entity_id):
|
|
|
|
|
- await broadcast(websocket, { "entity": name, "event": "deleted", "data": entity_id })
|
|
|
|
|
-
|
|
|
|
|
-async def describe(websocket, event):
|
|
|
|
|
- connections = list(CONNECTIONS)
|
|
|
|
|
- data = { c.user["id"]: connections.count(c) for c in connections }
|
|
|
|
|
- await websocket.send(json.dumps({ "entity": "connections", "event": "described", "data": data }))
|
|
|
|
|
-
|
|
|
|
|
-async def broadcast(websocket, event):
|
|
|
|
|
- websockets.broadcast(CONNECTIONS, json.dumps(event))
|
|
|
|
|
-
|
|
|
|
|
-COMMANDS = {
|
|
|
|
|
- "add": add_entity,
|
|
|
|
|
- "get": get_entity,
|
|
|
|
|
- "mod": mod_entity,
|
|
|
|
|
- "del": del_entity,
|
|
|
|
|
- "describe": describe
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
async def handle(websocket):
|
|
async def handle(websocket):
|
|
|
try:
|
|
try:
|
|
|
- CONNECTIONS.add(websocket)
|
|
|
|
|
- await broadcast(websocket, { "event": "connected", "entity": "users", "data": websocket.user})
|
|
|
|
|
|
|
+ await routes.add_connection(websocket)
|
|
|
|
|
|
|
|
async for message in websocket:
|
|
async for message in websocket:
|
|
|
event = json.loads(message)
|
|
event = json.loads(message)
|
|
|
print(event, file=sys.stderr)
|
|
print(event, file=sys.stderr)
|
|
|
- handler = COMMANDS.get(event["action"], broadcast)
|
|
|
|
|
- await handler(websocket, event)
|
|
|
|
|
|
|
+ await routes.call(event["action"], websocket, event)
|
|
|
|
|
|
|
|
finally:
|
|
finally:
|
|
|
- CONNECTIONS.remove(websocket)
|
|
|
|
|
- await broadcast(websocket, { "event": "disconnected", "entity": "users", "data": websocket.user})
|
|
|
|
|
|
|
+ await routes.remove_connection(websocket)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
async def main():
|
|
async def main():
|
|
|
port = os.environ.get("BEERLOG_PORT", 8000)
|
|
port = os.environ.get("BEERLOG_PORT", 8000)
|
|
@@ -91,5 +38,5 @@ async def main():
|
|
|
async with websockets.serve(handle, host, port, create_protocol=UserInfoProtocol):
|
|
async with websockets.serve(handle, host, port, create_protocol=UserInfoProtocol):
|
|
|
await asyncio.Future()
|
|
await asyncio.Future()
|
|
|
|
|
|
|
|
-asyncio.run(main())
|
|
|
|
|
|
|
|
|
|
|
|
+asyncio.run(main())
|