mirror of
https://github.com/hackdiaz-dev/free-turn-proxy.git
synced 2026-10-12 09:41:53 +02:00
52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package session
|
|
|
|
import (
|
|
"math"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/samosvalishe/free-turn-proxy/internal/stats"
|
|
)
|
|
|
|
// traffic агрегирует счётчики и считает скорость передачи.
|
|
type traffic struct {
|
|
stats *stats.Stats
|
|
|
|
mu sync.Mutex
|
|
prevTx uint64
|
|
prevRx uint64
|
|
prevAt time.Time
|
|
}
|
|
|
|
func newTraffic() *traffic {
|
|
return &traffic{stats: stats.New(true)}
|
|
}
|
|
|
|
// rates - средняя скорость (байт/с) с прошлого вызова. Считается на запрос, а не
|
|
// фоновым тикером: спрашивает только открытый экран, и будить процесс ради цифры,
|
|
// которую никто не читает, незачем.
|
|
func (t *traffic) rates() (txRate, rxRate int64) {
|
|
tx, rx := t.stats.Counters()
|
|
now := time.Now()
|
|
|
|
t.mu.Lock()
|
|
defer t.mu.Unlock()
|
|
prevTx, prevRx, prevAt := t.prevTx, t.prevRx, t.prevAt
|
|
t.prevTx, t.prevRx, t.prevAt = tx, rx, now
|
|
|
|
elapsed := now.Sub(prevAt)
|
|
if prevAt.IsZero() || elapsed <= 0 {
|
|
return 0, 0
|
|
}
|
|
sec := elapsed.Seconds()
|
|
return perSecond(tx-prevTx, sec), perSecond(rx-prevRx, sec)
|
|
}
|
|
|
|
func perSecond(delta uint64, sec float64) int64 {
|
|
rate := float64(delta) / sec
|
|
if rate >= math.MaxInt64 {
|
|
return math.MaxInt64
|
|
}
|
|
return int64(rate)
|
|
}
|