···23import (
4 "context"
0506 "github.com/sethvargo/go-envconfig"
7)
8···2324 // This disables signature verification so use with caution.
25 Dev bool `env:"DEV, default=false"`
000026}
2728type Config struct {
···23import (
4 "context"
5+ "fmt"
67+ "github.com/bluesky-social/indigo/atproto/syntax"
8 "github.com/sethvargo/go-envconfig"
9)
10···2526 // This disables signature verification so use with caution.
27 Dev bool `env:"DEV, default=false"`
28+}
29+30+func (s Server) Did() syntax.DID {
31+ return syntax.DID(fmt.Sprintf("did:web:%s", s.Hostname))
32}
3334type Config struct {
+37-18
knotserver/handler.go
···8 "runtime/debug"
910 "github.com/go-chi/chi/v5"
011 "tangled.sh/tangled.sh/core/jetstream"
12 "tangled.sh/tangled.sh/core/knotserver/config"
13 "tangled.sh/tangled.sh/core/knotserver/db"
0014 "tangled.sh/tangled.sh/core/notifier"
15 "tangled.sh/tangled.sh/core/rbac"
16-)
17-18-const (
19- ThisServer = "thisserver" // resource identifier for rbac enforcement
20)
2122type Handle struct {
23- c *config.Config
24- db *db.DB
25- jc *jetstream.JetstreamClient
26- e *rbac.Enforcer
27- l *slog.Logger
28- n *notifier.Notifier
02930 // init is a channel that is closed when the knot has been initailized
31 // i.e. when the first user (knot owner) has been added.
···37 r := chi.NewRouter()
3839 h := Handle{
40- c: c,
41- db: db,
42- e: e,
43- l: l,
44- jc: jc,
45- n: n,
46- init: make(chan struct{}),
047 }
4849- err := e.AddKnot(ThisServer)
50 if err != nil {
51 return nil, fmt.Errorf("failed to setup enforcer: %w", err)
52 }
···131 })
132 })
133000134 // Create a new repository.
135 r.Route("/repo", func(r chi.Router) {
136 r.Use(h.VerifySignature)
···161 r.Get("/keys", h.Keys)
162163 return r, nil
000000000000000164}
165166// version is set during build time.
···8 "runtime/debug"
910 "github.com/go-chi/chi/v5"
11+ "tangled.sh/tangled.sh/core/idresolver"
12 "tangled.sh/tangled.sh/core/jetstream"
13 "tangled.sh/tangled.sh/core/knotserver/config"
14 "tangled.sh/tangled.sh/core/knotserver/db"
15+ "tangled.sh/tangled.sh/core/knotserver/xrpc"
16+ tlog "tangled.sh/tangled.sh/core/log"
17 "tangled.sh/tangled.sh/core/notifier"
18 "tangled.sh/tangled.sh/core/rbac"
000019)
2021type Handle struct {
22+ c *config.Config
23+ db *db.DB
24+ jc *jetstream.JetstreamClient
25+ e *rbac.Enforcer
26+ l *slog.Logger
27+ n *notifier.Notifier
28+ resolver *idresolver.Resolver
2930 // init is a channel that is closed when the knot has been initailized
31 // i.e. when the first user (knot owner) has been added.
···37 r := chi.NewRouter()
3839 h := Handle{
40+ c: c,
41+ db: db,
42+ e: e,
43+ l: l,
44+ jc: jc,
45+ n: n,
46+ resolver: idresolver.DefaultResolver(),
47+ init: make(chan struct{}),
48 }
4950+ err := e.AddKnot(rbac.ThisServer)
51 if err != nil {
52 return nil, fmt.Errorf("failed to setup enforcer: %w", err)
53 }
···132 })
133 })
134135+ // xrpc apis
136+ r.Mount("/xrpc", h.XrpcRouter())
137+138 // Create a new repository.
139 r.Route("/repo", func(r chi.Router) {
140 r.Use(h.VerifySignature)
···165 r.Get("/keys", h.Keys)
166167 return r, nil
168+}
169+170+func (h *Handle) XrpcRouter() http.Handler {
171+ logger := tlog.New("knots")
172+173+ xrpc := &xrpc.Xrpc{
174+ Config: h.c,
175+ Db: h.db,
176+ Ingester: h.jc,
177+ Enforcer: h.e,
178+ Logger: logger,
179+ Notifier: h.n,
180+ Resolver: h.resolver,
181+ }
182+ return xrpc.Router()
183}
184185// version is set during build time.