webtty: upgrade Run to use an errgroup to join 2 i/o routines

This commit is contained in:
Will Owens 2025-10-26 13:17:02 -05:00
parent c830287cb0
commit b5d904cb14
No known key found for this signature in database
GPG key ID: 8C8384B16B623DA6
4 changed files with 52 additions and 41 deletions

View file

@ -7,6 +7,7 @@ import (
"sync"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
)
// 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,
rows: 0,
bufferSize: 1024,
bufferSize: 4096,
}
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")
}
errs := make(chan error, 2)
grp, grpCtx := errgroup.WithContext(ctx)
done := grpCtx.Done()
go func() {
errs <- func() error {
buffer := make([]byte, wt.bufferSize)
for {
n, err := wt.slave.Read(buffer)
if err != nil {
return ErrSlaveClosed
}
err = wt.handleSlaveReadEvent(buffer[:n])
if err != nil {
return err
}
grp.Go(func() error {
buffer := make([]byte, wt.bufferSize)
for {
select {
case <-done:
return grpCtx.Err()
default:
}
}()
}()
go func() {
errs <- func() error {
buffer := make([]byte, wt.bufferSize)
for {
n, err := wt.masterConn.Read(buffer)
if err != nil {
return ErrMasterClosed
}
err = wt.handleMasterReadEvent(buffer[:n])
if err != nil {
return err
}
n, err := wt.slave.Read(buffer)
if err != nil {
return ErrSlaveClosed
}
}()
}()
select {
case <-ctx.Done():
err = ctx.Err()
case err = <-errs:
}
err = wt.handleSlaveReadEvent(buffer[:n])
if err != nil {
return err
}
}
})
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 {
@ -205,7 +209,8 @@ func (wt *WebTTY) handleMasterReadEvent(data []byte) error {
columns = int(args.Columns)
}
wt.slave.ResizeTerminal(columns, rows)
// Ignoring this error unfournately
_ = wt.slave.ResizeTerminal(columns, rows)
default:
return errors.Errorf("unknown message type `%c`", data[0])
}