Skip to content

Conversation

@hsanjuan
Copy link
Contributor

@hsanjuan hsanjuan commented Oct 16, 2025

@guillaumemichel guillaumemichel self-requested a review October 17, 2025 12:45
@lidel lidel changed the title Add "getclosestpeers" support. feat: add "getclosestpeers" support (IPIP-476) Oct 17, 2025
Copy link
Member

@lidel lidel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)

@lidel lidel marked this pull request as ready for review October 17, 2025 19:55
@hsanjuan
Copy link
Contributor Author

@lidel thank you, LGTM.

Copy link
Contributor

@guillaumemichel guillaumemichel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two minor comments

hsanjuan and others added 10 commits November 19, 2025 11:49
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
@hsanjuan hsanjuan force-pushed the feat/get-closest-peers branch from 42bd221 to 0dad3f7 Compare November 19, 2025 11:12
@hsanjuan hsanjuan merged commit 43188dd into main Nov 19, 2025
7 checks passed
@hsanjuan hsanjuan deleted the feat/get-closest-peers branch November 19, 2025 11:34
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants