feat: add "getclosestpeers" support (IPIP-476)#124
Merged
Conversation
lidel
approved these changes
Oct 17, 2025
Member
There was a problem hiding this comment.
i've pushed some changes (fixed router wiring, added tests, changelog) so would be good to have 👍 from @guillaumemichel or @hsanjuan
i also tested it locally as a demon and cli and works as expected (cli will work out of the box once we deploy this to delegated-ipfs.dev)
Contributor
Author
|
@lidel thank you, LGTM. |
guillaumemichel
approved these changes
Oct 20, 2025
Contributor
guillaumemichel
left a comment
There was a problem hiding this comment.
Two minor comments
GetClosestPeers endpoint was returning empty results or errors: 1. composableRouter.dht field was nil - the server never created a dht router, so GetClosestPeers always returned empty. Fixed by calling getCombinedRouting to create dhtRouters and passing it to the handler. 2. libp2pRouter type switch didn't handle bundledDHT (the default when SOMEGUY_DHT=accelerated), causing "cannot call GetClosestPeers on DHT implementation" error. Fixed by adding bundledDHT case that delegates to the active DHT (fullRT or standard). 3. dual.DHT case failed entirely when LAN lookup errored, even if WAN succeeded. Fixed to log LAN errors but continue with WAN results.
- add 10 test cases for GET /routing/v1/dht/closest/peers/{key}
- verify 20 peers returned with unique addresses (127.0.0.1-127.0.0.20)
- test JSON and NDJSON response formats
- test empty results, ErrNotFound, and invalid key handling
- test different key formats (CID, PeerID as CID)
- test Accept header handling (default, wildcard)
- verify response headers (Cache-Control, Content-Type, Vary, Last-Modified)
- add makePeerRecords helper to generate test fixtures
- use cid.Parse instead of cid.Decode for consistency with other CLI commands - remove TODO comment in cachedRouter.GetClosestPeers - clarify UsageText to specify DHT-closest peers - add private address filtering in sanitizeRouter.GetClosestPeers
add missing addrs to GetClosestPeers to ensure light clients do not have to do extra lookups after addrs expired in regular libp2p peerbook. - add addrQueryOriginClosestPeers constant for metrics tracking - make queryOrigin configurable in cacheFallbackIter - create applyPeerRecordCaching helper to abstract type conversions - update GetClosestPeers to apply caching via helper - add tests for cache hit and FindPeers fallback scenarios
LAN DHT contains private network peers that should not be exposed via public HTTP Routing API. This fix ensures only WAN DHT results are returned to external clients.
- add parseKey() helper that accepts CIDs and legacy peer ID formats - change default endpoint for CLI commands to delegated-ipfs.dev - keep cid.contact as default for daemon mode
- document new /routing/v1/peers/closest/{key} endpoint (IPIP-476)
- note CLI default endpoint change to delegated-ipfs.dev
- update dependency versions
42bd221 to
0dad3f7
Compare
lidel
added a commit
that referenced
this pull request
Nov 19, 2025
…sabled fixes two issues with the GetClosestPeers endpoint: 1. endpoint returned HTTP 200 with empty results instead of actual DHT peers 2. when DHT disabled, returned HTTP 200 with empty results instead of error root cause: during rebase of PR #124 (commit 0dad3f7) when integrating with autoconf refactor (PR #123 / ec76365), the dhtRouters initialization was accidentally omitted from server.go. the autoconf PR renamed getCombinedRouting to combineRouters and changed its signature, but the rebase failed to preserve the dhtRouters creation line that existed in commit 42bd221. changes: - server.go:201-208: add explicit dhtRouters creation with caching and sanitization, similar to original 42bd221 implementation - server.go:232: wire dhtRouters to composableRouter.dht field - server.go:338: update combineRouters signature to accept host.Host parameter needed for GetClosestPeers peerstore lookups - server_routers.go:73-77: return routing.ErrNotSupported instead of empty iterator when DHT is nil, resulting in HTTP 500 instead of misleading HTTP 200 - server_test.go:16,20,24: update combineRouters test calls with new signature - server_dht_test.go:355-379: add test verifying HTTP 500 when DHT disabled
hsanjuan
pushed a commit
that referenced
this pull request
Nov 20, 2025
…sabled (#127) fixes two issues with the GetClosestPeers endpoint: 1. endpoint returned HTTP 200 with empty results instead of actual DHT peers 2. when DHT disabled, returned HTTP 200 with empty results instead of error root cause: during rebase of PR #124 (commit 0dad3f7) when integrating with autoconf refactor (PR #123 / ec76365), the dhtRouters initialization was accidentally omitted from server.go. the autoconf PR renamed getCombinedRouting to combineRouters and changed its signature, but the rebase failed to preserve the dhtRouters creation line that existed in commit 42bd221. changes: - server.go:201-208: add explicit dhtRouters creation with caching and sanitization, similar to original 42bd221 implementation - server.go:232: wire dhtRouters to composableRouter.dht field - server.go:338: update combineRouters signature to accept host.Host parameter needed for GetClosestPeers peerstore lookups - server_routers.go:73-77: return routing.ErrNotSupported instead of empty iterator when DHT is nil, resulting in HTTP 500 instead of misleading HTTP 200 - server_test.go:16,20,24: update combineRouters test calls with new signature - server_dht_test.go:355-379: add test verifying HTTP 500 when DHT disabled
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TODO