123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- package lib
- import (
- "encoding/json"
- "log"
- "time"
- "github.com/pion/webrtc"
- )
- const (
- LogTimeInterval = 5
- )
- type BytesLogger interface {
- Log()
- AddOutbound(int)
- AddInbound(int)
- }
- // Default BytesLogger does nothing.
- type BytesNullLogger struct{}
- func (b BytesNullLogger) Log() {}
- func (b BytesNullLogger) AddOutbound(amount int) {}
- func (b BytesNullLogger) AddInbound(amount int) {}
- // BytesSyncLogger uses channels to safely log from multiple sources with output
- // occuring at reasonable intervals.
- type BytesSyncLogger struct {
- OutboundChan chan int
- InboundChan chan int
- Outbound int
- Inbound int
- OutEvents int
- InEvents int
- IsLogging bool
- }
- func (b *BytesSyncLogger) Log() {
- b.IsLogging = true
- var amount int
- output := func() {
- log.Printf("Traffic Bytes (in|out): %d | %d -- (%d OnMessages, %d Sends)",
- b.Inbound, b.Outbound, b.InEvents, b.OutEvents)
- b.Outbound = 0
- b.OutEvents = 0
- b.Inbound = 0
- b.InEvents = 0
- }
- last := time.Now()
- for {
- select {
- case amount = <-b.OutboundChan:
- b.Outbound += amount
- b.OutEvents++
- if time.Since(last) > time.Second*LogTimeInterval {
- last = time.Now()
- output()
- }
- case amount = <-b.InboundChan:
- b.Inbound += amount
- b.InEvents++
- if time.Since(last) > time.Second*LogTimeInterval {
- last = time.Now()
- output()
- }
- case <-time.After(time.Second * LogTimeInterval):
- if b.InEvents > 0 || b.OutEvents > 0 {
- output()
- }
- }
- }
- }
- func (b *BytesSyncLogger) AddOutbound(amount int) {
- if !b.IsLogging {
- return
- }
- b.OutboundChan <- amount
- }
- func (b *BytesSyncLogger) AddInbound(amount int) {
- if !b.IsLogging {
- return
- }
- b.InboundChan <- amount
- }
- func deserializeSessionDescription(msg string) *webrtc.SessionDescription {
- var parsed map[string]interface{}
- err := json.Unmarshal([]byte(msg), &parsed)
- if nil != err {
- log.Println(err)
- return nil
- }
- if _, ok := parsed["type"]; !ok {
- log.Println("Cannot deserialize SessionDescription without type field.")
- return nil
- }
- if _, ok := parsed["sdp"]; !ok {
- log.Println("Cannot deserialize SessionDescription without sdp field.")
- return nil
- }
- var stype webrtc.SDPType
- switch parsed["type"].(string) {
- default:
- log.Println("Unknown SDP type")
- return nil
- case "offer":
- stype = webrtc.SDPTypeOffer
- case "pranswer":
- stype = webrtc.SDPTypePranswer
- case "answer":
- stype = webrtc.SDPTypeAnswer
- case "rollback":
- stype = webrtc.SDPTypeRollback
- }
- if err != nil {
- log.Println(err)
- return nil
- }
- return &webrtc.SessionDescription{
- Type: stype,
- SDP: parsed["sdp"].(string),
- }
- }
- func serializeSessionDescription(desc *webrtc.SessionDescription) string {
- bytes, err := json.Marshal(*desc)
- if nil != err {
- log.Println(err)
- return ""
- }
- return string(bytes)
- }
|