+22
-8
server/handle_sync_subscribe_repos.go
+22
-8
server/handle_sync_subscribe_repos.go
···
12
)
13
14
func (s *Server) handleSyncSubscribeRepos(e echo.Context) error {
15
-
ctx := e.Request().Context()
16
logger := s.logger.With("component", "subscribe-repos-websocket")
17
18
conn, err := websocket.Upgrade(e.Response().Writer, e.Request(), e.Response().Header(), 1<<10, 1<<10)
···
30
metrics.RelaysConnected.WithLabelValues(ident).Dec()
31
}()
32
33
-
evts, cancel, err := s.evtman.Subscribe(ctx, ident, func(evt *events.XRPCStreamEvent) bool {
34
return true
35
}, nil)
36
if err != nil {
37
return err
38
}
39
-
defer cancel()
40
41
header := events.EventHeader{Op: events.EvtKindMessage}
42
for evt := range evts {
···
97
98
// we should tell the relay to request a new crawl at this point if we got disconnected
99
// use a new context since the old one might be cancelled at this point
100
-
ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
101
-
defer cancel()
102
-
if err := s.requestCrawl(ctx); err != nil {
103
-
logger.Error("error requesting crawls", "err", err)
104
-
}
105
106
return nil
107
}
···
12
)
13
14
func (s *Server) handleSyncSubscribeRepos(e echo.Context) error {
15
+
ctx, cancel := context.WithCancel(e.Request().Context())
16
+
defer cancel()
17
+
18
logger := s.logger.With("component", "subscribe-repos-websocket")
19
20
conn, err := websocket.Upgrade(e.Response().Writer, e.Request(), e.Response().Header(), 1<<10, 1<<10)
···
32
metrics.RelaysConnected.WithLabelValues(ident).Dec()
33
}()
34
35
+
evts, evtManCancel, err := s.evtman.Subscribe(ctx, ident, func(evt *events.XRPCStreamEvent) bool {
36
return true
37
}, nil)
38
if err != nil {
39
return err
40
}
41
+
defer evtManCancel()
42
+
43
+
// drop the connection whenever a subscriber disconnects from the socket, we should get errors
44
+
go func() {
45
+
for {
46
+
if _, _, err := conn.ReadMessage(); err != nil {
47
+
logger.Warn("websocket error", "err", err)
48
+
cancel()
49
+
}
50
+
}
51
+
}()
52
53
header := events.EventHeader{Op: events.EvtKindMessage}
54
for evt := range evts {
···
109
110
// we should tell the relay to request a new crawl at this point if we got disconnected
111
// use a new context since the old one might be cancelled at this point
112
+
go func() {
113
+
retryCtx, retryCancel := context.WithTimeout(context.Background(), 10*time.Second)
114
+
defer retryCancel()
115
+
if err := s.requestCrawl(retryCtx); err != nil {
116
+
logger.Error("error requesting crawls", "err", err)
117
+
}
118
+
}()
119
120
return nil
121
}