From 2dae0dd74c6b62e8d4dc51163db8ec27c9ac03da Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Fri, 25 Jul 2025 08:31:52 +0000 Subject: [PATCH] idresolver: move package out of appview Signed-off-by: oppiliappan --- appview/ingester.go | 2 +- guard/guard.go | 2 +- idresolver/resolver.go | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ knotserver/ingester.go | 2 +- appview/idresolver/resolver.go | 117 --------------------------------------------------------------------------------------------------------------------- appview/issues/issues.go | 2 +- appview/knots/knots.go | 2 +- appview/middleware/middleware.go | 2 +- appview/pipelines/pipelines.go | 2 +- appview/pulls/pulls.go | 2 +- appview/repo/repo.go | 2 +- appview/reporesolver/resolver.go | 2 +- appview/spindles/spindles.go | 2 +- appview/state/state.go | 4 ++-- appview/oauth/handler/handler.go | 2 +- 15 file(s) changed, 130 insertion(s)(+), 131 deletion(s)(-) diff --git a/appview/ingester.go b/appview/ingester.go --- a/appview/ingester.go +++ b/appview/ingester.go @@ -14,8 +14,8 @@ "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/spindleverify" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/rbac" ) diff --git a/guard/guard.go b/guard/guard.go --- a/guard/guard.go +++ b/guard/guard.go @@ -13,7 +13,7 @@ "github.com/bluesky-social/indigo/atproto/identity" securejoin "github.com/cyphar/filepath-securejoin" "github.com/urfave/cli/v3" - "tangled.sh/tangled.sh/core/appview/idresolver" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/log" ) diff --git a/idresolver/resolver.go b/idresolver/resolver.go new file mode 100644 --- /dev/null +++ b/idresolver/resolver.go @@ -0,0 +1,116 @@ +package idresolver + +import ( + "context" + "net" + "net/http" + "sync" + "time" + + "github.com/bluesky-social/indigo/atproto/identity" + "github.com/bluesky-social/indigo/atproto/identity/redisdir" + "github.com/bluesky-social/indigo/atproto/syntax" + "github.com/carlmjohnson/versioninfo" +) + +type Resolver struct { + directory identity.Directory +} + +func BaseDirectory() identity.Directory { + base := identity.BaseDirectory{ + PLCURL: identity.DefaultPLCURL, + HTTPClient: http.Client{ + Timeout: time.Second * 10, + Transport: &http.Transport{ + // would want this around 100ms for services doing lots of handle resolution. Impacts PLC connections as well, but not too bad. + IdleConnTimeout: time.Millisecond * 1000, + MaxIdleConns: 100, + }, + }, + Resolver: net.Resolver{ + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + d := net.Dialer{Timeout: time.Second * 3} + return d.DialContext(ctx, network, address) + }, + }, + TryAuthoritativeDNS: true, + // primary Bluesky PDS instance only supports HTTP resolution method + SkipDNSDomainSuffixes: []string{".bsky.social"}, + UserAgent: "indigo-identity/" + versioninfo.Short(), + } + return &base +} + +func RedisDirectory(url string) (identity.Directory, error) { + hitTTL := time.Hour * 24 + errTTL := time.Second * 30 + invalidHandleTTL := time.Minute * 5 + return redisdir.NewRedisDirectory(BaseDirectory(), url, hitTTL, errTTL, invalidHandleTTL, 10000) +} + +func DefaultResolver() *Resolver { + return &Resolver{ + directory: identity.DefaultDirectory(), + } +} + +func RedisResolver(redisUrl string) (*Resolver, error) { + directory, err := RedisDirectory(redisUrl) + if err != nil { + return nil, err + } + return &Resolver{ + directory: directory, + }, nil +} + +func (r *Resolver) ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) { + id, err := syntax.ParseAtIdentifier(arg) + if err != nil { + return nil, err + } + + return r.directory.Lookup(ctx, *id) +} + +func (r *Resolver) ResolveIdents(ctx context.Context, idents []string) []*identity.Identity { + results := make([]*identity.Identity, len(idents)) + var wg sync.WaitGroup + + done := make(chan struct{}) + defer close(done) + + for idx, ident := range idents { + wg.Add(1) + go func(index int, id string) { + defer wg.Done() + + select { + case <-ctx.Done(): + results[index] = nil + case <-done: + results[index] = nil + default: + identity, _ := r.ResolveIdent(ctx, id) + results[index] = identity + } + }(idx, ident) + } + + wg.Wait() + return results +} + +func (r *Resolver) InvalidateIdent(ctx context.Context, arg string) error { + id, err := syntax.ParseAtIdentifier(arg) + if err != nil { + return err + } + + return r.directory.Purge(ctx, *id) +} + +func (r *Resolver) Directory() identity.Directory { + return r.directory +} diff --git a/knotserver/ingester.go b/knotserver/ingester.go --- a/knotserver/ingester.go +++ b/knotserver/ingester.go @@ -17,7 +17,7 @@ "github.com/bluesky-social/jetstream/pkg/models" securejoin "github.com/cyphar/filepath-securejoin" "tangled.sh/tangled.sh/core/api/tangled" - "tangled.sh/tangled.sh/core/appview/idresolver" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/knotserver/db" "tangled.sh/tangled.sh/core/knotserver/git" "tangled.sh/tangled.sh/core/log" diff --git a/appview/idresolver/resolver.go b/appview/idresolver/resolver.go deleted file mode 100644 --- a/appview/idresolver/resolver.go +++ /dev/null @@ -1,117 +0,0 @@ -package idresolver - -import ( - "context" - "net" - "net/http" - "sync" - "time" - - "github.com/bluesky-social/indigo/atproto/identity" - "github.com/bluesky-social/indigo/atproto/identity/redisdir" - "github.com/bluesky-social/indigo/atproto/syntax" - "github.com/carlmjohnson/versioninfo" - "tangled.sh/tangled.sh/core/appview/config" -) - -type Resolver struct { - directory identity.Directory -} - -func BaseDirectory() identity.Directory { - base := identity.BaseDirectory{ - PLCURL: identity.DefaultPLCURL, - HTTPClient: http.Client{ - Timeout: time.Second * 10, - Transport: &http.Transport{ - // would want this around 100ms for services doing lots of handle resolution. Impacts PLC connections as well, but not too bad. - IdleConnTimeout: time.Millisecond * 1000, - MaxIdleConns: 100, - }, - }, - Resolver: net.Resolver{ - Dial: func(ctx context.Context, network, address string) (net.Conn, error) { - d := net.Dialer{Timeout: time.Second * 3} - return d.DialContext(ctx, network, address) - }, - }, - TryAuthoritativeDNS: true, - // primary Bluesky PDS instance only supports HTTP resolution method - SkipDNSDomainSuffixes: []string{".bsky.social"}, - UserAgent: "indigo-identity/" + versioninfo.Short(), - } - return &base -} - -func RedisDirectory(url string) (identity.Directory, error) { - hitTTL := time.Hour * 24 - errTTL := time.Second * 30 - invalidHandleTTL := time.Minute * 5 - return redisdir.NewRedisDirectory(BaseDirectory(), url, hitTTL, errTTL, invalidHandleTTL, 10000) -} - -func DefaultResolver() *Resolver { - return &Resolver{ - directory: identity.DefaultDirectory(), - } -} - -func RedisResolver(config config.RedisConfig) (*Resolver, error) { - directory, err := RedisDirectory(config.ToURL()) - if err != nil { - return nil, err - } - return &Resolver{ - directory: directory, - }, nil -} - -func (r *Resolver) ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) { - id, err := syntax.ParseAtIdentifier(arg) - if err != nil { - return nil, err - } - - return r.directory.Lookup(ctx, *id) -} - -func (r *Resolver) ResolveIdents(ctx context.Context, idents []string) []*identity.Identity { - results := make([]*identity.Identity, len(idents)) - var wg sync.WaitGroup - - done := make(chan struct{}) - defer close(done) - - for idx, ident := range idents { - wg.Add(1) - go func(index int, id string) { - defer wg.Done() - - select { - case <-ctx.Done(): - results[index] = nil - case <-done: - results[index] = nil - default: - identity, _ := r.ResolveIdent(ctx, id) - results[index] = identity - } - }(idx, ident) - } - - wg.Wait() - return results -} - -func (r *Resolver) InvalidateIdent(ctx context.Context, arg string) error { - id, err := syntax.ParseAtIdentifier(arg) - if err != nil { - return err - } - - return r.directory.Purge(ctx, *id) -} - -func (r *Resolver) Directory() identity.Directory { - return r.directory -} diff --git a/appview/issues/issues.go b/appview/issues/issues.go --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -18,12 +18,12 @@ "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/notify" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/pagination" "tangled.sh/tangled.sh/core/appview/reporesolver" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/tid" ) diff --git a/appview/knots/knots.go b/appview/knots/knots.go --- a/appview/knots/knots.go +++ b/appview/knots/knots.go @@ -15,11 +15,11 @@ "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/middleware" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/eventconsumer" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/knotclient" "tangled.sh/tangled.sh/core/rbac" "tangled.sh/tangled.sh/core/tid" diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go --- a/appview/middleware/middleware.go +++ b/appview/middleware/middleware.go @@ -13,11 +13,11 @@ "github.com/bluesky-social/indigo/atproto/identity" "github.com/go-chi/chi/v5" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/pagination" "tangled.sh/tangled.sh/core/appview/reporesolver" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/rbac" ) diff --git a/appview/pipelines/pipelines.go b/appview/pipelines/pipelines.go --- a/appview/pipelines/pipelines.go +++ b/appview/pipelines/pipelines.go @@ -11,11 +11,11 @@ "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/reporesolver" "tangled.sh/tangled.sh/core/eventconsumer" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/log" "tangled.sh/tangled.sh/core/rbac" spindlemodel "tangled.sh/tangled.sh/core/spindle/models" diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -16,11 +16,11 @@ "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/notify" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/reporesolver" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/knotclient" "tangled.sh/tangled.sh/core/patchutil" "tangled.sh/tangled.sh/core/tid" diff --git a/appview/repo/repo.go b/appview/repo/repo.go --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -19,13 +19,13 @@ "tangled.sh/tangled.sh/core/appview/commitverify" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/notify" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/pages/markup" "tangled.sh/tangled.sh/core/appview/reporesolver" "tangled.sh/tangled.sh/core/eventconsumer" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/knotclient" "tangled.sh/tangled.sh/core/patchutil" "tangled.sh/tangled.sh/core/rbac" diff --git a/appview/reporesolver/resolver.go b/appview/reporesolver/resolver.go --- a/appview/reporesolver/resolver.go +++ b/appview/reporesolver/resolver.go @@ -17,10 +17,10 @@ "github.com/go-chi/chi/v5" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" "tangled.sh/tangled.sh/core/appview/pages/repoinfo" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/knotclient" "tangled.sh/tangled.sh/core/rbac" ) diff --git a/appview/spindles/spindles.go b/appview/spindles/spindles.go --- a/appview/spindles/spindles.go +++ b/appview/spindles/spindles.go @@ -12,11 +12,11 @@ "tangled.sh/tangled.sh/core/api/tangled" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/middleware" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" verify "tangled.sh/tangled.sh/core/appview/spindleverify" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/rbac" "tangled.sh/tangled.sh/core/tid" diff --git a/appview/state/state.go b/appview/state/state.go --- a/appview/state/state.go +++ b/appview/state/state.go @@ -20,13 +20,13 @@ "tangled.sh/tangled.sh/core/appview/cache/session" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/notify" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/pages" posthog_service "tangled.sh/tangled.sh/core/appview/posthog" "tangled.sh/tangled.sh/core/appview/reporesolver" "tangled.sh/tangled.sh/core/eventconsumer" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/jetstream" "tangled.sh/tangled.sh/core/knotclient" tlog "tangled.sh/tangled.sh/core/log" @@ -63,7 +63,7 @@ pgs := pages.NewPages(config) - res, err := idresolver.RedisResolver(config.Redis) + res, err := idresolver.RedisResolver(config.Redis.ToURL()) if err != nil { log.Printf("failed to create redis resolver: %v", err) res = idresolver.DefaultResolver() diff --git a/appview/oauth/handler/handler.go b/appview/oauth/handler/handler.go --- a/appview/oauth/handler/handler.go +++ b/appview/oauth/handler/handler.go @@ -16,11 +16,11 @@ sessioncache "tangled.sh/tangled.sh/core/appview/cache/session" "tangled.sh/tangled.sh/core/appview/config" "tangled.sh/tangled.sh/core/appview/db" - "tangled.sh/tangled.sh/core/appview/idresolver" "tangled.sh/tangled.sh/core/appview/middleware" "tangled.sh/tangled.sh/core/appview/oauth" "tangled.sh/tangled.sh/core/appview/oauth/client" "tangled.sh/tangled.sh/core/appview/pages" + "tangled.sh/tangled.sh/core/idresolver" "tangled.sh/tangled.sh/core/knotclient" "tangled.sh/tangled.sh/core/rbac" ) -- tangled.sh