79 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package router
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	// ErrWatcherStopped is returned when routing table watcher has been stopped
 | 
						|
	ErrWatcherStopped = errors.New("watcher stopped")
 | 
						|
)
 | 
						|
 | 
						|
// EventType defines routing table event
 | 
						|
type EventType int
 | 
						|
 | 
						|
const (
 | 
						|
	// Create is emitted when a new route has been created
 | 
						|
	Create EventType = iota
 | 
						|
	// Delete is emitted when an existing route has been deleted
 | 
						|
	Delete
 | 
						|
	// Update is emitted when an existing route has been updated
 | 
						|
	Update
 | 
						|
)
 | 
						|
 | 
						|
// String returns human readable event type
 | 
						|
func (t EventType) String() string {
 | 
						|
	switch t {
 | 
						|
	case Create:
 | 
						|
		return "create"
 | 
						|
	case Delete:
 | 
						|
		return "delete"
 | 
						|
	case Update:
 | 
						|
		return "update"
 | 
						|
	default:
 | 
						|
		return "unknown"
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Event is returned by a call to Next on the watcher.
 | 
						|
type Event struct {
 | 
						|
	// Unique id of the event
 | 
						|
	Id string
 | 
						|
	// Type defines type of event
 | 
						|
	Type EventType
 | 
						|
	// Timestamp is event timestamp
 | 
						|
	Timestamp time.Time
 | 
						|
	// Route is table route
 | 
						|
	Route Route
 | 
						|
}
 | 
						|
 | 
						|
// Watcher defines routing table watcher interface
 | 
						|
// Watcher returns updates to the routing table
 | 
						|
type Watcher interface {
 | 
						|
	// Next is a blocking call that returns watch result
 | 
						|
	Next() (*Event, error)
 | 
						|
	// Chan returns event channel
 | 
						|
	Chan() (<-chan *Event, error)
 | 
						|
	// Stop stops watcher
 | 
						|
	Stop()
 | 
						|
}
 | 
						|
 | 
						|
// WatchOption is used to define what routes to watch in the table
 | 
						|
type WatchOption func(*WatchOptions)
 | 
						|
 | 
						|
// WatchOptions are table watcher options
 | 
						|
// TODO: expand the options to watch based on other criteria
 | 
						|
type WatchOptions struct {
 | 
						|
	// Service allows to watch specific service routes
 | 
						|
	Service string
 | 
						|
}
 | 
						|
 | 
						|
// WatchService sets what service routes to watch
 | 
						|
// Service is the microservice name
 | 
						|
func WatchService(s string) WatchOption {
 | 
						|
	return func(o *WatchOptions) {
 | 
						|
		o.Service = s
 | 
						|
	}
 | 
						|
}
 |