| package broadcastwriter |
| |
| import ( |
| "io" |
| "sync" |
| ) |
| |
| type BroadcastWriter struct { |
| sync.Mutex |
| writers map[io.WriteCloser]struct{} |
| } |
| |
| func (w *BroadcastWriter) AddWriter(writer io.WriteCloser) { |
| w.Lock() |
| w.writers[writer] = struct{}{} |
| w.Unlock() |
| } |
| |
| func (w *BroadcastWriter) Write(p []byte) (n int, err error) { |
| w.Lock() |
| for sw := range w.writers { |
| if n, err := sw.Write(p); err != nil || n != len(p) { |
| delete(w.writers, sw) |
| } |
| } |
| w.Unlock() |
| return len(p), nil |
| } |
| |
| // END OMIT |
| |
| func (w *BroadcastWriter) Clean() error { |
| w.Lock() |
| for w := range w.writers { |
| w.Close() |
| } |
| w.writers = make(map[io.WriteCloser]struct{}) |
| w.Unlock() |
| return nil |
| } |
| |
| func New() *BroadcastWriter { |
| return &BroadcastWriter{ |
| writers: make(map[io.WriteCloser]struct{}), |
| } |
| } |