package session import ( "context" "errors" "net/http" "git.jeffthecoder.xyz/public/lazyhandler/magic" "git.jeffthecoder.xyz/public/lazyhandler/middleware" "github.com/go-session/session/v3" ) type ctxKey int const ( sessionKey ctxKey = iota ) var ( ErrSessionStoreNotInitialized = errors.New("no session store in request context") ) func Session(sessionStore session.ManagerStore) middleware.Middleware { manager := session.NewManager( session.SetStore(sessionStore), ) return middleware.WrapFunc(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { store, err := manager.Start(r.Context(), w, r) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } defer store.Save() next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), sessionKey, store))) }) }) } func GetSession(r *http.Request) (session.Store, error) { if store, ok := r.Context().Value(sessionKey).(session.Store); ok { return store, nil } return nil, ErrSessionStoreNotInitialized } func RegisterExtractor() { magic.RegisterExtractorGeneric[session.Store](func(r *http.Request) (any, error) { store, err := GetSession(r) return store, err }) }