@@ -112,6 +112,8 @@ func (s *Server) HandleSubscribe(c echo.Context) error {
112
112
}
113
113
defer ws .Close ()
114
114
115
+ writeWait := 10 * time .Second
116
+
115
117
log := slog .With ("source" , "server_handle_subscribe" , "socket_addr" , ws .RemoteAddr ().String (), "real_ip" , subIP )
116
118
117
119
sub , err := s .AddSubscriber (ws , subIP , subscriberOpts )
@@ -143,6 +145,8 @@ func (s *Server) HandleSubscribe(c echo.Context) error {
143
145
cancel ()
144
146
return
145
147
}
148
+ case websocket .PongMessage :
149
+ log .Debug ("received pong message from client" )
146
150
case websocket .CloseMessage :
147
151
log .Info ("received close message from client" )
148
152
cancel ()
@@ -241,6 +245,9 @@ func (s *Server) HandleSubscribe(c echo.Context) error {
241
245
}
242
246
243
247
// Read events from the outbox and send them to the subscriber
248
+ pingPeriod := 30 * time .Second
249
+ t := time .NewTicker (pingPeriod )
250
+ defer t .Stop ()
244
251
for {
245
252
select {
246
253
case <- ctx .Done ():
@@ -253,6 +260,8 @@ func (s *Server) HandleSubscribe(c echo.Context) error {
253
260
return fmt .Errorf ("failed to wait for rate limiter: %w" , err )
254
261
}
255
262
263
+ ws .SetWriteDeadline (time .Now ().Add (writeWait ))
264
+
256
265
// When compression is enabled, the msg is a zstd compressed message
257
266
if compress {
258
267
if err := sub .WriteMessage (websocket .BinaryMessage , * msg ); err != nil {
@@ -267,6 +276,12 @@ func (s *Server) HandleSubscribe(c echo.Context) error {
267
276
log .Error ("failed to write message to websocket" , "error" , err )
268
277
return nil
269
278
}
279
+ case <- t .C :
280
+ ws .SetWriteDeadline (time .Now ().Add (writeWait ))
281
+ if err := sub .WriteMessage (websocket .PingMessage , nil ); err != nil {
282
+ log .Error ("failed to write ping to websocket" , "error" , err )
283
+ return nil
284
+ }
270
285
}
271
286
}
272
287
}
0 commit comments