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)