diff --git a/go.mod b/go.mod index a1c4b24..e5bc86b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/CAFxX/httpcompression v0.0.9 github.com/felixge/httpsnoop v1.0.4 - github.com/ipfs/boxo v0.17.1-0.20240206103407-342b01d27828 + github.com/ipfs/boxo v0.17.1-0.20240215095212-e576b559674a github.com/ipfs/go-cid v0.4.1 github.com/ipfs/go-log/v2 v2.5.1 github.com/libp2p/go-libp2p v0.32.2 diff --git a/go.sum b/go.sum index b76909d..7d3ba90 100644 --- a/go.sum +++ b/go.sum @@ -186,8 +186,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/ipfs/boxo v0.17.1-0.20240206103407-342b01d27828 h1:WbZEHuIOqAMb2I67+j6S7uKnPPWBsts09uyec6S2gzY= -github.com/ipfs/boxo v0.17.1-0.20240206103407-342b01d27828/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= +github.com/ipfs/boxo v0.17.1-0.20240215095212-e576b559674a h1:44Bfcj6uzx6FOkpJX4qAmSwQy2JaMqpzPNCO7GsuzHM= +github.com/ipfs/boxo v0.17.1-0.20240215095212-e576b559674a/go.mod h1:pIZgTWdm3k3pLF9Uq6MB8JEcW07UDwNJjlXW1HELW80= github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= diff --git a/server_routers.go b/server_routers.go index 1d262ac..1dc9036 100644 --- a/server_routers.go +++ b/server_routers.go @@ -25,12 +25,12 @@ type router interface { type providersRouter interface { FindProviders(ctx context.Context, cid cid.Cid, limit int) (iter.ResultIter[types.Record], error) - Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) + Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) } type peersRouter interface { FindPeers(ctx context.Context, pid peer.ID, limit int) (iter.ResultIter[*types.PeerRecord], error) - ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) + ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) } type ipnsRouter interface { @@ -53,9 +53,9 @@ func (r composableRouter) FindProviders(ctx context.Context, key cid.Cid, limit return r.providers.FindProviders(ctx, key, limit) } -func (r composableRouter) Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) { +func (r composableRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { if r.providers == nil { - return req.TTL, nil + return 0, nil } return r.providers.Provide(ctx, req) } @@ -67,9 +67,9 @@ func (r composableRouter) FindPeers(ctx context.Context, pid peer.ID, limit int) return r.peers.FindPeers(ctx, pid, limit) } -func (r composableRouter) ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) { +func (r composableRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { if r.peers == nil { - return req.TTL, nil + return 0, nil } return r.peers.ProvidePeer(ctx, req) } @@ -218,13 +218,13 @@ func (mi *manyIter[T]) Close() error { return err } -func (r parallelRouter) Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) { +func (r parallelRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { return provide(ctx, r.routers, func(ctx context.Context, r router) (time.Duration, error) { return r.Provide(ctx, req) }) } -func (r parallelRouter) ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) { +func (r parallelRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { return provide(ctx, r.routers, func(ctx context.Context, r router) (time.Duration, error) { return r.ProvidePeer(ctx, req) }) @@ -374,7 +374,9 @@ func (d libp2pRouter) FindProviders(ctx context.Context, key cid.Cid, limit int) }), nil } -func (d libp2pRouter) Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) { +func (d libp2pRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { + // NOTE: this router cannot provide further to the DHT, since we can only + // announce CIDs that our own node has, which is not the case. return 0, routing.ErrNotSupported } @@ -399,7 +401,7 @@ func (d libp2pRouter) FindPeers(ctx context.Context, pid peer.ID, limit int) (it return iter.ToResultIter[*types.PeerRecord](iter.FromSlice[*types.PeerRecord]([]*types.PeerRecord{rec})), nil } -func (r libp2pRouter) ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) { +func (r libp2pRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { return 0, routing.ErrNotSupported } @@ -475,14 +477,36 @@ func (d clientRouter) FindProviders(ctx context.Context, cid cid.Cid, limit int) return d.Client.FindProviders(ctx, cid) } -func (d clientRouter) Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) { - return 0, routing.ErrNotSupported +func (d clientRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { + return d.provide(func() (iter.ResultIter[*types.AnnouncementRecord], error) { + return d.Client.ProvideRecords(ctx, req) + }) } func (d clientRouter) FindPeers(ctx context.Context, pid peer.ID, limit int) (iter.ResultIter[*types.PeerRecord], error) { return d.Client.FindPeers(ctx, pid) } -func (d clientRouter) ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) { - return 0, routing.ErrNotSupported +func (d clientRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { + return d.provide(func() (iter.ResultIter[*types.AnnouncementRecord], error) { + return d.Client.ProvidePeerRecords(ctx, req) + }) +} + +func (d clientRouter) provide(do func() (iter.ResultIter[*types.AnnouncementRecord], error)) (time.Duration, error) { + resIter, err := do() + if err != nil { + return 0, err + } + + records, err := iter.ReadAllResults(resIter) + if err != nil { + return 0, err + } + + if len(records) != 1 { + return 0, errors.New("invalid number of records returned") + } + + return records[0].Payload.TTL, nil } diff --git a/server_routers_test.go b/server_routers_test.go index f49579e..32680b0 100644 --- a/server_routers_test.go +++ b/server_routers_test.go @@ -9,7 +9,6 @@ import ( "github.com/ipfs/boxo/ipns" "github.com/ipfs/boxo/path" - "github.com/ipfs/boxo/routing/http/server" "github.com/ipfs/boxo/routing/http/types" "github.com/ipfs/boxo/routing/http/types/iter" "github.com/ipfs/go-cid" @@ -33,7 +32,7 @@ func (m *mockRouter) FindProviders(ctx context.Context, key cid.Cid, limit int) return args.Get(0).(iter.ResultIter[types.Record]), args.Error(1) } -func (m *mockRouter) Provide(ctx context.Context, req *server.ProvideRequest) (time.Duration, error) { +func (m *mockRouter) Provide(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { args := m.Called(ctx, req) return args.Get(0).(time.Duration), args.Error(1) } @@ -46,7 +45,7 @@ func (m *mockRouter) FindPeers(ctx context.Context, pid peer.ID, limit int) (ite return args.Get(0).(iter.ResultIter[*types.PeerRecord]), args.Error(1) } -func (m *mockRouter) ProvidePeer(ctx context.Context, req *server.ProvidePeerRequest) (time.Duration, error) { +func (m *mockRouter) ProvidePeer(ctx context.Context, req *types.AnnouncementRecord) (time.Duration, error) { args := m.Called(ctx, req) return args.Get(0).(time.Duration), args.Error(1) }