Use Hypercorn for republisher serve
This commit is contained in:
parent
73617cd40c
commit
c04efeb189
7 changed files with 133 additions and 9 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue