2019-07-02 12:40:25 +00:00
|
|
|
package lp2p
|
2019-07-01 09:09:48 +00:00
|
|
|
|
|
|
|
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,
|
|
|
|
}
|
|
|
|
}
|