this repo has no description
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/knotclient"
12 "tangled.sh/tangled.sh/core/knotserver/notifier"
13 "tangled.sh/tangled.sh/core/log"
14 "tangled.sh/tangled.sh/core/rbac"
15 "tangled.sh/tangled.sh/core/spindle/config"
16 "tangled.sh/tangled.sh/core/spindle/db"
17 "tangled.sh/tangled.sh/core/spindle/engine"
18)
19
20type Spindle struct {
21 jc *jetstream.JetstreamClient
22 db *db.DB
23 e *rbac.Enforcer
24 l *slog.Logger
25 n *notifier.Notifier
26 eng *engine.Engine
27}
28
29func Run(ctx context.Context) error {
30 cfg, err := config.Load(ctx)
31 if err != nil {
32 return fmt.Errorf("failed to load config: %w", err)
33 }
34
35 d, err := db.Make(cfg.Server.DBPath)
36 if err != nil {
37 return fmt.Errorf("failed to setup db: %w", err)
38 }
39
40 e, err := rbac.NewEnforcer(cfg.Server.DBPath)
41 if err != nil {
42 return fmt.Errorf("failed to setup rbac enforcer: %w", err)
43 }
44
45 logger := log.FromContext(ctx)
46
47 collections := []string{tangled.SpindleMemberNSID}
48 jc, err := jetstream.NewJetstreamClient(cfg.Server.JetstreamEndpoint, "spindle", collections, nil, logger, d, true, false)
49 if err != nil {
50 return fmt.Errorf("failed to setup jetstream client: %w", err)
51 }
52
53 n := notifier.New()
54
55 eng, err := engine.New(ctx, d)
56 if err != nil {
57 return err
58 }
59
60 spindle := Spindle{
61 jc: jc,
62 e: e,
63 db: d,
64 l: logger,
65 n: &n,
66 eng: eng,
67 }
68
69 go func() {
70 logger.Info("starting event consumer")
71 ec := knotclient.NewEventConsumer(knotclient.ConsumerConfig{
72 Sources: []string{"ws://localhost:5555/events"},
73 Logger: logger,
74 ProcessFunc: spindle.exec,
75 })
76
77 ec.Start(ctx)
78 }()
79
80 logger.Info("starting spindle server", "address", cfg.Server.ListenAddr)
81 logger.Error("server error", "error", http.ListenAndServe(cfg.Server.ListenAddr, spindle.Router()))
82
83 return nil
84}
85
86func (s *Spindle) Router() http.Handler {
87 mux := &http.ServeMux{}
88
89 mux.HandleFunc("/events", s.Events)
90 return mux
91}