53 lines
		
	
	
		
			949 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			949 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package registry
 | |
| 
 | |
| import (
 | |
| 	"sync"
 | |
| 
 | |
| 	"github.com/micro/go-micro/v3/router"
 | |
| )
 | |
| 
 | |
| // tableWatcher implements routing table Watcher
 | |
| type tableWatcher struct {
 | |
| 	sync.RWMutex
 | |
| 	id      string
 | |
| 	opts    router.WatchOptions
 | |
| 	resChan chan *router.Event
 | |
| 	done    chan struct{}
 | |
| }
 | |
| 
 | |
| // Next returns the next noticed action taken on table
 | |
| // TODO: right now we only allow to watch particular service
 | |
| func (w *tableWatcher) Next() (*router.Event, error) {
 | |
| 	for {
 | |
| 		select {
 | |
| 		case res := <-w.resChan:
 | |
| 			switch w.opts.Service {
 | |
| 			case res.Route.Service, "*":
 | |
| 				return res, nil
 | |
| 			default:
 | |
| 				continue
 | |
| 			}
 | |
| 		case <-w.done:
 | |
| 			return nil, router.ErrWatcherStopped
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Chan returns watcher events channel
 | |
| func (w *tableWatcher) Chan() (<-chan *router.Event, error) {
 | |
| 	return w.resChan, nil
 | |
| }
 | |
| 
 | |
| // Stop stops routing table watcher
 | |
| func (w *tableWatcher) Stop() {
 | |
| 	w.Lock()
 | |
| 	defer w.Unlock()
 | |
| 
 | |
| 	select {
 | |
| 	case <-w.done:
 | |
| 		return
 | |
| 	default:
 | |
| 		close(w.done)
 | |
| 	}
 | |
| }
 |