71 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package lp2p
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"sort"
 | 
						|
 | 
						|
	routing "github.com/libp2p/go-libp2p-core/routing"
 | 
						|
	dht "github.com/libp2p/go-libp2p-kad-dht"
 | 
						|
	record "github.com/libp2p/go-libp2p-record"
 | 
						|
	routinghelpers "github.com/libp2p/go-libp2p-routing-helpers"
 | 
						|
	"go.uber.org/fx"
 | 
						|
)
 | 
						|
 | 
						|
type BaseIpfsRouting routing.Routing
 | 
						|
 | 
						|
type Router struct {
 | 
						|
	routing.Routing
 | 
						|
 | 
						|
	Priority int // less = more important
 | 
						|
}
 | 
						|
 | 
						|
type p2pRouterOut struct {
 | 
						|
	fx.Out
 | 
						|
 | 
						|
	Router Router `group:"routers"`
 | 
						|
}
 | 
						|
 | 
						|
func BaseRouting(lc fx.Lifecycle, in BaseIpfsRouting) (out p2pRouterOut, dr *dht.IpfsDHT) {
 | 
						|
	if dht, ok := in.(*dht.IpfsDHT); ok {
 | 
						|
		dr = dht
 | 
						|
 | 
						|
		lc.Append(fx.Hook{
 | 
						|
			OnStop: func(ctx context.Context) error {
 | 
						|
				return dr.Close()
 | 
						|
			},
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	return p2pRouterOut{
 | 
						|
		Router: Router{
 | 
						|
			Priority: 1000,
 | 
						|
			Routing:  in,
 | 
						|
		},
 | 
						|
	}, dr
 | 
						|
}
 | 
						|
 | 
						|
type p2pOnlineRoutingIn struct {
 | 
						|
	fx.In
 | 
						|
 | 
						|
	Routers   []Router `group:"routers"`
 | 
						|
	Validator record.Validator
 | 
						|
}
 | 
						|
 | 
						|
func Routing(in p2pOnlineRoutingIn) routing.Routing {
 | 
						|
	routers := in.Routers
 | 
						|
 | 
						|
	sort.SliceStable(routers, func(i, j int) bool {
 | 
						|
		return routers[i].Priority < routers[j].Priority
 | 
						|
	})
 | 
						|
 | 
						|
	irouters := make([]routing.Routing, len(routers))
 | 
						|
	for i, v := range routers {
 | 
						|
		irouters[i] = v.Routing
 | 
						|
	}
 | 
						|
 | 
						|
	return routinghelpers.Tiered{
 | 
						|
		Routers:   irouters,
 | 
						|
		Validator: in.Validator,
 | 
						|
	}
 | 
						|
}
 |