ssh-chat/multiscreen.go
2018-06-05 19:31:34 -04:00

49 lines
877 B
Go

package sshchat
import (
"io"
"sync"
"github.com/shazow/ssh-chat/chat/message"
)
type multiScreen struct {
*message.User
mu sync.Mutex
writers []io.WriteCloser
}
func (s *multiScreen) add(w io.WriteCloser) {
s.mu.Lock()
s.writers = append(s.writers, w)
s.mu.Unlock()
}
func (s *multiScreen) Write(p []byte) (n int, err error) {
s.mu.Lock()
defer s.mu.Unlock()
for i, w := range s.writers {
n, err = w.Write(p)
if err == nil && n != len(p) {
err = io.ErrShortWrite
}
if err == nil {
continue
}
if err != nil && len(s.writers) == 1 {
// Once we're out of writers, fail.
return len(p), err
}
// Remove faulty writer
w.Close()
s.writers[i] = s.writers[len(s.writers)-1]
s.writers[len(s.writers)-1] = nil
s.writers = s.writers[:len(s.writers)-1]
// TODO: Emit error to a callback or something?
}
return len(p), nil
}