forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package appview 2 3import ( 4 "context" 5 "sync" 6 7 "github.com/bluesky-social/indigo/atproto/identity" 8 "github.com/bluesky-social/indigo/atproto/syntax" 9) 10 11type Resolver struct { 12 directory identity.Directory 13} 14 15func NewResolver() *Resolver { 16 return &Resolver{ 17 directory: identity.DefaultDirectory(), 18 } 19} 20 21func (r *Resolver) ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) { 22 id, err := syntax.ParseAtIdentifier(arg) 23 if err != nil { 24 return nil, err 25 } 26 27 return r.directory.Lookup(ctx, *id) 28} 29 30func (r *Resolver) ResolveIdents(ctx context.Context, idents []string) []*identity.Identity { 31 results := make([]*identity.Identity, len(idents)) 32 var wg sync.WaitGroup 33 34 // Create a channel to handle context cancellation 35 done := make(chan struct{}) 36 defer close(done) 37 38 // Start a goroutine for each identifier 39 for idx, ident := range idents { 40 wg.Add(1) 41 go func(index int, id string) { 42 defer wg.Done() 43 44 select { 45 case <-ctx.Done(): 46 results[index] = nil 47 case <-done: 48 results[index] = nil 49 default: 50 // Resolve the identifier - if error, identity will be nil 51 identity, _ := r.ResolveIdent(ctx, id) 52 results[index] = identity 53 } 54 }(idx, ident) 55 } 56 57 wg.Wait() 58 return results 59}