46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
import asyncio
|
|
from websockets.asyncio.server import serve
|
|
import websockets as ws
|
|
import time
|
|
|
|
class SpeakerClient:
|
|
def __init__(self, connection, instance) -> None:
|
|
self.connection = connection
|
|
self.instance = instance
|
|
self.alive = True
|
|
|
|
async def check_open(self):
|
|
try:
|
|
await self.connection.send("")
|
|
return True
|
|
except ws.ConnectionClosed:
|
|
return False
|
|
|
|
CONNECTIONS = set()
|
|
|
|
|
|
async def handler(websocket):
|
|
async for message in websocket:
|
|
args = message.split('/')
|
|
if (args[0] == "speaker"):
|
|
CONNECTIONS.add(SpeakerClient(websocket, int(args[1])))
|
|
print(f"New Speaker, instance {args[1]}")
|
|
if (args[0] == "status"):
|
|
print("Checking system health...")
|
|
remove_conns = []
|
|
for c in CONNECTIONS:
|
|
status = await c.check_open()
|
|
if status:
|
|
print(f"Instance {c.instance} is alive")
|
|
await websocket.send(f"Instance {c.instance} is alive")
|
|
else:
|
|
remove_conns.append(c)
|
|
for c in remove_conns:
|
|
CONNECTIONS.remove(c)
|
|
|
|
|
|
async def main():
|
|
async with serve(handler, "", 3003):
|
|
await asyncio.get_running_loop().create_future() # run forever
|
|
|
|
asyncio.run(main()) |