51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package main
|
|
|
|
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,
|
|
},
|
|
}
|
|
}
|