diff --git a/go.mod b/go.mod index 4eb4166..2da3200 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/aws/aws-sdk-go v1.55.6 github.com/aws/aws-sdk-go-v2 v1.34.0 github.com/aws/aws-sdk-go-v2/config v1.28.3 + github.com/aws/aws-sdk-go-v2/credentials v1.17.44 github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.15 github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.7.50 github.com/aws/aws-sdk-go-v2/service/dynamodb v1.36.5 @@ -36,7 +37,6 @@ require ( require ( github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.44 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.19 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.29 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.29 // indirect diff --git a/pkg/aws/service.go b/pkg/aws/service.go index 68468ad..4ef63f6 100644 --- a/pkg/aws/service.go +++ b/pkg/aws/service.go @@ -17,6 +17,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/ssm" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/peer" + "github.com/multiformats/go-multiaddr" "github.com/storacha/go-metadata" "github.com/storacha/go-piece/pkg/piece" "github.com/storacha/go-ucanto/core/delegation" @@ -342,6 +343,10 @@ func Construct(cfg Config) (storage.Service, error) { if err != nil { return nil, fmt.Errorf("setting up receipt store: %w", err) } + announceAddr, err := multiaddr.NewMultiaddr(cfg.IPNIPublisherAnnounceAddress) + if err != nil { + return nil, fmt.Errorf("parsing announce multiaddr: %w", err) + } opts := []storage.Option{ storage.WithIdentity(cfg.Signer), storage.WithBlobstore(blobStore), @@ -350,7 +355,7 @@ func Construct(cfg Config) (storage.Service, error) { storage.WithPublisherStore(publisherStore), storage.WithPublicURL(*pubURL), storage.WithPublisherDirectAnnounce(*announceURL), - storage.WithPublisherAnnounceAddr(cfg.IPNIPublisherAnnounceAddress), + storage.WithPublisherAnnounceAddress(announceAddr), storage.WithPublisherIndexingServiceConfig(indexingServiceDID, *indexingServiceURL), storage.WithPublisherIndexingServiceProof(indexingServiceProofs...), storage.WithReceiptStore(receiptStore), diff --git a/pkg/service/claims/options.go b/pkg/service/claims/options.go index 35276d4..f09404c 100644 --- a/pkg/service/claims/options.go +++ b/pkg/service/claims/options.go @@ -4,6 +4,7 @@ import ( "net/url" logging "github.com/ipfs/go-log/v2" + "github.com/multiformats/go-multiaddr" "github.com/storacha/go-ucanto/client" "github.com/storacha/go-ucanto/core/delegation" "github.com/storacha/go-ucanto/transport/http" @@ -11,6 +12,7 @@ import ( ) type options struct { + announceAddr multiaddr.Multiaddr announceURLs []url.URL indexingService client.Connection indexingServiceProofs delegation.Proofs @@ -18,6 +20,15 @@ type options struct { type Option func(*options) error +// WithPublisherAnnounceAddress sets the address put into announce messages to +// tell indexers where to fetch advertisements from. +func WithPublisherAnnounceAddress(addr multiaddr.Multiaddr) Option { + return func(o *options) error { + o.announceAddr = addr + return nil + } +} + // WithPublisherDirectAnnounce sets indexer URLs to send direct HTTP // announcements to. func WithPublisherDirectAnnounce(announceURLs ...url.URL) Option { diff --git a/pkg/service/claims/service.go b/pkg/service/claims/service.go index b285fa9..0a3a675 100644 --- a/pkg/service/claims/service.go +++ b/pkg/service/claims/service.go @@ -23,7 +23,7 @@ func (c *ClaimService) Store() claimstore.ClaimStore { var _ Claims = (*ClaimService)(nil) -func New(id principal.Signer, claimStore claimstore.ClaimStore, publisherStore store.PublisherStore, announceAddr multiaddr.Multiaddr, peerAddr multiaddr.Multiaddr, opts ...Option) (*ClaimService, error) { +func New(id principal.Signer, claimStore claimstore.ClaimStore, publisherStore store.PublisherStore, publicAddr multiaddr.Multiaddr, opts ...Option) (*ClaimService, error) { o := &options{} for _, opt := range opts { err := opt(o) @@ -35,11 +35,11 @@ func New(id principal.Signer, claimStore claimstore.ClaimStore, publisherStore s publisher, err := publisher.New( id, publisherStore, - announceAddr, - peerAddr, + publicAddr, publisher.WithDirectAnnounce(o.announceURLs...), publisher.WithIndexingService(o.indexingService), publisher.WithIndexingServiceProof(o.indexingServiceProofs...), + publisher.WithAnnounceAddress(o.announceAddr), ) if err != nil { return nil, err diff --git a/pkg/service/publisher/options.go b/pkg/service/publisher/options.go index 1e54a12..4f8a188 100644 --- a/pkg/service/publisher/options.go +++ b/pkg/service/publisher/options.go @@ -4,6 +4,7 @@ import ( "net/url" logging "github.com/ipfs/go-log/v2" + "github.com/multiformats/go-multiaddr" "github.com/storacha/go-ucanto/client" "github.com/storacha/go-ucanto/core/delegation" "github.com/storacha/go-ucanto/transport/http" @@ -11,6 +12,7 @@ import ( ) type options struct { + announceAddr multiaddr.Multiaddr announceURLs []url.URL indexingService client.Connection indexingServiceProofs delegation.Proofs @@ -18,6 +20,15 @@ type options struct { type Option func(*options) error +// WithAnnounceAddress sets the address put into announce messages to tell +// indexers where to fetch advertisements from. +func WithAnnounceAddress(addr multiaddr.Multiaddr) Option { + return func(o *options) error { + o.announceAddr = addr + return nil + } +} + // WithDirectAnnounce sets indexer URLs to send direct HTTP announcements to. func WithDirectAnnounce(announceURLs ...url.URL) Option { return func(o *options) error { diff --git a/pkg/service/publisher/publisher.go b/pkg/service/publisher/publisher.go index 37133b4..92cf11d 100644 --- a/pkg/service/publisher/publisher.go +++ b/pkg/service/publisher/publisher.go @@ -203,8 +203,7 @@ var _ Publisher = (*PublisherService)(nil) func New( id principal.Signer, publisherStore store.PublisherStore, - publicAnnounceAddr multiaddr.Multiaddr, - publicPeerAddr multiaddr.Multiaddr, + publicAddr multiaddr.Multiaddr, opts ...Option, ) (*PublisherService, error) { o := &options{} @@ -220,7 +219,11 @@ func New( return nil, fmt.Errorf("unmarshaling private key: %w", err) } - ipnipubOpts := []ipnipub.Option{ipnipub.WithAnnounceAddrs(publicAnnounceAddr.String())} + if o.announceAddr == nil { + o.announceAddr = publicAddr + } + + ipnipubOpts := []ipnipub.Option{ipnipub.WithAnnounceAddrs(o.announceAddr.String())} for _, u := range o.announceURLs { log.Infof("Announcing new IPNI adverts to: %s", u.String()) ipnipubOpts = append(ipnipubOpts, ipnipub.WithDirectAnnounce(u.String())) @@ -231,21 +234,21 @@ func New( } found := false - for _, p := range publicPeerAddr.Protocols() { + for _, p := range publicAddr.Protocols() { if p.Code == multiaddr.P_HTTPS || p.Code == multiaddr.P_HTTP { found = true break } } if !found { - return nil, fmt.Errorf("IPNI publisher address is not HTTP(S): %s", publicPeerAddr) + return nil, fmt.Errorf("IPNI publisher address is not HTTP(S): %s", publicAddr) } peerid, err := peer.IDFromPrivateKey(priv) if err != nil { return nil, fmt.Errorf("creating libp2p peer ID from private key: %w", err) } - provInfo := providerInfo(peerid, publicPeerAddr) + provInfo := providerInfo(peerid, publicAddr) if o.indexingService == nil { log.Errorf("Indexing service is not configured - claims will not be cached") diff --git a/pkg/service/storage/options.go b/pkg/service/storage/options.go index bf4ece5..46649fe 100644 --- a/pkg/service/storage/options.go +++ b/pkg/service/storage/options.go @@ -5,6 +5,7 @@ import ( "github.com/ipfs/go-datastore" logging "github.com/ipfs/go-log/v2" + "github.com/multiformats/go-multiaddr" "github.com/storacha/go-ucanto/client" "github.com/storacha/go-ucanto/core/delegation" "github.com/storacha/go-ucanto/principal" @@ -38,7 +39,7 @@ type config struct { claimDatastore datastore.Datastore publisherStore store.PublisherStore publisherDatastore datastore.Datastore - publisherAnnouceAddr string + publisherAnnouceAddr multiaddr.Multiaddr receiptStore receiptstore.ReceiptStore receiptDatastore datastore.Datastore pdp *PDPConfig @@ -154,18 +155,18 @@ func WithPublisherStore(publisherStore store.PublisherStore) Option { // WithPublisherDatastore configures the underlying datastore to use for storing // IPNI advertisements and their entries. -func WithPublisherAnnounceAddr(publisherAnnounceAddr string) Option { +func WithPublisherDatastore(dstore datastore.Datastore) Option { return func(c *config) error { - c.publisherAnnouceAddr = publisherAnnounceAddr + c.publisherDatastore = dstore return nil } } -// WithPublisherDatastore configures the underlying datastore to use for storing -// IPNI advertisements and their entries. -func WithPublisherDatastore(dstore datastore.Datastore) Option { +// WithPublisherAnnounceAddress sets the address put into announce messages to +// tell indexers where to fetch advertisements from. +func WithPublisherAnnounceAddress(addr multiaddr.Multiaddr) Option { return func(c *config) error { - c.publisherDatastore = dstore + c.publisherAnnouceAddr = addr return nil } } diff --git a/pkg/service/storage/service.go b/pkg/service/storage/service.go index 79f5855..d21c59e 100644 --- a/pkg/service/storage/service.go +++ b/pkg/service/storage/service.go @@ -10,7 +10,6 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipni/go-libipni/maurl" - "github.com/multiformats/go-multiaddr" "github.com/storacha/go-metadata" "github.com/storacha/go-ucanto/principal" ed25519 "github.com/storacha/go-ucanto/principal/ed25519/signer" @@ -170,13 +169,13 @@ func New(opts ...Option) (*StorageService, error) { if c.blobsPublicURL != (url.URL{}) { blobOpts = append(blobOpts, blobs.WithPublicURLAccess(c.blobsPublicURL)) } else { - blobOpts = append(blobOpts, blobs.WithPublicURLAccess(c.publicURL)) + blobOpts = append(blobOpts, blobs.WithPublicURLAccess(pubURL)) } if c.blobsPresigner != nil { blobOpts = append(blobOpts, blobs.WithPresigner(c.blobsPresigner)) } else { - blobOpts = append(blobOpts, blobs.WithPublicURLPresigner(id, c.publicURL)) + blobOpts = append(blobOpts, blobs.WithPublicURLPresigner(id, pubURL)) } } else { curioAuth, err := curio.CreateCurioJWTAuthHeader("storacha", id) @@ -201,20 +200,14 @@ func New(opts ...Option) (*StorageService, error) { if err != nil { return nil, fmt.Errorf("parsing publisher url as multiaddr: %w", err) } - announceAddr := peerAddr - if c.publisherAnnouceAddr != "" { - announceAddr, err = multiaddr.NewMultiaddr(c.publisherAnnouceAddr) - if err != nil { - return nil, fmt.Errorf("parsing publisher address: %w", err) - } - } + claims, err := claims.New( id, claimStore, publisherStore, - announceAddr, peerAddr, claims.WithPublisherDirectAnnounce(c.announceURLs...), + claims.WithPublisherAnnounceAddress(c.publisherAnnouceAddr), claims.WithPublisherIndexingService(c.indexingService), claims.WithPublisherIndexingServiceProof(c.indexingServiceProofs...), )