Files
core/http/api/session.go

143 lines
4.8 KiB
Go

package api
import (
"encoding/json"
"github.com/datarhei/core/v16/session"
)
// SessionStats are the accumulated numbers for the session summary
type SessionStats struct {
TotalSessions uint64 `json:"sessions" format:"uint64"`
TotalRxBytes uint64 `json:"traffic_rx_mb" format:"uint64"`
TotalTxBytes uint64 `json:"traffic_tx_mb" format:"uint64"`
}
// SessionPeers is for the grouping by peers in the summary
type SessionPeers struct {
SessionStats
Locations map[string]SessionStats `json:"local"`
}
// Session represents an active session
type Session struct {
ID string `json:"id"`
Reference string `json:"reference"`
CreatedAt int64 `json:"created_at" format:"int64"`
Location string `json:"local"`
Peer string `json:"remote"`
Extra string `json:"extra"`
RxBytes uint64 `json:"bytes_rx" format:"uint64"`
TxBytes uint64 `json:"bytes_tx" format:"uint64"`
RxBitrate json.Number `json:"bandwidth_rx_kbit" swaggertype:"number" jsonschema:"type=number"` // kbit/s
TxBitrate json.Number `json:"bandwidth_tx_kbit" swaggertype:"number" jsonschema:"type=number"` // kbit/s
}
func (s *Session) Unmarshal(sess session.Session) {
s.ID = sess.ID
s.Reference = sess.Reference
s.CreatedAt = sess.CreatedAt.Unix()
s.Location = sess.Location
s.Peer = sess.Peer
s.Extra = sess.Extra
s.RxBytes = sess.RxBytes
s.TxBytes = sess.TxBytes
s.RxBitrate = toNumber(sess.RxBitrate / 1024)
s.TxBitrate = toNumber(sess.TxBitrate / 1024)
}
// SessionSummaryActive represents the currently active sessions
type SessionSummaryActive struct {
SessionList []Session `json:"list"`
Sessions uint64 `json:"sessions" format:"uint64"`
RxBitrate json.Number `json:"bandwidth_rx_mbit" swaggertype:"number" jsonschema:"type=number"` // mbit/s
TxBitrate json.Number `json:"bandwidth_tx_mbit" swaggertype:"number" jsonschema:"type=number"` // mbit/s
MaxSessions uint64 `json:"max_sessions" format:"uint64"`
MaxRxBitrate json.Number `json:"max_bandwidth_rx_mbit" swaggertype:"number" jsonschema:"type=number"` // mbit/s
MaxTxBitrate json.Number `json:"max_bandwidth_tx_mbit" swaggertype:"number" jsonschema:"type=number"` // mbit/s
}
// SessionSummarySummary represents the summary (history) of all finished sessions
type SessionSummarySummary struct {
Peers map[string]SessionPeers `json:"remote"`
Locations map[string]SessionStats `json:"local"`
References map[string]SessionStats `json:"reference"`
SessionStats
}
// SessionSummary is the API representation of a session.Summary
type SessionSummary struct {
Active SessionSummaryActive `json:"active"`
Summary SessionSummarySummary `json:"summary"`
}
type SessionsSummary map[string]SessionSummary
// SessionsActive is the API representation of all active sessions
type SessionsActive map[string][]Session
// Unmarshal creates a new SessionSummary from a session.Summary
func (summary *SessionSummary) Unmarshal(sum session.Summary) {
summary.Active.MaxSessions = sum.MaxSessions
summary.Active.MaxRxBitrate = toNumber(sum.MaxRxBitrate / 1024 / 1024)
summary.Active.MaxTxBitrate = toNumber(sum.MaxTxBitrate / 1024 / 1024)
summary.Active.Sessions = sum.CurrentSessions
summary.Active.RxBitrate = toNumber(sum.CurrentRxBitrate / 1024 / 1024)
summary.Active.TxBitrate = toNumber(sum.CurrentTxBitrate / 1024 / 1024)
summary.Active.SessionList = make([]Session, len(sum.Active))
for i, s := range sum.Active {
summary.Active.SessionList[i].Unmarshal(s)
}
summary.Summary.Peers = make(map[string]SessionPeers)
for peer, g := range sum.Summary.Peers {
group := SessionPeers{
Locations: make(map[string]SessionStats),
}
group.TotalSessions = g.TotalSessions
group.TotalRxBytes = g.TotalRxBytes / 1024 / 1024
group.TotalTxBytes = g.TotalTxBytes / 1024 / 1024
for location, s := range g.Locations {
group.Locations[location] = SessionStats{
TotalSessions: s.TotalSessions,
TotalRxBytes: s.TotalRxBytes / 1024 / 1024,
TotalTxBytes: s.TotalTxBytes / 1024 / 1024,
}
}
summary.Summary.Peers[peer] = group
}
summary.Summary.Locations = make(map[string]SessionStats)
for location, g := range sum.Summary.Locations {
summary.Summary.Locations[location] = SessionStats{
TotalSessions: g.TotalSessions,
TotalRxBytes: g.TotalRxBytes / 1024 / 1024,
TotalTxBytes: g.TotalTxBytes / 1024 / 1024,
}
}
summary.Summary.References = make(map[string]SessionStats)
for reference, g := range sum.Summary.References {
summary.Summary.References[reference] = SessionStats{
TotalSessions: g.TotalSessions,
TotalRxBytes: g.TotalRxBytes / 1024 / 1024,
TotalTxBytes: g.TotalTxBytes / 1024 / 1024,
}
}
summary.Summary.TotalSessions = sum.Summary.TotalSessions
summary.Summary.TotalRxBytes = sum.Summary.TotalRxBytes / 1024 / 1024
summary.Summary.TotalTxBytes = sum.Summary.TotalTxBytes / 1024 / 1024
}