@ -60,6 +60,52 @@ type Instance struct {
running bool
}
func addInboundHandlers ( server * Instance , configs [ ] * InboundHandlerConfig ) error {
if len ( configs ) == 0 {
return nil
}
inboundManager := server . GetFeature ( inbound . ManagerType ( ) ) . ( inbound . Manager )
for _ , inboundConfig := range configs {
rawHandler , err := CreateObject ( server , inboundConfig )
if err != nil {
return err
}
handler , ok := rawHandler . ( inbound . Handler )
if ! ok {
return newError ( "not an InboundHandler" )
}
if err := inboundManager . AddHandler ( context . Background ( ) , handler ) ; err != nil {
return err
}
}
return nil
}
func addOutboundHandlers ( server * Instance , configs [ ] * OutboundHandlerConfig ) error {
if len ( configs ) == 0 {
return nil
}
outboundManager := server . GetFeature ( outbound . ManagerType ( ) ) . ( outbound . Manager )
for _ , outboundConfig := range configs {
rawHandler , err := CreateObject ( server , outboundConfig )
if err != nil {
return err
}
handler , ok := rawHandler . ( outbound . Handler )
if ! ok {
return newError ( "not an OutboundHandler" )
}
if err := outboundManager . AddHandler ( context . Background ( ) , handler ) ; err != nil {
return err
}
}
return nil
}
// New returns a new V2Ray instance based on given configuration.
// The instance is not started at this point.
// To ensure V2Ray instance works properly, the config must contain one Dispatcher, one InboundHandlerManager and one OutboundHandlerManager. Other features are optional.
@ -106,39 +152,13 @@ func New(config *Config) (*Instance, error) {
return nil , newError ( "not all dependency are resolved." )
}
if len ( config . Inbound ) > 0 {
inboundManager := server . GetFeature ( inbound . ManagerType ( ) ) . ( inbound . Manager )
for _ , inboundConfig := range config . Inbound {
rawHandler , err := CreateObject ( server , inboundConfig )
if err != nil {
return nil , err
}
handler , ok := rawHandler . ( inbound . Handler )
if ! ok {
return nil , newError ( "not an InboundHandler" )
}
if err := inboundManager . AddHandler ( context . Background ( ) , handler ) ; err != nil {
if err := addInboundHandlers ( server , config . Inbound ) ; err != nil {
return nil , err
}
}
}
if len ( config . Outbound ) > 0 {
outboundManager := server . GetFeature ( outbound . ManagerType ( ) ) . ( outbound . Manager )
for _ , outboundConfig := range config . Outbound {
rawHandler , err := CreateObject ( server , outboundConfig )
if err != nil {
if err := addOutboundHandlers ( server , config . Outbound ) ; err != nil {
return nil , err
}
handler , ok := rawHandler . ( outbound . Handler )
if ! ok {
return nil , newError ( "not an OutboundHandler" )
}
if err := outboundManager . AddHandler ( context . Background ( ) , handler ) ; err != nil {
return nil , err
}
}
}
return server , nil
}