mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
If there's a websocket being waited on the shut down won't actually happen. Add a new event for shut down and send it to break the websocket out of its loop.
41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
import time
|
|
from collections.abc import Iterator
|
|
from contextlib import contextmanager
|
|
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):
|
|
def __init__(self) -> None:
|
|
super().__init__(
|
|
Config(
|
|
app=app,
|
|
host=ServerSettings.get().server_bind_address,
|
|
port=ServerSettings.get().server_port,
|
|
# Configured explicitly with default_logging.yaml or logging.yaml.
|
|
log_config=None,
|
|
)
|
|
)
|
|
|
|
@contextmanager
|
|
def run_in_thread(self) -> Iterator[None]:
|
|
# This relies on undocumented behavior, but it is what the developer recommends:
|
|
# https://github.com/encode/uvicorn/issues/742
|
|
thread = Thread(target=self.run)
|
|
thread.start()
|
|
try:
|
|
while not self.started:
|
|
time.sleep(1e-3)
|
|
yield
|
|
finally:
|
|
self.should_exit = True
|
|
EventStream.put_nowait(GameUpdateEvents().shut_down())
|
|
thread.join()
|