package session import ( "crypto/rand" "encoding/base64" "sync" "time" ) type Store struct { sessions sync.Map cleanup *time.Ticker } func NewStore() *Store { s := &Store{ cleanup: time.NewTicker(1 * time.Minute), } // Background cleanup of expired sessions go func() { for range s.cleanup.C { s.cleanupExpired() } }() return s } func (s *Store) Delete(id string) { s.sessions.Delete(id) } func (s *Store) cleanupExpired() { s.sessions.Range(func(key, value any) bool { session := value.(*RegistrationSession) if time.Now().After(session.ExpiresAt) { s.sessions.Delete(key) } return true }) } func generateID() string { b := make([]byte, 32) rand.Read(b) return base64.RawURLEncoding.EncodeToString(b) }