1package terminal 2 3import ( 4 "fmt" 5 "io" 6) 7 8type StreamProxy struct { 9 StopCh chan error 10} 11 12func NewStreamProxy(stoppers int) *StreamProxy { 13 return &StreamProxy{ 14 StopCh: make(chan error, stoppers+2), // each proxy() call is a stopper 15 } 16} 17 18func (p *StreamProxy) GetStopCh() chan error { 19 return p.StopCh 20} 21 22func (p *StreamProxy) Serve(client io.ReadWriter, server io.ReadWriter) error { 23 go p.proxy(client, server) 24 go p.proxy(server, client) 25 26 err := <-p.StopCh 27 return err 28} 29 30func (p *StreamProxy) proxy(to, from io.ReadWriter) { 31 _, err := io.Copy(to, from) 32 if err != nil { 33 p.StopCh <- fmt.Errorf("failed to pipe stream: %v", err) 34 } 35} 36