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