Monorepo for Tangled
tangled.org
1package knotserver
2
3import (
4 "context"
5 "errors"
6 "net/http"
7 "time"
8
9 "github.com/bluesky-social/indigo/xrpc"
10 "tangled.org/core/api/tangled"
11 "tangled.org/core/eventstream"
12 "tangled.org/core/log"
13)
14
15func (h *Knot) Events(w http.ResponseWriter, r *http.Request) {
16 l := log.SubLogger(h.l, "eventstream")
17 l.Debug("received new connection")
18
19 err := eventstream.Stream(w, r, eventstream.StreamConfig{
20 Backend: h.db,
21 Notifier: h.n,
22 Logger: l,
23 })
24 if err != nil && !errors.Is(err, eventstream.ErrDrainCap) {
25 l.Error("event stream ended with error", "err", err)
26 }
27
28 go func() {
29 retryCtx, retryCancel := context.WithTimeout(context.Background(), 10*time.Second)
30 defer retryCancel()
31 if err := h.requestCrawl(retryCtx); err != nil {
32 l.Error("error requesting crawls", "err", err)
33 }
34 }()
35}
36
37func (h *Knot) requestCrawl(ctx context.Context) error {
38 h.l.Info("requesting crawl", "mirrors", h.c.KnotMirrors)
39 input := &tangled.SyncRequestCrawl_Input{
40 Hostname: h.c.Server.Hostname,
41 }
42 for _, knotmirror := range h.c.KnotMirrors {
43 xrpcc := xrpc.Client{Host: knotmirror}
44 if err := tangled.SyncRequestCrawl(ctx, &xrpcc, input); err != nil {
45 h.l.Error("error requesting crawl", "err", err)
46 } else {
47 h.l.Info("crawl requested successfully")
48 }
49 }
50 return nil
51}