forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package spindle
2
3import (
4 "fmt"
5 "log/slog"
6 "net/http"
7
8 "golang.org/x/net/context"
9 "tangled.sh/tangled.sh/core/api/tangled"
10 "tangled.sh/tangled.sh/core/jetstream"
11 "tangled.sh/tangled.sh/core/knotserver/notifier"
12 "tangled.sh/tangled.sh/core/log"
13 "tangled.sh/tangled.sh/core/rbac"
14 "tangled.sh/tangled.sh/core/spindle/config"
15 "tangled.sh/tangled.sh/core/spindle/db"
16)
17
18type Spindle struct {
19 jc *jetstream.JetstreamClient
20 db *db.DB
21 e *rbac.Enforcer
22 l *slog.Logger
23 n *notifier.Notifier
24}
25
26func Run(ctx context.Context) error {
27 cfg, err := config.Load(ctx)
28 if err != nil {
29 return fmt.Errorf("failed to load config: %w", err)
30 }
31
32 d, err := db.Make(cfg.Server.DBPath)
33 if err != nil {
34 return fmt.Errorf("failed to setup db: %w", err)
35 }
36
37 e, err := rbac.NewEnforcer(cfg.Server.DBPath)
38 if err != nil {
39 return fmt.Errorf("failed to setup rbac enforcer: %w", err)
40 }
41
42 logger := log.FromContext(ctx)
43
44 collections := []string{tangled.SpindleMemberNSID}
45 jc, err := jetstream.NewJetstreamClient(cfg.Server.JetstreamEndpoint, "spindle", collections, nil, logger, d, true, false)
46 if err != nil {
47 return fmt.Errorf("failed to setup jetstream client: %w", err)
48 }
49
50 n := notifier.New()
51
52 spindle := Spindle{
53 jc: jc,
54 e: e,
55 db: d,
56 l: logger,
57 n: &n,
58 }
59
60 logger.Info("starting spindle server", "address", cfg.Server.ListenAddr)
61 logger.Error("server error", "error", http.ListenAndServe(cfg.Server.ListenAddr, spindle.Router()))
62
63 return nil
64}
65
66func (s *Spindle) Router() http.Handler {
67 mux := &http.ServeMux{}
68
69 mux.HandleFunc("/events", s.Events)
70 return mux
71}