Files
Erupe/common/token/token.go
Houmgaor 2bd5f98f32 docs: add doc.go files and godoc comments to all packages
Add package-level documentation (doc.go) to all 22 first-party
packages and godoc comments to ~150 previously undocumented
exported symbols across common/, network/, and server/.
2026-02-18 21:39:13 +01:00

52 lines
1.2 KiB
Go

package token
import (
"math/rand"
"sync"
"time"
)
// SafeRand is a concurrency-safe wrapper around *rand.Rand.
type SafeRand struct {
mu sync.Mutex
rng *rand.Rand
}
// NewSafeRand creates a SafeRand seeded with the current time.
func NewSafeRand() *SafeRand {
return &SafeRand{
rng: rand.New(rand.NewSource(time.Now().UnixNano())),
}
}
// Intn returns a non-negative pseudo-random int in [0,n). It is safe for
// concurrent use.
func (sr *SafeRand) Intn(n int) int {
sr.mu.Lock()
v := sr.rng.Intn(n)
sr.mu.Unlock()
return v
}
// Uint32 returns a pseudo-random uint32. It is safe for concurrent use.
func (sr *SafeRand) Uint32() uint32 {
sr.mu.Lock()
v := sr.rng.Uint32()
sr.mu.Unlock()
return v
}
// RNG is the global concurrency-safe random number generator used throughout
// the server for generating warehouse IDs, session tokens, and other values.
var RNG = NewSafeRand()
// Generate returns an alphanumeric token of specified length
func Generate(length int) string {
var chars = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
b := make([]rune, length)
for i := range b {
b[i] = chars[RNG.Intn(len(chars))]
}
return string(b)
}