def create_connection_status_indicators( status_size:str='sm', # Size of status indicator dot (xs, sm, md, lg) show_text:bool=True, # Whether to show status text text_size:str='text-sm', # Text size class hide_text_on_mobile:bool=True, # Hide text on small screens)->Dict: # Dictionary of status state to indicator element
Create status indicator elements for different connection states.
SSE Connection Monitor Script
The SSEConnectionMonitorScript function creates a JavaScript script that monitors SSE connection status.
Key features: - Monitors HTMX SSE events (open, error, close, message) - Updates visual status indicators - Automatic reconnection with exponential backoff - Handles server shutdown gracefully - Tab visibility awareness (reconnects when tab becomes visible) - Detects OOB swaps that remove SSE element
def SSEConnectionMonitorScript( connection_id:str, # Unique identifier for this SSE connection status_indicators:Dict, # Status indicator elements for each state config:Optional=None, # Configuration options)->FT: # Script element with monitoring code
Create a script that monitors SSE connection status and manages reconnection.
Complete SSE Connection Monitor
The SSEConnectionMonitor function creates a complete connection monitoring system with status indicator and monitoring script.
def SSEConnectionMonitor( connection_id:str, # Unique identifier for this SSE connection status_size:str='sm', # Size of status indicator show_text:bool=True, # Whether to show status text hide_text_on_mobile:bool=True, # Hide text on small screens config:Optional=None, # Configuration options container_cls:Optional=None, # Additional CSS classes for status container)->tuple: # Tuple of (status_container, monitor_script)
Create a complete SSE connection monitoring system.
Usage Examples
Here are complete examples showing different SSE monitoring use cases:
# Example 1: Simple connection monitorstatus_container, monitor_script = SSEConnectionMonitor( connection_id="simple-stream")print("Example 1: Simple connection monitor")print(f"Status container ID: {InteractionHtmlIds.sse_status('simple-stream')}")print(f"SSE element ID: {InteractionHtmlIds.sse_element('simple-stream')}")
Example 1: Simple connection monitor
Status container ID: sse-status-simple-stream
SSE element ID: sse-element-simple-stream
Here’s how to implement the server-side SSE endpoint:
from fasthtml.common import*from starlette.responses import StreamingResponseimport asyncio@app.get("/stream/dashboard")asyncdef stream_dashboard():"""SSE endpoint for dashboard updates."""asyncdef event_generator():try:whileTrue:# Generate your data data = get_dashboard_data()# Send SSE eventyieldf"event: update\n"yieldf"data: {data}\n\n"# Wait before next updateawait asyncio.sleep(1)except asyncio.CancelledError:# Send close message before shutting downyieldf"event: close\n"yieldf"data: Server shutting down\n\n"return StreamingResponse( event_generator(), media_type="text/event-stream", headers={"Cache-Control": "no-cache","Connection": "keep-alive", }, )
Graceful Shutdown
To signal shutdown to clients, send a ‘close’ event:
# In your shutdown handlerasyncdef shutdown_sse_connections():"""Send close event to all SSE clients."""for client in active_connections:await client.send("event: close\n")await client.send("data: Server shutting down\n\n")
OOB Swap for Shutdown
Alternatively, use OOB swap to remove the SSE element:
# Send before shutdownDiv(id=InteractionHtmlIds.sse_element(connection_id), hx_swap_oob="outerHTML")