diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d0135cf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.gocache/ diff --git a/client/main.go b/client/main.go index 5ea94b7..a12861e 100644 --- a/client/main.go +++ b/client/main.go @@ -835,14 +835,30 @@ var credentialsStore = struct { var streamServerOffsets sync.Map // map[int]*atomic.Uint64 var turnServerCooldowns sync.Map // map[string]*atomic.Int64 -func getStreamServerOffset(streamID int) uint64 { +func streamServerOffset(streamID int) *atomic.Uint64 { v, _ := streamServerOffsets.LoadOrStore(streamID, &atomic.Uint64{}) - return v.(*atomic.Uint64).Load() + offset, ok := v.(*atomic.Uint64) + if !ok { + panic(fmt.Sprintf("unexpected streamServerOffsets value type: %T", v)) + } + return offset +} + +func turnServerCooldownUntil(addr string) *atomic.Int64 { + v, _ := turnServerCooldowns.LoadOrStore(addr, &atomic.Int64{}) + until, ok := v.(*atomic.Int64) + if !ok { + panic(fmt.Sprintf("unexpected turnServerCooldowns value type: %T", v)) + } + return until +} + +func getStreamServerOffset(streamID int) uint64 { + return streamServerOffset(streamID).Load() } func rotateStreamServer(streamID int) uint64 { - v, _ := streamServerOffsets.LoadOrStore(streamID, &atomic.Uint64{}) - return v.(*atomic.Uint64).Add(1) + return streamServerOffset(streamID).Add(1) } func pickStreamServerAddr(streamID int, addrs []string) string { @@ -858,8 +874,7 @@ func pickStreamServerAddr(streamID int, addrs []string) string { } func markTURNServerCooldown(addr string) { - v, _ := turnServerCooldowns.LoadOrStore(addr, &atomic.Int64{}) - v.(*atomic.Int64).Store(time.Now().Add(turnServerCooldown).UnixNano()) + turnServerCooldownUntil(addr).Store(time.Now().Add(turnServerCooldown).UnixNano()) } func isTURNServerAvailable(addr string) bool { @@ -867,7 +882,11 @@ func isTURNServerAvailable(addr string) bool { if !ok { return true } - return time.Now().UnixNano() >= v.(*atomic.Int64).Load() + until, ok := v.(*atomic.Int64) + if !ok { + panic(fmt.Sprintf("unexpected turnServerCooldowns value type: %T", v)) + } + return time.Now().UnixNano() >= until.Load() } func getStreamCache(streamID int) *StreamCredentialsCache {