| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- package assembly
- import (
- "context"
- gonet "net"
- "time"
- "github.com/v2fly/v2ray-core/v5/transport/internet/transportcommon"
- "github.com/v2fly/v2ray-core/v5/common"
- "github.com/v2fly/v2ray-core/v5/common/net"
- "github.com/v2fly/v2ray-core/v5/common/serial"
- "github.com/v2fly/v2ray-core/v5/transport/internet"
- "github.com/v2fly/v2ray-core/v5/transport/internet/request"
- )
- type server struct {
- tripper request.RoundTripperServer
- assembler request.SessionAssemblerServer
- addConn internet.ConnHandler
- streamSettings *internet.MemoryStreamConfig
- addr net.Address
- port net.Port
- }
- func (s server) Listen(ctx context.Context) (net.Listener, error) {
- return transportcommon.ListenWithSecuritySettings(ctx, s.addr, s.port, s.streamSettings)
- }
- func (s server) AutoImplListener() request.Listener {
- return s
- }
- func (s server) Close() error {
- if err := s.tripper.Close(); err != nil {
- return newError("failed to close tripper").Base(err)
- }
- return nil
- }
- func (s server) Addr() net.Addr {
- // Unimplemented
- return nil
- }
- type serverConnection struct {
- request.Session
- }
- func (s serverConnection) LocalAddr() gonet.Addr {
- return &net.UnixAddr{Name: "unimplemented"}
- }
- func (s serverConnection) RemoteAddr() gonet.Addr {
- return &net.UnixAddr{Name: "unimplemented"}
- }
- func (s serverConnection) SetDeadline(t time.Time) error {
- // Unimplemented
- return nil
- }
- func (s serverConnection) SetReadDeadline(t time.Time) error {
- // Unimplemented
- return nil
- }
- func (s serverConnection) SetWriteDeadline(t time.Time) error {
- // Unimplemented
- return nil
- }
- func (s server) OnNewSession(ctx context.Context, sess request.Session, opts ...request.SessionOption) error {
- s.addConn(&serverConnection{sess})
- return nil
- }
- func (s server) SessionReceiver() request.SessionReceiver {
- return s
- }
- func (s server) TripperReceiver() request.TripperReceiver {
- return s.assembler
- }
- func listenRequest(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (internet.Listener, error) {
- transportConfiguration := streamSettings.ProtocolSettings.(*Config)
- serverAssembly := &server{addConn: addConn}
- assemblerConfigInstance, err := serial.GetInstanceOf(transportConfiguration.Assembler)
- if err != nil {
- return nil, newError("failed to get config instance of assembler").Base(err)
- }
- assembler, err := common.CreateObject(ctx, assemblerConfigInstance)
- if err != nil {
- return nil, newError("failed to create assembler").Base(err)
- }
- if typedAssembler, ok := assembler.(request.SessionAssemblerServer); !ok {
- return nil, newError("failed to type assert assembler to SessionAssemblerServer")
- } else {
- serverAssembly.assembler = typedAssembler
- }
- roundtripperConfigInstance, err := serial.GetInstanceOf(transportConfiguration.Roundtripper)
- if err != nil {
- return nil, newError("failed to get config instance of roundtripper").Base(err)
- }
- roundtripper, err := common.CreateObject(ctx, roundtripperConfigInstance)
- if err != nil {
- return nil, newError("failed to create roundtripper").Base(err)
- }
- if typedRoundtripper, ok := roundtripper.(request.RoundTripperServer); !ok {
- return nil, newError("failed to type assert roundtripper to RoundTripperServer")
- } else {
- serverAssembly.tripper = typedRoundtripper
- }
- serverAssembly.addr = address
- serverAssembly.port = port
- serverAssembly.streamSettings = streamSettings
- serverAssembly.assembler.OnTransportServerAssemblyReady(serverAssembly)
- serverAssembly.tripper.OnTransportServerAssemblyReady(serverAssembly)
- if err := serverAssembly.tripper.Start(); err != nil {
- return nil, newError("failed to start tripper").Base(err)
- }
- return serverAssembly, nil
- }
- func init() {
- common.Must(internet.RegisterTransportListener(protocolName, listenRequest))
- }
|