github.com/gofiber/fiber/v2@v2.47.0/middleware/idempotency/locker.go (about) 1 package idempotency 2 3 import ( 4 "sync" 5 ) 6 7 // Locker implements a spinlock for a string key. 8 type Locker interface { 9 Lock(key string) error 10 Unlock(key string) error 11 } 12 13 type MemoryLock struct { 14 mu sync.Mutex 15 16 keys map[string]*sync.Mutex 17 } 18 19 func (l *MemoryLock) Lock(key string) error { 20 l.mu.Lock() 21 mu, ok := l.keys[key] 22 if !ok { 23 mu = new(sync.Mutex) 24 l.keys[key] = mu 25 } 26 l.mu.Unlock() 27 28 mu.Lock() 29 30 return nil 31 } 32 33 func (l *MemoryLock) Unlock(key string) error { 34 l.mu.Lock() 35 mu, ok := l.keys[key] 36 l.mu.Unlock() 37 if !ok { 38 // This happens if we try to unlock an unknown key 39 return nil 40 } 41 42 mu.Unlock() 43 44 return nil 45 } 46 47 func NewMemoryLock() *MemoryLock { 48 return &MemoryLock{ 49 keys: make(map[string]*sync.Mutex), 50 } 51 } 52 53 var _ Locker = (*MemoryLock)(nil)