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 }