Skip to content

Commit 19ff307

Browse files
committed
feat: contentrouter implements routing.PeerRouting
1 parent 5ba8de1 commit 19ff307

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

routing/http/contentrouter/contentrouter.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ var logger = logging.Logger("routing/http/contentrouter")
1919

2020
type Client interface {
2121
GetProviders(ctx context.Context, key cid.Cid) (iter.ResultIter[types.Record], error)
22+
GetPeers(ctx context.Context, pid peer.ID) (peers iter.ResultIter[types.Record], err error)
2223
}
2324

2425
type contentRouter struct {
2526
client Client
2627
}
2728

2829
var _ routing.ContentRouting = (*contentRouter)(nil)
30+
var _ routing.PeerRouting = (*contentRouter)(nil)
2931
var _ routinghelpers.ProvideManyRouter = (*contentRouter)(nil)
3032
var _ routinghelpers.ReadyAbleRouter = (*contentRouter)(nil)
3133

@@ -101,3 +103,43 @@ func (c *contentRouter) FindProvidersAsync(ctx context.Context, key cid.Cid, num
101103
go readProviderResponses(resultsIter, ch)
102104
return ch
103105
}
106+
107+
func (c *contentRouter) FindPeer(ctx context.Context, pid peer.ID) (peer.AddrInfo, error) {
108+
iter, err := c.client.GetPeers(ctx, pid)
109+
if err != nil {
110+
return peer.AddrInfo{}, err
111+
}
112+
defer iter.Close()
113+
114+
for iter.Next() {
115+
res := iter.Val()
116+
if res.Err != nil {
117+
logger.Warnw("error iterating provider responses: %s", res.Err)
118+
continue
119+
}
120+
v := res.Val
121+
if v.GetSchema() == types.SchemaPeer {
122+
result, ok := v.(*types.PeerRecord)
123+
if !ok {
124+
logger.Errorw(
125+
"problem casting find providers result",
126+
"Schema", v.GetSchema(),
127+
"Type", reflect.TypeOf(v).String(),
128+
)
129+
continue
130+
}
131+
132+
var addrs []multiaddr.Multiaddr
133+
for _, a := range result.Addrs {
134+
addrs = append(addrs, a.Multiaddr)
135+
}
136+
137+
return peer.AddrInfo{
138+
ID: *result.ID,
139+
Addrs: addrs,
140+
}, nil
141+
}
142+
}
143+
144+
return peer.AddrInfo{}, err
145+
}

routing/http/contentrouter/contentrouter_test.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ func (m *mockClient) GetProviders(ctx context.Context, key cid.Cid) (iter.Result
2020
args := m.Called(ctx, key)
2121
return args.Get(0).(iter.ResultIter[types.Record]), args.Error(1)
2222
}
23+
func (m *mockClient) GetPeers(ctx context.Context, pid peer.ID) (iter.ResultIter[types.Record], error) {
24+
args := m.Called(ctx, pid)
25+
return args.Get(0).(iter.ResultIter[types.Record]), args.Error(1)
26+
}
2327
func (m *mockClient) Ready(ctx context.Context) (bool, error) {
2428
args := m.Called(ctx)
2529
return args.Bool(0), args.Error(1)
@@ -38,7 +42,7 @@ func makeCID() cid.Cid {
3842
return c
3943
}
4044

41-
func TestGetProvidersAsync(t *testing.T) {
45+
func TestFindProvidersAsync(t *testing.T) {
4246
key := makeCID()
4347
ctx := context.Background()
4448
client := &mockClient{}
@@ -79,3 +83,28 @@ func TestGetProvidersAsync(t *testing.T) {
7983

8084
require.Equal(t, expected, actualAIs)
8185
}
86+
87+
func TestFindPeer(t *testing.T) {
88+
ctx := context.Background()
89+
client := &mockClient{}
90+
crc := NewContentRoutingClient(client)
91+
92+
p1 := peer.ID("peer1")
93+
ais := []types.Record{
94+
&types.UnknownRecord{
95+
Schema: "Unknown",
96+
},
97+
&types.PeerRecord{
98+
Schema: types.SchemaPeer,
99+
ID: &p1,
100+
Protocols: []string{"transport-bitswap"},
101+
},
102+
}
103+
aisIter := iter.ToResultIter[types.Record](iter.FromSlice(ais))
104+
105+
client.On("GetPeers", ctx, p1).Return(aisIter, nil)
106+
107+
peer, err := crc.FindPeer(ctx, p1)
108+
require.NoError(t, err)
109+
require.Equal(t, peer.ID, p1)
110+
}

0 commit comments

Comments
 (0)