Monorepo for Tangled
tangled.org
1package server
2
3import (
4 "context"
5 "fmt"
6 "net/http"
7
8 "github.com/urfave/cli/v3"
9 "tangled.org/core/knot2/config"
10 "tangled.org/core/knot2/db"
11 "tangled.org/core/log"
12)
13
14func Command() *cli.Command {
15 return &cli.Command{
16 Name: "server",
17 Usage: "run a knot server",
18 Action: Run,
19 Flags: []cli.Flag{
20 &cli.StringFlag{
21 Name: "config",
22 Aliases: []string{"c"},
23 Usage: "config path",
24 Required: true,
25 },
26 },
27 }
28}
29
30func Run(ctx context.Context, cmd *cli.Command) error {
31 l := log.FromContext(ctx)
32 l = log.SubLogger(l, cmd.Name)
33 ctx = log.IntoContext(ctx, l)
34
35 configPath := cmd.String("config")
36
37 cfg, err := config.Load(ctx, configPath)
38 if err != nil {
39 return fmt.Errorf("failed to load config: %w", err)
40 }
41 fmt.Println("config:", cfg)
42
43 // TODO: start listening to jetstream
44
45 d, err := db.New(cfg.DbPath())
46 if err != nil {
47 panic(err)
48 }
49 err = db.Init(d)
50 if err != nil {
51 panic(err)
52 }
53
54 clientApp := newAtClientApp(&cfg)
55
56 mux := Routes(&cfg, d, clientApp)
57
58 l.Info("starting knot server", "address", cfg.ListenAddr())
59 err = http.ListenAndServe(cfg.ListenAddr(), mux)
60 if err != nil {
61 l.Error("server error", "err", err)
62 }
63
64 return nil
65}