mljr-ui · showcase

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)"