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}