package main import ( "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, }, } }