| 
									
										
										
										
											2019-02-01 20:08:21 +01:00
										 |  |  | // +build !confonly | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-31 11:55:11 +02:00
										 |  |  | package core | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-11-17 22:45:07 +01:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2018-05-31 11:55:11 +02:00
										 |  |  | 	"context" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-17 04:31:50 +08:00
										 |  |  | 	"github.com/v2fly/v2ray-core/v4/common" | 
					
						
							|  |  |  | 	"github.com/v2fly/v2ray-core/v4/common/net" | 
					
						
							|  |  |  | 	"github.com/v2fly/v2ray-core/v4/features/routing" | 
					
						
							|  |  |  | 	"github.com/v2fly/v2ray-core/v4/transport/internet/udp" | 
					
						
							| 
									
										
										
										
											2018-05-31 11:55:11 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // CreateObject creates a new object based on the given V2Ray instance and config. The V2Ray instance may be nil. | 
					
						
							|  |  |  | func CreateObject(v *Instance, config interface{}) (interface{}, error) { | 
					
						
							| 
									
										
										
										
											2020-11-22 05:05:01 +08:00
										 |  |  | 	var ctx context.Context | 
					
						
							| 
									
										
										
										
											2018-05-31 11:55:11 +02:00
										 |  |  | 	if v != nil { | 
					
						
							| 
									
										
										
										
											2021-04-05 18:13:24 +01:00
										 |  |  | 		ctx = toContext(v.ctx, v) | 
					
						
							| 
									
										
										
										
											2018-05-31 11:55:11 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return common.CreateObject(ctx, config) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-21 16:54:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 23:36:38 +02:00
										 |  |  | // StartInstance starts a new V2Ray instance with given serialized config. | 
					
						
							| 
									
										
										
										
											2018-10-16 14:23:10 +02:00
										 |  |  | // By default V2Ray only support config in protobuf format, i.e., configFormat = "protobuf". Caller need to load other packages to add JSON support. | 
					
						
							| 
									
										
										
										
											2018-12-03 22:44:42 +01:00
										 |  |  | // | 
					
						
							|  |  |  | // v2ray:api:stable | 
					
						
							| 
									
										
										
										
											2018-10-11 23:36:38 +02:00
										 |  |  | func StartInstance(configFormat string, configBytes []byte) (*Instance, error) { | 
					
						
							| 
									
										
										
										
											2018-11-17 22:45:07 +01:00
										 |  |  | 	config, err := LoadConfig(configFormat, "", bytes.NewReader(configBytes)) | 
					
						
							| 
									
										
										
										
											2018-10-11 22:48:57 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	instance, err := New(config) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := instance.Start(); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return instance, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-10-13 15:21:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Dial provides an easy way for upstream caller to create net.Conn through V2Ray. | 
					
						
							|  |  |  | // It dispatches the request to the given destination by the given V2Ray instance. | 
					
						
							|  |  |  | // Since it is under a proxy context, the LocalAddr() and RemoteAddr() in returned net.Conn | 
					
						
							|  |  |  | // will not show real addresses being used for communication. | 
					
						
							| 
									
										
										
										
											2018-12-03 22:44:42 +01:00
										 |  |  | // | 
					
						
							|  |  |  | // v2ray:api:stable | 
					
						
							| 
									
										
										
										
											2018-10-13 15:21:52 +02:00
										 |  |  | func Dial(ctx context.Context, v *Instance, dest net.Destination) (net.Conn, error) { | 
					
						
							| 
									
										
										
										
											2021-04-05 18:13:24 +01:00
										 |  |  | 	ctx = toContext(ctx, v) | 
					
						
							| 
									
										
										
										
											2021-04-02 20:11:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-21 10:27:13 +02:00
										 |  |  | 	dispatcher := v.GetFeature(routing.DispatcherType()) | 
					
						
							|  |  |  | 	if dispatcher == nil { | 
					
						
							|  |  |  | 		return nil, newError("routing.Dispatcher is not registered in V2Ray core") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-04-02 12:16:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-21 10:27:13 +02:00
										 |  |  | 	r, err := dispatcher.(routing.Dispatcher).Dispatch(ctx, dest) | 
					
						
							| 
									
										
										
										
											2018-10-13 15:21:52 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-06 00:34:38 +01:00
										 |  |  | 	var readerOpt net.ConnectionOption | 
					
						
							|  |  |  | 	if dest.Network == net.Network_TCP { | 
					
						
							|  |  |  | 		readerOpt = net.ConnectionOutputMulti(r.Reader) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		readerOpt = net.ConnectionOutputMultiUDP(r.Reader) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return net.NewConnection(net.ConnectionInputMulti(r.Writer), readerOpt), nil | 
					
						
							| 
									
										
										
										
											2018-10-13 15:21:52 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-01-05 21:43:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // DialUDP provides a way to exchange UDP packets through V2Ray instance to remote servers. | 
					
						
							|  |  |  | // Since it is under a proxy context, the LocalAddr() in returned PacketConn will not show the real address. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // TODO: SetDeadline() / SetReadDeadline() / SetWriteDeadline() are not implemented. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // v2ray:api:beta | 
					
						
							|  |  |  | func DialUDP(ctx context.Context, v *Instance) (net.PacketConn, error) { | 
					
						
							| 
									
										
										
										
											2021-04-05 18:13:24 +01:00
										 |  |  | 	ctx = toContext(ctx, v) | 
					
						
							| 
									
										
										
										
											2021-04-02 20:11:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-05 21:43:22 +01:00
										 |  |  | 	dispatcher := v.GetFeature(routing.DispatcherType()) | 
					
						
							|  |  |  | 	if dispatcher == nil { | 
					
						
							|  |  |  | 		return nil, newError("routing.Dispatcher is not registered in V2Ray core") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return udp.DialDispatcher(ctx, dispatcher.(routing.Dispatcher)) | 
					
						
							|  |  |  | } |