datastar/site/routes_examples_offline_syn...

62 lines
1.5 KiB
Go

package site
import (
"fmt"
"log"
"net/http"
"time"
"github.com/delaneyj/toolbelt"
"github.com/go-chi/chi/v5"
"github.com/gorilla/sessions"
"github.com/hashicorp/golang-lru/v2/expirable"
datastar "github.com/starfederation/datastar/sdk/go"
"github.com/valyala/bytebufferpool"
)
func setupExamplesOfflineSync(examplesRouter chi.Router, signals sessions.Store) error {
lruCache := expirable.NewLRU[string, string](100, nil, 5*time.Minute)
sessionKey := "datastar-offline-sync-example"
examplesRouter.Put("/offline_sync/sync", func(w http.ResponseWriter, r *http.Request) {
buf := bytebufferpool.Get()
defer bytebufferpool.Put(buf)
if _, err := buf.ReadFrom(r.Body); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
signalsJSON := buf.String()
var sessionID string
session, err := signals.Get(r, sessionKey)
if err != nil || len(session.Values) == 0 {
sessionID = toolbelt.NextEncodedID()
session.Values["id"] = sessionID
if err := session.Save(r, w); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
} else {
sessionID = session.Values["id"].(string)
}
lruCache.Add(sessionID, signalsJSON)
datastar.NewSSE(w, r).MergeFragments(fmt.Sprintf(`
<div id="results">
<p>Synchronized offline data!</p>
<p>at %s</p>
<p>Session ID: %s</p>
<p>Signals JSON: %s</p>
</div>
`,
time.Now().Format(time.RFC3339),
sessionID, signalsJSON,
))
log.Print("Syncing offline data!")
})
return nil
}