38 lines
1.3 KiB
Go
38 lines
1.3 KiB
Go
package webservices
|
||
|
||
import (
|
||
|
||
"sync"
|
||
)
|
||
|
||
type baseService struct {
|
||
port int
|
||
running bool
|
||
mu sync.RWMutex
|
||
clients map[chan interface{}]bool
|
||
clientsMu sync.RWMutex
|
||
}
|
||
|
||
func newBaseService(port int) *baseService {
|
||
return &baseService{
|
||
port: port,
|
||
clients: make(map[chan interface{}]bool),
|
||
}
|
||
}
|
||
|
||
// broadcast отправляет данные всем подключённым SSE-клиентам
|
||
func (s *baseService) broadcast(data interface{}) {
|
||
s.clientsMu.RLock()
|
||
defer s.clientsMu.RUnlock()
|
||
for ch := range s.clients {
|
||
// Убираем default, чтобы отправка была блокирующей, но тогда один медленный клиент может замедлить всех
|
||
// Лучше увеличить буфер и оставить default с предупреждением
|
||
select {
|
||
case ch <- data:
|
||
default:
|
||
// Если канал заполнен, это проблема клиента, но мы не должны терять сообщения для других клиентов.
|
||
// Однако блокировка нежелательна. Увеличим буфер до 500.
|
||
|
||
}
|
||
}
|
||
} |