converge/pkg/agent/service/activitydetector.go

51 lines
1.2 KiB
Go

package service
import (
"git.wamblee.org/converge/pkg/agent/session"
"io"
"time"
)
type WriteDetector[T io.ReadWriter] struct {
session T
lastReportedTime time.Time
}
func (conn *WriteDetector[T]) Read(p []byte) (int, error) {
return conn.session.Read(p)
}
func (conn *WriteDetector[T]) Write(p []byte) (int, error) {
n, err := conn.session.Write(p)
if err == nil && n > 0 {
// because downloads can generate a lot of write in a short time, we do some throttling
// It could also negatively impact download speed if we handle all the events.
now := time.Now()
if now.Sub(conn.lastReportedTime).Seconds() > 1 {
conn.lastReportedTime = now
session.UserActivityDetected()
}
}
return n, err
}
func NewWriteDetector(conn io.ReadWriter) *WriteDetector[io.ReadWriter] {
return &WriteDetector[io.ReadWriter]{session: conn}
}
type SftpActivityDetector struct {
WriteDetector[io.ReadWriteCloser]
}
func (conn *SftpActivityDetector) Close() error {
return conn.session.Close()
}
func NewSftpActivityDetector(conn io.ReadWriteCloser) *SftpActivityDetector {
return &SftpActivityDetector{
WriteDetector: WriteDetector[io.ReadWriteCloser]{
session: conn,
},
}
}