aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/api
diff options
context:
space:
mode:
authorJavier Peletier <jm@epiclabs.io>2018-10-03 15:15:17 +0800
committerJavier Peletier <jm@epiclabs.io>2018-10-03 15:15:28 +0800
commitde01178c18766b9f744acc94fe2b96804f998e40 (patch)
treeb572a263ff660bd5ded343a5253f86f1f1145e46 /swarm/api
parent696bc9b01ce0ed3347fa1bd64460ccc08091e90a (diff)
downloaddexon-de01178c18766b9f744acc94fe2b96804f998e40.tar.gz
dexon-de01178c18766b9f744acc94fe2b96804f998e40.tar.zst
dexon-de01178c18766b9f744acc94fe2b96804f998e40.zip
swarm/storage/feed: Renamed package
Diffstat (limited to 'swarm/api')
-rw-r--r--swarm/api/api.go48
-rw-r--r--swarm/api/client/client.go16
-rw-r--r--swarm/api/client/client_test.go20
-rw-r--r--swarm/api/http/server.go24
-rw-r--r--swarm/api/http/server_test.go20
-rw-r--r--swarm/api/manifest.go6
6 files changed, 67 insertions, 67 deletions
diff --git a/swarm/api/api.go b/swarm/api/api.go
index a23e09e68..7bb631967 100644
--- a/swarm/api/api.go
+++ b/swarm/api/api.go
@@ -45,8 +45,8 @@ import (
"github.com/ethereum/go-ethereum/swarm/multihash"
"github.com/ethereum/go-ethereum/swarm/spancontext"
"github.com/ethereum/go-ethereum/swarm/storage"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup"
opentracing "github.com/opentracing/opentracing-go"
)
@@ -236,18 +236,18 @@ on top of the FileStore
it is the public interface of the FileStore which is included in the ethereum stack
*/
type API struct {
- feeds *feeds.Handler
+ feed *feed.Handler
fileStore *storage.FileStore
dns Resolver
Decryptor func(context.Context, string) DecryptFunc
}
// NewAPI the api constructor initialises a new API instance.
-func NewAPI(fileStore *storage.FileStore, dns Resolver, feedsHandler *feeds.Handler, pk *ecdsa.PrivateKey) (self *API) {
+func NewAPI(fileStore *storage.FileStore, dns Resolver, feedHandler *feed.Handler, pk *ecdsa.PrivateKey) (self *API) {
self = &API{
fileStore: fileStore,
dns: dns,
- feeds: feedsHandler,
+ feed: feedHandler,
Decryptor: func(ctx context.Context, credentials string) DecryptFunc {
return self.doDecrypt(ctx, credentials, pk)
},
@@ -409,7 +409,7 @@ func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage
if entry.Feed == nil {
return reader, mimeType, status, nil, fmt.Errorf("Cannot decode Feed in manifest")
}
- _, err := a.feeds.Lookup(ctx, feeds.NewQueryLatest(entry.Feed, lookup.NoClue))
+ _, err := a.feed.Lookup(ctx, feed.NewQueryLatest(entry.Feed, lookup.NoClue))
if err != nil {
apiGetNotFound.Inc(1)
status = http.StatusNotFound
@@ -417,7 +417,7 @@ func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage
return reader, mimeType, status, nil, err
}
// get the data of the update
- _, rsrcData, err := a.feeds.GetContent(entry.Feed)
+ _, rsrcData, err := a.feed.GetContent(entry.Feed)
if err != nil {
apiGetNotFound.Inc(1)
status = http.StatusNotFound
@@ -958,13 +958,13 @@ func (a *API) BuildDirectoryTree(ctx context.Context, mhash string, nameresolver
}
// FeedsLookup finds Swarm feeds updates at specific points in time, or the latest update
-func (a *API) FeedsLookup(ctx context.Context, query *feeds.Query) ([]byte, error) {
- _, err := a.feeds.Lookup(ctx, query)
+func (a *API) FeedsLookup(ctx context.Context, query *feed.Query) ([]byte, error) {
+ _, err := a.feed.Lookup(ctx, query)
if err != nil {
return nil, err
}
var data []byte
- _, data, err = a.feeds.GetContent(&query.Feed)
+ _, data, err = a.feed.GetContent(&query.Feed)
if err != nil {
return nil, err
}
@@ -972,18 +972,18 @@ func (a *API) FeedsLookup(ctx context.Context, query *feeds.Query) ([]byte, erro
}
// FeedsNewRequest creates a Request object to update a specific feed
-func (a *API) FeedsNewRequest(ctx context.Context, feed *feeds.Feed) (*feeds.Request, error) {
- return a.feeds.NewRequest(ctx, feed)
+func (a *API) FeedsNewRequest(ctx context.Context, feed *feed.Feed) (*feed.Request, error) {
+ return a.feed.NewRequest(ctx, feed)
}
// FeedsUpdate publishes a new update on the given feed
-func (a *API) FeedsUpdate(ctx context.Context, request *feeds.Request) (storage.Address, error) {
- return a.feeds.Update(ctx, request)
+func (a *API) FeedsUpdate(ctx context.Context, request *feed.Request) (storage.Address, error) {
+ return a.feed.Update(ctx, request)
}
// FeedsHashSize returned the size of the digest produced by Swarm feeds' hashing function
func (a *API) FeedsHashSize() int {
- return a.feeds.HashSize
+ return a.feed.HashSize
}
// ErrCannotLoadFeedManifest is returned when looking up a feeds manifest fails
@@ -993,7 +993,7 @@ var ErrCannotLoadFeedManifest = errors.New("Cannot load feed manifest")
var ErrNotAFeedManifest = errors.New("Not a feed manifest")
// ResolveFeedManifest retrieves the Swarm feed manifest for the given address, and returns the referenced Feed.
-func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*feeds.Feed, error) {
+func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*feed.Feed, error) {
trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt)
if err != nil {
return nil, ErrCannotLoadFeedManifest
@@ -1016,8 +1016,8 @@ var ErrCannotResolveFeed = errors.New("Cannot resolve Feed")
// ResolveFeed attempts to extract feed information out of the manifest, if provided
// If not, it attempts to extract the feed out of a set of key-value pairs
-func (a *API) ResolveFeed(ctx context.Context, uri *URI, values feeds.Values) (*feeds.Feed, error) {
- var feed *feeds.Feed
+func (a *API) ResolveFeed(ctx context.Context, uri *URI, values feed.Values) (*feed.Feed, error) {
+ var fd *feed.Feed
var err error
if uri.Addr != "" {
// resolve the content key.
@@ -1030,20 +1030,20 @@ func (a *API) ResolveFeed(ctx context.Context, uri *URI, values feeds.Values) (*
}
// get the Swarm feed from the manifest
- feed, err = a.ResolveFeedManifest(ctx, manifestAddr)
+ fd, err = a.ResolveFeedManifest(ctx, manifestAddr)
if err != nil {
return nil, err
}
- log.Debug("handle.get.feed: resolved", "manifestkey", manifestAddr, "feed", feed.Hex())
+ log.Debug("handle.get.feed: resolved", "manifestkey", manifestAddr, "feed", fd.Hex())
} else {
- var v feeds.Feed
- if err := v.FromValues(values); err != nil {
+ var f feed.Feed
+ if err := f.FromValues(values); err != nil {
return nil, ErrCannotResolveFeed
}
- feed = &v
+ fd = &f
}
- return feed, nil
+ return fd, nil
}
// MimeOctetStream default value of http Content-Type header
diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go
index ac218e6a7..d9837ca73 100644
--- a/swarm/api/client/client.go
+++ b/swarm/api/client/client.go
@@ -35,7 +35,7 @@ import (
"strings"
"github.com/ethereum/go-ethereum/swarm/api"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed"
)
var (
@@ -608,7 +608,7 @@ var ErrNoFeedUpdatesFound = errors.New("No updates found for this feed")
// data
// Returns the resulting feed manifest address that you can use to include in an ENS Resolver (setContent)
// or reference future updates (Client.UpdateFeed)
-func (c *Client) CreateFeedWithManifest(request *feeds.Request) (string, error) {
+func (c *Client) CreateFeedWithManifest(request *feed.Request) (string, error) {
responseStream, err := c.updateFeed(request, true)
if err != nil {
return "", err
@@ -628,12 +628,12 @@ func (c *Client) CreateFeedWithManifest(request *feeds.Request) (string, error)
}
// UpdateFeed allows you to set a new version of your content
-func (c *Client) UpdateFeed(request *feeds.Request) error {
+func (c *Client) UpdateFeed(request *feed.Request) error {
_, err := c.updateFeed(request, false)
return err
}
-func (c *Client) updateFeed(request *feeds.Request, createManifest bool) (io.ReadCloser, error) {
+func (c *Client) updateFeed(request *feed.Request, createManifest bool) (io.ReadCloser, error) {
URL, err := url.Parse(c.Gateway)
if err != nil {
return nil, err
@@ -662,7 +662,7 @@ func (c *Client) updateFeed(request *feeds.Request, createManifest bool) (io.Rea
// QueryFeed returns a byte stream with the raw content of the feed update
// manifestAddressOrDomain is the address you obtained in CreateFeedWithManifest or an ENS domain whose Resolver
// points to that address
-func (c *Client) QueryFeed(query *feeds.Query, manifestAddressOrDomain string) (io.ReadCloser, error) {
+func (c *Client) QueryFeed(query *feed.Query, manifestAddressOrDomain string) (io.ReadCloser, error) {
return c.queryFeed(query, manifestAddressOrDomain, false)
}
@@ -670,7 +670,7 @@ func (c *Client) QueryFeed(query *feeds.Query, manifestAddressOrDomain string) (
// manifestAddressOrDomain is the address you obtained in CreateFeedWithManifest or an ENS domain whose Resolver
// points to that address
// meta set to true will instruct the node return feed metainformation instead
-func (c *Client) queryFeed(query *feeds.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) {
+func (c *Client) queryFeed(query *feed.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) {
URL, err := url.Parse(c.Gateway)
if err != nil {
return nil, err
@@ -709,7 +709,7 @@ func (c *Client) queryFeed(query *feeds.Query, manifestAddressOrDomain string, m
// GetFeedRequest returns a structure that describes the referenced feed status
// manifestAddressOrDomain is the address you obtained in CreateFeedWithManifest or an ENS domain whose Resolver
// points to that address
-func (c *Client) GetFeedRequest(query *feeds.Query, manifestAddressOrDomain string) (*feeds.Request, error) {
+func (c *Client) GetFeedRequest(query *feed.Query, manifestAddressOrDomain string) (*feed.Request, error) {
responseStream, err := c.queryFeed(query, manifestAddressOrDomain, true)
if err != nil {
@@ -722,7 +722,7 @@ func (c *Client) GetFeedRequest(query *feeds.Query, manifestAddressOrDomain stri
return nil, err
}
- var metadata feeds.Request
+ var metadata feed.Request
if err := metadata.UnmarshalJSON(body); err != nil {
return nil, err
}
diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go
index 2aecdb299..03c6cbb28 100644
--- a/swarm/api/client/client_test.go
+++ b/swarm/api/client/client_test.go
@@ -25,14 +25,14 @@ import (
"sort"
"testing"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/swarm/api"
swarmhttp "github.com/ethereum/go-ethereum/swarm/api/http"
"github.com/ethereum/go-ethereum/swarm/multihash"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed"
"github.com/ethereum/go-ethereum/swarm/testutil"
)
@@ -361,12 +361,12 @@ func TestClientMultipartUpload(t *testing.T) {
}
}
-func newTestSigner() (*feeds.GenericSigner, error) {
+func newTestSigner() (*feed.GenericSigner, error) {
privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")
if err != nil {
return nil, err
}
- return feeds.NewGenericSigner(privKey), nil
+ return feed.NewGenericSigner(privKey), nil
}
// test the transparent resolving of multihash feed updates with bzz:// scheme
@@ -394,9 +394,9 @@ func TestClientCreateFeedMultihash(t *testing.T) {
mh := multihash.ToMultihash(s)
// our feed topic
- topic, _ := feeds.NewTopic("foo.eth", nil)
+ topic, _ := feed.NewTopic("foo.eth", nil)
- createRequest := feeds.NewFirstRequest(topic)
+ createRequest := feed.NewFirstRequest(topic)
createRequest.SetData(mh)
if err := createRequest.Sign(signer); err != nil {
@@ -448,8 +448,8 @@ func TestClientCreateUpdateFeed(t *testing.T) {
databytes := []byte("En un lugar de La Mancha, de cuyo nombre no quiero acordarme...")
// our feed topic name
- topic, _ := feeds.NewTopic("El Quijote", nil)
- createRequest := feeds.NewFirstRequest(topic)
+ topic, _ := feed.NewTopic("El Quijote", nil)
+ createRequest := feed.NewFirstRequest(topic)
createRequest.SetData(databytes)
if err := createRequest.Sign(signer); err != nil {
@@ -508,12 +508,12 @@ func TestClientCreateUpdateFeed(t *testing.T) {
// now try retrieving feed updates without a manifest
- fd := &feeds.Feed{
+ fd := &feed.Feed{
Topic: topic,
User: signer.Address(),
}
- lookupParams := feeds.NewQueryLatest(fd, lookup.NoClue)
+ lookupParams := feed.NewQueryLatest(fd, lookup.NoClue)
reader, err = client.QueryFeed(lookupParams, "")
if err != nil {
t.Fatalf("Error retrieving feed updates: %s", err)
diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go
index 0cfeb1f22..370aca5a7 100644
--- a/swarm/api/http/server.go
+++ b/swarm/api/http/server.go
@@ -40,7 +40,7 @@ import (
"github.com/ethereum/go-ethereum/swarm/api"
"github.com/ethereum/go-ethereum/swarm/log"
"github.com/ethereum/go-ethereum/swarm/storage"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed"
"github.com/rs/cors"
)
@@ -458,7 +458,7 @@ func (s *Server) HandleDelete(w http.ResponseWriter, r *http.Request) {
}
// Handles feed manifest creation and feed updates
-// The POST request admits a JSON structure as defined in the feeds package: `feeds.updateRequestJSON`
+// The POST request admits a JSON structure as defined in the feeds package: `feed.updateRequestJSON`
// The requests can be to a) create a feed manifest, b) update a feed or c) both a+b: create a feed manifest and publish a first update
func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) {
ruid := GetRUID(r.Context())
@@ -466,14 +466,14 @@ func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) {
log.Debug("handle.post.feed", "ruid", ruid)
var err error
- // Creation and update must send feeds.updateRequestJSON JSON structure
+ // Creation and update must send feed.updateRequestJSON JSON structure
body, err := ioutil.ReadAll(r.Body)
if err != nil {
RespondError(w, r, err.Error(), http.StatusInternalServerError)
return
}
- feed, err := s.api.ResolveFeed(r.Context(), uri, r.URL.Query())
+ fd, err := s.api.ResolveFeed(r.Context(), uri, r.URL.Query())
if err != nil { // couldn't parse query string or retrieve manifest
getFail.Inc(1)
httpStatus := http.StatusBadRequest
@@ -484,8 +484,8 @@ func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) {
return
}
- var updateRequest feeds.Request
- updateRequest.Feed = *feed
+ var updateRequest feed.Request
+ updateRequest.Feed = *fd
query := r.URL.Query()
if err := updateRequest.FromValues(query, body); err != nil { // decodes request from query parameters
@@ -552,7 +552,7 @@ func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) {
log.Debug("handle.get.feed", "ruid", ruid)
var err error
- feed, err := s.api.ResolveFeed(r.Context(), uri, r.URL.Query())
+ fd, err := s.api.ResolveFeed(r.Context(), uri, r.URL.Query())
if err != nil { // couldn't parse query string or retrieve manifest
getFail.Inc(1)
httpStatus := http.StatusBadRequest
@@ -565,10 +565,10 @@ func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) {
// determine if the query specifies period and version or it is a metadata query
if r.URL.Query().Get("meta") == "1" {
- unsignedUpdateRequest, err := s.api.FeedsNewRequest(r.Context(), feed)
+ unsignedUpdateRequest, err := s.api.FeedsNewRequest(r.Context(), fd)
if err != nil {
getFail.Inc(1)
- RespondError(w, r, fmt.Sprintf("cannot retrieve feed metadata for feed=%s: %s", feed.Hex(), err), http.StatusNotFound)
+ RespondError(w, r, fmt.Sprintf("cannot retrieve feed metadata for feed=%s: %s", fd.Hex(), err), http.StatusNotFound)
return
}
rawResponse, err := unsignedUpdateRequest.MarshalJSON()
@@ -582,7 +582,7 @@ func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) {
return
}
- lookupParams := &feeds.Query{Feed: *feed}
+ lookupParams := &feed.Query{Feed: *fd}
if err = lookupParams.FromValues(r.URL.Query()); err != nil { // parse period, version
RespondError(w, r, fmt.Sprintf("invalid feed update request:%s", err), http.StatusBadRequest)
return
@@ -598,7 +598,7 @@ func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) {
}
// All ok, serve the retrieved update
- log.Debug("Found update", "feed", feed.Hex(), "ruid", ruid)
+ log.Debug("Found update", "feed", fd.Hex(), "ruid", ruid)
w.Header().Set("Content-Type", api.MimeOctetStream)
http.ServeContent(w, r, "", time.Now(), bytes.NewReader(data))
}
@@ -606,7 +606,7 @@ func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) {
func (s *Server) translateFeedError(w http.ResponseWriter, r *http.Request, supErr string, err error) (int, error) {
code := 0
defaultErr := fmt.Errorf("%s: %v", supErr, err)
- rsrcErr, ok := err.(*feeds.Error)
+ rsrcErr, ok := err.(*feed.Error)
if !ok && rsrcErr != nil {
code = rsrcErr.Code()
}
diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go
index 4ab99b209..1cf7ff577 100644
--- a/swarm/api/http/server_test.go
+++ b/swarm/api/http/server_test.go
@@ -38,7 +38,7 @@ import (
"testing"
"time"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
@@ -48,7 +48,7 @@ import (
swarm "github.com/ethereum/go-ethereum/swarm/api/client"
"github.com/ethereum/go-ethereum/swarm/multihash"
"github.com/ethereum/go-ethereum/swarm/storage"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed"
"github.com/ethereum/go-ethereum/swarm/testutil"
)
@@ -62,12 +62,12 @@ func serverFunc(api *api.API) testutil.TestServer {
return NewServer(api, "")
}
-func newTestSigner() (*feeds.GenericSigner, error) {
+func newTestSigner() (*feed.GenericSigner, error) {
privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")
if err != nil {
return nil, err
}
- return feeds.NewGenericSigner(privKey), nil
+ return feed.NewGenericSigner(privKey), nil
}
// test the transparent resolving of multihash-containing feed updates with bzz:// scheme
@@ -103,8 +103,8 @@ func TestBzzFeedMultihash(t *testing.T) {
log.Info("added data", "manifest", string(b), "data", common.ToHex(mh))
- topic, _ := feeds.NewTopic("foo.eth", nil)
- updateRequest := feeds.NewFirstRequest(topic)
+ topic, _ := feed.NewTopic("foo.eth", nil)
+ updateRequest := feed.NewFirstRequest(topic)
updateRequest.SetData(mh)
@@ -182,8 +182,8 @@ func TestBzzFeed(t *testing.T) {
//data for update 2
update2Data := []byte("foo")
- topic, _ := feeds.NewTopic("foo.eth", nil)
- updateRequest := feeds.NewFirstRequest(topic)
+ topic, _ := feed.NewTopic("foo.eth", nil)
+ updateRequest := feed.NewFirstRequest(topic)
if err != nil {
t.Fatal(err)
}
@@ -319,7 +319,7 @@ func TestBzzFeed(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- updateRequest = &feeds.Request{}
+ updateRequest = &feed.Request{}
if err = updateRequest.UnmarshalJSON(b); err != nil {
t.Fatalf("Error decoding feed metadata: %s", err)
}
@@ -365,7 +365,7 @@ func TestBzzFeed(t *testing.T) {
// test manifest-less queries
log.Info("get first update in update1Timestamp via direct query")
- query := feeds.NewQuery(&updateRequest.Feed, update1Timestamp, lookup.NoClue)
+ query := feed.NewQuery(&updateRequest.Feed, update1Timestamp, lookup.NoClue)
urlq, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL))
if err != nil {
diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go
index e45ae85c4..7c4cc88e4 100644
--- a/swarm/api/manifest.go
+++ b/swarm/api/manifest.go
@@ -27,7 +27,7 @@ import (
"strings"
"time"
- "github.com/ethereum/go-ethereum/swarm/storage/feeds"
+ "github.com/ethereum/go-ethereum/swarm/storage/feed"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/swarm/log"
@@ -56,7 +56,7 @@ type ManifestEntry struct {
ModTime time.Time `json:"mod_time,omitempty"`
Status int `json:"status,omitempty"`
Access *AccessEntry `json:"access,omitempty"`
- Feed *feeds.Feed `json:"feed,omitempty"`
+ Feed *feed.Feed `json:"feed,omitempty"`
}
// ManifestList represents the result of listing files in a manifest
@@ -82,7 +82,7 @@ func (a *API) NewManifest(ctx context.Context, toEncrypt bool) (storage.Address,
// Manifest hack for supporting Swarm feeds from the bzz: scheme
// see swarm/api/api.go:API.Get() for more information
-func (a *API) NewFeedManifest(ctx context.Context, feed *feeds.Feed) (storage.Address, error) {
+func (a *API) NewFeedManifest(ctx context.Context, feed *feed.Feed) (storage.Address, error) {
var manifest Manifest
entry := ManifestEntry{
Feed: feed,