microdot.sse --- Server-Sent Events

Server-Sent Events (SSE) adalah protokol push satu arah yang sederhana: klien membuka request HTTP normal ke Content-Type: text/event-stream, dan server menjaga koneksi tetap terbuka dan menulis event yang terformat saat terjadi. Browser mengekspos stream sebagai objek JavaScript EventSource. Dibandingkan dengan WebSocket, SSE lebih sederhana ketika hanya server yang mendorong; klien selalu meminta.

Penggunaan kamera yang umum adalah mempublikasikan deteksi / pembacaan sensor / pembaruan status ke ponsel atau dasbor sesuai dengan laju kejadiannya, tanpa dasbor harus melakukan polling.

class SSE

class microdot.sse.SSE

Handle yang diterima route. Diteruskan ke handler sebagai argumen kedua ketika with_sse() digunakan.

async send(data, event: str | None = None, event_id: str | None = None, retry: int | None = None, comment: bool = False)

Dorong satu event ke klien.

data

Payload event. String dan byte dikirim apa adanya. Dict dan list diserialisasi ke JSON. Yang lainnya dikonversi dengan str().

event

Nama event opsional -- EventSource browser mendispatch ke listener JavaScript dengan nama yang sama ketika ini diset.

event_id

ID event opsional -- browser mengirimkannya kembali sebagai Last-Event-ID jika koneksi terputus dan tersambung kembali, yang memungkinkan server melanjutkan dari tempat terakhir.

retry

Penundaan koneksi ulang dalam detik; browser menggunakan ini jika koneksi terputus.

comment

Jika True, payload dikirim sebagai baris komentar SSE (diabaikan oleh browser). Berguna sebagai heartbeat keep-alive untuk mencegah timeout NAT menutup stream yang sedang tidak aktif.

Dekorator level modul

microdot.sse.with_sse(f)

Dekorator yang mengubah route menjadi endpoint SSE. Handler menerima request dan objek SSE

from microdot import Microdot
from microdot.sse import with_sse

app = Microdot()

@app.get('/events')
@with_sse
async def events(request, sse):
    import asyncio
    while True:
        await sse.send({'temp': read_sensor()}, event='reading')
        await asyncio.sleep(1)

Masa hidup handler sama dengan masa hidup stream -- handler berjalan selama klien tetap terhubung. Pembatalan (klien terputus, server mati) dipropagasikan sebagai asyncio.CancelledError, yang akan ditelan oleh kerangka kerja.

microdot.sse.sse_response(request, event_function, *args, **kwargs)

Titik masuk level rendah: mengembalikan tuple respons yang dikembalikan with_sse() secara internal. Berguna ketika endpoint SSE membutuhkan header kustom atau kode status yang tidak diizinkan oleh dekorator:

from microdot.sse import sse_response

@app.get('/events')
async def events(request):
    if not request.g.current_user:
        return 401
    async def emit(req, sse):
        await sse.send('hello')
    return sse_response(request, emit)

event_function menerima (request, sse, *args, **kwargs) dan menggunakan await sse.send(...) untuk mendorong event.

Respons SSE menetapkan Content-Type: text/event-stream dan menjaga koneksi tetap terbuka sampai event_function kembali atau klien terputus. Gunakan loop while True dengan await asyncio.sleep di antara pengiriman untuk menghindari hot-looping.