Merge branch 'starfederation:develop' into develop

This commit is contained in:
Dmitry Kotik 2025-04-11 15:33:19 -04:00 committed by GitHub
commit b2e737d760
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 20 additions and 26 deletions

View File

@ -52,7 +52,7 @@ async def updates_asgi(request):
async def time_updates(): async def time_updates():
while True: while True:
yield DatastarStreamingHttpResponse.merge_fragments( yield DatastarStreamingHttpResponse.merge_fragments(
[f"""<span id="currentTime">{datetime.now().isoformat()}"""] f"""<span id="currentTime">{datetime.now().isoformat()}"""
) )
await asyncio.sleep(1) await asyncio.sleep(1)
yield DatastarStreamingHttpResponse.merge_signals( yield DatastarStreamingHttpResponse.merge_signals(
@ -110,7 +110,7 @@ def updates_wsgi(request):
def time_updates(): def time_updates():
while True: while True:
yield DatastarStreamingHttpResponse.merge_fragments( yield DatastarStreamingHttpResponse.merge_fragments(
[f"""<span id="currentTime">{datetime.now().isoformat()}"""] f"""<span id="currentTime">{datetime.now().isoformat()}"""
) )
time.sleep(0.5) time.sleep(0.5)
yield DatastarStreamingHttpResponse.merge_signals( yield DatastarStreamingHttpResponse.merge_signals(

View File

@ -54,7 +54,7 @@ async def read_root():
async def time_updates(): async def time_updates():
while True: while True:
yield DatastarStreamingResponse.merge_fragments( yield DatastarStreamingResponse.merge_fragments(
[f"""<span id="currentTime">{datetime.now().isoformat()}"""] f"""<span id="currentTime">{datetime.now().isoformat()}"""
) )
await asyncio.sleep(1) await asyncio.sleep(1)
yield DatastarStreamingResponse.merge_signals({"currentTime": f"{datetime.now().isoformat()}"}) yield DatastarStreamingResponse.merge_signals({"currentTime": f"{datetime.now().isoformat()}"})

View File

@ -93,7 +93,7 @@ def GreatTable(pattern=default_pattern):
@app.post @app.post
async def table(filter: str): async def table(filter: str):
async def _(): async def _():
yield DatastarStreamingResponse.merge_fragments([GreatTable(filter)]) yield DatastarStreamingResponse.merge_fragments(GreatTable(filter))
return DatastarStreamingResponse(_()) return DatastarStreamingResponse(_())
@ -151,7 +151,7 @@ def index():
async def clock(): async def clock():
while True: while True:
now = datetime.isoformat(datetime.now()) now = datetime.isoformat(datetime.now())
yield DatastarStreamingResponse.merge_fragments([Span(id="currentTime")(now)]) yield DatastarStreamingResponse.merge_fragments(Span(id="currentTime")(now))
await asyncio.sleep(1) await asyncio.sleep(1)
@ -165,7 +165,7 @@ async def hello():
async def _(): async def _():
# Simulate load time # Simulate load time
await asyncio.sleep(1) await asyncio.sleep(1)
yield DatastarStreamingResponse.merge_fragments([HELLO_BUTTON]) yield DatastarStreamingResponse.merge_fragments(HELLO_BUTTON)
return DatastarStreamingResponse(_()) return DatastarStreamingResponse(_())
@ -185,7 +185,7 @@ async def reset():
async def _(sse): async def _(sse):
await asyncio.sleep(1) await asyncio.sleep(1)
yield sse.merge_fragments([reset_and_hello]) yield sse.merge_fragments(reset_and_hello)
return DatastarFastHTMLResponse(_) return DatastarFastHTMLResponse(_)

View File

@ -46,7 +46,7 @@ async def index():
async def clock(): async def clock():
while True: while True:
now = datetime.isoformat(datetime.now()) now = datetime.isoformat(datetime.now())
yield DatastarStreamingResponse.merge_fragments([Span(id="currentTime")(now)]) yield DatastarStreamingResponse.merge_fragments(Span(id="currentTime")(now))
await asyncio.sleep(1) await asyncio.sleep(1)
yield DatastarStreamingResponse.merge_signals({"currentTime": f"{now}"}) yield DatastarStreamingResponse.merge_signals({"currentTime": f"{now}"})
await asyncio.sleep(1) await asyncio.sleep(1)

View File

@ -47,7 +47,7 @@ async def updates():
async def time_updates(): async def time_updates():
while True: while True:
yield ServerSentEventGenerator.merge_fragments( yield ServerSentEventGenerator.merge_fragments(
[f"""<span id="currentTime">{datetime.now().isoformat()}"""] f"""<span id="currentTime">{datetime.now().isoformat()}"""
) )
await asyncio.sleep(1) await asyncio.sleep(1)
yield ServerSentEventGenerator.merge_signals({"currentTime": f"{datetime.now().isoformat()}"}) yield ServerSentEventGenerator.merge_signals({"currentTime": f"{datetime.now().isoformat()}"})

View File

@ -58,13 +58,11 @@ async def add_signal(request):
await response.send( await response.send(
SSE.merge_fragments( SSE.merge_fragments(
[ """
"""
<div class="time signal"> <div class="time signal">
Current time from signal: <span data-text="$currentTime">CURRENT_TIME</span> Current time from signal: <span data-text="$currentTime">CURRENT_TIME</span>
</div> </div>
""" """,
],
selector="#timers", selector="#timers",
merge_mode=FragmentMergeMode.FragmentMergeModeAppend, merge_mode=FragmentMergeMode.FragmentMergeModeAppend,
) )
@ -79,13 +77,11 @@ async def add_fragment(request):
await response.send( await response.send(
SSE.merge_fragments( SSE.merge_fragments(
[ f"""\
f"""\
<div class="time fragment"> <div class="time fragment">
Current time from fragment: {datetime.now().isoformat()} Current time from fragment: {datetime.now().isoformat()}
</div> </div>
""" """,
],
selector="#timers", selector="#timers",
merge_mode=FragmentMergeMode.FragmentMergeModeAppend, merge_mode=FragmentMergeMode.FragmentMergeModeAppend,
) )
@ -101,13 +97,11 @@ async def updates(request):
while True: while True:
await response.send( await response.send(
SSE.merge_fragments( SSE.merge_fragments(
[ f"""
f"""
<div class="time fragment" > <div class="time fragment" >
Current time from fragment: {datetime.now().isoformat()} Current time from fragment: {datetime.now().isoformat()}
</div> </div>
""" """,
],
selector=".fragment", selector=".fragment",
) )
) )

View File

@ -10,6 +10,7 @@ class DatastarStreamingResponse(_DatastarStreamingResponse):
@classmethod @classmethod
@override @override
def merge_fragments(cls, fragments, *args, **kwargs): def merge_fragments(cls, fragments, *args, **kwargs):
xml_fragments = [f if isinstance(f, str) else to_xml(f) for f in fragments] if not isinstance(fragments, str):
fragments = to_xml(fragments)
# From here, business as usual # From here, business as usual
return super().merge_fragments(xml_fragments, *args, **kwargs) return super().merge_fragments(fragments, *args, **kwargs)

View File

@ -38,7 +38,7 @@ class ServerSentEventGenerator:
@classmethod @classmethod
def merge_fragments( def merge_fragments(
cls, cls,
fragments: list[str], fragments: str,
selector: Optional[str] = None, selector: Optional[str] = None,
merge_mode: Optional[consts.FragmentMergeMode] = None, merge_mode: Optional[consts.FragmentMergeMode] = None,
use_view_transition: bool = consts.DEFAULT_FRAGMENTS_USE_VIEW_TRANSITIONS, use_view_transition: bool = consts.DEFAULT_FRAGMENTS_USE_VIEW_TRANSITIONS,
@ -57,8 +57,7 @@ class ServerSentEventGenerator:
data_lines.extend( data_lines.extend(
f"data: {consts.FRAGMENTS_DATALINE_LITERAL} {x}" f"data: {consts.FRAGMENTS_DATALINE_LITERAL} {x}"
for fragment in fragments for x in fragments.splitlines()
for x in fragment.splitlines()
) )
return ServerSentEventGenerator._send( return ServerSentEventGenerator._send(