| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package core
- import (
- "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
- }
|