-
Notifications
You must be signed in to change notification settings - Fork 6
Implement ipni-sync http over libp2p #113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Use the new libp2phttp functionality for serving and requesting ipnisync over libp2p.
Codecov ReportPatch coverage:
❗ Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the GitHub App Integration for your organization. Read more. Additional details and impacted files@@ Coverage Diff @@
## main #113 +/- ##
==========================================
+ Coverage 54.03% 61.20% +7.17%
==========================================
Files 67 57 -10
Lines 5341 4916 -425
==========================================
+ Hits 2886 3009 +123
+ Misses 2140 1581 -559
- Partials 315 326 +11
☔ View full report in Codecov by Sentry. |
- Update comments - Add HttpTimeout option for subscriber
Add option to use retryable http client
…This supports legacy HTTP served without IPNI path.
|
From @MarcoPolo in #103, here |
- Change AsyncErr to Err in SyncFinished - Move old p2p head client/server (legs protocol ID) into dtsync, since that is the only place it is used. - Add tests
masih
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🚀
dagsync/ipnisync/sync.go
Outdated
| ) | ||
|
|
||
| const defaultHttpTimeout = 10 * time.Second | ||
| const ProtocolID = protocol.ID("/ipnisync/v1") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Too late to change this to /ipni/sync/v1?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would it be better to match the HTTP path, which is /ipni/v1/ad/ ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure http path as libp2p protocol ID makes sense? That protocol exposes multiple paths right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Only one path. As per spec the only path is /ipni/v1/ad/, which is followed by the resource head or the CID to fetch.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With the libp2phttp package, the protocol ID maps to a specific HTTP path, so it seems to make sense that they should be the same.
@MarcoPolo Recommendation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I decided to use the IPNIPath as the protocol ID. I provided an explanation in the comment here.
Serve ipnisync HTTP over libp2p
This PR makes use of the new libp2phttp functionality for serving and requesting ipnisync over libp2p.
The new publisher can publish ipnisync-http over libp2p if supplied with a stream host, over plain HTTP if supplied with a listen address, or both. The publisher also works as an HTTP handler to allow it to be used with existing HTTP listeners.
The sync client works with ipnisync-http over libp2p, plain HTTP, and legacy data-transfer sync. It is able to detect which protocol and transport to use with any provider, new or old.
Protocol negotiation
When a
Synceris created to sync with a specific advertisement publisher, it first uses libp2phttp to negotiate with the publisher whether to use HTTP with or without libp2p. If the publisher is an older publisher that does not support this negotiation, then the client tries to use plain HTTP or the legacy data-transfer/graphsync protocol depending on the publisher address.If a publisher is newer, but uses an existing HTTP server, it can still support protocol negotiation by supporting the
/.well-known/HTTP endpoint. Here is an example of adding support for this. This is optional, and the cost for not supporting it is one additional HTTP round trip between the indexer and publisher per sync operation.API Changes
This PR has some minor
ipnisyncAPI changes to be aware of.Publisher API Changes:
NewPublisherfunction does not take a single HTTP listen address as its first argument. It now takes a list of HTTP address as an option,WithHTTPListenAddrs, since HTTP listen addresses are not required when using a libp2p stream host or with an existing HTTP server.NewPublishercan be given a libp2p stream host to serve advertisements, by specifying the optionWithStreamHost.dagsync/p2p/protocol/headpackage has moved todagsync/dtsync/headsince it is only used indtsync. This should not affect any external applications.WithServerhas been renamed toWithStartServer.WithRequireTLStells whether to require https or allow the publisher to serve non-secure http. Default is false, allowing non-secure HTTP.Sync client API changes:
NewSyncfunction does not take anhttp.Client. Options are used to configure a default or retryable HTTP client.NewSyncfunction:ClientAuthServerPeerIDtells the sync client that it must authenticate the Server's PeerID.ClientHTTPTimeoutspecifies a time limit for HTTP requestsClientStreamHostspecifies an optional stream based libp2p hostClientHTTPRetryconfigures a retriable HTTP clientNewSyncerfunction now takes a singlepeer.AddrInfoinstead of a separatepeer.IDand[]multiaddr.Multiaddrarguments.dagsync.SubscriberAPI changes:NewSubscriberno longer has aHttpClientoption. It now supports the following options:HttpTimeoutwhich is passed through to the theClientHttpTimeoutoptionRetryableHTTPClientwhich is passed through to theClientHTTPRetryoption.