代码拉取完成,页面将自动刷新
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),
},
})
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。