71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
|
package libp2p
|
||
|
|
||
|
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,
|
||
|
}
|
||
|
}
|