Use messaging in web package

This commit is contained in:
Alexandre Iooss 2020-10-17 12:38:18 +02:00
parent 68d4ad8aee
commit b8ee60ce9f
No known key found for this signature in database
GPG Key ID: 6C79278F3FCDCC02
3 changed files with 28 additions and 14 deletions

View File

@ -13,14 +13,12 @@ import (
"github.com/markbates/pkger" "github.com/markbates/pkger"
"gitlab.crans.org/nounous/ghostream/internal/monitoring" "gitlab.crans.org/nounous/ghostream/internal/monitoring"
"gitlab.crans.org/nounous/ghostream/stream/srt"
"gitlab.crans.org/nounous/ghostream/stream/telnet"
"gitlab.crans.org/nounous/ghostream/stream/webrtc" "gitlab.crans.org/nounous/ghostream/stream/webrtc"
) )
var ( var (
// Precompile regex // Precompile regex
validPath = regexp.MustCompile("^/[a-z0-9_-]*$") validPath = regexp.MustCompile("^/[a-z0-9@_-]*$")
) )
// Handle WebRTC session description exchange via POST // Handle WebRTC session description exchange via POST
@ -152,14 +150,19 @@ func staticHandler() http.Handler {
} }
func statisticsHandler(w http.ResponseWriter, r *http.Request) { func statisticsHandler(w http.ResponseWriter, r *http.Request) {
// Display connected users stats, from WebRTC or streaming directly from a video player name := strings.Replace(r.URL.Path[7:], "/", "", -1)
streamID := strings.Replace(r.URL.Path[7:], "/", "", -1) userCount := 0
// Get requested stream
stream, ok := streams[name]
if ok {
// Get number of output channels
userCount = stream.Count()
}
// Display connected users statistics
enc := json.NewEncoder(w) enc := json.NewEncoder(w)
err := enc.Encode(struct { err := enc.Encode(struct{ ConnectedViewers int }{userCount})
ConnectedViewers int
}{webrtc.GetNumberConnectedSessions(streamID) +
srt.GetNumberConnectedSessions(streamID) +
telnet.GetNumberConnectedSessions(streamID)})
if err != nil { if err != nil {
http.Error(w, "Failed to generate JSON.", http.StatusInternalServerError) http.Error(w, "Failed to generate JSON.", http.StatusInternalServerError)
log.Printf("Failed to generate JSON: %s", err) log.Printf("Failed to generate JSON: %s", err)

View File

@ -11,6 +11,7 @@ import (
"github.com/markbates/pkger" "github.com/markbates/pkger"
"github.com/pion/webrtc/v3" "github.com/pion/webrtc/v3"
"gitlab.crans.org/nounous/ghostream/stream"
) )
// Options holds web package configuration // Options holds web package configuration
@ -41,6 +42,9 @@ var (
// Preload templates // Preload templates
templates *template.Template templates *template.Template
// Streams to get statistics
streams map[string]stream.Stream
) )
// Load templates with pkger // Load templates with pkger
@ -74,10 +78,11 @@ func loadTemplates() error {
} }
// Serve HTTP server // Serve HTTP server
func Serve(rSdpChan chan struct { func Serve(s map[string]stream.Stream, rSdpChan chan struct {
StreamID string StreamID string
RemoteDescription webrtc.SessionDescription RemoteDescription webrtc.SessionDescription
}, lSdpChan chan webrtc.SessionDescription, c *Options) { }, lSdpChan chan webrtc.SessionDescription, c *Options) {
streams = s
remoteSdpChan = rSdpChan remoteSdpChan = rSdpChan
localSdpChan = lSdpChan localSdpChan = lSdpChan
cfg = c cfg = c

View File

@ -4,11 +4,17 @@ import (
"net/http" "net/http"
"testing" "testing"
"time" "time"
"gitlab.crans.org/nounous/ghostream/stream"
) )
// TestHTTPServe tries to serve a real HTTP server and load some pages // TestHTTPServe tries to serve a real HTTP server and load some pages
func TestHTTPServe(t *testing.T) { func TestHTTPServe(t *testing.T) {
go Serve(nil, nil, &Options{Enabled: false, ListenAddress: "127.0.0.1:8081"}) // Init streams messaging
streams := make(map[string]stream.Stream)
// Create a disabled web server
go Serve(streams, nil, nil, &Options{Enabled: false, ListenAddress: "127.0.0.1:8081"})
// Sleep 500ms to ensure that the web server is running, to avoid fails because the request came too early // Sleep 500ms to ensure that the web server is running, to avoid fails because the request came too early
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
@ -20,7 +26,7 @@ func TestHTTPServe(t *testing.T) {
} }
// Now let's really start the web server // Now let's really start the web server
go Serve(nil, nil, &Options{Enabled: true, ListenAddress: "127.0.0.1:8081"}) go Serve(streams, nil, nil, &Options{Enabled: true, ListenAddress: "127.0.0.1:8081"})
// Sleep 500ms to ensure that the web server is running, to avoid fails because the request came too early // Sleep 500ms to ensure that the web server is running, to avoid fails because the request came too early
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
@ -52,7 +58,7 @@ func TestHTTPServe(t *testing.T) {
t.Errorf("Viewer page returned %v != %v on GET", resp.StatusCode, http.StatusOK) t.Errorf("Viewer page returned %v != %v on GET", resp.StatusCode, http.StatusOK)
} }
// Test viewer statistic endpoint // Test viewer statistics endpoint
resp, err = http.Get("http://localhost:8081/_stats/demo/") resp, err = http.Get("http://localhost:8081/_stats/demo/")
if err != nil { if err != nil {
t.Errorf("Error while getting /_stats: %s", err) t.Errorf("Error while getting /_stats: %s", err)