52 lines
819 B
Go
52 lines
819 B
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"io/ioutil"
|
|
"log"
|
|
"sync"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type Pool struct {
|
|
conns *sync.Map //map[string]*websocket.Conn
|
|
}
|
|
|
|
func NewPool() *Pool {
|
|
return &Pool{
|
|
conns: &sync.Map{}, //map[string]*websocket.Conn{},
|
|
}
|
|
}
|
|
|
|
func (p *Pool) Broadcast(mt int, r io.Reader) error {
|
|
b, err := ioutil.ReadAll(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
n := 1000000
|
|
cnt := 0
|
|
p.conns.Range(func(k, v interface{}) bool {
|
|
k = k.(string)
|
|
conn := v.(*websocket.Conn)
|
|
cnt += 1
|
|
w, err := conn.NextWriter(mt)
|
|
if err != nil {
|
|
p.conns.Delete(k)
|
|
return true
|
|
}
|
|
defer w.Close()
|
|
m, err := w.Write(b)
|
|
if err != nil {
|
|
p.conns.Delete(k)
|
|
return true
|
|
}
|
|
if m < n {
|
|
n = m
|
|
}
|
|
return true
|
|
})
|
|
log.Printf("%d writes, %d min size, %d wanted size", cnt, n, len(b))
|
|
return nil
|
|
}
|