github.com/qiniu/go-sdk/v7@v7.27.0/internal/freezer/freezer.go (about)

     1  package freezer
     2  
     3  import (
     4  	"sync"
     5  	"time"
     6  )
     7  
     8  type Freezer interface {
     9  	Available(itemId string) bool
    10  	Freeze(itemId string, duration time.Duration) error
    11  	Unfreeze(itemId string) error
    12  }
    13  
    14  func New() Freezer {
    15  	return &freezer{
    16  		freezerItems: &sync.Map{},
    17  	}
    18  }
    19  
    20  type freezer struct {
    21  	freezerItems *sync.Map
    22  }
    23  
    24  func (i *freezer) Available(itemId string) bool {
    25  	unfreezeTime, ok := i.freezerItems.Load(itemId)
    26  	if !ok {
    27  		return true
    28  	}
    29  
    30  	unfreezeTimeInt64, ok := unfreezeTime.(int64)
    31  	if !ok {
    32  		return false
    33  	}
    34  
    35  	timestamp := time.Now().Unix()
    36  	return timestamp > unfreezeTimeInt64
    37  }
    38  
    39  func (i *freezer) Freeze(itemId string, duration time.Duration) error {
    40  	timestamp := time.Now().Unix()
    41  	i.freezerItems.Store(itemId, timestamp+int64(duration/time.Second))
    42  	return nil
    43  }
    44  
    45  func (i *freezer) Unfreeze(itemId string) error {
    46  	i.freezerItems.Delete(itemId)
    47  	return nil
    48  }