47 lines
749 B
Go
47 lines
749 B
Go
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)
|
|
}
|