Implement SSE endpoints in Tornado #3

This commit is contained in:
Ian Renton
2025-12-23 21:01:41 +00:00
parent d463403018
commit 86beb27ebf
7 changed files with 129 additions and 73 deletions

View File

@@ -15,8 +15,6 @@ from server.handlers.pagetemplate import PageTemplateHandler
# Provides the public-facing web server.
# TODO SSE API responses
# TODO clean_up_sse_queues
class WebServer:
# Constructor
def __init__(self, spots, alerts, status_data, port):
@@ -49,8 +47,8 @@ class WebServer:
# Routes for API calls
(r"/api/v1/spots", APISpotsHandler, {"spots": self.spots, "web_server_metrics": self.web_server_metrics}),
(r"/api/v1/alerts", APIAlertsHandler, {"alerts": self.alerts, "web_server_metrics": self.web_server_metrics}),
(r"/api/v1/spots/stream", APISpotsStreamHandler), # todo provide queues?
(r"/api/v1/alerts/stream", APIAlertsStreamHandler), # todo provide queues?
(r"/api/v1/spots/stream", APISpotsStreamHandler, {"sse_spot_queues": self.sse_spot_queues, "web_server_metrics": self.web_server_metrics}),
(r"/api/v1/alerts/stream", APIAlertsStreamHandler, {"sse_alert_queues": self.sse_alert_queues, "web_server_metrics": self.web_server_metrics}),
(r"/api/v1/options", APIOptionsHandler, {"status_data": self.status_data, "web_server_metrics": self.web_server_metrics}),
(r"/api/v1/status", APIStatusHandler, {"status_data": self.status_data, "web_server_metrics": self.web_server_metrics}),
(r"/api/v1/lookup/call", APILookupCallHandler, {"web_server_metrics": self.web_server_metrics}),
@@ -71,37 +69,35 @@ class WebServer:
(r"/(.*)", StaticFileHandler, {"path": os.path.join(os.path.dirname(__file__), "../webassets")}),
],
template_path=os.path.join(os.path.dirname(__file__), "../templates"),
debug=True) # todo set false
debug=False)
app.listen(self.port)
await self.shutdown_event.wait()
# Internal method called when a new spot is added to the system. This is used to ping any SSE clients that are
# awaiting a server-sent message with new spots.
def notify_new_spot(self, spot):
# todo
# for queue in self.sse_spot_queues:
# try:
# queue.put(spot)
# except:
# # Cleanup thread was probably deleting the queue, that's fine
# pass
for queue in self.sse_spot_queues:
try:
queue.put(spot)
except:
# Cleanup thread was probably deleting the queue, that's fine
pass
pass
# Internal method called when a new alert is added to the system. This is used to ping any SSE clients that are
# awaiting a server-sent message with new spots.
def notify_new_alert(self, alert):
# todo
# for queue in self.sse_alert_queues:
# try:
# queue.put(alert)
# except:
# # Cleanup thread was probably deleting the queue, that's fine
# pass
for queue in self.sse_alert_queues:
try:
queue.put(alert)
except:
# Cleanup thread was probably deleting the queue, that's fine
pass
pass
# Clean up any SSE queues that are growing too large; probably their client disconnected.
# Clean up any SSE queues that are growing too large; probably their client disconnected and we didn't catch it
# properly for some reason.
def clean_up_sse_queues(self):
# todo
# self.sse_spot_queues = [q for q in self.sse_spot_queues if not q.full()]
# self.sse_alert_queues = [q for q in self.sse_alert_queues if not q.full()]
self.sse_spot_queues = [q for q in self.sse_spot_queues if not q.full()]
self.sse_alert_queues = [q for q in self.sse_alert_queues if not q.full()]
pass