Hello everyone,
somtimes happens, that one request could block whole page for minutes with heavy on demand job. And thats not good. But with data-star its very simple to give user realtime feedback about whats happenining.
here is tiny code example:
r.Post("/progress", func(w http.ResponseWriter, r *http.Request) {
sse := datastar.NewSSE(w, r)
progress := 0
total := 10124
processed := 0
for {
select {
case <-r.Context().Done():
return
default:
processed++
progress = (processed * 100 / total)
// lets say here is our heavy job function which is slow but after each step we notify user with progress
time.Sleep(1 * time.Millisecond)
// send updates to frontend via SSE
sse.MergeFragmentTempl(Progress(fmt.Sprintf("%d", processed), fmt.Sprintf("%d", total), fmt.Sprintf("%d", progress)))
if progress == 100 {
sse.MergeFragmentTempl(Done())
return
}
}
}
})
whats nice about DataStar and SSE that each GET PUT POST PATCH DELETE requests could respond N events stream in realtime while doing heavy work, so user always can see progress of whats happening.
heres full working code repo: https://github.com/blinkinglight/go-progressbar