257 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package web
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"crypto/tls"
 | |
| 	"net/http"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/micro/cli/v2"
 | |
| 	"github.com/micro/go-micro/v2"
 | |
| 	"github.com/micro/go-micro/v2/registry"
 | |
| )
 | |
| 
 | |
| type Options struct {
 | |
| 	Name      string
 | |
| 	Version   string
 | |
| 	Id        string
 | |
| 	Metadata  map[string]string
 | |
| 	Address   string
 | |
| 	Advertise string
 | |
| 
 | |
| 	Action func(*cli.Context)
 | |
| 	Flags  []cli.Flag
 | |
| 
 | |
| 	RegisterTTL      time.Duration
 | |
| 	RegisterInterval time.Duration
 | |
| 
 | |
| 	// RegisterCheck runs a check function before registering the service
 | |
| 	RegisterCheck func(context.Context) error
 | |
| 
 | |
| 	Server  *http.Server
 | |
| 	Handler http.Handler
 | |
| 
 | |
| 	// Alternative Options
 | |
| 	Context context.Context
 | |
| 
 | |
| 	Registry registry.Registry
 | |
| 	Service  micro.Service
 | |
| 
 | |
| 	Secure      bool
 | |
| 	TLSConfig   *tls.Config
 | |
| 	BeforeStart []func() error
 | |
| 	BeforeStop  []func() error
 | |
| 	AfterStart  []func() error
 | |
| 	AfterStop   []func() error
 | |
| 
 | |
| 	// Static directory
 | |
| 	StaticDir string
 | |
| 
 | |
| 	Signal bool
 | |
| }
 | |
| 
 | |
| func newOptions(opts ...Option) Options {
 | |
| 	opt := Options{
 | |
| 		Name:             DefaultName,
 | |
| 		Version:          DefaultVersion,
 | |
| 		Id:               DefaultId,
 | |
| 		Address:          DefaultAddress,
 | |
| 		RegisterTTL:      DefaultRegisterTTL,
 | |
| 		RegisterInterval: DefaultRegisterInterval,
 | |
| 		StaticDir:        DefaultStaticDir,
 | |
| 		Service:          micro.NewService(),
 | |
| 		Context:          context.TODO(),
 | |
| 		Signal:           true,
 | |
| 	}
 | |
| 
 | |
| 	for _, o := range opts {
 | |
| 		o(&opt)
 | |
| 	}
 | |
| 
 | |
| 	if opt.RegisterCheck == nil {
 | |
| 		opt.RegisterCheck = DefaultRegisterCheck
 | |
| 	}
 | |
| 
 | |
| 	return opt
 | |
| }
 | |
| 
 | |
| // Server name
 | |
| func Name(n string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Name = n
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Icon specifies an icon url to load in the UI
 | |
| func Icon(ico string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		if o.Metadata == nil {
 | |
| 			o.Metadata = make(map[string]string)
 | |
| 		}
 | |
| 		o.Metadata["icon"] = ico
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Unique server id
 | |
| func Id(id string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Id = id
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Version of the service
 | |
| func Version(v string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Version = v
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Metadata associated with the service
 | |
| func Metadata(md map[string]string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Metadata = md
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Address to bind to - host:port
 | |
| func Address(a string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Address = a
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // The address to advertise for discovery - host:port
 | |
| func Advertise(a string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Advertise = a
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Context specifies a context for the service.
 | |
| // Can be used to signal shutdown of the service.
 | |
| // Can be used for extra option values.
 | |
| func Context(ctx context.Context) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Context = ctx
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Registry used for discovery
 | |
| func Registry(r registry.Registry) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Registry = r
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Register the service with a TTL
 | |
| func RegisterTTL(t time.Duration) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.RegisterTTL = t
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Register the service with at interval
 | |
| func RegisterInterval(t time.Duration) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.RegisterInterval = t
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Handler(h http.Handler) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Handler = h
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func Server(srv *http.Server) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Server = srv
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // MicroService sets the micro.Service used internally
 | |
| func MicroService(s micro.Service) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Service = s
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Flags sets the command flags.
 | |
| func Flags(flags ...cli.Flag) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Flags = append(o.Flags, flags...)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Action sets the command action.
 | |
| func Action(a func(*cli.Context)) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Action = a
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // BeforeStart is executed before the server starts.
 | |
| func BeforeStart(fn func() error) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.BeforeStart = append(o.BeforeStart, fn)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // BeforeStop is executed before the server stops.
 | |
| func BeforeStop(fn func() error) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.BeforeStop = append(o.BeforeStop, fn)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // AfterStart is executed after server start.
 | |
| func AfterStart(fn func() error) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.AfterStart = append(o.AfterStart, fn)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // AfterStop is executed after server stop.
 | |
| func AfterStop(fn func() error) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.AfterStop = append(o.AfterStop, fn)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Secure Use secure communication. If TLSConfig is not specified we use InsecureSkipVerify and generate a self signed cert
 | |
| func Secure(b bool) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Secure = b
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // TLSConfig to be used for the transport.
 | |
| func TLSConfig(t *tls.Config) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.TLSConfig = t
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // StaticDir sets the static file directory. This defaults to ./html
 | |
| func StaticDir(d string) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.StaticDir = d
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // RegisterCheck run func before registry service
 | |
| func RegisterCheck(fn func(context.Context) error) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.RegisterCheck = fn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // HandleSignal toggles automatic installation of the signal handler that
 | |
| // traps TERM, INT, and QUIT.  Users of this feature to disable the signal
 | |
| // handler, should control liveness of the service through the context.
 | |
| func HandleSignal(b bool) Option {
 | |
| 	return func(o *Options) {
 | |
| 		o.Signal = b
 | |
| 	}
 | |
| }
 |