Server Push (SSE)
PatchElements morphs DOM fragments. PatchSignals updates client state. data-on-signal-patch reacts to incoming patches.
datastar ds-push
Usage
// Server — Go SSE handler
sse := datastar.NewSSE(c.Response().Writer, c.Request())
// Patch a DOM fragment (morphs by id)
sse.PatchElements(web.RenderToString(
h.Div(h.ID("counter"), g.Text(fmt.Sprintf("%d", count))),
))
// Patch signals (updates client state)
datastar.MarshalAndPatchSignals(sse, map[string]any{
"serverTime": time.Now().Format("15:04:05"),
"online": true,
})
// For persistent streams: loop + flush, check ctx
for {
select {
case <-c.Request().Context().Done():
return nil
case <-ticker.C:
datastar.MarshalAndPatchSignals(sse, ...)
}
}
// Client — react to signal patches
data-on-signal-patch="if(patch.serverTime) console.log('new time:', $serverTime)"