| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | package coreimport (	"fmt"	v2net "github.com/v2ray/v2ray-core/net")// VPoint is an single server in V2Ray system.type VPoint struct {	Config     VConfig	UserSet    *VUserSet	ichFactory InboundConnectionHandlerFactory	ochFactory OutboundConnectionHandlerFactory}// NewVPoint returns a new VPoint server based on given configuration.// The server is not started at this point.func NewVPoint(config *VConfig, ichFactory InboundConnectionHandlerFactory, ochFactory OutboundConnectionHandlerFactory) (*VPoint, error) {	var vpoint = new(VPoint)	vpoint.Config = *config	vpoint.UserSet = NewVUserSet()	for _, user := range vpoint.Config.AllowedClients {		vpoint.UserSet.AddUser(user)	}	vpoint.ichFactory = ichFactory	vpoint.ochFactory = ochFactory	return vpoint, nil}type InboundConnectionHandlerFactory interface {	Create(vPoint *VPoint) (InboundConnectionHandler, error)}type InboundConnectionHandler interface {	Listen(port uint16) error}type OutboundConnectionHandlerFactory interface {	Create(vPoint *VPoint, dest v2net.VAddress) (OutboundConnectionHandler, error)}type OutboundConnectionHandler interface {	Start(vray OutboundVRay) error}// Start starts the VPoint server, and return any error during the process.// In the case of any errors, the state of the server is unpredicatable.func (vp *VPoint) Start() error {	if vp.Config.Port <= 0 {		return fmt.Errorf("Invalid port %d", vp.Config.Port)	}	inboundConnectionHandler, err := vp.ichFactory.Create(vp)	if err != nil {		return err	}	err = inboundConnectionHandler.Listen(vp.Config.Port)	return nil}func (vp *VPoint) NewInboundConnectionAccepted(destination v2net.VAddress) InboundVRay {	ray := NewVRay()	// TODO: handle error	och, _ := vp.ochFactory.Create(vp, destination)	_ = och.Start(ray)	return ray}
 |