|  | @@ -5,9 +5,11 @@ import (
 | 
											
												
													
														|  |  	"sync"
 |  |  	"sync"
 | 
											
												
													
														|  |  	"time"
 |  |  	"time"
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +	"v2ray.com/core/app"
 | 
											
												
													
														|  |  	"v2ray.com/core/app/dispatcher"
 |  |  	"v2ray.com/core/app/dispatcher"
 | 
											
												
													
														|  |  	"v2ray.com/core/app/log"
 |  |  	"v2ray.com/core/app/log"
 | 
											
												
													
														|  |  	"v2ray.com/core/common/buf"
 |  |  	"v2ray.com/core/common/buf"
 | 
											
												
													
														|  | 
 |  | +	"v2ray.com/core/common/errors"
 | 
											
												
													
														|  |  	"v2ray.com/core/common/net"
 |  |  	"v2ray.com/core/common/net"
 | 
											
												
													
														|  |  	"v2ray.com/core/common/signal"
 |  |  	"v2ray.com/core/common/signal"
 | 
											
												
													
														|  |  	"v2ray.com/core/proxy"
 |  |  	"v2ray.com/core/proxy"
 | 
											
										
											
												
													
														|  | @@ -194,13 +196,32 @@ type Server struct {
 | 
											
												
													
														|  |  	dispatcher dispatcher.Interface
 |  |  	dispatcher dispatcher.Interface
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +func NewServer(ctx context.Context) *Server {
 | 
											
												
													
														|  | 
 |  | +	s := &Server{}
 | 
											
												
													
														|  | 
 |  | +	space := app.SpaceFromContext(ctx)
 | 
											
												
													
														|  | 
 |  | +	space.OnInitialize(func() error {
 | 
											
												
													
														|  | 
 |  | +		d := dispatcher.FromSpace(space)
 | 
											
												
													
														|  | 
 |  | +		if d == nil {
 | 
											
												
													
														|  | 
 |  | +			return errors.New("Proxyman|Mux: No dispatcher in space.")
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +		s.dispatcher = d
 | 
											
												
													
														|  | 
 |  | +		return nil
 | 
											
												
													
														|  | 
 |  | +	})
 | 
											
												
													
														|  | 
 |  | +	return s
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  func (s *Server) Dispatch(ctx context.Context, dest net.Destination) (ray.InboundRay, error) {
 |  |  func (s *Server) Dispatch(ctx context.Context, dest net.Destination) (ray.InboundRay, error) {
 | 
											
												
													
														|  |  	if dest != muxCoolDestination {
 |  |  	if dest != muxCoolDestination {
 | 
											
												
													
														|  |  		return s.dispatcher.Dispatch(ctx, dest)
 |  |  		return s.dispatcher.Dispatch(ctx, dest)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	ray := ray.NewRay(ctx)
 |  |  	ray := ray.NewRay(ctx)
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | 
 |  | +	worker := &ServerWorker{
 | 
											
												
													
														|  | 
 |  | +		dispatcher:  s.dispatcher,
 | 
											
												
													
														|  | 
 |  | +		outboundRay: ray,
 | 
											
												
													
														|  | 
 |  | +		sessions:    make(map[uint16]*session),
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	go worker.run(ctx)
 | 
											
												
													
														|  |  	return ray, nil
 |  |  	return ray, nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 |