62 lines
1.5 KiB
Go
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
|
|
}
|