11package handlers
22
33import (
4- "context"
54 "errors"
65 "fmt"
76 "log"
87 "net/http"
98 "os"
109 "strings"
11- "sync"
1210 "time"
1311
1412 "github.com/glimesh/broadcast-box/internal/environment"
1513 "github.com/glimesh/broadcast-box/internal/server/helpers"
1614 "github.com/glimesh/broadcast-box/internal/webrtc/sessions/manager"
17- "github.com/google/uuid"
1815)
1916
2017func sseHandler (responseWriter http.ResponseWriter , request * http.Request ) {
@@ -37,15 +34,11 @@ func sseHandler(responseWriter http.ResponseWriter, request *http.Request) {
3734 ctx := request .Context ()
3835 responseController := http .NewResponseController (responseWriter )
3936
40- var writeLock sync.Mutex
41- writeEvent := func (writeCtx context.Context , msg string ) bool {
42- if msg == "" || writeCtx .Err () != nil {
37+ writeEvent := func (msg string ) bool {
38+ if msg == "" || ctx .Err () != nil {
4339 return false
4440 }
4541
46- writeLock .Lock ()
47- defer writeLock .Unlock ()
48-
4942 if debugSseMessages {
5043 log .Println ("API.SSE Sending:" , msg )
5144 }
@@ -78,35 +71,42 @@ func sseHandler(responseWriter http.ResponseWriter, request *http.Request) {
7871 }
7972
8073 if streamSession , whepSession , foundSession := manager .SessionsManager .GetSessionAndWHEPByID (sessionID ); foundSession {
81- subscriberCtx , subscriberCancel := context .WithCancel (ctx )
82- defer subscriberCancel ()
83-
84- subscriberID := uuid .NewString ()
85- subscriberWrite := func (msg string ) bool {
86- return writeEvent (subscriberCtx , msg )
87- }
88- if ! whepSession .AddSSESubscriber (subscriberID , subscriberWrite , subscriberCancel ) {
89- helpers .LogHTTPError (responseWriter , "Invalid request" , http .StatusBadRequest )
90- return
91- }
92- defer whepSession .RemoveSSESubscriber (subscriberID )
93-
94- if ! subscriberWrite (streamSession .GetSessionStatsEvent ()) {
74+ if ! writeEvent (streamSession .GetSessionStatsEvent ()) {
9575 return
9676 }
9777
9878 host := streamSession .Host .Load ()
99- if host != nil && ! subscriberWrite (host .GetAvailableLayersEvent ()) {
79+ if host != nil && ! writeEvent (host .GetAvailableLayersEvent ()) {
10080 return
10181 }
10282
103- <- subscriberCtx .Done ()
104- log .Println ("API.SSE: Client disconnected" )
105- return
83+ ticker := time .NewTicker (5 * time .Second )
84+ defer ticker .Stop ()
85+
86+ for {
87+ select {
88+ case <- ctx .Done ():
89+ log .Println ("API.SSE: Client disconnected" )
90+ return
91+ case <- ticker .C :
92+ if whepSession .IsSessionClosed .Load () {
93+ return
94+ }
95+
96+ if ! writeEvent (streamSession .GetSessionStatsEvent ()) {
97+ return
98+ }
99+
100+ host := streamSession .Host .Load ()
101+ if host != nil && ! writeEvent (host .GetAvailableLayersEvent ()) {
102+ return
103+ }
104+ }
105+ }
106106 }
107107
108108 if streamSession , foundSession := manager .SessionsManager .GetSessionByHostSessionID (sessionID ); foundSession {
109- if ! writeEvent (ctx , streamSession .GetSessionStatsEvent ()) {
109+ if ! writeEvent (streamSession .GetSessionStatsEvent ()) {
110110 return
111111 }
112112
@@ -119,7 +119,7 @@ func sseHandler(responseWriter http.ResponseWriter, request *http.Request) {
119119 log .Println ("API.SSE: Client disconnected" )
120120 return
121121 case <- ticker .C :
122- if ! writeEvent (ctx , streamSession .GetSessionStatsEvent ()) {
122+ if ! writeEvent (streamSession .GetSessionStatsEvent ()) {
123123 return
124124 }
125125 }
0 commit comments