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}