55 "errors"
66 "evolve/controller"
77 "evolve/modules/sse"
8- "evolve/modules/ws"
98 "evolve/routes"
109 "evolve/util"
1110 "fmt"
@@ -36,16 +35,19 @@ func main() {
3635
3736 var logger = util .NewLogger ()
3837
39- // Context and Graceful Shutdown Setup.
38+ redisClient , err := sse .GetRedisClient (* logger )
39+ if err != nil {
40+ logger .Error (fmt .Sprintf ("Failed to initialize Redis client: %v. Exiting." , err ))
41+ os .Exit (1 )
42+ }
43+ logger .Info ("Redis client initialized successfully." )
44+
45+ // Use context for cancellation signal propagation.
4046 ctx , stop := signal .NotifyContext (context .Background (), syscall .SIGINT , syscall .SIGTERM )
4147 defer stop ()
4248
43- // Start WebSocket Server.
44- wsHub := ws .StartServer (ctx , * logger )
45- logger .Info ("WebSocket Hub started." )
46-
47- // Register HTTP Routes.
48- mux := http .DefaultServeMux
49+ // Register HTTP Routes
50+ mux := http .NewServeMux ()
4951
5052 mux .HandleFunc (routes .TEST , controller .Test )
5153 mux .HandleFunc (routes .EA , controller .CreateEA )
@@ -56,40 +58,35 @@ func main() {
5658 mux .HandleFunc (routes .SHARE_RUN , controller .ShareRun )
5759 mux .HandleFunc (routes .RUN , controller .UserRun )
5860
59- // WebSocket Route.
60- wsHandler := ws .GetHandler (ctx , wsHub , * logger )
61- mux .HandleFunc (routes .LIVE , wsHandler )
62- logger .Info ("WebSocket endpoint registered at /live/" )
63-
64- // SSE Route.
65- sseHandler := sse .GetSSEHandler (* logger )
61+ sseHandler := sse .GetSSEHandler (* logger , redisClient )
6662 mux .HandleFunc (routes .LOGS , sseHandler )
67- logger .Info ("SSE endpoint registered at /runs/logs/" )
63+ logger .Info (fmt . Sprintf ( "SSE endpoint registered at %s using Redis Pub/Sub" , routes . LOGS ) )
6864
69- // Log the test endpoint URL.
7065 logger .Info (fmt .Sprintf ("Test http server on http://localhost%s/api/test" , PORT ))
7166
7267 // CORS Configuration.
7368 corsHandler := cors .New (cors.Options {
7469 AllowedOrigins : []string {FRONTEND_URL },
7570 AllowedMethods : []string {"GET" , "POST" , "PUT" , "DELETE" , "OPTIONS" },
76- AllowedHeaders : []string {"*" },
71+ AllowedHeaders : []string {"*" , "X-RUN-ID" },
72+ ExposedHeaders : []string {},
7773 AllowCredentials : true ,
7874 }).Handler (mux )
7975
8076 // HTTP Server Setup and Start.
8177 server := & http.Server {
8278 Addr : PORT ,
8379 Handler : corsHandler ,
84- ReadTimeout : 10 * time .Second ,
85- WriteTimeout : 0 , // Set WriteTimeout to 0 for long-lived SSE connections.
86- IdleTimeout : 0 , // Set IdleTimeout to 0 for long-lived SSE connections.
80+ ReadTimeout : 15 * time .Second ,
81+ WriteTimeout : 0 ,
82+ IdleTimeout : 0 ,
8783 BaseContext : func (_ net.Listener ) context.Context { return ctx },
8884 }
8985
90- // Start server in a goroutine.
86+ // Start server in a goroutine so
87+ // it doesn't block the graceful shutdown handling.
9188 go func () {
92- logger .Info (fmt .Sprintf ("HTTP server starting on %s (Frontend: %s)" , server .Addr , FRONTEND_URL ))
89+ logger .Info (fmt .Sprintf ("HTTP server starting on %s (Allowed Frontend Origin : %s)" , server .Addr , FRONTEND_URL ))
9390 if err := server .ListenAndServe (); err != nil && ! errors .Is (err , http .ErrServerClosed ) {
9491 logger .Error (fmt .Sprintf ("HTTP server ListenAndServe error: %v" , err ))
9592 stop ()
@@ -99,17 +96,26 @@ func main() {
9996 // Wait for Shutdown Signal.
10097 <- ctx .Done ()
10198
102- // Initiate Graceful Shutdown.
10399 logger .Info ("Shutdown signal received. Starting graceful shutdown..." )
104100
105- shutdownCtx , cancelShutdown := context .WithTimeout (context .Background (), 10 * time .Second )
101+ // Create a context with a timeout for the shutdown process.
102+ shutdownCtx , cancelShutdown := context .WithTimeout (context .Background (), 15 * time .Second )
106103 defer cancelShutdown ()
107104
105+ // Attempt to gracefully shut down the HTTP server.
108106 if err := server .Shutdown (shutdownCtx ); err != nil {
109107 logger .Error (fmt .Sprintf ("HTTP server graceful shutdown failed: %v" , err ))
110108 } else {
111109 logger .Info ("HTTP server shutdown complete." )
112110 }
113111
112+ // Close Redis Client.
113+ logger .Info ("Shutting down Redis client..." )
114+ if redisErr := redisClient .Close (); redisErr != nil {
115+ logger .Error (fmt .Sprintf ("Redis client shutdown error: %v" , redisErr ))
116+ } else {
117+ logger .Info ("Redis client shutdown complete." )
118+ }
119+
114120 logger .Info ("Server exiting." )
115121}
0 commit comments