package atproto import ( "context" "net" "net/http" "time" "github.com/bluesky-social/indigo/atproto/identity" "github.com/bluesky-social/indigo/atproto/syntax" "github.com/carlmjohnson/versioninfo" ) type Resolver struct { directory identity.Directory } func DefaultResolver() *Resolver { return &Resolver{ directory: identity.DefaultDirectory(), } } 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 (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) Directory() identity.Directory { return r.directory }