github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/pkg/currency/watcher.go (about)

     1  package currency
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/NpoolPlatform/go-service-framework/pkg/logger"
     8  	redis2 "github.com/NpoolPlatform/go-service-framework/pkg/redis"
     9  	watcher "github.com/NpoolPlatform/go-service-framework/pkg/watcher"
    10  	basetypes "github.com/NpoolPlatform/message/npool/basetypes/v1"
    11  )
    12  
    13  func refresh(ctx context.Context, fiat bool) {
    14  	refreshCoins(ctx)
    15  	refreshCoinFiats(ctx)
    16  	if fiat {
    17  		refreshFiats(ctx)
    18  	}
    19  }
    20  
    21  var w *watcher.Watcher
    22  
    23  func Watch(ctx context.Context) {
    24  	lockKey := basetypes.Prefix_PrefixUpdateCoinCurrency.String()
    25  	for {
    26  		if err := redis2.TryLock(lockKey, 0); err == nil {
    27  			break
    28  		}
    29  		<-time.After(time.Minute)
    30  	}
    31  	defer func() {
    32  		_ = redis2.Unlock(lockKey)
    33  	}()
    34  
    35  	refreshTicker := time.NewTicker(60 * time.Second) //nolint
    36  	fiatRefreshCount := 0
    37  	w = watcher.NewWatcher()
    38  
    39  	refresh(ctx, true)
    40  
    41  	for {
    42  		select {
    43  		case <-refreshTicker.C:
    44  			refresh(ctx, fiatRefreshCount%60 == 0)
    45  			fiatRefreshCount++
    46  		case <-ctx.Done():
    47  			logger.Sugar().Infow(
    48  				"Watch",
    49  				"State", "Done",
    50  				"Error", ctx.Err(),
    51  			)
    52  			close(w.ClosedChan())
    53  			return
    54  		case <-w.CloseChan():
    55  			close(w.ClosedChan())
    56  			return
    57  		}
    58  	}
    59  }
    60  
    61  func Shutdown(ctx context.Context) {
    62  	if w != nil {
    63  		w.Shutdown(ctx)
    64  	}
    65  }