Use Hypercorn for republisher serve

This commit is contained in:
Abel Luck 2026-03-31 12:47:36 +02:00
parent 73617cd40c
commit c04efeb189
7 changed files with 133 additions and 9 deletions

View file

@ -3,6 +3,7 @@ from __future__ import annotations
import asyncio
import hashlib
from collections.abc import AsyncGenerator, Awaitable, Callable
from contextlib import suppress
from dataclasses import dataclass, field
from datetime import UTC, datetime, timedelta
from typing import Protocol
@ -151,6 +152,7 @@ async def render_stream(
*,
last_event_id: str | None = None,
render_on_connect: bool = True,
shutdown_event: asyncio.Event | None = None,
) -> AsyncGenerator[DatastarEvent, None]:
if render_on_connect:
last_event_id, event = await render_sse_event(
@ -160,7 +162,27 @@ async def render_stream(
yield event
while True:
event_name = await queue.get()
if shutdown_event is None:
event_name = await queue.get()
else:
if shutdown_event.is_set():
return
queue_task = asyncio.create_task(queue.get())
shutdown_task = asyncio.create_task(shutdown_event.wait())
done, pending = await asyncio.wait(
{queue_task, shutdown_task},
return_when=asyncio.FIRST_COMPLETED,
)
for task in pending:
task.cancel()
for task in pending:
with suppress(asyncio.CancelledError):
await task
if shutdown_task in done:
with suppress(asyncio.CancelledError):
await queue_task
return
event_name = queue_task.result()
last_event_id, event = await render_sse_event(
render,
last_event_id=last_event_id,