From 9e33addda7f3068d6b5e1cd96c60a83ed096ec63 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Tue, 8 Aug 2023 15:41:14 +1000 Subject: [PATCH] fix: update deps & use index-provider/engine instead of fork github.com/ipni/index-provider@v0.13.5 includes the changes that were in the forked version that was being used here. --- cmd/frisbii/main.go | 2 +- engine/doc.go | 19 -- engine/engine.go | 767 ------------------------------------------- engine/linksystem.go | 196 ----------- engine/options.go | 412 ----------------------- go.mod | 81 ++--- go.sum | 150 +++++---- 7 files changed, 122 insertions(+), 1505 deletions(-) delete mode 100644 engine/doc.go delete mode 100644 engine/engine.go delete mode 100644 engine/linksystem.go delete mode 100644 engine/options.go diff --git a/cmd/frisbii/main.go b/cmd/frisbii/main.go index 1bf11a0..6ff50f5 100644 --- a/cmd/frisbii/main.go +++ b/cmd/frisbii/main.go @@ -10,9 +10,9 @@ import ( "github.com/ipfs/go-log/v2" "github.com/ipfs/go-unixfsnode" "github.com/ipld/frisbii" - "github.com/ipld/frisbii/engine" cidlink "github.com/ipld/go-ipld-prime/linking/cid" "github.com/ipni/go-libipni/maurl" + "github.com/ipni/index-provider/engine" "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" "github.com/urfave/cli/v2" diff --git a/engine/doc.go b/engine/doc.go deleted file mode 100644 index 24d567d..0000000 --- a/engine/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -// Package engine is a fork of github.com/ipni/index-provider/engine with some -// modifications to make it work for the current Frisbii usecase. It needs to be -// reconciled back into that package and removed from here. -// -// Package engine provides a reference implementation of the provider.Interface in order to -// advertise the availability of a list of multihashes to indexer nodes such as "storetheindex". -// See: https://github.com/ipni/storetheindex -// -// The advertisements are published as a chan of diffs that signal the list of multihashes that are -// added or removed represented as an IPLD DAG. -// Walking the chain of advertisements would then provide the latest state of the total multihashes -// provided by the engine. -// The list of multihashes are paginated as a collection of interlinked chunks. -// For the complete advertisement IPLD schema, see: -// - https://github.com/ipni/go-libipni/blob/main/ingest/schema/schema.ipldsch -// -// The engine internally uses "go-libipni/dagsync" to sync the IPLD DAG of advertisements. -// See: https://github.com/ipni/go-libipni/tree/main/dagsync -package engine diff --git a/engine/engine.go b/engine/engine.go deleted file mode 100644 index d106b10..0000000 --- a/engine/engine.go +++ /dev/null @@ -1,767 +0,0 @@ -package engine - -import ( - "context" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "net/http" - "net/url" - "sync" - - "github.com/hashicorp/go-multierror" - "github.com/ipfs/go-cid" - "github.com/ipfs/go-datastore" - dsn "github.com/ipfs/go-datastore/namespace" - logging "github.com/ipfs/go-log/v2" - "github.com/ipld/go-ipld-prime" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/ipni/go-libipni/announce" - "github.com/ipni/go-libipni/announce/httpsender" - "github.com/ipni/go-libipni/announce/message" - "github.com/ipni/go-libipni/announce/p2psender" - "github.com/ipni/go-libipni/dagsync" - "github.com/ipni/go-libipni/dagsync/dtsync" - "github.com/ipni/go-libipni/dagsync/httpsync" - "github.com/ipni/go-libipni/ingest/schema" - "github.com/ipni/go-libipni/metadata" - provider "github.com/ipni/index-provider" - "github.com/ipni/index-provider/engine/chunker" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/multiformats/go-multiaddr" -) - -const ( - keyToCidMapPrefix = "map/keyCid/" - cidToKeyMapPrefix = "map/cidKey/" - cidToProviderAndKeyMapPrefix = "map/cidProvAndKey/" - keyToMetadataMapPrefix = "map/keyMD/" - latestAdvKey = "sync/adv/" - linksCachePath = "/cache/links" -) - -var ( - log = logging.Logger("provider/engine") - - dsLatestAdvKey = datastore.NewKey(latestAdvKey) -) - -// Engine is an implementation of the core reference provider interface. -type Engine struct { - *options - lsys ipld.LinkSystem - - entriesChunker *chunker.CachedEntriesChunker - - publisher dagsync.Publisher - - mhLister provider.MultihashLister - cblk sync.Mutex -} - -var _ provider.Interface = (*Engine)(nil) - -// New creates a new index provider Engine as the default implementation of -// provider.Interface. It provides the ability to advertise the availability of -// a list of multihashes associated to a context ID as a chain of linked -// advertisements as defined by the indexer node protocol implemented by -// "go-libipni". -// -// Engine internally uses "go-libipni/dagsync", a protocol for propagating and -// synchronizing changes an IPLD DAG, to publish advertisements. See: -// -// - https://github.com/ipni/go-libipni/tree/main/dagsync -// -// Published advertisements are signed using the given private key. The -// retAddrs corresponds to the endpoints at which the data block associated to -// the advertised multihashes can be retrieved. If no retAddrs are specified, -// then use the listen addresses of the given libp2p host. -// -// The engine also provides the ability to generate advertisements via -// Engine.NotifyPut and Engine.NotifyRemove as long as a -// provider.MultihashLister is registered. See: provider.MultihashLister, -// Engine.RegisterMultihashLister. -// -// The engine must be started via Engine.Start before use and discarded via -// Engine.Shutdown when no longer needed. -func New(o ...Option) (*Engine, error) { - opts, err := newOptions(o...) - if err != nil { - return nil, err - } - - e := &Engine{ - options: opts, - } - - e.lsys = e.mkLinkSystem() - - return e, nil -} - -// Start starts the engine by instantiating the internal storage and joining -// the configured gossipsub topic used for publishing advertisements. -// -// The context is used to instantiate the internal LRU cache storage. See: -// Engine.Shutdown, chunker.NewCachedEntriesChunker, -// dtsync.NewPublisherFromExisting -func (e *Engine) Start(ctx context.Context) error { - var err error - // Create datastore entriesChunker. - entriesCacheDs := dsn.Wrap(e.ds, datastore.NewKey(linksCachePath)) - e.entriesChunker, err = chunker.NewCachedEntriesChunker(ctx, entriesCacheDs, e.entCacheCap, e.chunker, e.purgeCache) - if err != nil { - return err - } - - e.publisher, err = e.newPublisher() - if err != nil { - log.Errorw("Failed to instantiate publisher", "err", err, "kind", e.pubKind) - return err - } - - if e.publisher != nil { - // Initialize publisher with latest advertisement CID. - adCid, err := e.getLatestAdCid(ctx) - if err != nil { - return fmt.Errorf("could not get latest advertisement cid: %w", err) - } - if adCid != cid.Undef { - if err = e.publisher.SetRoot(ctx, adCid); err != nil { - return err - } - } - } - - return nil -} - -func (e *Engine) newPublisher() (dagsync.Publisher, error) { - switch e.pubKind { - case NoPublisher: - log.Info("Remote announcements is disabled; all advertisements will only be store locally.") - return nil, nil - case DataTransferPublisher, HttpPublisher: - default: - return nil, fmt.Errorf("unknown publisher kind: %s", e.pubKind) - } - - var senders []announce.Sender - - // If there are announce URLs, then creage an announce sender to send - // direct HTTP announce messages to these URLs. - if len(e.announceURLs) != 0 { - id, err := peer.IDFromPrivateKey(e.key) - if err != nil { - return nil, fmt.Errorf("cannot get peer ID from private key: %w", err) - } - httpSender, err := httpsender.New(e.announceURLs, id) - if err != nil { - return nil, fmt.Errorf("cannot create http announce sender: %w", err) - } - senders = append(senders, httpSender) - } - - // If there is a libp2p host, then create a gossip pubsub announce sender. - if e.h != nil { - // Create an announce sender to send over gossip pubsub. - p2pSender, err := p2psender.New(e.h, e.pubTopicName, p2psender.WithTopic(e.pubTopic)) - if err != nil { - return nil, err - } - senders = append(senders, p2pSender) - } - - if e.pubKind == HttpPublisher { - if e.pubHttpWithoutServer { - return httpsync.NewPublisherWithoutServer(e.pubHttpListenAddr, e.pubHttpHandlerPath, e.lsys, e.key, httpsync.WithAnnounceSenders(senders...)) - } - return httpsync.NewPublisher(e.pubHttpListenAddr, e.lsys, e.key, httpsync.WithAnnounceSenders(senders...)) - } - - dtOpts := []dtsync.Option{ - dtsync.WithExtraData(e.pubExtraGossipData), - dtsync.WithAllowPeer(e.syncPolicy.Allowed), - dtsync.WithAnnounceSenders(senders...), - } - if e.pubDT != nil { - return dtsync.NewPublisherFromExisting(e.pubDT, e.h, e.pubTopicName, e.lsys, dtOpts...) - } - ds := dsn.Wrap(e.ds, datastore.NewKey("/dagsync/dtsync/pub")) - return dtsync.NewPublisher(e.h, ds, e.lsys, e.pubTopicName, dtOpts...) -} - -// PublishLocal stores the advertisement in the local link system and marks it -// locally as the latest advertisement. -// -// The context is used for storing internal mapping information onto the -// datastore. -// -// See: Engine.Publish. -func (e *Engine) PublishLocal(ctx context.Context, adv schema.Advertisement) (cid.Cid, error) { - if err := adv.Validate(); err != nil { - return cid.Undef, err - } - - adNode, err := adv.ToNode() - if err != nil { - return cid.Undef, err - } - - lnk, err := e.lsys.Store(ipld.LinkContext{Ctx: ctx}, schema.Linkproto, adNode) - if err != nil { - return cid.Undef, fmt.Errorf("cannot generate advertisement link: %s", err) - } - c := lnk.(cidlink.Link).Cid - log := log.With("adCid", c) - log.Info("Stored ad in local link system") - - if err = e.putLatestAdv(ctx, c.Bytes()); err != nil { - log.Errorw("Failed to update reference to the latest advertisement", "err", err) - return cid.Undef, fmt.Errorf("failed to update reference to latest advertisement: %w", err) - } - log.Info("Updated reference to the latest advertisement successfully") - return c, nil -} - -// Publish stores the given advertisement locally via Engine.PublishLocal -// first, then publishes a message onto the gossipsub to signal the change in -// the latest advertisement by the provider to indexer nodes. -// -// The publication mechanism uses dagsync.Publisher internally. -// See: https://github.com/ipni/go-libipni/tree/main/dagsync -func (e *Engine) Publish(ctx context.Context, adv schema.Advertisement) (cid.Cid, error) { - c, err := e.PublishLocal(ctx, adv) - if err != nil { - log.Errorw("Failed to store advertisement locally", "err", err) - return cid.Undef, fmt.Errorf("failed to publish advertisement locally: %w", err) - } - - // Only announce the advertisement CID if publisher is configured. - if e.publisher != nil { - log := log.With("adCid", c) - if len(e.announceURLs) == 0 && e.h != nil { - log.Info("Announcing advertisement in pubsub channel") - } else if len(e.announceURLs) != 0 && e.h == nil { - log.Info("Announcing advertisement via http") - } else if len(e.announceURLs) != 0 && e.h != nil { - log.Info("Announcing advertisement in pubsub channel and via http") - } else { - return cid.Undef, fmt.Errorf("unexpected publisher state, no announceURLs or libp2p host") - } - - err = e.publisher.UpdateRoot(ctx, c) - if err != nil { - log.Errorw("Failed to announce advertisement", "err", err) - // Do not consider a failure to announce an error, since publishing - // locally worked. - } - } - - return c, nil -} - -func (e *Engine) latestAdToPublish(ctx context.Context) (cid.Cid, error) { - // Skip announcing the latest advertisement CID if there is no publisher. - if e.publisher == nil { - log.Infow("Skipped announcing the latest: remote announcements are disabled.") - return cid.Undef, nil - } - - adCid, err := e.getLatestAdCid(ctx) - if err != nil { - return cid.Undef, fmt.Errorf("failed to get latest advertisement cid: %w", err) - } - - if adCid == cid.Undef { - log.Info("Skipped announcing the latest: no previously published advertisements.") - return cid.Undef, nil - } - - return adCid, nil -} - -// PublishLatest re-publishes the latest existing advertisement to pubsub. -func (e *Engine) PublishLatest(ctx context.Context) (cid.Cid, error) { - adCid, err := e.latestAdToPublish(ctx) - if err != nil { - return cid.Undef, err - } - log.Infow("Publishing latest advertisement", "cid", adCid) - - err = e.publisher.UpdateRoot(ctx, adCid) - if err != nil { - return adCid, err - } - - return adCid, nil -} - -// PublishLatestHTTP publishes the latest existing advertisement to the -// specific indexers. -func (e *Engine) PublishLatestHTTP(ctx context.Context, announceURLs ...*url.URL) (cid.Cid, error) { - adCid, err := e.latestAdToPublish(ctx) - if err != nil { - return cid.Undef, err - } - - err = e.httpAnnounce(ctx, adCid, announceURLs) - if err != nil { - return adCid, err - } - - return adCid, nil -} - -func (e *Engine) httpAnnounce(ctx context.Context, adCid cid.Cid, announceURLs []*url.URL) error { - if ctx.Err() != nil { - return ctx.Err() - } - if len(announceURLs) == 0 { - return nil - } - - // Create announce message. - msg := message.Message{ - Cid: adCid, - } - - // The publisher kind determines what addresses to put into the announce - // message. - switch e.pubKind { - case NoPublisher: - log.Info("Remote announcements disabled") - return nil - case DataTransferPublisher: - msg.SetAddrs(e.h.Addrs()) - case HttpPublisher: - if len(e.pubHttpAnnounceAddrs) != 0 { - msg.SetAddrs(e.pubHttpAnnounceAddrs) - } else { - msg.SetAddrs(e.publisher.Addrs()) - } - } - - // Create the http announce sender. - httpSender, err := httpsender.New(announceURLs, e.h.ID()) - if err != nil { - return fmt.Errorf("cannot create http announce sender: %w", err) - } - - log.Infow("Announcing advertisements over HTTP", "urls", announceURLs) - return httpSender.Send(ctx, msg) -} - -// RegisterMultihashLister registers a provider.MultihashLister that is used to -// look up the list of multihashes associated to a context ID. At least one -// such registration must be registered before calls to Engine.NotifyPut and -// Engine.NotifyRemove. -// -// Note that successive calls to this function will replace the previous -// registration. Only a single registration is supported. -// -// See: provider.Interface -func (e *Engine) RegisterMultihashLister(mhl provider.MultihashLister) { - log.Debugf("Registering multihash lister in engine") - e.cblk.Lock() - defer e.cblk.Unlock() - e.mhLister = mhl -} - -// NotifyPut publishes an advertisement that signals the list of multihashes -// associated to the given contextID is available by this provider with the -// given metadata. A provider.MultihashLister is required, and is used to look -// up the list of multihashes associated to a context ID. -// -// Note that prior to calling this function a provider.MultihashLister must be -// registered. -// -// See: Engine.RegisterMultihashLister, Engine.Publish. -func (e *Engine) NotifyPut(ctx context.Context, provider *peer.AddrInfo, contextID []byte, md metadata.Metadata) (cid.Cid, error) { - // The multihash lister must have been registered for the linkSystem to - // know how to go from contextID to list of CIDs. - pID := e.options.provider.ID - addrs := e.options.provider.Addrs - if provider != nil { - pID = provider.ID - addrs = provider.Addrs - } - return e.publishAdvForIndex(ctx, pID, addrs, contextID, md, false) -} - -// NotifyRemove publishes an advertisement that signals the list of multihashes -// associated to the given contextID is no longer available by this provider. -// -// Note that prior to calling this function a provider.MultihashLister must be -// registered. -// -// See: Engine.RegisterMultihashLister, Engine.Publish. -func (e *Engine) NotifyRemove(ctx context.Context, provider peer.ID, contextID []byte) (cid.Cid, error) { - // TODO: add support for "delete all" for provider - if provider == "" { - provider = e.options.provider.ID - } - return e.publishAdvForIndex(ctx, provider, nil, contextID, metadata.Metadata{}, true) -} - -// LinkSystem gets the link system used by the engine to store and retrieve advertisement data. -func (e *Engine) LinkSystem() *ipld.LinkSystem { - return &e.lsys -} - -// Shutdown shuts down the engine and discards all resources opened by the -// engine. The engine is no longer usable after the call to this function. -func (e *Engine) Shutdown() error { - var errs error - if e.publisher != nil { - if err := e.publisher.Close(); err != nil { - errs = multierror.Append(errs, fmt.Errorf("error closing leg publisher: %s", err)) - } - } - if err := e.entriesChunker.Close(); err != nil { - errs = multierror.Append(errs, fmt.Errorf("error closing link entriesChunker: %s", err)) - } - return errs -} - -// GetPublisherHttpFunc gets the http.HandlerFunc that can be used to serve -// advertisements over HTTP. The returned handler is only valid if the -// PublisherKind is HttpPublisher and the HttpPublisherWithoutServer option is -// set. -func (e *Engine) GetPublisherHttpFunc() (http.HandlerFunc, error) { - if e.publisher == nil { - return nil, errors.New("no publisher configured") - } - if !e.pubHttpWithoutServer { - return nil, errors.New("HttpPublisherWithoutServer option not set") - } - if hp, ok := e.publisher.(*httpsync.Publisher); !ok { - return nil, errors.New("publisher is not an http publisher") - } else { - return hp.ServeHTTP, nil - } -} - -// GetAdv gets the advertisement associated to the given cid c. The context is -// not used. -func (e *Engine) GetAdv(_ context.Context, adCid cid.Cid) (*schema.Advertisement, error) { - log := log.With("cid", adCid) - log.Infow("Getting advertisement by CID") - - lsys := e.vanillaLinkSystem() - n, err := lsys.Load(ipld.LinkContext{}, cidlink.Link{Cid: adCid}, schema.AdvertisementPrototype) - if err != nil { - return nil, fmt.Errorf("cannot load advertisement from blockstore with vanilla linksystem: %s", err) - } - return schema.UnwrapAdvertisement(n) -} - -// GetLatestAdv gets the latest advertisement by the provider. If there are no -// previously published advertisements, then cid.Undef is returned as the -// advertisement CID. -func (e *Engine) GetLatestAdv(ctx context.Context) (cid.Cid, *schema.Advertisement, error) { - log.Info("Getting latest advertisement") - latestAdCid, err := e.getLatestAdCid(ctx) - if err != nil { - return cid.Undef, nil, fmt.Errorf("could not get latest advertisement cid from blockstore: %s", err) - } - if latestAdCid == cid.Undef { - return cid.Undef, nil, nil - } - - ad, err := e.GetAdv(ctx, latestAdCid) - if err != nil { - return cid.Undef, nil, fmt.Errorf("count not get latest advertisement from blockstore by cid: %s", err) - } - return latestAdCid, ad, nil -} - -func (e *Engine) publishAdvForIndex(ctx context.Context, p peer.ID, addrs []multiaddr.Multiaddr, contextID []byte, md metadata.Metadata, isRm bool) (cid.Cid, error) { - var err error - var cidsLnk cidlink.Link - - log := log.With("providerID", p).With("contextID", base64.StdEncoding.EncodeToString(contextID)) - - c, err := e.getKeyCidMap(ctx, p, contextID) - if err != nil { - if err != datastore.ErrNotFound { - return cid.Undef, fmt.Errorf("cound not not get entries cid by provider + context id: %s", err) - } - } - - // If not removing, then generate the link for the list of - // CIDs from the contextID using the multihash lister, and store the - // relationship. - if !isRm { - log.Info("Creating advertisement") - - // If no previously-published ad for this context ID. - if c == cid.Undef { - log.Info("Generating entries linked list for advertisement") - // If no lister registered return error. - if e.mhLister == nil { - return cid.Undef, provider.ErrNoMultihashLister - } - - // Call the lister. - mhIter, err := e.mhLister(ctx, p, contextID) - if err != nil { - return cid.Undef, err - } - // Generate the linked list ipld.Link that is added to the - // advertisement and used for ingestion. - lnk, err := e.entriesChunker.Chunk(ctx, mhIter) - if err != nil { - return cid.Undef, fmt.Errorf("could not generate entries list: %s", err) - } else if lnk == nil { - log.Warnw("chunking for context ID resulted in no link", "contextID", contextID) - lnk = schema.NoEntries - } - cidsLnk = lnk.(cidlink.Link) - - // Store the relationship between providerID, contextID and CID of the - // advertised list of Cids. - err = e.putKeyCidMap(ctx, p, contextID, cidsLnk.Cid) - if err != nil { - return cid.Undef, fmt.Errorf("failed to write provider + context id to entries cid mapping: %s", err) - } - } else { - // Lookup metadata for this providerID and contextID. - prevMetadata, err := e.getKeyMetadataMap(ctx, p, contextID) - if err != nil { - if err != datastore.ErrNotFound { - return cid.Undef, fmt.Errorf("could not get metadata for provider + context id: %s", err) - } - log.Warn("No metadata for existing provider + context ID, generating new advertisement") - } - - if md.Equal(prevMetadata) { - // Metadata is the same; no change, no need for new - // advertisement. - return cid.Undef, provider.ErrAlreadyAdvertised - } - - // Linked list is the same, but metadata is different, so generate - // new advertisement with same linked list, but new metadata. - cidsLnk = cidlink.Link{Cid: c} - } - - if err = e.putKeyMetadataMap(ctx, p, contextID, &md); err != nil { - return cid.Undef, fmt.Errorf("failed to write provider + context id to metadata mapping: %s", err) - } - } else { - log.Info("Creating removal advertisement") - - if c == cid.Undef { - return cid.Undef, provider.ErrContextIDNotFound - } - - // If removing by context ID, it means the list of CIDs is not needed - // anymore, so we can remove the entry from the datastore. - err = e.deleteKeyCidMap(ctx, p, contextID) - if err != nil { - return cid.Undef, fmt.Errorf("failed to delete provider + context id to entries cid mapping: %s", err) - } - err = e.deleteCidKeyMap(ctx, c) - if err != nil { - return cid.Undef, fmt.Errorf("failed to delete entries cid to provider + context id mapping: %s", err) - } - err = e.deleteKeyMetadataMap(ctx, p, contextID) - if err != nil { - return cid.Undef, fmt.Errorf("failed to delete provider + context id to metadata mapping: %s", err) - } - - // Create an advertisement to delete content by contextID by specifying - // that advertisement has no entries. - cidsLnk = schema.NoEntries - - // The advertisement still requires a valid metadata even though - // metadata is not used for removal. Create a valid empty metadata. - md = metadata.Default.New() - } - - mdBytes, err := md.MarshalBinary() - if err != nil { - return cid.Undef, err - } - - var stringAddrs []string - for _, addr := range addrs { - stringAddrs = append(stringAddrs, addr.String()) - } - - adv := schema.Advertisement{ - Provider: p.String(), - Addresses: stringAddrs, - Entries: cidsLnk, - ContextID: contextID, - Metadata: mdBytes, - IsRm: isRm, - } - - // Get the previous advertisement that was generated. - prevAdvID, err := e.getLatestAdCid(ctx) - if err != nil { - return cid.Undef, fmt.Errorf("could not get latest advertisement: %s", err) - } - - // Check for cid.Undef for the previous link. If this is the case, then - // this means there are no previous advertisements. - if prevAdvID == cid.Undef { - log.Info("Latest advertisement CID was undefined - no previous advertisement") - } else { - adv.PreviousID = ipld.Link(cidlink.Link{Cid: prevAdvID}) - } - - // Sign the advertisement. - if err = adv.Sign(e.key); err != nil { - return cid.Undef, err - } - return e.Publish(ctx, adv) -} - -func (e *Engine) keyToCidKey(provider peer.ID, contextID []byte) datastore.Key { - switch provider { - case e.provider.ID: - return datastore.NewKey(keyToCidMapPrefix + string(contextID)) - default: - return datastore.NewKey(keyToCidMapPrefix + provider.String() + "/" + string(contextID)) - } -} - -func (e *Engine) cidToKeyKey(c cid.Cid) datastore.Key { - return datastore.NewKey(cidToKeyMapPrefix + c.String()) -} - -func (e *Engine) cidToProviderAndKeyKey(c cid.Cid) datastore.Key { - return datastore.NewKey(cidToProviderAndKeyMapPrefix + c.String()) -} - -func (e *Engine) keyToMetadataKey(provider peer.ID, contextID []byte) datastore.Key { - switch provider { - case e.provider.ID: - return datastore.NewKey(keyToMetadataMapPrefix + string(contextID)) - default: - return datastore.NewKey(keyToMetadataMapPrefix + provider.String() + "/" + string(contextID)) - } -} - -func (e *Engine) putKeyCidMap(ctx context.Context, provider peer.ID, contextID []byte, c cid.Cid) error { - // Store the map Key-Cid to know what CidLink to put in advertisement when - // notifying about a removal. - - err := e.ds.Put(ctx, e.keyToCidKey(provider, contextID), c.Bytes()) - if err != nil { - return err - } - // And the other way around when graphsync is making a request, so the - // lister in the linksystem knows to what contextID the CID referrs to. - // it's enough for us to store just a single mapping of cid to provider and context to generate chunks - - pB, err := provider.Marshal() - if err != nil { - return err - } - m, err := json.Marshal(&providerAndContext{Provider: pB, ContextID: contextID}) - if err != nil { - return err - } - return e.ds.Put(ctx, e.cidToProviderAndKeyKey(c), m) -} - -func (e *Engine) getKeyCidMap(ctx context.Context, provider peer.ID, contextID []byte) (cid.Cid, error) { - b, err := e.ds.Get(ctx, e.keyToCidKey(provider, contextID)) - if err != nil { - return cid.Undef, err - } - _, d, err := cid.CidFromBytes(b) - return d, err -} - -func (e *Engine) deleteKeyCidMap(ctx context.Context, provider peer.ID, contextID []byte) error { - return e.ds.Delete(ctx, e.keyToCidKey(provider, contextID)) -} - -func (e *Engine) deleteCidKeyMap(ctx context.Context, c cid.Cid) error { - err := e.ds.Delete(ctx, e.cidToProviderAndKeyKey(c)) - if err != nil { - return err - } - return e.ds.Delete(ctx, e.cidToKeyKey(c)) -} - -type providerAndContext struct { - Provider []byte `json:"p"` - ContextID []byte `json:"c"` -} - -// getCidKeyMap returns the provider and contextID for a given cid. Provider and Context ID are guaranteed to be -// not nil. In the case if legacy index exists, the default provider identity is assumed. -func (e *Engine) getCidKeyMap(ctx context.Context, c cid.Cid) (*providerAndContext, error) { - // first see whether the mapping exists in the legacy index - val, err := e.ds.Get(ctx, e.cidToKeyKey(c)) - if err == nil { - // if the mapping has been found in the legacy index - return the default provider identity - return &providerAndContext{Provider: []byte(e.provider.ID), ContextID: val}, nil - } - if !errors.Is(err, datastore.ErrNotFound) { - return nil, err - } - // trying to fetch this mapping from the new index - val, err = e.ds.Get(ctx, e.cidToProviderAndKeyKey(c)) - if err != nil { - return nil, err - } - - var pAndC providerAndContext - err = json.Unmarshal(val, &pAndC) - if err != nil { - return nil, err - } - // in case if provider is empty (which should never happen), assume the default one - if len(pAndC.Provider) == 0 { - pAndC.Provider = []byte(e.provider.ID) - } - return &pAndC, nil -} - -func (e *Engine) putKeyMetadataMap(ctx context.Context, provider peer.ID, contextID []byte, metadata *metadata.Metadata) error { - data, err := metadata.MarshalBinary() - if err != nil { - return err - } - return e.ds.Put(ctx, e.keyToMetadataKey(provider, contextID), data) -} - -func (e *Engine) getKeyMetadataMap(ctx context.Context, provider peer.ID, contextID []byte) (metadata.Metadata, error) { - md := metadata.Default.New() - data, err := e.ds.Get(ctx, e.keyToMetadataKey(provider, contextID)) - if err != nil { - return md, err - } - if err := md.UnmarshalBinary(data); err != nil { - return md, err - } - return md, nil -} - -func (e *Engine) deleteKeyMetadataMap(ctx context.Context, provider peer.ID, contextID []byte) error { - return e.ds.Delete(ctx, e.keyToMetadataKey(provider, contextID)) -} - -func (e *Engine) putLatestAdv(ctx context.Context, advID []byte) error { - return e.ds.Put(ctx, dsLatestAdvKey, advID) -} - -func (e *Engine) getLatestAdCid(ctx context.Context) (cid.Cid, error) { - b, err := e.ds.Get(ctx, dsLatestAdvKey) - if err != nil { - if errors.Is(err, datastore.ErrNotFound) { - return cid.Undef, nil - } - return cid.Undef, err - } - _, c, err := cid.CidFromBytes(b) - return c, err -} diff --git a/engine/linksystem.go b/engine/linksystem.go deleted file mode 100644 index db95f87..0000000 --- a/engine/linksystem.go +++ /dev/null @@ -1,196 +0,0 @@ -package engine - -import ( - "bytes" - "errors" - "io" - - "github.com/ipfs/go-datastore" - "github.com/ipld/go-ipld-prime" - "github.com/ipld/go-ipld-prime/codec/dagjson" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/ipld/go-ipld-prime/node/basicnode" - "github.com/ipni/go-libipni/ingest/schema" - provider "github.com/ipni/index-provider" - "github.com/libp2p/go-libp2p/core/peer" -) - -var ( - errNoEntries = errors.New("no entries; see schema.NoEntries") - - // ErrEntriesLinkMismatch signals that the link generated from chunking the mulithashes returned by provider.MultihashLister does not match the previously generated link. This error is most likely caused by the lister returning inconsistent multihashes for the same key. - ErrEntriesLinkMismatch = errors.New("regenerated link from multihash lister did not match the original link; multihashes returned by the lister for the same key are not consistent") -) - -// Creates the main engine linksystem. -func (e *Engine) mkLinkSystem() ipld.LinkSystem { - lsys := cidlink.DefaultLinkSystem() - lsys.StorageReadOpener = func(lctx ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { - // If link corresponds to schema.NoEntries return error immediately. - if lnk == schema.NoEntries { - return nil, errNoEntries - } - - ctx := lctx.Ctx - c := lnk.(cidlink.Link).Cid - log.Debugf("Triggered ReadOpener from engine's linksystem with cid (%s)", c) - - // Get the node from main datastore. If it is in the - // main datastore it means it is an advertisement. - val, err := e.ds.Get(ctx, datastore.NewKey(c.String())) - if err != nil && err != datastore.ErrNotFound { - log.Errorf("Error getting object from datastore in linksystem: %s", err) - return nil, err - } - - // If data was retrieved from the datastore, this may be an advertisement. - if len(val) != 0 { - // Decode the node to check its type to see if it is an Advertisement. - n, err := decodeIPLDNode(bytes.NewBuffer(val)) - if err != nil { - log.Errorf("Could not decode IPLD node for potential advertisement: %s", err) - return nil, err - } - // If this was an advertisement, then return it. - if isAdvertisement(n) { - log.Debugw("Retrieved advertisement from datastore", "cid", c, "size", len(val)) - return bytes.NewBuffer(val), nil - } - log.Debugw("Retrieved non-advertisement object from datastore", "cid", c, "size", len(val)) - } - - // Not an advertisement, so this means we are receiving ingestion data. - - // If no lister registered return error - if e.mhLister == nil { - log.Error("No multihash lister has been registered in engine") - return nil, provider.ErrNoMultihashLister - } - - log.Debugw("Checking cache for data", "cid", c) - - // Check if the key is already cached. - b, err := e.entriesChunker.GetRawCachedChunk(ctx, lnk) - if err != nil { - log.Errorf("Error fetching cached list for Cid (%s): %s", c, err) - return nil, err - } - - // If we don't have the link, generate the linked list of entries in - // cache so it is ready to serve for this and future ingestion. - // - // The reason for caching this is because the indexer requests each - // chunk entry, and a specific subset of entries cannot be read from a - // car. So all entry chunks are kept in cache to serve to the indexer. - // The cache uses the entry chunk CID as a key that maps to the entry - // chunk data. - if b == nil { - log.Infow("Entry for CID is not cached, generating chunks", "cid", c) - // If the link is not found, it means that the root link of the list has - // not been generated and we need to get the relationship between the cid - // received and the contextID so the lister knows how to - // regenerate the list of CIDs. It's enough to fetch *any* provider's mapping - // as same entries from different providers would result into the same chunks - key, err := e.getCidKeyMap(ctx, c) - if err != nil { - log.Errorf("Error fetching relationship between CID and contextID: %s", err) - return nil, err - } - - // Get the car iterator needed to create the entry chunks. - // Normally for removal this is not needed since the indexer - // deletes all indexes for the contextID in the removal - // advertisement. Only if the removal had no contextID would the - // indexer ask for entry chunks to remove. - provider, err := peer.IDFromBytes(key.Provider) - if err != nil { - return nil, err - } - mhIter, err := e.mhLister(ctx, provider, key.ContextID) - if err != nil { - return nil, err - } - - // Store the linked list entries in cache as we generate them. We - // use the cache linksystem that stores entries in an in-memory - // datastore. - regeneratedLink, err := e.entriesChunker.Chunk(ctx, mhIter) - if err != nil { - log.Errorf("Error generating linked list from multihash lister: %s", err) - return nil, err - } - if regeneratedLink == nil || !c.Equals(regeneratedLink.(cidlink.Link).Cid) { - log.Errorw("Regeneration of entries link from multihash iterator did not match the original link. Check that multihash iterator consistently returns the same entries for the same key.", "want", lnk, "got", regeneratedLink) - return nil, ErrEntriesLinkMismatch - } - } else { - log.Debugw("Found cache entry for CID", "cid", c) - } - - // Return the linked list node. - val, err = e.entriesChunker.GetRawCachedChunk(ctx, lnk) - if err != nil { - log.Errorf("Error fetching cached list for CID (%s): %s", c, err) - return nil, err - } - - // If no value was populated it means that nothing was found - // in the multiple datastores. - if len(val) == 0 { - log.Errorf("No object found in linksystem for CID (%s)", c) - return nil, datastore.ErrNotFound - } - - return bytes.NewBuffer(val), nil - } - lsys.StorageWriteOpener = func(lctx ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { - buf := bytes.NewBuffer(nil) - return buf, func(lnk ipld.Link) error { - c := lnk.(cidlink.Link).Cid - return e.ds.Put(lctx.Ctx, datastore.NewKey(c.String()), buf.Bytes()) - }, nil - } - return lsys -} - -// vanillaLinkSystem plainly loads and stores from engine datastore. -// -// This is used to plainly load and store links without the complex -// logic of the main linksystem. This is mainly used to retrieve -// stored advertisements through the link from the main blockstore. -func (e *Engine) vanillaLinkSystem() ipld.LinkSystem { - lsys := cidlink.DefaultLinkSystem() - lsys.StorageReadOpener = func(lctx ipld.LinkContext, lnk ipld.Link) (io.Reader, error) { - c := lnk.(cidlink.Link).Cid - val, err := e.ds.Get(lctx.Ctx, datastore.NewKey(c.String())) - if err != nil { - return nil, err - } - return bytes.NewBuffer(val), nil - } - lsys.StorageWriteOpener = func(lctx ipld.LinkContext) (io.Writer, ipld.BlockWriteCommitter, error) { - buf := bytes.NewBuffer(nil) - return buf, func(lnk ipld.Link) error { - c := lnk.(cidlink.Link).Cid - return e.ds.Put(lctx.Ctx, datastore.NewKey(c.String()), buf.Bytes()) - }, nil - } - return lsys -} - -// decodeIPLDNode reads the content of the given reader fully as an IPLD node. -func decodeIPLDNode(r io.Reader) (ipld.Node, error) { - nb := basicnode.Prototype.Any.NewBuilder() - err := dagjson.Decode(nb, r) - if err != nil { - return nil, err - } - return nb.Build(), nil -} - -// isAdvertisement loosely checks if an IPLD node is an advertisement or an index. -// This is done simply by checking if `Signature` filed is present. -func isAdvertisement(n ipld.Node) bool { - indexID, _ := n.LookupByString("Signature") - return indexID != nil -} diff --git a/engine/options.go b/engine/options.go deleted file mode 100644 index 0b27643..0000000 --- a/engine/options.go +++ /dev/null @@ -1,412 +0,0 @@ -package engine - -import ( - "fmt" - "net/url" - - datatransfer "github.com/filecoin-project/go-data-transfer/v2" - "github.com/ipfs/go-datastore" - dssync "github.com/ipfs/go-datastore/sync" - _ "github.com/ipni/go-libipni/maurl" - "github.com/ipni/index-provider/engine/chunker" - "github.com/ipni/index-provider/engine/policy" - "github.com/libp2p/go-libp2p" - pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/libp2p/go-libp2p/core/crypto" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/multiformats/go-multiaddr" - "github.com/multiformats/go-multicodec" -) - -const ( - // NoPublisher indicates that no announcements are made to the network and all advertisements - // are only stored locally. - NoPublisher PublisherKind = "" - - // DataTransferPublisher makes announcements over a gossipsub topic and exposes a - // datatransfer/graphsync server that allows peers in the network to sync advertisements. - DataTransferPublisher PublisherKind = "dtsync" - - // HttpPublisher exposes a HTTP server that announces published advertisements and allows peers - // in the network to sync them over raw HTTP transport. - HttpPublisher PublisherKind = "http" -) - -type ( - // PublisherKind represents the kind of publisher to use in order to announce a new - // advertisement to the network. - // See: WithPublisherKind, NoPublisher, DataTransferPublisher, HttpPublisher. - PublisherKind string - - // Option sets a configuration parameter for the provider engine. - Option func(*options) error - - options struct { - ds datastore.Batching - h host.Host - - // announceURLs is the list of indexer URLs to send direct HTTP - // announce messages to. - announceURLs []*url.URL - - // key is always initialized from the host peerstore. - // Setting an explicit identity must not be exposed unless it is tightly coupled with the - // host identity. Otherwise, the signature of advertisement will not match the libp2p host - // ID. - key crypto.PrivKey - - // It is important to not to change this parameter when running against - // existing datastores. The reason for that is to maintain backward - // compatibility. Older records from previous library versions aren't - // indexed by provider ID as there could have been only one provider in - // the previous versions. Provider host and retrieval addresses can be - // overidden from the NotifyPut and Notify Remove method, otherwise the - // default configured provider will be assumed. - provider peer.AddrInfo - - pubKind PublisherKind - pubDT datatransfer.Manager - // pubHttpAnnounceAddrs are the addresses that are put into announce - // messages to tell the indexer the addresses where advertisement are - // published. - pubHttpAnnounceAddrs []multiaddr.Multiaddr - pubHttpListenAddr string - pubHttpWithoutServer bool - pubHttpHandlerPath string - pubTopicName string - pubTopic *pubsub.Topic - pubExtraGossipData []byte - - entCacheCap int - purgeCache bool - chunker chunker.NewChunkerFunc - - syncPolicy *policy.Policy - } -) - -func newOptions(o ...Option) (*options, error) { - opts := &options{ - pubKind: NoPublisher, - pubHttpListenAddr: "0.0.0.0:3104", - pubTopicName: "/indexer/ingest/mainnet", - // Keep 1024 ad entry DAG in cache; note, the size on disk depends on DAG format and - // multihash code. - entCacheCap: 1024, - // By default use chained Entry Chunk as the format of advertisement entries, with maximum - // 16384 multihashes per chunk. - chunker: chunker.NewChainChunkerFunc(16384), - purgeCache: false, - } - - for _, apply := range o { - if err := apply(opts); err != nil { - return nil, err - } - } - - if opts.syncPolicy == nil { - var err error - opts.syncPolicy, err = policy.New(true, nil) - if err != nil { - return nil, err - } - } - - if opts.ds == nil { - opts.ds = dssync.MutexWrap(datastore.NewMapDatastore()) - } - - if (opts.key == nil || len(opts.provider.Addrs) == 0 || opts.provider.ID == "") && opts.h == nil { - // need a host - h, err := libp2p.New() - if err != nil { - return nil, err - } - log.Infow("Libp2p host is not configured, but required; created a new host.", "id", h.ID()) - opts.h = h - } - - if opts.key == nil { - // Initialize private key from libp2p host - opts.key = opts.h.Peerstore().PrivKey(opts.h.ID()) - } - // Defensively check that host's self private key is indeed set. - if opts.key == nil { - return nil, fmt.Errorf("cannot find private key in self peerstore; libp2p host is misconfigured") - } - - if len(opts.provider.Addrs) == 0 { - opts.provider.Addrs = opts.h.Addrs() - log.Infow("Retrieval address not configured; using host listen addresses instead.", "retrievalAddrs", opts.provider.Addrs) - } - if opts.provider.ID == "" { - opts.provider.ID = opts.h.ID() - log.Infow("Retrieval ID not configured; using host ID instead.", "retrievalID", opts.provider.ID) - } - - return opts, nil -} - -/* TODO: uncomment when reconciled with indexer-provider -func (o *options) retrievalAddrsAsString() []string { - var ras []string - for _, ra := range o.provider.Addrs { - ras = append(ras, ra.String()) - } - return ras -} -*/ - -// WithPurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine -// starts. -// If unset, cache is rehydrated from previously cached entries stored in datastore if present. -// See: WithDatastore. -func WithPurgeCacheOnStart(p bool) Option { - return func(o *options) error { - o.purgeCache = p - return nil - } -} - -// WithChainedEntries sets format of advertisement entries to chained Entry Chunk with the -// given chunkSize as the maximum number of multihashes per chunk. -// -// If unset, advertisement entries are formatted as chained Entry Chunk with default maximum of -// 16384 multihashes per chunk. -// -// To use HAMT as the advertisement entries format, see: WithHamtEntries. -// For caching configuration: WithEntriesCacheCapacity, chunker.CachedEntriesChunker -func WithChainedEntries(chunkSize int) Option { - return func(o *options) error { - o.chunker = chunker.NewChainChunkerFunc(chunkSize) - return nil - } -} - -// WithHamtEntries sets format of advertisement entries to HAMT with the given hash algorithm, -// bit-width and bucket size. -// -// If unset, advertisement entries are formatted as chained Entry Chunk with default maximum of -// 16384 multihashes per chunk. -// -// Only multicodec.Identity, multicodec.Sha2_256 and multicodec.Murmur3X64_64 are supported as hash -// algorithm. -// The bit-width and bucket size must be at least 3 and 1 respectively. -// For more information on HAMT data structure, see: -// - https://ipld.io/specs/advanced-data-layouts/hamt/spec -// - https://github.com/ipld/go-ipld-adl-hamt -// -// For caching configuration: WithEntriesCacheCapacity, chunker.CachedEntriesChunker -func WithHamtEntries(hashAlg multicodec.Code, bitWidth, bucketSize int) Option { - return func(o *options) error { - o.chunker = chunker.NewHamtChunkerFunc(hashAlg, bitWidth, bucketSize) - return nil - } -} - -// WithEntriesCacheCapacity sets the maximum number of advertisement entries DAG to cache. The -// cached DAG may be in chained Entry Chunk or HAMT format. See WithChainedEntries and -// WithHamtEntries to select the ad entries DAG format. -// -// If unset, the default capacity of 1024 is used. This means at most 1024 DAGs will be cached. -// -// The cache is evicted using LRU policy. Note that the capacity dictates the number of complete -// chains that are cached, not individual entry chunks. This means, the maximum storage used by the -// cache is a factor of capacity, chunk size and the length of multihashes in each chunk. -// -// As an example, for 128-bit long multihashes the cache with default capacity of 1024, and default -// chunk size of 16384 can grow up to 256MiB when full. -func WithEntriesCacheCapacity(s int) Option { - return func(o *options) error { - o.entCacheCap = s - return nil - } -} - -// WithPublisherKind sets the kind of publisher used to announce new advertisements. -// If unset, advertisements are only stored locally and no announcements are made. -// See: PublisherKind. -func WithPublisherKind(k PublisherKind) Option { - return func(o *options) error { - o.pubKind = k - return nil - } -} - -// WithHttpPublisherListenAddr sets the net listen address for the HTTP publisher. -// If unset, the default net listen address of '0.0.0.0:3104' is used. -// -// Note that this option only takes effect if the PublisherKind is set to HttpPublisher. -// See: WithPublisherKind. -func WithHttpPublisherListenAddr(addr string) Option { - return func(o *options) error { - o.pubHttpListenAddr = addr - return nil - } -} - -// WithHttpPublisherWithoutServer sets the HTTP publisher to not start a server. -// Setting up the handler is left to the user. -func WithHttpPublisherWithoutServer() Option { - return func(o *options) error { - o.pubHttpWithoutServer = true - return nil - } -} - -// WithHttpPublisherHandlerPath should only be used with -// WithHttpPublisherWithoutServer -func WithHttpPublisherHandlerPath(handlerPath string) Option { - return func(o *options) error { - o.pubHttpHandlerPath = handlerPath - return nil - } -} - -// WithHttpPublisherAnnounceAddr sets the address to be supplied in announce -// messages to tell indexers where to retrieve advertisements. -// -// This option only takes effect if the PublisherKind is set to HttpPublisher. -func WithHttpPublisherAnnounceAddr(addr string) Option { - return func(o *options) error { - if addr != "" { - maddr, err := multiaddr.NewMultiaddr(addr) - if err != nil { - return err - } - o.pubHttpAnnounceAddrs = append(o.pubHttpAnnounceAddrs, maddr) - } - return nil - } -} - -// WithTopicName sets toe topic name on which pubsub announcements are published. -// To override the default pubsub configuration, use WithTopic. -// -// Note that this option only takes effect if the PublisherKind is set to DataTransferPublisher. -// See: WithPublisherKind. -func WithTopicName(t string) Option { - return func(o *options) error { - o.pubTopicName = t - return nil - } -} - -// WithTopic sets the pubsub topic on which new advertisements are announced. -// To use the default pubsub configuration with a specific topic name, use WithTopicName. If both -// options are specified, WithTopic takes presence. -// -// Note that this option only takes effect if the PublisherKind is set to DataTransferPublisher. -// See: WithPublisherKind. -func WithTopic(t *pubsub.Topic) Option { - return func(o *options) error { - o.pubTopic = t - return nil - } -} - -// WithDataTransfer sets the instance of datatransfer.Manager to use. -// If unspecified a new instance is created automatically. -// -// Note that this option only takes effect if the PublisherKind is set to DataTransferPublisher. -// See: WithPublisherKind. -func WithDataTransfer(dt datatransfer.Manager) Option { - return func(o *options) error { - o.pubDT = dt - return nil - } -} - -// WithHost specifies the host to which the provider engine belongs. -// If unspecified, a host is created automatically. -// See: libp2p.New. -func WithHost(h host.Host) Option { - return func(o *options) error { - o.h = h - return nil - } -} - -// WithDatastore sets the datastore that is used by the engine to store advertisements. -// If unspecified, an ephemeral in-memory datastore is used. -// See: datastore.NewMapDatastore. -func WithDatastore(ds datastore.Batching) Option { - return func(o *options) error { - o.ds = ds - return nil - } -} - -// WithRetrievalAddrs sets the addresses that specify where to get the content corresponding to an -// indexing advertisement. -// If unspecified, the libp2p host listen addresses are used. -// See: WithHost. -func WithRetrievalAddrs(addrs ...string) Option { - return func(o *options) error { - if len(addrs) != 0 { - maddrs := make([]multiaddr.Multiaddr, len(addrs)) - for i, a := range addrs { - var err error - maddrs[i], err = multiaddr.NewMultiaddr(a) - if err != nil { - return fmt.Errorf("bad multiaddr %q: %w", a, err) - } - } - o.provider.Addrs = maddrs - } - return nil - } -} - -func WithSyncPolicy(syncPolicy *policy.Policy) Option { - return func(o *options) error { - o.syncPolicy = syncPolicy - return nil - } -} - -// WithProvider sets the peer and addresses for the provider to put in indexing advertisements. -// This value overrides `WithRetrievalAddrs` -func WithProvider(provider peer.AddrInfo) Option { - return func(o *options) error { - o.provider = provider - return nil - } -} - -// WithExtraGossipData supplies extra data to include in the pubsub announcement. -// Note that this option only takes effect if the PublisherKind is set to DataTransferPublisher. -// See: WithPublisherKind. -func WithExtraGossipData(extraData []byte) Option { - return func(o *options) error { - if len(extraData) != 0 { - // Make copy for safety. - o.pubExtraGossipData = make([]byte, len(extraData)) - copy(o.pubExtraGossipData, extraData) - } - return nil - } -} - -func WithPrivateKey(key crypto.PrivKey) Option { - return func(o *options) error { - o.key = key - return nil - } -} - -// WithDirectAnnounce sets indexer URLs to send direct HTTP announcements to. -func WithDirectAnnounce(announceURLs ...string) Option { - return func(o *options) error { - for _, urlStr := range announceURLs { - u, err := url.Parse(urlStr) - if err != nil { - return err - } - o.announceURLs = append(o.announceURLs, u) - } - return nil - } -} diff --git a/go.mod b/go.mod index 4debff3..ec044ea 100644 --- a/go.mod +++ b/go.mod @@ -4,29 +4,24 @@ go 1.20 require ( github.com/dustin/go-humanize v1.0.1 - github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7 github.com/filecoin-project/lassie v0.12.2-0.20230614045620-19b6e938241c - github.com/hashicorp/go-multierror v1.1.1 github.com/ipfs/go-block-format v0.1.2 github.com/ipfs/go-cid v0.4.1 - github.com/ipfs/go-datastore v0.6.0 - github.com/ipfs/go-graphsync v0.14.6 + github.com/ipfs/go-graphsync v0.14.7 github.com/ipfs/go-ipld-format v0.5.0 github.com/ipfs/go-log/v2 v2.5.1 - github.com/ipfs/go-unixfsnode v1.7.1 + github.com/ipfs/go-unixfsnode v1.7.3 github.com/ipld/go-car/v2 v2.10.1 github.com/ipld/go-codec-dagpb v1.6.0 github.com/ipld/go-ipld-prime v0.20.1-0.20230613110822-3142e1304e55 - github.com/ipni/go-libipni v0.2.3 - github.com/ipni/index-provider v0.13.3 - github.com/libp2p/go-libp2p v0.28.0 - github.com/libp2p/go-libp2p-pubsub v0.9.3 - github.com/multiformats/go-multiaddr v0.9.0 - github.com/multiformats/go-multicodec v0.9.0 + github.com/ipni/go-libipni v0.3.4 + github.com/ipni/index-provider v0.13.5 + github.com/libp2p/go-libp2p v0.29.2 + github.com/multiformats/go-multiaddr v0.10.1 github.com/multiformats/go-multihash v0.2.3 github.com/stretchr/testify v1.8.4 - github.com/urfave/cli/v2 v2.25.6 - golang.org/x/term v0.9.0 + github.com/urfave/cli/v2 v2.25.7 + golang.org/x/term v0.10.0 ) require ( @@ -45,16 +40,19 @@ require ( github.com/elastic/gosigar v0.14.2 // indirect github.com/felixge/httpsnoop v1.0.0 // indirect github.com/filecoin-project/go-address v1.1.0 // indirect - github.com/filecoin-project/go-amt-ipld/v4 v4.1.0 // indirect + github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 // indirect github.com/filecoin-project/go-cbor-util v0.0.1 // indirect + github.com/filecoin-project/go-data-transfer/v2 v2.0.0-rc7 // indirect github.com/filecoin-project/go-ds-versioning v0.1.2 // indirect - github.com/filecoin-project/go-hamt-ipld/v3 v3.2.0 // indirect + github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect github.com/filecoin-project/go-retrieval-types v1.2.0 // indirect github.com/filecoin-project/go-state-types v0.10.0 // indirect - github.com/filecoin-project/go-statemachine v1.0.3 // indirect + github.com/filecoin-project/go-statemachine v1.0.2 // indirect github.com/filecoin-project/go-statestore v0.2.0 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect + github.com/gammazero/channelqueue v0.2.1 // indirect + github.com/gammazero/deque v0.2.1 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect @@ -65,23 +63,25 @@ require ( github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect + github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20230214144701-5d17c9d5243c // indirect github.com/hannahhoward/go-pubsub v1.0.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect github.com/huin/goupnp v1.2.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect - github.com/ipfs/boxo v0.10.0 // indirect + github.com/ipfs/boxo v0.10.2-0.20230629143123-2d3edc552442 // indirect github.com/ipfs/go-bitfield v1.1.0 // indirect + github.com/ipfs/go-datastore v0.6.0 // indirect github.com/ipfs/go-ipfs-blocksutil v0.0.1 // indirect github.com/ipfs/go-ipfs-chunker v0.0.5 // indirect github.com/ipfs/go-ipfs-delay v0.0.1 // indirect github.com/ipfs/go-ipfs-pq v0.0.3 // indirect - github.com/ipfs/go-ipfs-util v0.0.2 // indirect + github.com/ipfs/go-ipfs-util v0.0.3 // indirect github.com/ipfs/go-ipld-cbor v0.0.6 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect @@ -92,7 +92,7 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jpillora/backoff v1.0.0 // indirect - github.com/klauspost/compress v1.16.5 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect @@ -100,6 +100,7 @@ require ( github.com/libp2p/go-flow-metrics v0.1.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect github.com/libp2p/go-libp2p-gostream v0.6.0 // indirect + github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect github.com/libp2p/go-libp2p-record v0.2.0 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.0 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect @@ -107,11 +108,11 @@ require ( github.com/libp2p/go-nat v0.2.0 // indirect github.com/libp2p/go-netroute v0.2.1 // indirect github.com/libp2p/go-reuseport v0.3.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.0 // indirect + github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.54 // indirect + github.com/miekg/dns v1.1.55 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect @@ -123,9 +124,10 @@ require ( github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect github.com/multiformats/go-multistream v0.4.1 // indirect github.com/multiformats/go-varint v0.0.7 // indirect - github.com/onsi/ginkgo/v2 v2.9.7 // indirect + github.com/onsi/ginkgo/v2 v2.11.0 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect @@ -133,14 +135,14 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polydawn/refmt v0.89.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_golang v1.15.1 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect - github.com/quic-go/quic-go v0.33.0 // indirect + github.com/quic-go/qtls-go1-19 v0.3.3 // indirect + github.com/quic-go/qtls-go1-20 v0.2.3 // indirect + github.com/quic-go/quic-go v0.36.4 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -150,22 +152,23 @@ require ( github.com/whyrusleeping/cbor-gen v0.0.0-20230418232409-daab9ece03a0 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect - go.opentelemetry.io/otel v1.14.0 // indirect - go.opentelemetry.io/otel/sdk v1.14.0 // indirect - go.opentelemetry.io/otel/trace v1.14.0 // indirect + go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/sdk v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/dig v1.17.0 // indirect - go.uber.org/fx v1.19.2 // indirect + go.uber.org/fx v1.20.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.10.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect - golang.org/x/tools v0.9.1 // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.12.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect + golang.org/x/tools v0.11.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 27b8a7e..99559d3 100644 --- a/go.sum +++ b/go.sum @@ -86,9 +86,8 @@ github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+ github.com/filecoin-project/go-address v1.1.0 h1:ofdtUtEsNxkIxkDw67ecSmvtzaVSdcea4boAmLbnHfE= github.com/filecoin-project/go-address v1.1.0/go.mod h1:5t3z6qPmIADZBtuE9EIzi0EwzcRy2nVhpo0I/c1r0OA= github.com/filecoin-project/go-amt-ipld/v2 v2.1.0/go.mod h1:nfFPoGyX0CU9SkXX8EoCcSuHN1XcbN0c6KBh7yvP5fs= +github.com/filecoin-project/go-amt-ipld/v4 v4.0.0 h1:XM81BJ4/6h3FV0WfFjh74cIDIgqMbJsMBLM0fIuLUUk= github.com/filecoin-project/go-amt-ipld/v4 v4.0.0/go.mod h1:gF053YQ4BIpzTNDoEwHZas7U3oAwncDVGvOHyY8oDpE= -github.com/filecoin-project/go-amt-ipld/v4 v4.1.0 h1:FGgkMxLz2/eZWmpITRXbgX78znZiDMAbBlmK03lry1Q= -github.com/filecoin-project/go-amt-ipld/v4 v4.1.0/go.mod h1:ZY43es4ZuaURy3u31wVb+soWCRj42G/vVs3ew/kjn3I= github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= @@ -105,9 +104,8 @@ github.com/filecoin-project/go-ds-versioning v0.1.2/go.mod h1:C9/l9PnB1+mwPa26BB github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-hamt-ipld/v3 v3.2.0 h1:McvVkfSvpreP8zA5hplCUdzEZgqToSFdZzIEegm1/8Y= -github.com/filecoin-project/go-hamt-ipld/v3 v3.2.0/go.mod h1:T6p2jInnwr6aML/731EEwBg3dEbzlGS8a5SgKXBHcJs= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-retrieval-types v1.2.0 h1:fz6DauLVP3GRg7UuW7HZ6sE+GTmaUW70DTXBF1r9cK0= github.com/filecoin-project/go-retrieval-types v1.2.0/go.mod h1:ojW6wSw2GPyoRDBGqw1K6JxUcbfa5NOSIiyQEeh7KK0= @@ -118,8 +116,8 @@ github.com/filecoin-project/go-state-types v0.1.10/go.mod h1:UwGVoMsULoCK+bWjEdd github.com/filecoin-project/go-state-types v0.10.0 h1:vsSThZIaPmOxNGG59+8D/HnlWRtlbdOjduH6ye+v8f0= github.com/filecoin-project/go-state-types v0.10.0/go.mod h1:aLIas+W8BWAfpLWEPUOGMPBdhcVwoCG4pIQSQk26024= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= -github.com/filecoin-project/go-statemachine v1.0.3 h1:N07o6alys+V1tNoSTi4WuuoeNC4erS/6jE74+NsgQuk= -github.com/filecoin-project/go-statemachine v1.0.3/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= +github.com/filecoin-project/go-statemachine v1.0.2 h1:421SSWBk8GIoCoWYYTE/d+qCWccgmRH0uXotXRDjUbc= +github.com/filecoin-project/go-statemachine v1.0.2/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNdofHZoGPjfNaAo5Q= github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= @@ -133,6 +131,10 @@ github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJn github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gammazero/channelqueue v0.2.1 h1:AcK6wnLrj8koTTn3RxjRCyfmS677TjhIZb1FSMi14qc= +github.com/gammazero/channelqueue v0.2.1/go.mod h1:824o5HHE+yO1xokh36BIuSv8YWwXW0364ku91eRMFS4= +github.com/gammazero/deque v0.2.1 h1:qSdsbG6pgp6nL7A0+K/B7s12mcCY/5l5SIUpMOl+dC0= +github.com/gammazero/deque v0.2.1/go.mod h1:LFroj8x4cMYCukHJDbxFCkT+r9AndaJnFMuZDV34tuU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= @@ -178,6 +180,7 @@ github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaW github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -196,8 +199,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= -github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -235,8 +238,8 @@ github.com/huin/goupnp v1.2.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.10.0 h1:tdDAxq8jrsbRkYoF+5Rcqyeb91hgWe2hp7iLu7ORZLY= -github.com/ipfs/boxo v0.10.0/go.mod h1:Fg+BnfxZ0RPzR0nOodzdIq3A7KgoWAOWsEIImrIQdBM= +github.com/ipfs/boxo v0.10.2-0.20230629143123-2d3edc552442 h1:SGbw381zt6c1VFf3QCBaJ+eVJ4AwD9fPaFKFp9U9Apk= +github.com/ipfs/boxo v0.10.2-0.20230629143123-2d3edc552442/go.mod h1:1qgKq45mPRCxf4ZPoJV2lnXxyxucigILMJOrQrVivv8= github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA= github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= @@ -262,8 +265,9 @@ github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0M github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-graphsync v0.14.6 h1:NPxvuUy4Z08Mg8dwpBzwgbv/PGLIufSJ1sle6iAX8yo= -github.com/ipfs/go-graphsync v0.14.6/go.mod h1:yT0AfjFgicOoWdAlUJ96tQ5AkuGI4r1taIQX/aHbBQo= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/ipfs/go-graphsync v0.14.7 h1:V90NORSdCpUHAgqQhApU/bmPSLOnwtSHM2v7R90k9Do= +github.com/ipfs/go-graphsync v0.14.7/go.mod h1:yT0AfjFgicOoWdAlUJ96tQ5AkuGI4r1taIQX/aHbBQo= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v1.3.0 h1:m2EXaWgwTzAfsmt5UdJ7Is6l4gJcaM/A12XwJyvYvMM= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -276,13 +280,14 @@ github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-exchange-interface v0.2.0 h1:8lMSJmKogZYNo2jjhUs0izT+dck05pqUw4mWNW9Pw6Y= github.com/ipfs/go-ipfs-exchange-offline v0.3.0 h1:c/Dg8GDPzixGd0MC8Jh6mjOwU57uYokgWRFidfvEkuA= -github.com/ipfs/go-ipfs-files v0.0.8 h1:8o0oFJkJ8UkO/ABl8T6ac6tKF3+NIpj67aAB6ZpusRg= +github.com/ipfs/go-ipfs-files v0.3.0 h1:fallckyc5PYjuMEitPNrjRfpwl7YFt69heCOUhsbGxQ= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-pq v0.0.3 h1:YpoHVJB+jzK15mr/xsWC574tyDLkezVrDNeaalQBsTE= github.com/ipfs/go-ipfs-pq v0.0.3/go.mod h1:btNw5hsHBpRcSSgZtiNm/SLj5gYIZ18AKtv3kERkRb4= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= +github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0= +github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= @@ -294,7 +299,7 @@ github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf github.com/ipfs/go-ipld-format v0.5.0 h1:WyEle9K96MSrvr47zZHKKcDxJ/vlpET6PSiQsAFO+Ds= github.com/ipfs/go-ipld-format v0.5.0/go.mod h1:ImdZqJQaEouMjCvqCe0ORUS+uoBmf7Hf+EO/jh+nk3M= github.com/ipfs/go-ipld-legacy v0.2.1 h1:mDFtrBpmU7b//LzLSypVrXsD8QxkEWxu5qVxN99/+tk= -github.com/ipfs/go-libipfs v0.7.0 h1:Mi54WJTODaOL2/ZSm5loi3SwI3jI2OuFWUrQIkJ5cpM= +github.com/ipfs/go-libipfs v0.6.0 h1:3FuckAJEm+zdHbHbf6lAyk0QUzc45LsFcGw102oBCZM= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -313,8 +318,8 @@ github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j github.com/ipfs/go-peertaskqueue v0.8.1 h1:YhxAs1+wxb5jk7RvS0LHdyiILpNmRIRnZVztekOF0pg= github.com/ipfs/go-peertaskqueue v0.8.1/go.mod h1:Oxxd3eaK279FxeydSPPVGHzbwVeHjatZ2GA8XD+KbPU= github.com/ipfs/go-unixfs v0.4.5 h1:wj8JhxvV1G6CD7swACwSKYa+NgtdWC1RUit+gFnymDU= -github.com/ipfs/go-unixfsnode v1.7.1 h1:RRxO2b6CSr5UQ/kxnGzaChTjp5LWTdf3Y4n8ANZgB/s= -github.com/ipfs/go-unixfsnode v1.7.1/go.mod h1:PVfoyZkX1B34qzT3vJO4nsLUpRCyhnMuHBznRcXirlk= +github.com/ipfs/go-unixfsnode v1.7.3 h1:giAxFq7CxAm2Z8h8yFAD7TOQUpf5XG7a2xrR143ci4Y= +github.com/ipfs/go-unixfsnode v1.7.3/go.mod h1:PVfoyZkX1B34qzT3vJO4nsLUpRCyhnMuHBznRcXirlk= github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs= github.com/ipld/go-car/v2 v2.10.1 h1:MRDqkONNW9WRhB79u+Z3U5b+NoN7lYA5B8n8qI3+BoI= github.com/ipld/go-car/v2 v2.10.1/go.mod h1:sQEkXVM3csejlb1kCCb+vQ/pWBKX9QtvsrysMQjOgOg= @@ -325,10 +330,10 @@ github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0/go.mod h1:od github.com/ipld/go-ipld-prime v0.20.1-0.20230613110822-3142e1304e55 h1:D1JUX6l0+ugD3PE99l/NmN/97jz9YNP0uZZRLAGZQhs= github.com/ipld/go-ipld-prime v0.20.1-0.20230613110822-3142e1304e55/go.mod h1:PRQpXNcJypaPiiSdarsrJABPkYrBvafwDl0B9HjujZ8= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo= -github.com/ipni/go-libipni v0.2.3 h1:uuRbHzrt/abYOlkZXSSMqOzekBgPzsY5W3eLf2v/TMQ= -github.com/ipni/go-libipni v0.2.3/go.mod h1:jJd9baZTFVfiLz9H3+qM39NLpUu88VlgdSQZ9sbYrv0= -github.com/ipni/index-provider v0.13.3 h1:KRyR1HPKxCPC0xIpt+1g0/U8itAzwjP7N7Tqn0wvUiA= -github.com/ipni/index-provider v0.13.3/go.mod h1:7M8M8JqGo98jEYjHPlUF5TmyjsQzntm5GZHlh3FLAoo= +github.com/ipni/go-libipni v0.3.4 h1:ZYgCE2TOZt/QJJcBZb+R63FaBLlA2suZGP2IH1fKv4A= +github.com/ipni/go-libipni v0.3.4/go.mod h1:6EIUhN83pd1i6q7SCSCIuuUC3XgR7D/gjKkEnVyIQWE= +github.com/ipni/index-provider v0.13.5 h1:pNOO795k4mR0bwm9npkapSWJld7fYP/8//DMJZi1w/M= +github.com/ipni/index-provider v0.13.5/go.mod h1:W5s+N7iTQXapZwX6pxHkuR4Qh2faahVdmoQFbfCZpKA= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= @@ -355,8 +360,8 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -377,8 +382,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.28.0 h1:zO8cY98nJiPzZpFv5w5gqqb8aVzt4ukQ0nVOSaaKhJ8= -github.com/libp2p/go-libp2p v0.28.0/go.mod h1:s3Xabc9LSwOcnv9UD4nORnXKTsWkPMkIMB/JIGXVnzk= +github.com/libp2p/go-libp2p v0.29.2 h1:uPw/c8hOxoLP/KhFnzlc5Ejqf+OmAL1dwIsqE31WBtY= +github.com/libp2p/go-libp2p v0.29.2/go.mod h1:OU7nSq0aEZMsV2wY8nXn1+XNNt9q2UiR8LjW3Kmp2UE= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= github.com/libp2p/go-libp2p-gostream v0.6.0 h1:QfAiWeQRce6pqnYfmIVWJFXNdDyfiR/qkCnjyaZUPYU= @@ -400,8 +405,8 @@ github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9t github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= github.com/libp2p/go-reuseport v0.3.0 h1:iiZslO5byUYZEg9iCwJGf5h+sf1Agmqx2V2FDjPyvUw= github.com/libp2p/go-reuseport v0.3.0/go.mod h1:laea40AimhtfEqysZ71UpYj4S+R9VpH8PgqLo7L+SwI= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= +github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= +github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= @@ -416,8 +421,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI= -github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -449,8 +454,8 @@ github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= -github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= +github.com/multiformats/go-multiaddr v0.10.1 h1:HghtFrWyZEPrpTvgAMFJi6gFdgHfs2cb0pyfDsk+lqU= +github.com/multiformats/go-multiaddr v0.10.1/go.mod h1:jLEZsA61rwWNZQTHHnqq2HNa+4os/Hz54eqiRnsRqYQ= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= @@ -479,9 +484,9 @@ github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/n github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= -github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= -github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= +github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -504,8 +509,8 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= @@ -518,19 +523,19 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= -github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= -github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= +github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE= +github.com/quic-go/qtls-go1-19 v0.3.3/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.2.3 h1:m575dovXn1y2ATOb1XrRFcrv0F+EQmlowTkoraNkDPI= +github.com/quic-go/qtls-go1-20 v0.2.3/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/quic-go v0.36.4 h1:CXn/ZLN5Vntlk53fjR+kUMC8Jt7flfQe+I5Ty5A+k0o= +github.com/quic-go/quic-go v0.36.4/go.mod h1:qxQumdeKw5GmWs1OsTZZnOxzSI+RJWuhf1O8FN35L2o= github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= github.com/quic-go/webtransport-go v0.5.3/go.mod h1:OhmmgJIzTTqXK5xvtuX0oBpLV2GkLWNDA+UeTGJXErU= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -581,6 +586,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= @@ -588,8 +594,8 @@ github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.25.6 h1:yuSkgDSZfH3L1CjF2/5fNNg2KbM47pY2EvjBq4ESQnU= -github.com/urfave/cli/v2 v2.25.6/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/warpfork/go-testmark v0.12.1 h1:rMgCpJfwy1sJ50x0M0NgyphxYYPMOODIJHhsXyEHU0s= @@ -631,12 +637,14 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= -go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= -go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= -go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= -go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= -go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -645,8 +653,8 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.19.2 h1:SyFgYQFr1Wl0AYstE8vyYIzP4bFz2URrScjwC4cwUvY= -go.uber.org/fx v1.19.2/go.mod h1:43G1VcqSzbIv77y00p1DRAsyZS8WdzuYdhZXmEUkMyQ= +go.uber.org/fx v1.20.0 h1:ZMC/pnRvhsthOZh9MZjMq5U8Or3mA9zBSPaLnzs3ihQ= +go.uber.org/fx v1.20.0/go.mod h1:qCUj0btiR3/JnanEr1TYEePfSw6o/4qYJscgvzQ5Ub0= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= @@ -679,8 +687,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -689,8 +697,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -712,8 +720,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -739,8 +747,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -759,8 +767,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -795,19 +803,19 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -847,8 +855,8 @@ golang.org/x/tools v0.0.0-20200711155855-7342f9734a7d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= -golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=