package remotedialer import ( "context" "time" "github.com/gorilla/websocket" "github.com/sirupsen/logrus" ) func (s *Session) startPingsWhileWindows(rootCtx context.Context) { ctx, cancel := context.WithCancel(rootCtx) s.pingCancel = cancel s.pingWait.Add(1) go func() { defer s.pingWait.Done() t := time.NewTicker(PingWriteInterval) defer t.Stop() for { select { case <-ctx.Done(): return case <-t.C: s.conn.Lock() if err := s.conn.conn.WriteControl(websocket.PingMessage, []byte(""), time.Now().Add(time.Second)); err != nil { logrus.WithError(err).Error("Error writing ping") } logrus.Debug("Wrote ping") s.conn.Unlock() } } }() } func (s *Session) ServeWhileWindows(ctx context.Context) (int, error) { if s.client { s.startPingsWhileWindows(ctx) } for { msType, reader, err := s.conn.NextReader() if err != nil { return 400, err } if msType != websocket.BinaryMessage { return 400, errWrongMessageType } if err := s.serveMessage(reader); err != nil { return 500, err } } }