Replace CDN-hosted datastar beta.11 with local v1.0.0-RC.7 to fix client-side expression incompatibilities with the Go SDK. Also fix quoted CSS class keys in data-class expressions, harden session cookie settings (named cookie, Secure flag), simplify SetupRoutes to not return an error, and regenerate templ output.
73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
// Package router wires feature routes and middleware into the central chi mux.
|
|
package router
|
|
|
|
import (
|
|
"embed"
|
|
"io/fs"
|
|
"net/http"
|
|
"sync"
|
|
|
|
"github.com/ryanhamamura/c4/config"
|
|
"github.com/ryanhamamura/c4/db/repository"
|
|
"github.com/ryanhamamura/c4/features/auth"
|
|
"github.com/ryanhamamura/c4/features/c4game"
|
|
"github.com/ryanhamamura/c4/features/lobby"
|
|
"github.com/ryanhamamura/c4/features/snakegame"
|
|
"github.com/ryanhamamura/c4/game"
|
|
"github.com/ryanhamamura/c4/snake"
|
|
|
|
"github.com/alexedwards/scs/v2"
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/nats-io/nats.go"
|
|
"github.com/starfederation/datastar-go/datastar"
|
|
)
|
|
|
|
func SetupRoutes(
|
|
router chi.Router,
|
|
queries *repository.Queries,
|
|
sessions *scs.SessionManager,
|
|
nc *nats.Conn,
|
|
store *game.GameStore,
|
|
snakeStore *snake.SnakeStore,
|
|
assets embed.FS,
|
|
) {
|
|
// Static assets
|
|
subFS, _ := fs.Sub(assets, "assets")
|
|
router.Handle("/assets/*", http.StripPrefix("/assets/", http.FileServerFS(subFS)))
|
|
|
|
// Hot-reload for development
|
|
if config.Global.Environment == config.Dev {
|
|
setupReload(router)
|
|
}
|
|
|
|
auth.SetupRoutes(router, queries, sessions)
|
|
lobby.SetupRoutes(router, queries, sessions, store, snakeStore)
|
|
c4game.SetupRoutes(router, store, nc, sessions, queries)
|
|
snakegame.SetupRoutes(router, snakeStore, nc, sessions)
|
|
}
|
|
|
|
func setupReload(router chi.Router) {
|
|
reloadChan := make(chan struct{}, 1)
|
|
var hotReloadOnce sync.Once
|
|
|
|
router.Get("/reload", func(w http.ResponseWriter, r *http.Request) {
|
|
sse := datastar.NewSSE(w, r)
|
|
reload := func() { sse.ExecuteScript("window.location.reload()") } //nolint:errcheck // dev-only
|
|
hotReloadOnce.Do(reload)
|
|
select {
|
|
case <-reloadChan:
|
|
reload()
|
|
case <-r.Context().Done():
|
|
}
|
|
})
|
|
|
|
router.Get("/hotreload", func(w http.ResponseWriter, r *http.Request) {
|
|
select {
|
|
case reloadChan <- struct{}{}:
|
|
default:
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Write([]byte("OK")) //nolint:errcheck // dev-only
|
|
})
|
|
}
|