You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.1 KiB
52 lines
1.1 KiB
package peer |
|
|
|
import ( |
|
"context" |
|
|
|
"golang.org/x/sync/singleflight" |
|
|
|
"github.com/gotd/td/tg" |
|
) |
|
|
|
type singleFlight struct { |
|
next Resolver |
|
sg singleflight.Group |
|
} |
|
|
|
func (s *singleFlight) ResolveDomain(ctx context.Context, domain string) (tg.InputPeerClass, error) { |
|
ch := s.sg.DoChan(domain, func() (interface{}, error) { |
|
return s.next.ResolveDomain(ctx, domain) |
|
}) |
|
|
|
select { |
|
case <-ctx.Done(): |
|
return nil, ctx.Err() |
|
case r := <-ch: |
|
if r.Err != nil { |
|
return nil, r.Err |
|
} |
|
return r.Val.(tg.InputPeerClass), nil |
|
} |
|
} |
|
|
|
func (s *singleFlight) ResolvePhone(ctx context.Context, phone string) (tg.InputPeerClass, error) { |
|
ch := s.sg.DoChan(phone, func() (interface{}, error) { |
|
return s.next.ResolvePhone(ctx, phone) |
|
}) |
|
|
|
select { |
|
case <-ctx.Done(): |
|
return nil, ctx.Err() |
|
case r := <-ch: |
|
if r.Err != nil { |
|
return nil, r.Err |
|
} |
|
return r.Val.(tg.InputPeerClass), nil |
|
} |
|
} |
|
|
|
// SingleflightResolver is a simple resolver decorator |
|
// which prevents duplicate resolve calls. |
|
func SingleflightResolver(next Resolver) Resolver { |
|
return &singleFlight{next: next} |
|
}
|
|
|