Compare commits
	
		
			10 Commits
		
	
	
		
			bf3b76a273
			...
			8e4fc06cf1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8e4fc06cf1 | |||
| 7f581cb668 | |||
| 55d7b2e312 | |||
| 8835e0e647 | |||
| d975ec3c74 | |||
| 9e767d6745 | |||
| 6431cd8bb9 | |||
| d354cf2539 | |||
| f08c814602 | |||
| 4525630abb | 
@ -2,8 +2,11 @@ package admission
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "context"
 | 
					import "context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Options struct{}
 | 
				
			||||||
 | 
					type Option func(opts *Options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Admission interface {
 | 
					type Admission interface {
 | 
				
			||||||
	Admit(ctx context.Context, addr string) bool
 | 
						Admit(ctx context.Context, addr string, opts ...Option) bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type admissionGroup struct {
 | 
					type admissionGroup struct {
 | 
				
			||||||
@ -16,9 +19,9 @@ func AdmissionGroup(admissions ...Admission) Admission {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *admissionGroup) Admit(ctx context.Context, addr string) bool {
 | 
					func (p *admissionGroup) Admit(ctx context.Context, addr string, opts ...Option) bool {
 | 
				
			||||||
	for _, admission := range p.admissions {
 | 
						for _, admission := range p.admissions {
 | 
				
			||||||
		if admission != nil && !admission.Admit(ctx, addr) {
 | 
							if admission != nil && !admission.Admit(ctx, addr, opts...) {
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								auth/auth.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								auth/auth.go
									
									
									
									
									
								
							@ -2,9 +2,13 @@ package auth
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "context"
 | 
					import "context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Options struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Option func(opts *Options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Authenticator is an interface for user authentication.
 | 
					// Authenticator is an interface for user authentication.
 | 
				
			||||||
type Authenticator interface {
 | 
					type Authenticator interface {
 | 
				
			||||||
	Authenticate(ctx context.Context, user, password string) (id string, ok bool)
 | 
						Authenticate(ctx context.Context, user, password string, opts ...Option) (id string, ok bool)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type authenticatorGroup struct {
 | 
					type authenticatorGroup struct {
 | 
				
			||||||
@ -17,7 +21,7 @@ func AuthenticatorGroup(authers ...Authenticator) Authenticator {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *authenticatorGroup) Authenticate(ctx context.Context, user, password string) (string, bool) {
 | 
					func (p *authenticatorGroup) Authenticate(ctx context.Context, user, password string, opts ...Option) (string, bool) {
 | 
				
			||||||
	if len(p.authers) == 0 {
 | 
						if len(p.authers) == 0 {
 | 
				
			||||||
		return "", false
 | 
							return "", false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -26,7 +30,7 @@ func (p *authenticatorGroup) Authenticate(ctx context.Context, user, password st
 | 
				
			|||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if id, ok := auther.Authenticate(ctx, user, password); ok {
 | 
							if id, ok := auther.Authenticate(ctx, user, password, opts...); ok {
 | 
				
			||||||
			return id, ok
 | 
								return id, ok
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ import "context"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type Options struct {
 | 
					type Options struct {
 | 
				
			||||||
	Host string
 | 
						Host string
 | 
				
			||||||
 | 
						Path string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Option func(opts *Options)
 | 
					type Option func(opts *Options)
 | 
				
			||||||
@ -14,6 +15,12 @@ func WithHostOpton(host string) Option {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func WithPathOption(path string) Option {
 | 
				
			||||||
 | 
						return func(opts *Options) {
 | 
				
			||||||
 | 
							opts.Path = path
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bypass is a filter of address (IP or domain).
 | 
					// Bypass is a filter of address (IP or domain).
 | 
				
			||||||
type Bypass interface {
 | 
					type Bypass interface {
 | 
				
			||||||
	// Contains reports whether the bypass includes addr.
 | 
						// Contains reports whether the bypass includes addr.
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@ type HTTPNodeSettings struct {
 | 
				
			|||||||
type TLSNodeSettings struct {
 | 
					type TLSNodeSettings struct {
 | 
				
			||||||
	ServerName string
 | 
						ServerName string
 | 
				
			||||||
	Secure     bool
 | 
						Secure     bool
 | 
				
			||||||
 | 
						Options    struct {
 | 
				
			||||||
 | 
							MinVersion   string
 | 
				
			||||||
 | 
							MaxVersion   string
 | 
				
			||||||
 | 
							CipherSuites []string
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type NodeOptions struct {
 | 
					type NodeOptions struct {
 | 
				
			||||||
@ -26,7 +31,9 @@ type NodeOptions struct {
 | 
				
			|||||||
	HostMapper hosts.HostMapper
 | 
						HostMapper hosts.HostMapper
 | 
				
			||||||
	Metadata   metadata.Metadata
 | 
						Metadata   metadata.Metadata
 | 
				
			||||||
	Host       string
 | 
						Host       string
 | 
				
			||||||
 | 
						Network    string
 | 
				
			||||||
	Protocol   string
 | 
						Protocol   string
 | 
				
			||||||
 | 
						Path       string
 | 
				
			||||||
	HTTP       *HTTPNodeSettings
 | 
						HTTP       *HTTPNodeSettings
 | 
				
			||||||
	TLS        *TLSNodeSettings
 | 
						TLS        *TLSNodeSettings
 | 
				
			||||||
	Auther     auth.Authenticator
 | 
						Auther     auth.Authenticator
 | 
				
			||||||
@ -64,12 +71,24 @@ func HostNodeOption(host string) NodeOption {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NetworkNodeOption(network string) NodeOption {
 | 
				
			||||||
 | 
						return func(o *NodeOptions) {
 | 
				
			||||||
 | 
							o.Network = network
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ProtocolNodeOption(protocol string) NodeOption {
 | 
					func ProtocolNodeOption(protocol string) NodeOption {
 | 
				
			||||||
	return func(o *NodeOptions) {
 | 
						return func(o *NodeOptions) {
 | 
				
			||||||
		o.Protocol = protocol
 | 
							o.Protocol = protocol
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func PathNodeOption(path string) NodeOption {
 | 
				
			||||||
 | 
						return func(o *NodeOptions) {
 | 
				
			||||||
 | 
							o.Path = path
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func MetadataNodeOption(md metadata.Metadata) NodeOption {
 | 
					func MetadataNodeOption(md metadata.Metadata) NodeOption {
 | 
				
			||||||
	return func(o *NodeOptions) {
 | 
						return func(o *NodeOptions) {
 | 
				
			||||||
		o.Metadata = md
 | 
							o.Metadata = md
 | 
				
			||||||
 | 
				
			|||||||
@ -14,7 +14,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 128)
 | 
										b := make([]byte, 128)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -23,7 +23,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 512)
 | 
										b := make([]byte, 512)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -32,7 +32,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 1024)
 | 
										b := make([]byte, 1024)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -41,7 +41,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 2048)
 | 
										b := make([]byte, 2048)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -50,7 +50,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 4096)
 | 
										b := make([]byte, 4096)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -59,7 +59,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 8192)
 | 
										b := make([]byte, 8192)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -68,7 +68,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 16*1024)
 | 
										b := make([]byte, 16*1024)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -77,7 +77,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 32*1024)
 | 
										b := make([]byte, 32*1024)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -86,7 +86,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 64*1024)
 | 
										b := make([]byte, 64*1024)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -95,7 +95,7 @@ var (
 | 
				
			|||||||
			pool: sync.Pool{
 | 
								pool: sync.Pool{
 | 
				
			||||||
				New: func() any {
 | 
									New: func() any {
 | 
				
			||||||
					b := make([]byte, 65*1024)
 | 
										b := make([]byte, 65*1024)
 | 
				
			||||||
					return &b
 | 
										return b
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -103,21 +103,20 @@ var (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get returns a buffer of specified size.
 | 
					// Get returns a buffer of specified size.
 | 
				
			||||||
func Get(size int) *[]byte {
 | 
					func Get(size int) []byte {
 | 
				
			||||||
	for i := range pools {
 | 
						for i := range pools {
 | 
				
			||||||
		if size <= pools[i].size {
 | 
							if size <= pools[i].size {
 | 
				
			||||||
			b := pools[i].pool.Get().(*[]byte)
 | 
								b := pools[i].pool.Get().([]byte)
 | 
				
			||||||
			*b = (*b)[:size]
 | 
								return b[:size]
 | 
				
			||||||
			return b
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	b := make([]byte, size)
 | 
						b := make([]byte, size)
 | 
				
			||||||
	return &b
 | 
						return b
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Put(b *[]byte) {
 | 
					func Put(b []byte) {
 | 
				
			||||||
	for i := range pools {
 | 
						for i := range pools {
 | 
				
			||||||
		if cap(*b) == pools[i].size {
 | 
							if cap(b) == pools[i].size {
 | 
				
			||||||
			pools[i].pool.Put(b)
 | 
								pools[i].pool.Put(b)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,13 @@ func (d *NetDialer) Dial(ctx context.Context, network, addr string) (conn net.Co
 | 
				
			|||||||
		log = logger.Default()
 | 
							log = logger.Default()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch network {
 | 
				
			||||||
 | 
						case "unix":
 | 
				
			||||||
 | 
							netd := net.Dialer{}
 | 
				
			||||||
 | 
							return netd.DialContext(ctx, network, addr)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deadline := time.Now().Add(timeout)
 | 
						deadline := time.Now().Add(timeout)
 | 
				
			||||||
	ifces := strings.Split(d.Interface, ",")
 | 
						ifces := strings.Split(d.Interface, ",")
 | 
				
			||||||
	for _, ifce := range ifces {
 | 
						for _, ifce := range ifces {
 | 
				
			||||||
 | 
				
			|||||||
@ -37,7 +37,7 @@ func (c *conn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
 | 
				
			|||||||
	case bb := <-c.rc:
 | 
						case bb := <-c.rc:
 | 
				
			||||||
		n = copy(b, bb)
 | 
							n = copy(b, bb)
 | 
				
			||||||
		c.SetIdle(false)
 | 
							c.SetIdle(false)
 | 
				
			||||||
		bufpool.Put(&bb)
 | 
							bufpool.Put(bb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case <-c.closed:
 | 
						case <-c.closed:
 | 
				
			||||||
		err = net.ErrClosed
 | 
							err = net.ErrClosed
 | 
				
			||||||
 | 
				
			|||||||
@ -35,11 +35,13 @@ func NewListener(conn net.PacketConn, cfg *ListenConfig) net.Listener {
 | 
				
			|||||||
	ln := &listener{
 | 
						ln := &listener{
 | 
				
			||||||
		conn:    conn,
 | 
							conn:    conn,
 | 
				
			||||||
		cqueue:  make(chan net.Conn, cfg.Backlog),
 | 
							cqueue:  make(chan net.Conn, cfg.Backlog),
 | 
				
			||||||
		connPool: newConnPool(cfg.TTL).WithLogger(cfg.Logger),
 | 
					 | 
				
			||||||
		closed:  make(chan struct{}),
 | 
							closed:  make(chan struct{}),
 | 
				
			||||||
		errChan: make(chan error, 1),
 | 
							errChan: make(chan error, 1),
 | 
				
			||||||
		config:  cfg,
 | 
							config:  cfg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if cfg.KeepAlive {
 | 
				
			||||||
 | 
							ln.connPool = newConnPool(cfg.TTL).WithLogger(cfg.Logger)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	go ln.listenLoop()
 | 
						go ln.listenLoop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ln
 | 
						return ln
 | 
				
			||||||
@ -69,7 +71,7 @@ func (ln *listener) listenLoop() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		b := bufpool.Get(ln.config.ReadBufferSize)
 | 
							b := bufpool.Get(ln.config.ReadBufferSize)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		n, raddr, err := ln.conn.ReadFrom(*b)
 | 
							n, raddr, err := ln.conn.ReadFrom(b)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			ln.errChan <- err
 | 
								ln.errChan <- err
 | 
				
			||||||
			close(ln.errChan)
 | 
								close(ln.errChan)
 | 
				
			||||||
@ -82,7 +84,7 @@ func (ln *listener) listenLoop() {
 | 
				
			|||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := c.WriteQueue((*b)[:n]); err != nil {
 | 
							if err := c.WriteQueue(b[:n]); err != nil {
 | 
				
			||||||
			ln.config.Logger.Warn("data discarded: ", err)
 | 
								ln.config.Logger.Warn("data discarded: ", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -29,6 +29,10 @@ func (p *connPool) WithLogger(logger logger.Logger) *connPool {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *connPool) Get(key any) (c *conn, ok bool) {
 | 
					func (p *connPool) Get(key any) (c *conn, ok bool) {
 | 
				
			||||||
 | 
						if p == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	v, ok := p.m.Load(key)
 | 
						v, ok := p.m.Load(key)
 | 
				
			||||||
	if ok {
 | 
						if ok {
 | 
				
			||||||
		c, ok = v.(*conn)
 | 
							c, ok = v.(*conn)
 | 
				
			||||||
@ -37,14 +41,25 @@ func (p *connPool) Get(key any) (c *conn, ok bool) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *connPool) Set(key any, c *conn) {
 | 
					func (p *connPool) Set(key any, c *conn) {
 | 
				
			||||||
 | 
						if p == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p.m.Store(key, c)
 | 
						p.m.Store(key, c)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *connPool) Delete(key any) {
 | 
					func (p *connPool) Delete(key any) {
 | 
				
			||||||
 | 
						if p == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	p.m.Delete(key)
 | 
						p.m.Delete(key)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (p *connPool) Close() {
 | 
					func (p *connPool) Close() {
 | 
				
			||||||
 | 
						if p == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	select {
 | 
						select {
 | 
				
			||||||
	case <-p.closed:
 | 
						case <-p.closed:
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										13
									
								
								hop/hop.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								hop/hop.go
									
									
									
									
									
								
							@ -9,8 +9,9 @@ import (
 | 
				
			|||||||
type SelectOptions struct {
 | 
					type SelectOptions struct {
 | 
				
			||||||
	Network  string
 | 
						Network  string
 | 
				
			||||||
	Addr     string
 | 
						Addr     string
 | 
				
			||||||
	Host     string
 | 
					 | 
				
			||||||
	Protocol string
 | 
						Protocol string
 | 
				
			||||||
 | 
						Host     string
 | 
				
			||||||
 | 
						Path     string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type SelectOption func(*SelectOptions)
 | 
					type SelectOption func(*SelectOptions)
 | 
				
			||||||
@ -27,15 +28,21 @@ func AddrSelectOption(addr string) SelectOption {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ProtocolSelectOption(protocol string) SelectOption {
 | 
				
			||||||
 | 
						return func(o *SelectOptions) {
 | 
				
			||||||
 | 
							o.Protocol = protocol
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func HostSelectOption(host string) SelectOption {
 | 
					func HostSelectOption(host string) SelectOption {
 | 
				
			||||||
	return func(o *SelectOptions) {
 | 
						return func(o *SelectOptions) {
 | 
				
			||||||
		o.Host = host
 | 
							o.Host = host
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ProtocolSelectOption(protocol string) SelectOption {
 | 
					func PathSelectOption(path string) SelectOption {
 | 
				
			||||||
	return func(o *SelectOptions) {
 | 
						return func(o *SelectOptions) {
 | 
				
			||||||
		o.Protocol = protocol
 | 
							o.Path = path
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,11 @@ import (
 | 
				
			|||||||
	"net"
 | 
						"net"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Options struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Option func(opts *Options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HostMapper is a mapping from hostname to IP.
 | 
					// HostMapper is a mapping from hostname to IP.
 | 
				
			||||||
type HostMapper interface {
 | 
					type HostMapper interface {
 | 
				
			||||||
	Lookup(ctx context.Context, network, host string) ([]net.IP, bool)
 | 
						Lookup(ctx context.Context, network, host string, opts ...Option) ([]net.IP, bool)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,15 @@ package ingress
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import "context"
 | 
					import "context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetOptions struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetOption func(opts *GetOptions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SetOptions struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SetOption func(opts *SetOptions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Ingress interface {
 | 
					type Ingress interface {
 | 
				
			||||||
	Get(ctx context.Context, host string) string
 | 
						Get(ctx context.Context, host string, opts ...GetOption) string
 | 
				
			||||||
 | 
						Set(ctx context.Context, host, endpoint string, opts ...SetOption)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,8 +4,20 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RecordOptions struct {
 | 
				
			||||||
 | 
						Metadata any
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RecordOption func(opts *RecordOptions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func MetadataReocrdOption(md any) RecordOption {
 | 
				
			||||||
 | 
						return func(opts *RecordOptions) {
 | 
				
			||||||
 | 
							opts.Metadata = md
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Recorder interface {
 | 
					type Recorder interface {
 | 
				
			||||||
	Record(ctx context.Context, b []byte) error
 | 
						Record(ctx context.Context, b []byte, opts ...RecordOption) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RecorderObject struct {
 | 
					type RecorderObject struct {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,8 +10,12 @@ var (
 | 
				
			|||||||
	ErrInvalid = errors.New("invalid resolver")
 | 
						ErrInvalid = errors.New("invalid resolver")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Options struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Option func(opts *Options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Resolver interface {
 | 
					type Resolver interface {
 | 
				
			||||||
	// Resolve returns a slice of the host's IPv4 and IPv6 addresses.
 | 
						// Resolve returns a slice of the host's IPv4 and IPv6 addresses.
 | 
				
			||||||
	// The network should be 'ip', 'ip4' or 'ip6', default network is 'ip'.
 | 
						// The network should be 'ip', 'ip4' or 'ip6', default network is 'ip'.
 | 
				
			||||||
	Resolve(ctx context.Context, network, host string) ([]net.IP, error)
 | 
						Resolve(ctx context.Context, network, host string, opts ...Option) ([]net.IP, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										25
									
								
								sd/sd.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								sd/sd.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					package sd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Options struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Option func(opts *Options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Service struct {
 | 
				
			||||||
 | 
						ID      string
 | 
				
			||||||
 | 
						Name    string
 | 
				
			||||||
 | 
						Node    string
 | 
				
			||||||
 | 
						Network string
 | 
				
			||||||
 | 
						Address string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SD is the service discovery interface.
 | 
				
			||||||
 | 
					type SD interface {
 | 
				
			||||||
 | 
						Register(ctx context.Context, service *Service, opts ...Option) error
 | 
				
			||||||
 | 
						Deregister(ctx context.Context, service *Service) error
 | 
				
			||||||
 | 
						Renew(ctx context.Context, service *Service) error
 | 
				
			||||||
 | 
						Get(ctx context.Context, name string) ([]*Service, error)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user