mirror of
				https://github.com/v2fly/v2ray-core.git
				synced 2025-10-29 16:59:28 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			54 lines
		
	
	
		
			773 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			773 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package router
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"sync"
 | |
| )
 | |
| 
 | |
| type Router interface {
 | |
| 	Pick(ctx context.Context) (string, bool)
 | |
| }
 | |
| 
 | |
| type defaultRouter byte
 | |
| 
 | |
| func (defaultRouter) Pick(ctx context.Context) (string, bool) {
 | |
| 	return "", false
 | |
| }
 | |
| 
 | |
| type syncRouter struct {
 | |
| 	sync.RWMutex
 | |
| 	Router
 | |
| }
 | |
| 
 | |
| func (r *syncRouter) Pick(ctx context.Context) (string, bool) {
 | |
| 	r.RLock()
 | |
| 	defer r.RUnlock()
 | |
| 
 | |
| 	return r.Router.Pick(ctx)
 | |
| }
 | |
| 
 | |
| func (r *syncRouter) Set(router Router) {
 | |
| 	r.Lock()
 | |
| 	defer r.Unlock()
 | |
| 
 | |
| 	r.Router = router
 | |
| }
 | |
| 
 | |
| var (
 | |
| 	routerInstance = &syncRouter{
 | |
| 		Router: defaultRouter(0),
 | |
| 	}
 | |
| )
 | |
| 
 | |
| func RegisterRouter(router Router) {
 | |
| 	if router == nil {
 | |
| 		panic("Router is nil.")
 | |
| 	}
 | |
| 
 | |
| 	routerInstance.Set(router)
 | |
| }
 | |
| 
 | |
| func Pick(ctx context.Context) (string, bool) {
 | |
| 	return routerInstance.Router.Pick(ctx)
 | |
| }
 | 
