// Copyright 2026 Beacon Contributors // SPDX-License-Identifier: AGPL-3.0-or-later package ws import "sync" // ipLimiter tracks the number of active WebSocket connections per IP address. type ipLimiter struct { mu sync.Mutex count map[string]int max int } func newIPLimiter(max int) *ipLimiter { return &ipLimiter{ count: make(map[string]int), max: max, } } // acquire increments the connection count for the given IP and returns true // if the connection is allowed. Returns false if the limit is already reached. func (l *ipLimiter) acquire(ip string) bool { l.mu.Lock() defer l.mu.Unlock() if l.count[ip] >= l.max { return false } l.count[ip]++ return true } // release decrements the connection count for the given IP. // The map entry is deleted when the count reaches zero to prevent unbounded growth. func (l *ipLimiter) release(ip string) { l.mu.Lock() defer l.mu.Unlock() l.count[ip]-- if l.count[ip] <= 0 { delete(l.count, ip) } }