1 Star 0 Fork 0

infrastlabs/fk-container-web-tty

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
grpc_tty.go 1.73 KB
一键复制 编辑 原始数据 按行查看 历史
package grpc
import (
"time"
pb "gitee.com/infrastlabs/fk-container-web-tty/proxy/pb"
)
// execWrapper implement webtty.Slave
type execWrapper struct {
exec pb.ContainerServer_ExecClient
activeChan chan struct{}
}
type resizeFunction func(width int, height int) error
func newExecWrapper(client pb.ContainerServer_ExecClient) *execWrapper {
return &execWrapper{
exec: client,
activeChan: make(chan struct{}, 5),
}
}
func (enj *execWrapper) Read(p []byte) (n int, err error) {
go func() {
if len(enj.activeChan) != 0 {
return
}
enj.activeChan <- struct{}{}
}()
execOpts, err := enj.exec.Recv()
if err != nil {
return 0, err
}
// logrus.Debugf("output: %s\n", execOpts.Cmd.Out)
copy(p, execOpts.Cmd.Out)
return len(execOpts.Cmd.Out), nil
}
func (enj *execWrapper) Write(p []byte) (n int, err error) {
// logrus.Debugf("input: %s\n", p)
return len(p), enj.exec.Send(&pb.ExecOptions{
Cmd: &pb.Io{
In: p,
},
})
}
func (enj *execWrapper) Exit() error {
enj.Write([]byte{3})
enj.Write([]byte{4})
close(enj.activeChan)
return enj.exec.CloseSend()
}
func (enj *execWrapper) ActiveChan() <-chan struct{} {
return enj.activeChan
}
func (enj *execWrapper) WindowTitleVariables() map[string]interface{} {
return map[string]interface{}{}
}
func (enj *execWrapper) ResizeTerminal(width int, height int) (err error) {
// since the process may not up so fast, give it 150ms
// retry 3 times
for i := 0; i < 3; i++ {
if err = enj.resize(width, height); err == nil {
return
}
time.Sleep(time.Millisecond * 50)
}
return
}
func (enj *execWrapper) resize(width int, height int) error {
return enj.exec.Send(&pb.ExecOptions{
Ws: &pb.WindowSize{
Height: int32(height),
Width: int32(width),
},
})
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/infrastlabs/fk-container-web-tty.git
git@gitee.com:infrastlabs/fk-container-web-tty.git
infrastlabs
fk-container-web-tty
fk-container-web-tty
v0.2.6

搜索帮助