mirror of
https://github.com/shazow/ssh-chat.git
synced 2025-04-12 15:17:16 +03:00
49 lines
877 B
Go
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
|
|
}
|