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 }