croc/pkg/session/bench/state_upload.go

76 lines
1.4 KiB
Go

package bench
import (
"crypto/rand"
"fmt"
"time"
"github.com/pion/webrtc/v2"
log "github.com/sirupsen/logrus"
)
func (s *Session) onOpenUploadHandler(dc *webrtc.DataChannel) func() {
return func() {
if !s.master {
<-s.startPhase2
}
log.Debugln("Starting to upload data...")
defer log.Debugln("Stopped uploading data...")
lenToken := uint64(4096)
token := make([]byte, lenToken)
if _, err := rand.Read(token); err != nil {
log.Fatalln("Err: ", err)
}
s.uploadNetworkStats.Start()
// Useful for unit tests
if dc != nil {
dc.SetBufferedAmountLowThreshold(s.bufferThreshold)
dc.OnBufferedAmountLow(func() {
if err := dc.Send(token); err == nil {
fmt.Printf("Uploading at %.2f MB/s\r", s.uploadNetworkStats.Bandwidth())
s.uploadNetworkStats.AddBytes(lenToken)
}
})
} else {
log.Warningln("No DataChannel provided")
}
fmt.Printf("Uploading random datas ... (%d s)\n", int(s.testDuration.Seconds()))
timeout := time.After(s.testDuration)
timeoutErr := time.After(s.testDurationError)
if dc != nil {
// Ignore potential error
_ = dc.Send(token)
}
SENDING_LOOP:
for {
select {
case <-timeoutErr:
log.Error("Time'd out")
break SENDING_LOOP
case <-timeout:
log.Traceln("Done uploading")
break SENDING_LOOP
}
}
fmt.Printf("\n")
s.uploadNetworkStats.Stop()
if dc != nil {
dc.Close()
}
if s.master {
close(s.startPhase2)
}
s.wg.Done()
}
}