diff --git a/game/server/eventstream/routes.py b/game/server/eventstream/routes.py index b3aff991..2cbbfebb 100644 --- a/game/server/eventstream/routes.py +++ b/game/server/eventstream/routes.py @@ -14,6 +14,10 @@ async def event_stream(websocket: WebSocket) -> None: await websocket.accept() while True: if not (events := await EventStream.get()).empty: + if events.shutting_down: + await websocket.close() + return + await websocket.send_json( jsonable_encoder( GameUpdateEventsJs.from_events(events, GameContext.get()) diff --git a/game/server/server.py b/game/server/server.py index fdbb2151..3cd47eb2 100644 --- a/game/server/server.py +++ b/game/server/server.py @@ -6,8 +6,10 @@ from threading import Thread import uvicorn from uvicorn import Config +from game.server import EventStream from game.server.app import app from game.server.settings import ServerSettings +from game.sim import GameUpdateEvents class Server(uvicorn.Server): @@ -34,4 +36,5 @@ class Server(uvicorn.Server): yield finally: self.should_exit = True + EventStream.put_nowait(GameUpdateEvents().shut_down()) thread.join() diff --git a/game/sim/gameupdateevents.py b/game/sim/gameupdateevents.py index b3b3ee63..ec6498b8 100644 --- a/game/sim/gameupdateevents.py +++ b/game/sim/gameupdateevents.py @@ -25,6 +25,7 @@ class GameUpdateEvents: deleted_flights: set[UUID] = field(default_factory=set) selected_flight: UUID | None = None deselected_flight: bool = False + shutting_down: bool = False @property def empty(self) -> bool: @@ -89,3 +90,7 @@ class GameUpdateEvents: self.deselected_flight = True self.selected_flight = None return self + + def shut_down(self) -> GameUpdateEvents: + self.shutting_down = True + return self