mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-27 00:55:17 +00:00
59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
|
package util
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"time"
|
||
|
|
||
|
"github.com/libp2p/go-libp2p/core/discovery"
|
||
|
"github.com/libp2p/go-libp2p/core/peer"
|
||
|
|
||
|
logging "github.com/ipfs/go-log/v2"
|
||
|
)
|
||
|
|
||
|
var log = logging.Logger("discovery-util")
|
||
|
|
||
|
// FindPeers is a utility function that synchronously collects peers from a Discoverer.
|
||
|
func FindPeers(ctx context.Context, d discovery.Discoverer, ns string, opts ...discovery.Option) ([]peer.AddrInfo, error) {
|
||
|
|
||
|
ch, err := d.FindPeers(ctx, ns, opts...)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
res := make([]peer.AddrInfo, 0, len(ch))
|
||
|
for pi := range ch {
|
||
|
res = append(res, pi)
|
||
|
}
|
||
|
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
// Advertise is a utility function that persistently advertises a service through an Advertiser.
|
||
|
func Advertise(ctx context.Context, a discovery.Advertiser, ns string, opts ...discovery.Option) {
|
||
|
go func() {
|
||
|
for {
|
||
|
ttl, err := a.Advertise(ctx, ns, opts...)
|
||
|
if err != nil {
|
||
|
log.Debugf("Error advertising %s: %s", ns, err.Error())
|
||
|
if ctx.Err() != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
select {
|
||
|
case <-time.After(2 * time.Minute):
|
||
|
continue
|
||
|
case <-ctx.Done():
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
wait := 7 * ttl / 8
|
||
|
select {
|
||
|
case <-time.After(wait):
|
||
|
case <-ctx.Done():
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
}
|