mirror of
https://github.com/datarhei/core.git
synced 2025-09-27 04:16:25 +08:00
143 lines
4.8 KiB
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
|
|
}
|