github.com/status-im/status-go@v1.1.0/peers/topic_register.go (about)

     1  package peers
     2  
     3  import (
     4  	"sync"
     5  
     6  	"github.com/ethereum/go-ethereum/log"
     7  	"github.com/ethereum/go-ethereum/p2p/discv5"
     8  
     9  	"github.com/status-im/status-go/discovery"
    10  )
    11  
    12  // Register manages register topic queries
    13  type Register struct {
    14  	discovery discovery.Discovery
    15  	topics    []discv5.Topic
    16  
    17  	wg   sync.WaitGroup
    18  	quit chan struct{}
    19  }
    20  
    21  // NewRegister creates instance of topic register
    22  func NewRegister(discovery discovery.Discovery, topics ...discv5.Topic) *Register {
    23  	return &Register{discovery: discovery, topics: topics}
    24  }
    25  
    26  // Start topic register query for every topic
    27  func (r *Register) Start() error {
    28  	if !r.discovery.Running() {
    29  		return ErrDiscv5NotRunning
    30  	}
    31  	r.quit = make(chan struct{})
    32  	for _, topic := range r.topics {
    33  		r.wg.Add(1)
    34  		go func(t discv5.Topic) {
    35  			log.Debug("v5 register topic", "topic", t)
    36  			if err := r.discovery.Register(string(t), r.quit); err != nil {
    37  				log.Error("error registering topic", "topic", t, "error", err)
    38  			}
    39  			r.wg.Done()
    40  		}(topic)
    41  	}
    42  	return nil
    43  }
    44  
    45  // Stop all register topic queries and waits for them to exit
    46  func (r *Register) Stop() {
    47  	if r.quit == nil {
    48  		return
    49  	}
    50  	select {
    51  	case <-r.quit:
    52  		return
    53  	default:
    54  		close(r.quit)
    55  	}
    56  	log.Debug("waiting for register queries to exit")
    57  	r.wg.Wait()
    58  }