mirror of
https://github.com/yudai/gotty.git
synced 2026-03-04 21:00:17 +01:00
webtty: upgrade Run to use an errgroup to join 2 i/o routines
This commit is contained in:
parent
c830287cb0
commit
b5d904cb14
4 changed files with 52 additions and 41 deletions
3
go.mod
3
go.mod
|
|
@ -1,6 +1,6 @@
|
||||||
module github.com/ghthor/gotty/v2
|
module github.com/ghthor/gotty/v2
|
||||||
|
|
||||||
go 1.23.0
|
go 1.24.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/NYTimes/gziphandler v1.1.1
|
github.com/NYTimes/gziphandler v1.1.1
|
||||||
|
|
@ -11,6 +11,7 @@ require (
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/urfave/cli v1.22.14
|
github.com/urfave/cli v1.22.14
|
||||||
github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552
|
github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552
|
||||||
|
golang.org/x/sync v0.17.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|
|
||||||
2
go.sum
2
go.sum
|
|
@ -46,6 +46,8 @@ github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552 h1:tjsK9T2IA3d2FFNxzDP7A
|
||||||
github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552/go.mod h1:hg0ZaCmQL3rze1cH8Fh2g0a9q8vQs0uN8ESpePEwSEw=
|
github.com/yudai/hcl v0.0.0-20151013225006-5fa2393b3552/go.mod h1:hg0ZaCmQL3rze1cH8Fh2g0a9q8vQs0uN8ESpePEwSEw=
|
||||||
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
|
||||||
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
|
||||||
|
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||||
|
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|
|
||||||
|
|
@ -165,8 +165,11 @@ func (server *Server) processWSConn(ctx context.Context, conn *websocket.Conn) e
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tty.Run(ctx)
|
err = tty.Run(ctx)
|
||||||
|
if err != nil && !errors.Is(err, context.Canceled) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return err
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (server *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
|
func (server *Server) handleIndex(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
// WebTTY bridges a PTY slave and its PTY master.
|
// WebTTY bridges a PTY slave and its PTY master.
|
||||||
|
|
@ -42,7 +43,7 @@ func New(masterConn Master, slave Slave, options ...Option) (*WebTTY, error) {
|
||||||
columns: 0,
|
columns: 0,
|
||||||
rows: 0,
|
rows: 0,
|
||||||
|
|
||||||
bufferSize: 1024,
|
bufferSize: 4096,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
|
|
@ -64,49 +65,52 @@ func (wt *WebTTY) Run(ctx context.Context) error {
|
||||||
return errors.Wrapf(err, "failed to send initializing message")
|
return errors.Wrapf(err, "failed to send initializing message")
|
||||||
}
|
}
|
||||||
|
|
||||||
errs := make(chan error, 2)
|
grp, grpCtx := errgroup.WithContext(ctx)
|
||||||
|
done := grpCtx.Done()
|
||||||
|
|
||||||
go func() {
|
grp.Go(func() error {
|
||||||
errs <- func() error {
|
buffer := make([]byte, wt.bufferSize)
|
||||||
buffer := make([]byte, wt.bufferSize)
|
for {
|
||||||
for {
|
select {
|
||||||
n, err := wt.slave.Read(buffer)
|
case <-done:
|
||||||
if err != nil {
|
return grpCtx.Err()
|
||||||
return ErrSlaveClosed
|
default:
|
||||||
}
|
|
||||||
|
|
||||||
err = wt.handleSlaveReadEvent(buffer[:n])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}()
|
|
||||||
}()
|
|
||||||
|
|
||||||
go func() {
|
n, err := wt.slave.Read(buffer)
|
||||||
errs <- func() error {
|
if err != nil {
|
||||||
buffer := make([]byte, wt.bufferSize)
|
return ErrSlaveClosed
|
||||||
for {
|
|
||||||
n, err := wt.masterConn.Read(buffer)
|
|
||||||
if err != nil {
|
|
||||||
return ErrMasterClosed
|
|
||||||
}
|
|
||||||
|
|
||||||
err = wt.handleMasterReadEvent(buffer[:n])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}()
|
|
||||||
}()
|
|
||||||
|
|
||||||
select {
|
err = wt.handleSlaveReadEvent(buffer[:n])
|
||||||
case <-ctx.Done():
|
if err != nil {
|
||||||
err = ctx.Err()
|
return err
|
||||||
case err = <-errs:
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return err
|
grp.Go(func() error {
|
||||||
|
buffer := make([]byte, wt.bufferSize)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
return grpCtx.Err()
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
n, err := wt.masterConn.Read(buffer)
|
||||||
|
if err != nil {
|
||||||
|
return ErrMasterClosed
|
||||||
|
}
|
||||||
|
|
||||||
|
err = wt.handleMasterReadEvent(buffer[:n])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return grp.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wt *WebTTY) sendInitializeMessage() error {
|
func (wt *WebTTY) sendInitializeMessage() error {
|
||||||
|
|
@ -205,7 +209,8 @@ func (wt *WebTTY) handleMasterReadEvent(data []byte) error {
|
||||||
columns = int(args.Columns)
|
columns = int(args.Columns)
|
||||||
}
|
}
|
||||||
|
|
||||||
wt.slave.ResizeTerminal(columns, rows)
|
// Ignoring this error unfournately
|
||||||
|
_ = wt.slave.ResizeTerminal(columns, rows)
|
||||||
default:
|
default:
|
||||||
return errors.Errorf("unknown message type `%c`", data[0])
|
return errors.Errorf("unknown message type `%c`", data[0])
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue