From f1e86ad9cf0470051b7106ee83794d27276b528d Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Sat, 29 Sep 2018 01:00:28 +0200 Subject: [PATCH 1/8] swarm/storage/mru: Renamed all identifiers to Feeds --- cmd/swarm/mru.go | 4 +- cmd/swarm/mru_test.go | 6 +- swarm/api/api.go | 14 ++-- swarm/api/client/client_test.go | 2 +- swarm/api/http/server.go | 8 +-- swarm/api/http/server_test.go | 4 +- swarm/api/manifest.go | 4 +- swarm/network/README.md | 2 +- swarm/storage/mru/cacheentry.go | 8 +-- swarm/storage/mru/doc.go | 2 +- swarm/storage/mru/handler.go | 112 +++++++++++++++--------------- swarm/storage/mru/handler_test.go | 78 ++++++++++----------- swarm/storage/mru/id.go | 24 +++---- swarm/storage/mru/id_test.go | 6 +- swarm/storage/mru/query.go | 16 ++--- swarm/storage/mru/query_test.go | 6 +- swarm/storage/mru/request.go | 34 ++++----- swarm/storage/mru/request_test.go | 38 +++++----- swarm/storage/mru/testutil.go | 12 ++-- swarm/storage/mru/topic.go | 2 +- swarm/storage/mru/update.go | 20 +++--- swarm/storage/mru/update_test.go | 18 ++--- swarm/storage/mru/view.go | 40 +++++------ swarm/storage/mru/view_test.go | 12 ++-- 24 files changed, 236 insertions(+), 236 deletions(-) diff --git a/cmd/swarm/mru.go b/cmd/swarm/mru.go index cc7f634cb..afa73820f 100644 --- a/cmd/swarm/mru.go +++ b/cmd/swarm/mru.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// Command resource allows the user to create and update signed mutable resource updates +// Command resource allows the user to create and update signed Swarm Feeds package main import ( @@ -66,7 +66,7 @@ func resourceCreate(ctx *cli.Context) { ) newResourceRequest := mru.NewFirstRequest(getTopic(ctx)) - newResourceRequest.View.User = resourceGetUser(ctx) + newResourceRequest.Feed.User = resourceGetUser(ctx) manifestAddress, err := client.CreateResource(newResourceRequest) if err != nil { diff --git a/cmd/swarm/mru_test.go b/cmd/swarm/mru_test.go index 142cf9cfd..c52097a6e 100644 --- a/cmd/swarm/mru_test.go +++ b/cmd/swarm/mru_test.go @@ -101,7 +101,7 @@ func TestCLIResourceUpdate(t *testing.T) { } // View configures whose updates we will be looking up. - view := mru.View{ + view := mru.Feed{ Topic: topic, User: address, } @@ -146,8 +146,8 @@ func TestCLIResourceUpdate(t *testing.T) { } // make sure the retrieved view is the same - if request.View != view { - t.Fatalf("Expected view to be: %s, got %s", view, request.View) + if request.Feed != view { + t.Fatalf("Expected view to be: %s, got %s", view, request.Feed) } // test publishing a manifest diff --git a/swarm/api/api.go b/swarm/api/api.go index 7b8f04c13..e6b676dba 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -956,14 +956,14 @@ func (a *API) BuildDirectoryTree(ctx context.Context, mhash string, nameresolver return addr, manifestEntryMap, nil } -// ResourceLookup finds mutable resource updates at specific periods and versions +// ResourceLookup finds Swarm Feeds at specific periods and versions func (a *API) ResourceLookup(ctx context.Context, query *mru.Query) ([]byte, error) { _, err := a.resource.Lookup(ctx, query) if err != nil { return nil, err } var data []byte - _, data, err = a.resource.GetContent(&query.View) + _, data, err = a.resource.GetContent(&query.Feed) if err != nil { return nil, err } @@ -971,7 +971,7 @@ func (a *API) ResourceLookup(ctx context.Context, query *mru.Query) ([]byte, err } // ResourceNewRequest creates a Request object to update a specific mutable resource -func (a *API) ResourceNewRequest(ctx context.Context, view *mru.View) (*mru.Request, error) { +func (a *API) ResourceNewRequest(ctx context.Context, view *mru.Feed) (*mru.Request, error) { return a.resource.NewRequest(ctx, view) } @@ -993,7 +993,7 @@ var ErrCannotLoadResourceManifest = errors.New("Cannot load resource manifest") var ErrNotAResourceManifest = errors.New("Not a resource manifest") // ResolveResourceManifest retrieves the Mutable Resource manifest for the given address, and returns the Resource's view ID. -func (a *API) ResolveResourceManifest(ctx context.Context, addr storage.Address) (*mru.View, error) { +func (a *API) ResolveResourceManifest(ctx context.Context, addr storage.Address) (*mru.Feed, error) { trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt) if err != nil { return nil, ErrCannotLoadResourceManifest @@ -1016,8 +1016,8 @@ var ErrCannotResolveResourceView = errors.New("Cannot resolve resource view") // ResolveResourceView attempts to extract View information out of the manifest, if provided // If not, it attempts to extract the View out of a set of key-value pairs -func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Values) (*mru.View, error) { - var view *mru.View +func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Values) (*mru.Feed, error) { + var view *mru.Feed var err error if uri.Addr != "" { // resolve the content key. @@ -1036,7 +1036,7 @@ func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Valu } log.Debug("handle.get.resource: resolved", "manifestkey", manifestAddr, "view", view.Hex()) } else { - var v mru.View + var v mru.Feed if err := v.FromValues(values); err != nil { return nil, ErrCannotResolveResourceView diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go index 02980de1d..c6ad0237b 100644 --- a/swarm/api/client/client_test.go +++ b/swarm/api/client/client_test.go @@ -508,7 +508,7 @@ func TestClientCreateUpdateResource(t *testing.T) { // now try retrieving resource without a manifest - view := &mru.View{ + view := &mru.Feed{ Topic: topic, User: signer.Address(), } diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index 5ec69373d..4c19dd6df 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -517,7 +517,7 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { } var updateRequest mru.Request - updateRequest.View = *view + updateRequest.Feed = *view query := r.URL.Query() if err := updateRequest.FromValues(query, body); err != nil { // decodes request from query parameters @@ -544,7 +544,7 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { // we create a manifest so we can retrieve the resource with bzz:// later // this manifest has a special "resource type" manifest, and saves the // resource view ID used to retrieve the resource later - m, err := s.api.NewResourceManifest(r.Context(), &updateRequest.View) + m, err := s.api.NewResourceManifest(r.Context(), &updateRequest.Feed) if err != nil { RespondError(w, r, fmt.Sprintf("failed to create resource manifest: %v", err), http.StatusInternalServerError) return @@ -563,7 +563,7 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { } } -// Retrieve mutable resource updates: +// Retrieve Swarm Feeds: // bzz-resource:// - get latest update // bzz-resource:///?period=n - get latest update on period n // bzz-resource:///?period=n&version=m - get update version m of period n @@ -606,7 +606,7 @@ func (s *Server) HandleGetResource(w http.ResponseWriter, r *http.Request) { return } - lookupParams := &mru.Query{View: *view} + lookupParams := &mru.Query{Feed: *view} if err = lookupParams.FromValues(r.URL.Query()); err != nil { // parse period, version RespondError(w, r, fmt.Sprintf("invalid mutable resource request:%s", err), http.StatusBadRequest) return diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 817519a30..0855d30a2 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -206,7 +206,7 @@ func TestBzzResourceMultihash(t *testing.T) { } } -// Test resource updates using the raw update methods +// Test Swarm Feeds using the raw update methods func TestBzzResource(t *testing.T) { srv := testutil.NewTestSwarmServer(t, serverFunc, nil) signer, _ := newTestSigner() @@ -406,7 +406,7 @@ func TestBzzResource(t *testing.T) { // test manifest-less queries log.Info("get first update in update1Timestamp via direct query") - query := mru.NewQuery(&updateRequest.View, update1Timestamp, lookup.NoClue) + query := mru.NewQuery(&updateRequest.Feed, update1Timestamp, lookup.NoClue) urlq, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) if err != nil { diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index 06be7323e..9672ca540 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -56,7 +56,7 @@ type ManifestEntry struct { ModTime time.Time `json:"mod_time,omitempty"` Status int `json:"status,omitempty"` Access *AccessEntry `json:"access,omitempty"` - ResourceView *mru.View `json:"resourceView,omitempty"` + ResourceView *mru.Feed `json:"resourceView,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 Mutable Resource Updates from the bzz: scheme // see swarm/api/api.go:API.Get() for more information -func (a *API) NewResourceManifest(ctx context.Context, view *mru.View) (storage.Address, error) { +func (a *API) NewResourceManifest(ctx context.Context, view *mru.Feed) (storage.Address, error) { var manifest Manifest entry := ManifestEntry{ ResourceView: view, diff --git a/swarm/network/README.md b/swarm/network/README.md index e9c9d30d0..0955fe94e 100644 --- a/swarm/network/README.md +++ b/swarm/network/README.md @@ -37,7 +37,7 @@ Using the streamer logic, various stream types are easy to implement: * live session syncing * historical syncing * simple retrieve requests and deliveries -* mutable resource updates streams +* Swarm Feeds streams * receipting for finger pointing ## Syncing diff --git a/swarm/storage/mru/cacheentry.go b/swarm/storage/mru/cacheentry.go index 280331f77..024ed61c3 100644 --- a/swarm/storage/mru/cacheentry.go +++ b/swarm/storage/mru/cacheentry.go @@ -26,23 +26,23 @@ import ( const ( hasherCount = 8 - resourceHashAlgorithm = storage.SHA3Hash + feedsHashAlgorithm = storage.SHA3Hash defaultRetrieveTimeout = 100 * time.Millisecond ) // cacheEntry caches resource data and the metadata of its root chunk. type cacheEntry struct { - ResourceUpdate + Update *bytes.Reader lastKey storage.Address } // implements storage.LazySectionReader func (r *cacheEntry) Size(ctx context.Context, _ chan bool) (int64, error) { - return int64(len(r.ResourceUpdate.data)), nil + return int64(len(r.Update.data)), nil } //returns the resource's topic func (r *cacheEntry) Topic() Topic { - return r.View.Topic + return r.Feed.Topic } diff --git a/swarm/storage/mru/doc.go b/swarm/storage/mru/doc.go index 19330e0c1..a9ea2076c 100644 --- a/swarm/storage/mru/doc.go +++ b/swarm/storage/mru/doc.go @@ -1,5 +1,5 @@ /* -Package mru defines Mutable resource updates. +Package feeds defines Swarm Feeds. A Mutable Resource is an entity which allows updates to a resource without resorting to ENS on each update. diff --git a/swarm/storage/mru/handler.go b/swarm/storage/mru/handler.go index 3e7654795..034934d05 100644 --- a/swarm/storage/mru/handler.go +++ b/swarm/storage/mru/handler.go @@ -34,8 +34,8 @@ import ( type Handler struct { chunkStore *storage.NetStore HashSize int - resources map[uint64]*cacheEntry - resourceLock sync.RWMutex + cache map[uint64]*cacheEntry + cacheLock sync.RWMutex storeTimeout time.Duration queryMaxPeriods uint32 } @@ -52,26 +52,26 @@ var hashPool sync.Pool func init() { hashPool = sync.Pool{ New: func() interface{} { - return storage.MakeHashFunc(resourceHashAlgorithm)() + return storage.MakeHashFunc(feedsHashAlgorithm)() }, } } // NewHandler creates a new Mutable Resource API func NewHandler(params *HandlerParams) *Handler { - rh := &Handler{ - resources: make(map[uint64]*cacheEntry), + fh := &Handler{ + cache: make(map[uint64]*cacheEntry), } for i := 0; i < hasherCount; i++ { - hashfunc := storage.MakeHashFunc(resourceHashAlgorithm)() - if rh.HashSize == 0 { - rh.HashSize = hashfunc.Size() + hashfunc := storage.MakeHashFunc(feedsHashAlgorithm)() + if fh.HashSize == 0 { + fh.HashSize = hashfunc.Size() } hashPool.Put(hashfunc) } - return rh + return fh } // SetStore sets the store backend for the Mutable Resource API @@ -95,7 +95,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { // First, deserialize the chunk var r Request if err := r.fromChunk(chunkAddr, data); err != nil { - log.Debug("Invalid resource chunk", "addr", chunkAddr.Hex(), "err", err.Error()) + log.Debug("Invalid feed update chunk", "addr", chunkAddr.Hex(), "err", err.Error()) return false } @@ -103,7 +103,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { // If it fails, it means either the signature is not valid, data is corrupted // or someone is trying to update someone else's resource. if err := r.Verify(); err != nil { - log.Debug("Invalid signature", "err", err) + log.Debug("Invalid feed update signature", "err", err) return false } @@ -111,32 +111,32 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { } // GetContent retrieves the data payload of the last synced update of the Mutable Resource -func (h *Handler) GetContent(view *View) (storage.Address, []byte, error) { - if view == nil { +func (h *Handler) GetContent(feed *Feed) (storage.Address, []byte, error) { + if feed == nil { return nil, nil, NewError(ErrInvalidValue, "view is nil") } - rsrc := h.get(view) - if rsrc == nil { + feedUpdate := h.get(feed) + if feedUpdate == nil { return nil, nil, NewError(ErrNotFound, "resource does not exist") } - return rsrc.lastKey, rsrc.data, nil + return feedUpdate.lastKey, feedUpdate.data, nil } // NewRequest prepares a Request structure with all the necessary information to // just add the desired data and sign it. // The resulting structure can then be signed and passed to Handler.Update to be verified and sent -func (h *Handler) NewRequest(ctx context.Context, view *View) (request *Request, err error) { - if view == nil { - return nil, NewError(ErrInvalidValue, "view cannot be nil") +func (h *Handler) NewRequest(ctx context.Context, feed *Feed) (request *Request, err error) { + if feed == nil { + return nil, NewError(ErrInvalidValue, "feed cannot be nil") } now := TimestampProvider.Now().Time request = new(Request) request.Header.Version = ProtocolVersion - query := NewQueryLatest(view, lookup.NoClue) + query := NewQueryLatest(feed, lookup.NoClue) - rsrc, err := h.Lookup(ctx, query) + feedUpdate, err := h.Lookup(ctx, query) if err != nil { if err.(*Error).code != ErrNotFound { return nil, err @@ -145,11 +145,11 @@ func (h *Handler) NewRequest(ctx context.Context, view *View) (request *Request, // or that the resource really does not have updates } - request.View = *view + request.Feed = *feed // if we already have an update, then find next epoch - if rsrc != nil { - request.Epoch = lookup.GetNextEpoch(rsrc.Epoch, now) + if feedUpdate != nil { + request.Epoch = lookup.GetNextEpoch(feedUpdate.Epoch, now) } else { request.Epoch = lookup.GetFirstEpoch(now) } @@ -172,7 +172,7 @@ func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) } if query.Hint == lookup.NoClue { // try to use our cache - entry := h.get(&query.View) + entry := h.get(&query.Feed) if entry != nil && entry.Epoch.Time <= timeLimit { // avoid bad hints query.Hint = entry.Epoch } @@ -183,19 +183,19 @@ func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) return nil, NewError(ErrInit, "Call Handler.SetStore() before performing lookups") } - var ul ID - ul.View = query.View + var id ID + id.Feed = query.Feed var readCount int // Invoke the lookup engine. // The callback will be called every time the lookup algorithm needs to guess requestPtr, err := lookup.Lookup(timeLimit, query.Hint, func(epoch lookup.Epoch, now uint64) (interface{}, error) { readCount++ - ul.Epoch = epoch + id.Epoch = epoch ctx, cancel := context.WithTimeout(ctx, defaultRetrieveTimeout) defer cancel() - chunk, err := h.chunkStore.Get(ctx, ul.Addr()) + chunk, err := h.chunkStore.Get(ctx, id.Addr()) if err != nil { // TODO: check for catastrophic errors other than chunk not found return nil, nil } @@ -227,19 +227,19 @@ func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) func (h *Handler) updateCache(request *Request) (*cacheEntry, error) { updateAddr := request.Addr() - log.Trace("resource cache update", "topic", request.Topic.Hex(), "updatekey", updateAddr, "epoch time", request.Epoch.Time, "epoch level", request.Epoch.Level) + log.Trace("feed cache update", "topic", request.Topic.Hex(), "updateaddr", updateAddr, "epoch time", request.Epoch.Time, "epoch level", request.Epoch.Level) - rsrc := h.get(&request.View) - if rsrc == nil { - rsrc = &cacheEntry{} - h.set(&request.View, rsrc) + feedUpdate := h.get(&request.Feed) + if feedUpdate == nil { + feedUpdate = &cacheEntry{} + h.set(&request.Feed, feedUpdate) } // update our rsrcs entry map - rsrc.lastKey = updateAddr - rsrc.ResourceUpdate = request.ResourceUpdate - rsrc.Reader = bytes.NewReader(rsrc.data) - return rsrc, nil + feedUpdate.lastKey = updateAddr + feedUpdate.Update = request.Update + feedUpdate.Reader = bytes.NewReader(feedUpdate.data) + return feedUpdate, nil } // Update adds an actual data update @@ -255,8 +255,8 @@ func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Ad return nil, NewError(ErrInit, "Call Handler.SetStore() before updating") } - rsrc := h.get(&r.View) - if rsrc != nil && rsrc.Epoch.Equals(r.Epoch) { // This is the only cheap check we can do for sure + feedUpdate := h.get(&r.Feed) + if feedUpdate != nil && feedUpdate.Epoch.Equals(r.Epoch) { // This is the only cheap check we can do for sure return nil, NewError(ErrInvalidValue, "A former update in this epoch is already known to exist") } @@ -267,32 +267,32 @@ func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Ad // send the chunk h.chunkStore.Put(ctx, chunk) - log.Trace("resource update", "updateAddr", r.idAddr, "epoch time", r.Epoch.Time, "epoch level", r.Epoch.Level, "data", chunk.Data()) + log.Trace("feed update", "updateAddr", r.idAddr, "epoch time", r.Epoch.Time, "epoch level", r.Epoch.Level, "data", chunk.Data()) // update our resources map cache entry if the new update is older than the one we have, if we have it. - if rsrc != nil && r.Epoch.After(rsrc.Epoch) { - rsrc.Epoch = r.Epoch - rsrc.data = make([]byte, len(r.data)) - rsrc.lastKey = r.idAddr - copy(rsrc.data, r.data) - rsrc.Reader = bytes.NewReader(rsrc.data) + if feedUpdate != nil && r.Epoch.After(feedUpdate.Epoch) { + feedUpdate.Epoch = r.Epoch + feedUpdate.data = make([]byte, len(r.data)) + feedUpdate.lastKey = r.idAddr + copy(feedUpdate.data, r.data) + feedUpdate.Reader = bytes.NewReader(feedUpdate.data) } return r.idAddr, nil } // Retrieves the resource cache value for the given nameHash -func (h *Handler) get(view *View) *cacheEntry { +func (h *Handler) get(view *Feed) *cacheEntry { mapKey := view.mapKey() - h.resourceLock.RLock() - defer h.resourceLock.RUnlock() - rsrc := h.resources[mapKey] - return rsrc + h.cacheLock.RLock() + defer h.cacheLock.RUnlock() + feedUpdate := h.cache[mapKey] + return feedUpdate } // Sets the resource cache value for the given View -func (h *Handler) set(view *View, rsrc *cacheEntry) { +func (h *Handler) set(view *Feed, feedUpdate *cacheEntry) { mapKey := view.mapKey() - h.resourceLock.Lock() - defer h.resourceLock.Unlock() - h.resources[mapKey] = rsrc + h.cacheLock.Lock() + defer h.cacheLock.Unlock() + h.cache[mapKey] = feedUpdate } diff --git a/swarm/storage/mru/handler_test.go b/swarm/storage/mru/handler_test.go index 13eb9e51b..a4c7969a3 100644 --- a/swarm/storage/mru/handler_test.go +++ b/swarm/storage/mru/handler_test.go @@ -40,7 +40,7 @@ var ( Time: uint64(4200), } cleanF func() - resourceName = "føø.bar" + subtopicName = "føø.bar" hashfunc = storage.MakeHashFunc(storage.DefaultHash) ) @@ -73,7 +73,7 @@ func (f *fakeTimeProvider) Now() Timestamp { } // make updates and retrieve them based on periods and versions -func TestResourceHandler(t *testing.T) { +func TestFeedsHandler(t *testing.T) { // make fake timeProvider clock := &fakeTimeProvider{ @@ -83,7 +83,7 @@ func TestResourceHandler(t *testing.T) { // signer containing private key signer := newAliceSigner() - rh, datadir, teardownTest, err := setupTest(clock, signer) + feedsHandler, datadir, teardownTest, err := setupTest(clock, signer) if err != nil { t.Fatal(err) } @@ -93,8 +93,8 @@ func TestResourceHandler(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - topic, _ := NewTopic("Mess with mru code and see what ghost catches you", nil) - view := View{ + topic, _ := NewTopic("Mess with Swarm Feeds code and see what ghost catches you", nil) + view := Feed{ Topic: topic, User: signer.Address(), } @@ -108,13 +108,13 @@ func TestResourceHandler(t *testing.T) { } request := NewFirstRequest(view.Topic) // this timestamps the update at t = 4200 (start time) - resourcekey := make(map[string]storage.Address) + chunkAddress := make(map[string]storage.Address) data := []byte(updates[0]) request.SetData(data) if err := request.Sign(signer); err != nil { t.Fatal(err) } - resourcekey[updates[0]], err = rh.Update(ctx, request) + chunkAddress[updates[0]], err = feedsHandler.Update(ctx, request) if err != nil { t.Fatal(err) } @@ -122,7 +122,7 @@ func TestResourceHandler(t *testing.T) { // move the clock ahead 21 seconds clock.FastForward(21) // t=4221 - request, err = rh.NewRequest(ctx, &request.View) // this timestamps the update at t = 4221 + request, err = feedsHandler.NewRequest(ctx, &request.Feed) // this timestamps the update at t = 4221 if err != nil { t.Fatal(err) } @@ -136,14 +136,14 @@ func TestResourceHandler(t *testing.T) { if err := request.Sign(signer); err != nil { t.Fatal(err) } - resourcekey[updates[1]], err = rh.Update(ctx, request) + chunkAddress[updates[1]], err = feedsHandler.Update(ctx, request) if err == nil { t.Fatal("Expected update to fail since an update in this epoch already exists") } // move the clock ahead 21 seconds clock.FastForward(21) // t=4242 - request, err = rh.NewRequest(ctx, &request.View) + request, err = feedsHandler.NewRequest(ctx, &request.Feed) if err != nil { t.Fatal(err) } @@ -151,14 +151,14 @@ func TestResourceHandler(t *testing.T) { if err := request.Sign(signer); err != nil { t.Fatal(err) } - resourcekey[updates[1]], err = rh.Update(ctx, request) + chunkAddress[updates[1]], err = feedsHandler.Update(ctx, request) if err != nil { t.Fatal(err) } // move the clock ahead 42 seconds clock.FastForward(42) // t=4284 - request, err = rh.NewRequest(ctx, &request.View) + request, err = feedsHandler.NewRequest(ctx, &request.Feed) if err != nil { t.Fatal(err) } @@ -167,14 +167,14 @@ func TestResourceHandler(t *testing.T) { if err := request.Sign(signer); err != nil { t.Fatal(err) } - resourcekey[updates[2]], err = rh.Update(ctx, request) + chunkAddress[updates[2]], err = feedsHandler.Update(ctx, request) if err != nil { t.Fatal(err) } // move the clock ahead 1 second clock.FastForward(1) // t=4285 - request, err = rh.NewRequest(ctx, &request.View) + request, err = feedsHandler.NewRequest(ctx, &request.Feed) if err != nil { t.Fatal(err) } @@ -187,25 +187,25 @@ func TestResourceHandler(t *testing.T) { if err := request.Sign(signer); err != nil { t.Fatal(err) } - resourcekey[updates[3]], err = rh.Update(ctx, request) + chunkAddress[updates[3]], err = feedsHandler.Update(ctx, request) if err != nil { t.Fatal(err) } time.Sleep(time.Second) - rh.Close() + feedsHandler.Close() // check we can retrieve the updates after close clock.FastForward(2000) // t=6285 - rhparams := &HandlerParams{} + feedParams := &HandlerParams{} - rh2, err := NewTestHandler(datadir, rhparams) + feedsHandler2, err := NewTestHandler(datadir, feedParams) if err != nil { t.Fatal(err) } - rsrc2, err := rh2.Lookup(ctx, NewQueryLatest(&request.View, lookup.NoClue)) + rsrc2, err := feedsHandler2.Lookup(ctx, NewQueryLatest(&request.Feed, lookup.NoClue)) if err != nil { t.Fatal(err) } @@ -223,7 +223,7 @@ func TestResourceHandler(t *testing.T) { log.Debug("Latest lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data) // specific point in time - rsrc, err := rh2.Lookup(ctx, NewQuery(&request.View, 4284, lookup.NoClue)) + rsrc, err := feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, 4284, lookup.NoClue)) if err != nil { t.Fatal(err) } @@ -234,7 +234,7 @@ func TestResourceHandler(t *testing.T) { log.Debug("Historical lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data) // beyond the first should yield an error - rsrc, err = rh2.Lookup(ctx, NewQuery(&request.View, startTime.Time-1, lookup.NoClue)) + rsrc, err = feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, startTime.Time-1, lookup.NoClue)) if err == nil { t.Fatalf("expected previous to fail, returned epoch %s data %v", rsrc.Epoch.String(), rsrc.data) } @@ -270,7 +270,7 @@ func TestSparseUpdates(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() topic, _ := NewTopic("Very slow updates", nil) - view := View{ + view := Feed{ Topic: topic, User: signer.Address(), } @@ -349,12 +349,12 @@ func TestValidator(t *testing.T) { defer teardownTest() // create new resource - topic, _ := NewTopic(resourceName, nil) - view := View{ + topic, _ := NewTopic(subtopicName, nil) + feed := Feed{ Topic: topic, User: signer.Address(), } - mr := NewFirstRequest(view.Topic) + mr := NewFirstRequest(feed.Topic) // chunk with address data := []byte("foo") @@ -410,9 +410,9 @@ func TestValidatorInStore(t *testing.T) { } // set up resource handler and add is as a validator to the localstore - rhParams := &HandlerParams{} - rh := NewHandler(rhParams) - store.Validators = append(store.Validators, rh) + fhParams := &HandlerParams{} + fh := NewHandler(fhParams) + store.Validators = append(store.Validators, fh) // create content addressed chunks, one good, one faulty chunks := storage.GenerateRandomChunks(chunk.DefaultSize, 2) @@ -420,7 +420,7 @@ func TestValidatorInStore(t *testing.T) { badChunk := storage.NewChunk(chunks[1].Address(), goodChunk.Data()) topic, _ := NewTopic("xyzzy", nil) - view := View{ + feed := Feed{ Topic: topic, User: signer.Address(), } @@ -430,7 +430,7 @@ func TestValidatorInStore(t *testing.T) { Epoch: lookup.Epoch{Time: 42, Level: 1, }, - View: view, + Feed: feed, } updateAddr := id.Addr() @@ -438,7 +438,7 @@ func TestValidatorInStore(t *testing.T) { r := new(Request) r.idAddr = updateAddr - r.ResourceUpdate.ID = id + r.Update.ID = id r.data = data r.Sign(signer) @@ -451,20 +451,20 @@ func TestValidatorInStore(t *testing.T) { // put the chunks in the store and check their error status err = store.Put(context.Background(), goodChunk) if err == nil { - t.Fatal("expected error on good content address chunk with resource validator only, but got nil") + t.Fatal("expected error on good content address chunk with feed update validator only, but got nil") } err = store.Put(context.Background(), badChunk) if err == nil { - t.Fatal("expected error on bad content address chunk with resource validator only, but got nil") + t.Fatal("expected error on bad content address chunk with feed update validator only, but got nil") } err = store.Put(context.Background(), uglyChunk) if err != nil { - t.Fatalf("expected no error on resource update chunk with resource validator only, but got: %s", err) + t.Fatalf("expected no error on feed update chunk with feed update validator only, but got: %s", err) } } // create rpc and resourcehandler -func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler, datadir string, teardown func(), err error) { +func setupTest(timeProvider timestampProvider, signer Signer) (fh *TestHandler, datadir string, teardown func(), err error) { var fsClean func() var rpcClean func() @@ -478,7 +478,7 @@ func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler, } // temp datadir - datadir, err = ioutil.TempDir("", "rh") + datadir, err = ioutil.TempDir("", "fh") if err != nil { return nil, "", nil, err } @@ -487,9 +487,9 @@ func setupTest(timeProvider timestampProvider, signer Signer) (rh *TestHandler, } TimestampProvider = timeProvider - rhparams := &HandlerParams{} - rh, err = NewTestHandler(datadir, rhparams) - return rh, datadir, cleanF, err + fhParams := &HandlerParams{} + fh, err = NewTestHandler(datadir, fhParams) + return fh, datadir, cleanF, err } func newAliceSigner() *GenericSigner { diff --git a/swarm/storage/mru/id.go b/swarm/storage/mru/id.go index f008169ed..09ef9e450 100644 --- a/swarm/storage/mru/id.go +++ b/swarm/storage/mru/id.go @@ -29,21 +29,21 @@ import ( // ID uniquely identifies an update on the network. type ID struct { - View `json:"view"` + Feed `json:"view"` lookup.Epoch `json:"epoch"` } // ID layout: -// View viewLength bytes +// Feed feedLength bytes // Epoch EpochLength -const idLength = viewLength + lookup.EpochLength +const idLength = feedLength + lookup.EpochLength // Addr calculates the resource update chunk address corresponding to this ID func (u *ID) Addr() (updateAddr storage.Address) { serializedData := make([]byte, idLength) var cursor int - u.View.binaryPut(serializedData[cursor : cursor+viewLength]) - cursor += viewLength + u.Feed.binaryPut(serializedData[cursor : cursor+feedLength]) + cursor += feedLength eid := u.Epoch.ID() copy(serializedData[cursor:cursor+lookup.EpochLength], eid[:]) @@ -61,10 +61,10 @@ func (u *ID) binaryPut(serializedData []byte) error { return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize ID. Expected %d, got %d", idLength, len(serializedData)) } var cursor int - if err := u.View.binaryPut(serializedData[cursor : cursor+viewLength]); err != nil { + if err := u.Feed.binaryPut(serializedData[cursor : cursor+feedLength]); err != nil { return err } - cursor += viewLength + cursor += feedLength epochBytes, err := u.Epoch.MarshalBinary() if err != nil { @@ -88,10 +88,10 @@ func (u *ID) binaryGet(serializedData []byte) error { } var cursor int - if err := u.View.binaryGet(serializedData[cursor : cursor+viewLength]); err != nil { + if err := u.Feed.binaryGet(serializedData[cursor : cursor+feedLength]); err != nil { return err } - cursor += viewLength + cursor += feedLength if err := u.Epoch.UnmarshalBinary(serializedData[cursor : cursor+lookup.EpochLength]); err != nil { return err @@ -108,8 +108,8 @@ func (u *ID) FromValues(values Values) error { u.Epoch.Level = uint8(level) u.Epoch.Time, _ = strconv.ParseUint(values.Get("time"), 10, 64) - if u.View.User == (common.Address{}) { - return u.View.FromValues(values) + if u.Feed.User == (common.Address{}) { + return u.Feed.FromValues(values) } return nil } @@ -119,5 +119,5 @@ func (u *ID) FromValues(values Values) error { func (u *ID) AppendValues(values Values) { values.Set("level", fmt.Sprintf("%d", u.Epoch.Level)) values.Set("time", fmt.Sprintf("%d", u.Epoch.Time)) - u.View.AppendValues(values) + u.Feed.AppendValues(values) } diff --git a/swarm/storage/mru/id_test.go b/swarm/storage/mru/id_test.go index eba58fbf3..767b3c159 100644 --- a/swarm/storage/mru/id_test.go +++ b/swarm/storage/mru/id_test.go @@ -8,14 +8,14 @@ import ( func getTestID() *ID { return &ID{ - View: *getTestView(), + Feed: *getTestFeed(), Epoch: lookup.GetFirstEpoch(1000), } } func TestIDAddr(t *testing.T) { - ul := getTestID() - updateAddr := ul.Addr() + id := getTestID() + updateAddr := id.Addr() compareByteSliceToExpectedHex(t, "updateAddr", updateAddr, "0x8b24583ec293e085f4c78aaee66d1bc5abfb8b4233304d14a349afa57af2a783") } diff --git a/swarm/storage/mru/query.go b/swarm/storage/mru/query.go index 13a28eaab..c8a7cbe5a 100644 --- a/swarm/storage/mru/query.go +++ b/swarm/storage/mru/query.go @@ -27,7 +27,7 @@ import ( // Query is used to specify constraints when performing an update lookup // TimeLimit indicates an upper bound for the search. Set to 0 for "now" type Query struct { - View + Feed Hint lookup.Epoch TimeLimit uint64 } @@ -41,8 +41,8 @@ func (q *Query) FromValues(values Values) error { level, _ := strconv.ParseUint(values.Get("hint.level"), 10, 32) q.Hint.Level = uint8(level) q.Hint.Time, _ = strconv.ParseUint(values.Get("hint.time"), 10, 64) - if q.View.User == (common.Address{}) { - return q.View.FromValues(values) + if q.Feed.User == (common.Address{}) { + return q.Feed.FromValues(values) } return nil } @@ -59,20 +59,20 @@ func (q *Query) AppendValues(values Values) { if q.Hint.Time != 0 { values.Set("hint.time", fmt.Sprintf("%d", q.Hint.Time)) } - q.View.AppendValues(values) + q.Feed.AppendValues(values) } // NewQuery constructs an Query structure to find updates on or before `time` // if time == 0, the latest update will be looked up -func NewQuery(view *View, time uint64, hint lookup.Epoch) *Query { +func NewQuery(feed *Feed, time uint64, hint lookup.Epoch) *Query { return &Query{ TimeLimit: time, - View: *view, + Feed: *feed, Hint: hint, } } // NewQueryLatest generates lookup parameters that look for the latest version of a resource -func NewQueryLatest(view *View, hint lookup.Epoch) *Query { - return NewQuery(view, 0, hint) +func NewQueryLatest(feed *Feed, hint lookup.Epoch) *Query { + return NewQuery(feed, 0, hint) } diff --git a/swarm/storage/mru/query_test.go b/swarm/storage/mru/query_test.go index 189a465d6..4cfc597b2 100644 --- a/swarm/storage/mru/query_test.go +++ b/swarm/storage/mru/query_test.go @@ -21,11 +21,11 @@ import ( ) func getTestQuery() *Query { - ul := getTestID() + id := getTestID() return &Query{ TimeLimit: 5000, - View: ul.View, - Hint: ul.Epoch, + Feed: id.Feed, + Hint: id.Epoch, } } diff --git a/swarm/storage/mru/request.go b/swarm/storage/mru/request.go index f6d0f38ff..03ffbf038 100644 --- a/swarm/storage/mru/request.go +++ b/swarm/storage/mru/request.go @@ -29,10 +29,10 @@ import ( // Request represents an update and/or resource create message type Request struct { - ResourceUpdate // actual content that will be put on the chunk, less signature - Signature *Signature - idAddr storage.Address // cached chunk address for the update (not serialized, for internal use) - binaryData []byte // cached serialized data (does not get serialized again!, for efficiency/internal use) + Update // actual content that will be put on the chunk, less signature + Signature *Signature + idAddr storage.Address // cached chunk address for the update (not serialized, for internal use) + binaryData []byte // cached serialized data (does not get serialized again!, for efficiency/internal use) } // updateRequestJSON represents a JSON-serialized UpdateRequest @@ -44,11 +44,11 @@ type updateRequestJSON struct { } // Request layout -// resourceUpdate bytes +// Update bytes // SignatureLength bytes const minimumSignedUpdateLength = minimumUpdateDataLength + signatureLength -// NewFirstRequest returns a ready to sign request to publish a first update +// NewFirstRequest returns a ready to sign request to publish a first feed update func NewFirstRequest(topic Topic) *Request { request := new(Request) @@ -56,7 +56,7 @@ func NewFirstRequest(topic Topic) *Request { // get the current time now := TimestampProvider.Now().Time request.Epoch = lookup.GetFirstEpoch(now) - request.View.Topic = topic + request.Feed.Topic = topic request.Header.Version = ProtocolVersion return request @@ -88,7 +88,7 @@ func (r *Request) Verify() (err error) { } // get the address of the signer (which also checks that it's a valid signature) - r.View.User, err = getUserAddr(digest, *r.Signature) + r.Feed.User, err = getUserAddr(digest, *r.Signature) if err != nil { return err } @@ -105,7 +105,7 @@ func (r *Request) Verify() (err error) { // Sign executes the signature to validate the resource func (r *Request) Sign(signer Signer) error { - r.View.User = signer.Address() + r.Feed.User = signer.Address() r.binaryData = nil //invalidate serialized data digest, err := r.GetDigest() // computes digest and serializes into .binaryData if err != nil { @@ -139,10 +139,10 @@ func (r *Request) GetDigest() (result common.Hash, err error) { hasher := hashPool.Get().(hash.Hash) defer hashPool.Put(hasher) hasher.Reset() - dataLength := r.ResourceUpdate.binaryLength() + dataLength := r.Update.binaryLength() if r.binaryData == nil { r.binaryData = make([]byte, dataLength+signatureLength) - if err := r.ResourceUpdate.binaryPut(r.binaryData[:dataLength]); err != nil { + if err := r.Update.binaryPut(r.binaryData[:dataLength]); err != nil { return result, err } } @@ -161,10 +161,10 @@ func (r *Request) toChunk() (storage.Chunk, error) { return nil, NewError(ErrInvalidSignature, "toChunk called without a valid signature or payload data. Call .Sign() first.") } - resourceUpdateLength := r.ResourceUpdate.binaryLength() + updateLength := r.Update.binaryLength() // signature is the last item in the chunk data - copy(r.binaryData[resourceUpdateLength:], r.Signature[:]) + copy(r.binaryData[updateLength:], r.Signature[:]) chunk := storage.NewChunk(r.idAddr, r.binaryData) return chunk, nil @@ -175,13 +175,13 @@ func (r *Request) fromChunk(updateAddr storage.Address, chunkdata []byte) error // for update chunk layout see Request definition //deserialize the resource update portion - if err := r.ResourceUpdate.binaryGet(chunkdata[:len(chunkdata)-signatureLength]); err != nil { + if err := r.Update.binaryGet(chunkdata[:len(chunkdata)-signatureLength]); err != nil { return err } // Extract the signature var signature *Signature - cursor := r.ResourceUpdate.binaryLength() + cursor := r.Update.binaryLength() sigdata := chunkdata[cursor : cursor+signatureLength] if len(sigdata) > 0 { signature = &Signature{} @@ -209,7 +209,7 @@ func (r *Request) FromValues(values Values, data []byte) error { r.Signature = new(Signature) copy(r.Signature[:], signatureBytes) } - err = r.ResourceUpdate.FromValues(values, data) + err = r.Update.FromValues(values, data) if err != nil { return err } @@ -223,7 +223,7 @@ func (r *Request) AppendValues(values Values) []byte { if r.Signature != nil { values.Set("signature", hexutil.Encode(r.Signature[:])) } - return r.ResourceUpdate.AppendValues(values) + return r.Update.AppendValues(values) } // fromJSON takes an update request JSON and populates an UpdateRequest diff --git a/swarm/storage/mru/request_test.go b/swarm/storage/mru/request_test.go index c32d5ec13..e58bf28aa 100644 --- a/swarm/storage/mru/request_test.go +++ b/swarm/storage/mru/request_test.go @@ -53,25 +53,25 @@ func TestEncodingDecodingUpdateRequests(t *testing.T) { charlie := newCharlieSigner() //Charlie bob := newBobSigner() //Bob - // Create a resource to our good guy Charlie's name - topic, _ := NewTopic("a good resource name", nil) - createRequest := NewFirstRequest(topic) - createRequest.User = charlie.Address() + // Create a feed to our good guy Charlie's name + topic, _ := NewTopic("a good topic name", nil) + firstRequest := NewFirstRequest(topic) + firstRequest.User = charlie.Address() // We now encode the create message to simulate we send it over the wire - messageRawData, err := createRequest.MarshalJSON() + messageRawData, err := firstRequest.MarshalJSON() if err != nil { - t.Fatalf("Error encoding create resource request: %s", err) + t.Fatalf("Error encoding first feed update request: %s", err) } // ... the message arrives and is decoded... - var recoveredCreateRequest Request - if err := recoveredCreateRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding create resource request: %s", err) + var recoveredFirstRequest Request + if err := recoveredFirstRequest.UnmarshalJSON(messageRawData); err != nil { + t.Fatalf("Error decoding first feed update request: %s", err) } // ... but verification should fail because it is not signed! - if err := recoveredCreateRequest.Verify(); err == nil { + if err := recoveredFirstRequest.Verify(); err == nil { t.Fatal("Expected Verify to fail since the message is not signed") } @@ -85,13 +85,13 @@ func TestEncodingDecodingUpdateRequests(t *testing.T) { //Put together an unsigned update request that we will serialize to send it to the signer. data := []byte("This hour's update: Swarm 99.0 has been released!") request := &Request{ - ResourceUpdate: ResourceUpdate{ + Update: Update{ ID: ID{ Epoch: lookup.Epoch{ Time: 1000, Level: 1, }, - View: createRequest.ResourceUpdate.View, + Feed: firstRequest.Update.Feed, }, data: data, }, @@ -191,7 +191,7 @@ func TestEncodingDecodingUpdateRequests(t *testing.T) { func getTestRequest() *Request { return &Request{ - ResourceUpdate: *getTestResourceUpdate(), + Update: *getTestFeedUpdate(), } } @@ -258,7 +258,7 @@ func TestReverse(t *testing.T) { defer teardownTest() topic, _ := NewTopic("Cervantes quotes", nil) - view := View{ + view := Feed{ Topic: topic, User: signer.Address(), } @@ -266,7 +266,7 @@ func TestReverse(t *testing.T) { data := []byte("Donde una puerta se cierra, otra se abre") request := new(Request) - request.View = view + request.Feed = view request.Epoch = epoch request.data = data @@ -291,15 +291,15 @@ func TestReverse(t *testing.T) { if err != nil { t.Fatal(err) } - recoveredaddress, err := getUserAddr(checkdigest, *checkUpdate.Signature) + recoveredAddr, err := getUserAddr(checkdigest, *checkUpdate.Signature) if err != nil { t.Fatalf("Retrieve address from signature fail: %v", err) } - originaladdress := crypto.PubkeyToAddress(signer.PrivKey.PublicKey) + originalAddr := crypto.PubkeyToAddress(signer.PrivKey.PublicKey) // check that the metadata retrieved from the chunk matches what we gave it - if recoveredaddress != originaladdress { - t.Fatalf("addresses dont match: %x != %x", originaladdress, recoveredaddress) + if recoveredAddr != originalAddr { + t.Fatalf("addresses dont match: %x != %x", originalAddr, recoveredAddr) } if !bytes.Equal(key[:], chunk.Address()[:]) { diff --git a/swarm/storage/mru/testutil.go b/swarm/storage/mru/testutil.go index 7a5a9e4d9..80e0d4cf0 100644 --- a/swarm/storage/mru/testutil.go +++ b/swarm/storage/mru/testutil.go @@ -27,7 +27,7 @@ import ( ) const ( - testDbDirName = "mru" + testDbDirName = "feeds" ) type TestHandler struct { @@ -52,20 +52,20 @@ func newFakeNetFetcher(context.Context, storage.Address, *sync.Map) storage.NetF // NewTestHandler creates Handler object to be used for testing purposes. func NewTestHandler(datadir string, params *HandlerParams) (*TestHandler, error) { path := filepath.Join(datadir, testDbDirName) - rh := NewHandler(params) + fh := NewHandler(params) localstoreparams := storage.NewDefaultLocalStoreParams() localstoreparams.Init(path) localStore, err := storage.NewLocalStore(localstoreparams, nil) if err != nil { return nil, fmt.Errorf("localstore create fail, path %s: %v", path, err) } - localStore.Validators = append(localStore.Validators, storage.NewContentAddressValidator(storage.MakeHashFunc(resourceHashAlgorithm))) - localStore.Validators = append(localStore.Validators, rh) + localStore.Validators = append(localStore.Validators, storage.NewContentAddressValidator(storage.MakeHashFunc(feedsHashAlgorithm))) + localStore.Validators = append(localStore.Validators, fh) netStore, err := storage.NewNetStore(localStore, nil) if err != nil { return nil, err } netStore.NewNetFetcherFunc = newFakeNetFetcher - rh.SetStore(netStore) - return &TestHandler{rh}, nil + fh.SetStore(netStore) + return &TestHandler{fh}, nil } diff --git a/swarm/storage/mru/topic.go b/swarm/storage/mru/topic.go index f318a5593..5f5720ae2 100644 --- a/swarm/storage/mru/topic.go +++ b/swarm/storage/mru/topic.go @@ -29,7 +29,7 @@ import ( // TopicLength establishes the max length of a topic string const TopicLength = storage.AddressLength -// Topic represents what a resource talks about +// Topic represents what a feed is about type Topic [TopicLength]byte // ErrTopicTooLong is returned when creating a topic with a name/related content too long diff --git a/swarm/storage/mru/update.go b/swarm/storage/mru/update.go index 6aa57fce1..892cb9d1b 100644 --- a/swarm/storage/mru/update.go +++ b/swarm/storage/mru/update.go @@ -34,8 +34,8 @@ type Header struct { Padding [headerLength - 1]uint8 // reserved for future use } -// ResourceUpdate encapsulates the information sent as part of a resource update -type ResourceUpdate struct { +// Update encapsulates the information sent as part of a feed update +type Update struct { Header Header // ID // Resource update identifying information data []byte // actual data payload @@ -44,15 +44,15 @@ type ResourceUpdate struct { const minimumUpdateDataLength = idLength + headerLength + 1 const maxUpdateDataLength = chunk.DefaultSize - signatureLength - idLength - headerLength -// binaryPut serializes the resource update information into the given slice -func (r *ResourceUpdate) binaryPut(serializedData []byte) error { +// binaryPut serializes the feed update information into the given slice +func (r *Update) binaryPut(serializedData []byte) error { datalength := len(r.data) if datalength == 0 { - return NewError(ErrInvalidValue, "cannot update a resource with no data") + return NewError(ErrInvalidValue, "a feed update must contain data") } if datalength > maxUpdateDataLength { - return NewErrorf(ErrInvalidValue, "data is too big (length=%d). Max length=%d", datalength, maxUpdateDataLength) + return NewErrorf(ErrInvalidValue, "feed update data is too big (length=%d). Max length=%d", datalength, maxUpdateDataLength) } if len(serializedData) != r.binaryLength() { @@ -79,12 +79,12 @@ func (r *ResourceUpdate) binaryPut(serializedData []byte) error { } // binaryLength returns the expected number of bytes this structure will take to encode -func (r *ResourceUpdate) binaryLength() int { +func (r *Update) binaryLength() int { return idLength + headerLength + len(r.data) } // binaryGet populates this instance from the information contained in the passed byte slice -func (r *ResourceUpdate) binaryGet(serializedData []byte) error { +func (r *Update) binaryGet(serializedData []byte) error { if len(serializedData) < minimumUpdateDataLength { return NewErrorf(ErrNothingToReturn, "chunk less than %d bytes cannot be a resource update chunk", minimumUpdateDataLength) } @@ -116,7 +116,7 @@ func (r *ResourceUpdate) binaryGet(serializedData []byte) error { // FromValues deserializes this instance from a string key-value store // useful to parse query strings -func (r *ResourceUpdate) FromValues(values Values, data []byte) error { +func (r *Update) FromValues(values Values, data []byte) error { r.data = data version, _ := strconv.ParseUint(values.Get("protocolVersion"), 10, 32) r.Header.Version = uint8(version) @@ -125,7 +125,7 @@ func (r *ResourceUpdate) FromValues(values Values, data []byte) error { // AppendValues serializes this structure into the provided string key-value store // useful to build query strings -func (r *ResourceUpdate) AppendValues(values Values) []byte { +func (r *Update) AppendValues(values Values) []byte { r.ID.AppendValues(values) values.Set("protocolVersion", fmt.Sprintf("%d", r.Header.Version)) return r.data diff --git a/swarm/storage/mru/update_test.go b/swarm/storage/mru/update_test.go index bd706d83a..62c401f3f 100644 --- a/swarm/storage/mru/update_test.go +++ b/swarm/storage/mru/update_test.go @@ -20,31 +20,31 @@ import ( "testing" ) -func getTestResourceUpdate() *ResourceUpdate { - return &ResourceUpdate{ +func getTestFeedUpdate() *Update { + return &Update{ ID: *getTestID(), data: []byte("El que lee mucho y anda mucho, ve mucho y sabe mucho"), } } -func TestResourceUpdateSerializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestResourceUpdate(), "0x0000000000000000776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019456c20717565206c6565206d7563686f207920616e6461206d7563686f2c207665206d7563686f20792073616265206d7563686f") +func TestUpdateSerializer(t *testing.T) { + testBinarySerializerRecovery(t, getTestFeedUpdate(), "0x0000000000000000776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019456c20717565206c6565206d7563686f207920616e6461206d7563686f2c207665206d7563686f20792073616265206d7563686f") } -func TestResourceUpdateLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestResourceUpdate()) +func TestUpdateLengthCheck(t *testing.T) { + testBinarySerializerLengthCheck(t, getTestFeedUpdate()) // Test fail if update is too big - update := getTestResourceUpdate() + update := getTestFeedUpdate() update.data = make([]byte, maxUpdateDataLength+100) serialized := make([]byte, update.binaryLength()) if err := update.binaryPut(serialized); err == nil { - t.Fatal("Expected resourceUpdate.binaryPut to fail since update is too big") + t.Fatal("Expected update.binaryPut to fail since update is too big") } // test fail if data is empty or nil update.data = nil serialized = make([]byte, update.binaryLength()) if err := update.binaryPut(serialized); err == nil { - t.Fatal("Expected resourceUpdate.binaryPut to fail since data is empty") + t.Fatal("Expected update.binaryPut to fail since data is empty") } } diff --git a/swarm/storage/mru/view.go b/swarm/storage/mru/view.go index 2e4ce4a0b..f1a588d44 100644 --- a/swarm/storage/mru/view.go +++ b/swarm/storage/mru/view.go @@ -25,8 +25,8 @@ import ( "github.com/ethereum/go-ethereum/swarm/storage" ) -// View represents a particular user's view of a resource -type View struct { +// Feed represents a particular user's view of a resource +type Feed struct { Topic Topic `json:"topic"` User common.Address `json:"user"` } @@ -34,11 +34,11 @@ type View struct { // View layout: // TopicLength bytes // userAddr common.AddressLength bytes -const viewLength = TopicLength + common.AddressLength +const feedLength = TopicLength + common.AddressLength -// mapKey calculates a unique id for this view for the cache map in `Handler` -func (u *View) mapKey() uint64 { - serializedData := make([]byte, viewLength) +// mapKey calculates a unique id for this feed. Used by the cache map in `Handler` +func (u *Feed) mapKey() uint64 { + serializedData := make([]byte, feedLength) u.binaryPut(serializedData) hasher := hashPool.Get().(hash.Hash) defer hashPool.Put(hasher) @@ -48,10 +48,10 @@ func (u *View) mapKey() uint64 { return *(*uint64)(unsafe.Pointer(&hash[0])) } -// binaryPut serializes this View instance into the provided slice -func (u *View) binaryPut(serializedData []byte) error { - if len(serializedData) != viewLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize View. Expected %d, got %d", viewLength, len(serializedData)) +// binaryPut serializes this Feed instance into the provided slice +func (u *Feed) binaryPut(serializedData []byte) error { + if len(serializedData) != feedLength { + return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize View. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int copy(serializedData[cursor:cursor+TopicLength], u.Topic[:TopicLength]) @@ -64,14 +64,14 @@ func (u *View) binaryPut(serializedData []byte) error { } // binaryLength returns the expected size of this structure when serialized -func (u *View) binaryLength() int { - return viewLength +func (u *Feed) binaryLength() int { + return feedLength } // binaryGet restores the current instance from the information contained in the passed slice -func (u *View) binaryGet(serializedData []byte) error { - if len(serializedData) != viewLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to read View. Expected %d, got %d", viewLength, len(serializedData)) +func (u *Feed) binaryGet(serializedData []byte) error { + if len(serializedData) != feedLength { + return NewErrorf(ErrInvalidValue, "Incorrect slice size to read Feed. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int @@ -84,16 +84,16 @@ func (u *View) binaryGet(serializedData []byte) error { return nil } -// Hex serializes the View to a hex string -func (u *View) Hex() string { - serializedData := make([]byte, viewLength) +// Hex serializes the Feed to a hex string +func (u *Feed) Hex() string { + serializedData := make([]byte, feedLength) u.binaryPut(serializedData) return hexutil.Encode(serializedData) } // FromValues deserializes this instance from a string key-value store // useful to parse query strings -func (u *View) FromValues(values Values) (err error) { +func (u *Feed) FromValues(values Values) (err error) { topic := values.Get("topic") if topic != "" { if err := u.Topic.FromHex(values.Get("topic")); err != nil { @@ -119,7 +119,7 @@ func (u *View) FromValues(values Values) (err error) { // AppendValues serializes this structure into the provided string key-value store // useful to build query strings -func (u *View) AppendValues(values Values) { +func (u *Feed) AppendValues(values Values) { values.Set("topic", u.Topic.Hex()) values.Set("user", u.User.Hex()) } diff --git a/swarm/storage/mru/view_test.go b/swarm/storage/mru/view_test.go index 45720ba79..e2f4d6b30 100644 --- a/swarm/storage/mru/view_test.go +++ b/swarm/storage/mru/view_test.go @@ -19,18 +19,18 @@ import ( "testing" ) -func getTestView() *View { +func getTestFeed() *Feed { topic, _ := NewTopic("world news report, every hour", nil) - return &View{ + return &Feed{ Topic: topic, User: newCharlieSigner().Address(), } } -func TestViewSerializerDeserializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestView(), "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781c") +func TestFeedSerializerDeserializer(t *testing.T) { + testBinarySerializerRecovery(t, getTestFeed(), "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781c") } -func TestMetadataSerializerLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestView()) +func TestFeedSerializerLengthCheck(t *testing.T) { + testBinarySerializerLengthCheck(t, getTestFeed()) } From b35622cf3c758d96874f287d137725946fc6341d Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Sun, 30 Sep 2018 07:48:49 +0200 Subject: [PATCH 2/8] swarm/storage/mru: Renamed all comments to Feeds --- swarm/storage/mru/cacheentry.go | 4 +- swarm/storage/mru/doc.go | 29 +++++----- swarm/storage/mru/error.go | 2 +- swarm/storage/mru/handler.go | 57 +++++++++---------- swarm/storage/mru/handler_test.go | 54 +++++++++--------- swarm/storage/mru/id.go | 4 +- swarm/storage/mru/lookup/lookup.go | 2 +- swarm/storage/mru/query.go | 2 +- swarm/storage/mru/request.go | 12 ++-- swarm/storage/mru/request_test.go | 16 +++--- .../storage/mru/{resource_sign.go => sign.go} | 4 +- swarm/storage/mru/topic.go | 2 +- swarm/storage/mru/update.go | 4 +- swarm/storage/mru/view.go | 6 +- 14 files changed, 96 insertions(+), 102 deletions(-) rename swarm/storage/mru/{resource_sign.go => sign.go} (95%) diff --git a/swarm/storage/mru/cacheentry.go b/swarm/storage/mru/cacheentry.go index 024ed61c3..f6ed72818 100644 --- a/swarm/storage/mru/cacheentry.go +++ b/swarm/storage/mru/cacheentry.go @@ -30,7 +30,7 @@ const ( defaultRetrieveTimeout = 100 * time.Millisecond ) -// cacheEntry caches resource data and the metadata of its root chunk. +// cacheEntry caches the last known update of a specific Feed. type cacheEntry struct { Update *bytes.Reader @@ -42,7 +42,7 @@ func (r *cacheEntry) Size(ctx context.Context, _ chan bool) (int64, error) { return int64(len(r.Update.data)), nil } -//returns the resource's topic +//returns the Feed's topic func (r *cacheEntry) Topic() Topic { return r.Feed.Topic } diff --git a/swarm/storage/mru/doc.go b/swarm/storage/mru/doc.go index a9ea2076c..2cf2d3757 100644 --- a/swarm/storage/mru/doc.go +++ b/swarm/storage/mru/doc.go @@ -1,43 +1,42 @@ /* Package feeds defines Swarm Feeds. -A Mutable Resource is an entity which allows updates to a resource +Swarm Feeds allows a user to build an update feed about a particular topic without resorting to ENS on each update. The update scheme is built on swarm chunks with chunk keys following a predictable, versionable pattern. -A Resource is tied to a unique identifier that is deterministically generated out of +A Feed is tied to a unique identifier that is deterministically generated out of the chosen topic. -A Resource View is defined as a specific user's point of view about a particular resource. -Thus, a View is a Topic + the user's address (userAddr) +A Feed is defined as the series of updates of a specific user about a particular topic Actual data updates are also made in the form of swarm chunks. The keys of the updates are the hash of a concatenation of properties as follows: -updateAddr = H(View, Epoch ID) +updateAddr = H(Feed, Epoch ID) where H is the SHA3 hash function -View is the combination of Topic and the user address +Feed is the combination of Topic and the user address Epoch ID is a time slot. See the lookup package for more information. -A user looking up a resource would only need to know the View in order to -another user's updates +A user looking up a the latest update in a Feed only needs to know the Topic +and the other user's address. -The resource update data is: -resourcedata = View|Epoch|data +The Feed Update data is: +updatedata = Feed|Epoch|data -the full update data that goes in the chunk payload is: +The full update data that goes in the chunk payload is: resourcedata|sign(resourcedata) Structure Summary: -Request: Resource update with signature - ResourceUpdate: headers + data +Request: Feed Update with signature + Update: headers + data Header: Protocol version and reserved for future use placeholders ID: Information about how to locate a specific update - View: Author of the update and what is updating + Feed: Represents a user's series of publications about a specific Topic Topic: Item that the updates are about - User: User who updates the resource + User: User who updates the Feed Epoch: time slot where the update is stored */ diff --git a/swarm/storage/mru/error.go b/swarm/storage/mru/error.go index 18ab52558..714426449 100644 --- a/swarm/storage/mru/error.go +++ b/swarm/storage/mru/error.go @@ -52,7 +52,7 @@ func (e *Error) Code() int { return e.code } -// NewError creates a new Mutable Resource Error object with the specified code and custom error message +// NewError creates a new Swarm Feeds Error object with the specified code and custom error message func NewError(code int, s string) error { if code < 0 || code >= ErrCnt { panic("no such error code!") diff --git a/swarm/storage/mru/handler.go b/swarm/storage/mru/handler.go index 034934d05..3ddeaafae 100644 --- a/swarm/storage/mru/handler.go +++ b/swarm/storage/mru/handler.go @@ -57,7 +57,7 @@ func init() { } } -// NewHandler creates a new Mutable Resource API +// NewHandler creates a new Swarm Feeds API func NewHandler(params *HandlerParams) *Handler { fh := &Handler{ cache: make(map[uint64]*cacheEntry), @@ -74,13 +74,13 @@ func NewHandler(params *HandlerParams) *Handler { return fh } -// SetStore sets the store backend for the Mutable Resource API +// SetStore sets the store backend for the Swarm Feeds API func (h *Handler) SetStore(store *storage.NetStore) { h.chunkStore = store } // Validate is a chunk validation method -// If it looks like a resource update, the chunk address is checked against the userAddr of the update's signature +// If it looks like a feed update, the chunk address is checked against the userAddr of the update's signature // It implements the storage.ChunkValidator interface func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { dataLength := len(data) @@ -89,7 +89,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { } // check if it is a properly formatted update chunk with - // valid signature and proof of ownership of the resource it is trying + // valid signature and proof of ownership of the feed it is trying // to update // First, deserialize the chunk @@ -99,9 +99,9 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { return false } - // Verify signatures and that the signer actually owns the resource + // Verify signatures and that the signer actually owns the feed // If it fails, it means either the signature is not valid, data is corrupted - // or someone is trying to update someone else's resource. + // or someone is trying to update someone else's feed. if err := r.Verify(); err != nil { log.Debug("Invalid feed update signature", "err", err) return false @@ -110,14 +110,14 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { return true } -// GetContent retrieves the data payload of the last synced update of the Mutable Resource +// GetContent retrieves the data payload of the last synced update of the Feed func (h *Handler) GetContent(feed *Feed) (storage.Address, []byte, error) { if feed == nil { - return nil, nil, NewError(ErrInvalidValue, "view is nil") + return nil, nil, NewError(ErrInvalidValue, "feed is nil") } feedUpdate := h.get(feed) if feedUpdate == nil { - return nil, nil, NewError(ErrNotFound, "resource does not exist") + return nil, nil, NewError(ErrNotFound, "feed update not cached") } return feedUpdate.lastKey, feedUpdate.data, nil } @@ -142,7 +142,7 @@ func (h *Handler) NewRequest(ctx context.Context, feed *Feed) (request *Request, return nil, err } // not finding updates means that there is a network error - // or that the resource really does not have updates + // or that the feed really does not have updates } request.Feed = *feed @@ -157,13 +157,10 @@ func (h *Handler) NewRequest(ctx context.Context, feed *Feed) (request *Request, return request, nil } -// Lookup retrieves a specific or latest version of the resource -// Lookup works differently depending on the configuration of `ID` -// See the `ID` documentation and helper functions: -// `LookupLatest` and `LookupBefore` -// When looking for the latest update, it starts at the next period after the current time. -// upon failure tries the corresponding keys of each previous period until one is found -// (or startTime is reached, in which case there are no updates). +// Lookup retrieves a specific or latest feed update +// Lookup works differently depending on the configuration of `query` +// See the `query` documentation and helper functions: +// `NewQueryLatest` and `NewQuery` func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) { timeLimit := query.TimeLimit @@ -213,17 +210,17 @@ func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) return nil, err } - log.Info(fmt.Sprintf("Resource lookup finished in %d lookups", readCount)) + log.Info(fmt.Sprintf("Feed lookup finished in %d lookups", readCount)) request, _ := requestPtr.(*Request) if request == nil { - return nil, NewError(ErrNotFound, "no updates found") + return nil, NewError(ErrNotFound, "no feed updates found") } return h.updateCache(request) } -// update mutable resource cache map with specified content +// update feed updates cache with specified content func (h *Handler) updateCache(request *Request) (*cacheEntry, error) { updateAddr := request.Addr() @@ -242,10 +239,10 @@ func (h *Handler) updateCache(request *Request) (*cacheEntry, error) { return feedUpdate, nil } -// Update adds an actual data update -// Uses the Mutable Resource metadata currently loaded in the resources map entry. -// It is the caller's responsibility to make sure that this data is not stale. -// Note that a Mutable Resource update cannot span chunks, and thus has a MAX NET LENGTH 4096, INCLUDING update header data and signature. An error will be returned if the total length of the chunk payload will exceed this limit. +// Update publishes a feed update +// Note that a Feed update cannot span chunks, and thus has a MAX NET LENGTH 4096, INCLUDING update header data and signature. +// This results in a max payload of `maxUpdateDataLength` (check update.go for more details) +// An error will be returned if the total length of the chunk payload will exceed this limit. // Update can only check if the caller is trying to overwrite the very last known version, otherwise it just puts the update // on the network. func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Address, err error) { @@ -280,18 +277,18 @@ func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Ad return r.idAddr, nil } -// Retrieves the resource cache value for the given nameHash -func (h *Handler) get(view *Feed) *cacheEntry { - mapKey := view.mapKey() +// Retrieves the feed update cache value for the given nameHash +func (h *Handler) get(feed *Feed) *cacheEntry { + mapKey := feed.mapKey() h.cacheLock.RLock() defer h.cacheLock.RUnlock() feedUpdate := h.cache[mapKey] return feedUpdate } -// Sets the resource cache value for the given View -func (h *Handler) set(view *Feed, feedUpdate *cacheEntry) { - mapKey := view.mapKey() +// Sets the feed update cache value for the given Feed +func (h *Handler) set(feed *Feed, feedUpdate *cacheEntry) { + mapKey := feed.mapKey() h.cacheLock.Lock() defer h.cacheLock.Unlock() h.cache[mapKey] = feedUpdate diff --git a/swarm/storage/mru/handler_test.go b/swarm/storage/mru/handler_test.go index a4c7969a3..3bf2bda8b 100644 --- a/swarm/storage/mru/handler_test.go +++ b/swarm/storage/mru/handler_test.go @@ -89,12 +89,12 @@ func TestFeedsHandler(t *testing.T) { } defer teardownTest() - // create a new resource + // create a new Feed ctx, cancel := context.WithCancel(context.Background()) defer cancel() topic, _ := NewTopic("Mess with Swarm Feeds code and see what ghost catches you", nil) - view := Feed{ + feed := Feed{ Topic: topic, User: signer.Address(), } @@ -107,7 +107,7 @@ func TestFeedsHandler(t *testing.T) { "clyde", // t=4285 } - request := NewFirstRequest(view.Topic) // this timestamps the update at t = 4200 (start time) + request := NewFirstRequest(feed.Topic) // this timestamps the update at t = 4200 (start time) chunkAddress := make(map[string]storage.Address) data := []byte(updates[0]) request.SetData(data) @@ -205,38 +205,38 @@ func TestFeedsHandler(t *testing.T) { t.Fatal(err) } - rsrc2, err := feedsHandler2.Lookup(ctx, NewQueryLatest(&request.Feed, lookup.NoClue)) + update2, err := feedsHandler2.Lookup(ctx, NewQueryLatest(&request.Feed, lookup.NoClue)) if err != nil { t.Fatal(err) } // last update should be "clyde" - if !bytes.Equal(rsrc2.data, []byte(updates[len(updates)-1])) { - t.Fatalf("resource data was %v, expected %v", string(rsrc2.data), updates[len(updates)-1]) + if !bytes.Equal(update2.data, []byte(updates[len(updates)-1])) { + t.Fatalf("feed update data was %v, expected %v", string(update2.data), updates[len(updates)-1]) } - if rsrc2.Level != 22 { - t.Fatalf("resource epoch level was %d, expected 22", rsrc2.Level) + if update2.Level != 22 { + t.Fatalf("feed update epoch level was %d, expected 22", update2.Level) } - if rsrc2.Base() != 0 { - t.Fatalf("resource epoch base time was %d, expected 0", rsrc2.Base()) + if update2.Base() != 0 { + t.Fatalf("feed update epoch base time was %d, expected 0", update2.Base()) } - log.Debug("Latest lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data) + log.Debug("Latest lookup", "epoch base time", update2.Base(), "epoch level", update2.Level, "data", update2.data) // specific point in time - rsrc, err := feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, 4284, lookup.NoClue)) + update, err := feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, 4284, lookup.NoClue)) if err != nil { t.Fatal(err) } // check data - if !bytes.Equal(rsrc.data, []byte(updates[2])) { - t.Fatalf("resource data (historical) was %v, expected %v", string(rsrc2.data), updates[2]) + if !bytes.Equal(update.data, []byte(updates[2])) { + t.Fatalf("feed update data (historical) was %v, expected %v", string(update2.data), updates[2]) } - log.Debug("Historical lookup", "epoch base time", rsrc2.Base(), "epoch level", rsrc2.Level, "data", rsrc2.data) + log.Debug("Historical lookup", "epoch base time", update2.Base(), "epoch level", update2.Level, "data", update2.data) // beyond the first should yield an error - rsrc, err = feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, startTime.Time-1, lookup.NoClue)) + update, err = feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, startTime.Time-1, lookup.NoClue)) if err == nil { - t.Fatalf("expected previous to fail, returned epoch %s data %v", rsrc.Epoch.String(), rsrc.data) + t.Fatalf("expected previous to fail, returned epoch %s data %v", update.Epoch.String(), update.data) } } @@ -266,11 +266,11 @@ func TestSparseUpdates(t *testing.T) { defer teardownTest() defer os.RemoveAll(datadir) - // create a new resource + // create a new Feed ctx, cancel := context.WithCancel(context.Background()) defer cancel() topic, _ := NewTopic("Very slow updates", nil) - view := Feed{ + feed := Feed{ Topic: topic, User: signer.Address(), } @@ -280,7 +280,7 @@ func TestSparseUpdates(t *testing.T) { var epoch lookup.Epoch var lastUpdateTime uint64 for T := uint64(0); T < today; T += 5 * Year { - request := NewFirstRequest(view.Topic) + request := NewFirstRequest(feed.Topic) request.Epoch = lookup.GetNextEpoch(epoch, T) request.data = generateData(T) // this generates some data that depends on T, so we can check later request.Sign(signer) @@ -295,14 +295,14 @@ func TestSparseUpdates(t *testing.T) { lastUpdateTime = T } - query := NewQuery(&view, today, lookup.NoClue) + query := NewQuery(&feed, today, lookup.NoClue) _, err = rh.Lookup(ctx, query) if err != nil { t.Fatal(err) } - _, content, err := rh.GetContent(&view) + _, content, err := rh.GetContent(&feed) if err != nil { t.Fatal(err) } @@ -321,7 +321,7 @@ func TestSparseUpdates(t *testing.T) { t.Fatal(err) } - _, content, err = rh.GetContent(&view) + _, content, err = rh.GetContent(&feed) if err != nil { t.Fatal(err) } @@ -348,7 +348,7 @@ func TestValidator(t *testing.T) { } defer teardownTest() - // create new resource + // create new Feed topic, _ := NewTopic(subtopicName, nil) feed := Feed{ Topic: topic, @@ -382,7 +382,7 @@ func TestValidator(t *testing.T) { } // tests that the content address validator correctly checks the data -// tests that resource update chunks are passed through content address validator +// tests that Feed update chunks are passed through content address validator // there is some redundancy in this test as it also tests content addressed chunks, // which should be evaluated as invalid chunks by this validator func TestValidatorInStore(t *testing.T) { @@ -409,7 +409,7 @@ func TestValidatorInStore(t *testing.T) { t.Fatal(err) } - // set up resource handler and add is as a validator to the localstore + // set up Swarm Feeds handler and add is as a validator to the localstore fhParams := &HandlerParams{} fh := NewHandler(fhParams) store.Validators = append(store.Validators, fh) @@ -425,7 +425,7 @@ func TestValidatorInStore(t *testing.T) { User: signer.Address(), } - // create a resource update chunk with correct publickey + // create a feed update chunk with correct publickey id := ID{ Epoch: lookup.Epoch{Time: 42, Level: 1, diff --git a/swarm/storage/mru/id.go b/swarm/storage/mru/id.go index 09ef9e450..dcc88ac2a 100644 --- a/swarm/storage/mru/id.go +++ b/swarm/storage/mru/id.go @@ -29,7 +29,7 @@ import ( // ID uniquely identifies an update on the network. type ID struct { - Feed `json:"view"` + Feed `json:"feed"` lookup.Epoch `json:"epoch"` } @@ -38,7 +38,7 @@ type ID struct { // Epoch EpochLength const idLength = feedLength + lookup.EpochLength -// Addr calculates the resource update chunk address corresponding to this ID +// Addr calculates the feed update chunk address corresponding to this ID func (u *ID) Addr() (updateAddr storage.Address) { serializedData := make([]byte, idLength) var cursor int diff --git a/swarm/storage/mru/lookup/lookup.go b/swarm/storage/mru/lookup/lookup.go index c98248d70..a5154d261 100644 --- a/swarm/storage/mru/lookup/lookup.go +++ b/swarm/storage/mru/lookup/lookup.go @@ -15,7 +15,7 @@ // along with the go-ethereum library. If not, see . /* -Package lookup defines resource lookup algorithms and provides tools to place updates +Package lookup defines Feed lookup algorithms and provides tools to place updates so they can be found */ package lookup diff --git a/swarm/storage/mru/query.go b/swarm/storage/mru/query.go index c8a7cbe5a..a0b358bfd 100644 --- a/swarm/storage/mru/query.go +++ b/swarm/storage/mru/query.go @@ -72,7 +72,7 @@ func NewQuery(feed *Feed, time uint64, hint lookup.Epoch) *Query { } } -// NewQueryLatest generates lookup parameters that look for the latest version of a resource +// NewQueryLatest generates lookup parameters that look for the latest update to a feed func NewQueryLatest(feed *Feed, hint lookup.Epoch) *Query { return NewQuery(feed, 0, hint) } diff --git a/swarm/storage/mru/request.go b/swarm/storage/mru/request.go index 03ffbf038..ca88adda1 100644 --- a/swarm/storage/mru/request.go +++ b/swarm/storage/mru/request.go @@ -27,7 +27,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" ) -// Request represents an update and/or resource create message +// Request represents a request to sign or signed Feed Update message type Request struct { Update // actual content that will be put on the chunk, less signature Signature *Signature @@ -62,7 +62,7 @@ func NewFirstRequest(topic Topic) *Request { return request } -// SetData stores the payload data the resource will be updated with +// SetData stores the payload data the feed update will be updated with func (r *Request) SetData(data []byte) { r.data = data r.Signature = nil @@ -73,7 +73,7 @@ func (r *Request) IsUpdate() bool { return r.Signature != nil } -// Verify checks that signatures are valid and that the signer owns the resource to be updated +// Verify checks that signatures are valid func (r *Request) Verify() (err error) { if len(r.data) == 0 { return NewError(ErrInvalidValue, "Update does not contain data") @@ -103,7 +103,7 @@ func (r *Request) Verify() (err error) { return nil } -// Sign executes the signature to validate the resource +// Sign executes the signature to validate the update message func (r *Request) Sign(signer Signer) error { r.Feed.User = signer.Address() r.binaryData = nil //invalidate serialized data @@ -133,7 +133,7 @@ func (r *Request) Sign(signer Signer) error { return nil } -// GetDigest creates the resource update digest used in signatures +// GetDigest creates the feed update digest used in signatures // the serialized payload is cached in .binaryData func (r *Request) GetDigest() (result common.Hash, err error) { hasher := hashPool.Get().(hash.Hash) @@ -174,7 +174,7 @@ func (r *Request) toChunk() (storage.Chunk, error) { func (r *Request) fromChunk(updateAddr storage.Address, chunkdata []byte) error { // for update chunk layout see Request definition - //deserialize the resource update portion + //deserialize the feed update portion if err := r.Update.binaryGet(chunkdata[:len(chunkdata)-signatureLength]); err != nil { return err } diff --git a/swarm/storage/mru/request_test.go b/swarm/storage/mru/request_test.go index e58bf28aa..33e975756 100644 --- a/swarm/storage/mru/request_test.go +++ b/swarm/storage/mru/request_test.go @@ -47,7 +47,7 @@ func areEqualJSON(s1, s2 string) (bool, error) { } // TestEncodingDecodingUpdateRequests ensures that requests are serialized properly -// while also checking cryptographically that only the owner of a resource can update it. +// while also checking cryptographically that only the owner of a Feed can update it. func TestEncodingDecodingUpdateRequests(t *testing.T) { charlie := newCharlieSigner() //Charlie @@ -75,12 +75,10 @@ func TestEncodingDecodingUpdateRequests(t *testing.T) { t.Fatal("Expected Verify to fail since the message is not signed") } - // We now assume that the resource was created and propagated. With rootAddr we can retrieve the resource metadata - // and recover the information above. To sign an update, we need the rootAddr and the metaHash to construct - // proof of ownership + // We now assume that the feed ypdate was created and propagated. - const expectedSignature = "0x32c2d2c7224e24e4d3ae6a10595fc6e945f1b3ecdf548a04d8247c240a50c9240076aa7730abad6c8a46dfea00cfb8f43b6211f02db5c4cc5ed8584cb0212a4d00" - const expectedJSON = `{"view":{"topic":"0x6120676f6f64207265736f75726365206e616d65000000000000000000000000","user":"0x876a8936a7cd0b79ef0735ad0896c1afe278781c"},"epoch":{"time":1000,"level":1},"protocolVersion":0,"data":"0x5468697320686f75722773207570646174653a20537761726d2039392e3020686173206265656e2072656c656173656421"}` + const expectedSignature = "0x7235b27a68372ddebcf78eba48543fa460864b0b0e99cb533fcd3664820e603312d29426dd00fb39628f5299480a69bf6e462838d78de49ce0704c754c9deb2601" + const expectedJSON = `{"feed":{"topic":"0x6120676f6f6420746f706963206e616d65000000000000000000000000000000","user":"0x876a8936a7cd0b79ef0735ad0896c1afe278781c"},"epoch":{"time":1000,"level":1},"protocolVersion":0,"data":"0x5468697320686f75722773207570646174653a20537761726d2039392e3020686173206265656e2072656c656173656421"}` //Put together an unsigned update request that we will serialize to send it to the signer. data := []byte("This hour's update: Swarm 99.0 has been released!") @@ -138,7 +136,7 @@ func TestEncodingDecodingUpdateRequests(t *testing.T) { t.Fatal("Expected DecodeUpdateRequest to fail when trying to interpret a corrupt message with an invalid signature") } - // Now imagine Bob wants to create an update of his own about the same resource, + // Now imagine Bob wants to create an update of his own about the same Feed, // signing a message with his private key if err := request.Sign(bob); err != nil { t.Fatalf("Error signing: %s", err) @@ -258,7 +256,7 @@ func TestReverse(t *testing.T) { defer teardownTest() topic, _ := NewTopic("Cervantes quotes", nil) - view := Feed{ + feed := Feed{ Topic: topic, User: signer.Address(), } @@ -266,7 +264,7 @@ func TestReverse(t *testing.T) { data := []byte("Donde una puerta se cierra, otra se abre") request := new(Request) - request.Feed = view + request.Feed = feed request.Epoch = epoch request.data = data diff --git a/swarm/storage/mru/resource_sign.go b/swarm/storage/mru/sign.go similarity index 95% rename from swarm/storage/mru/resource_sign.go rename to swarm/storage/mru/sign.go index 58196f10e..03b0fa2b6 100644 --- a/swarm/storage/mru/resource_sign.go +++ b/swarm/storage/mru/sign.go @@ -28,7 +28,7 @@ const signatureLength = 65 // Signature is an alias for a static byte array with the size of a signature type Signature [signatureLength]byte -// Signer signs Mutable Resource update payloads +// Signer signs Feed update payloads type Signer interface { Sign(common.Hash) (Signature, error) Address() common.Address @@ -65,7 +65,7 @@ func (s *GenericSigner) Address() common.Address { return s.address } -// getUserAddr extracts the address of the resource update signer +// getUserAddr extracts the address of the Feed update signer func getUserAddr(digest common.Hash, signature Signature) (common.Address, error) { pub, err := crypto.SigToPub(digest.Bytes(), signature[:]) if err != nil { diff --git a/swarm/storage/mru/topic.go b/swarm/storage/mru/topic.go index 5f5720ae2..b6adb4cd7 100644 --- a/swarm/storage/mru/topic.go +++ b/swarm/storage/mru/topic.go @@ -74,7 +74,7 @@ func (t *Topic) FromHex(hex string) error { return nil } -// Name will try to extract the resource name out of the topic +// Name will try to extract the topic name out of the Topic func (t *Topic) Name(relatedContent []byte) string { nameBytes := *t if relatedContent != nil { diff --git a/swarm/storage/mru/update.go b/swarm/storage/mru/update.go index 892cb9d1b..f6e70b4d8 100644 --- a/swarm/storage/mru/update.go +++ b/swarm/storage/mru/update.go @@ -37,7 +37,7 @@ type Header struct { // Update encapsulates the information sent as part of a feed update type Update struct { Header Header // - ID // Resource update identifying information + ID // Feed Update identifying information data []byte // actual data payload } @@ -86,7 +86,7 @@ func (r *Update) binaryLength() int { // binaryGet populates this instance from the information contained in the passed byte slice func (r *Update) binaryGet(serializedData []byte) error { if len(serializedData) < minimumUpdateDataLength { - return NewErrorf(ErrNothingToReturn, "chunk less than %d bytes cannot be a resource update chunk", minimumUpdateDataLength) + return NewErrorf(ErrNothingToReturn, "chunk less than %d bytes cannot be a feed update chunk", minimumUpdateDataLength) } dataLength := len(serializedData) - idLength - headerLength // at this point we can be satisfied that we have the correct data length to read diff --git a/swarm/storage/mru/view.go b/swarm/storage/mru/view.go index f1a588d44..8d21ef7a4 100644 --- a/swarm/storage/mru/view.go +++ b/swarm/storage/mru/view.go @@ -25,13 +25,13 @@ import ( "github.com/ethereum/go-ethereum/swarm/storage" ) -// Feed represents a particular user's view of a resource +// Feed represents a particular user's stream of updates on a Topic type Feed struct { Topic Topic `json:"topic"` User common.Address `json:"user"` } -// View layout: +// Feed layout: // TopicLength bytes // userAddr common.AddressLength bytes const feedLength = TopicLength + common.AddressLength @@ -51,7 +51,7 @@ func (u *Feed) mapKey() uint64 { // binaryPut serializes this Feed instance into the provided slice func (u *Feed) binaryPut(serializedData []byte) error { if len(serializedData) != feedLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize View. Expected %d, got %d", feedLength, len(serializedData)) + return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize Feed. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int copy(serializedData[cursor:cursor+TopicLength], u.Topic[:TopicLength]) From 83705ef6aa3645a6305a400fa175e44904a929f7 Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Sun, 30 Sep 2018 09:43:10 +0200 Subject: [PATCH 3/8] swarm/storage/mru: Renamed rest of MRU references --- cmd/swarm/main.go | 66 ++++++++-------- cmd/swarm/mru.go | 52 ++++++------- cmd/swarm/mru_test.go | 34 ++++---- swarm/api/api.go | 113 ++++++++++++++------------- swarm/api/client/client.go | 57 +++++++------- swarm/api/client/client_test.go | 70 ++++++++--------- swarm/api/http/server.go | 124 ++++++++++++------------------ swarm/api/http/server_test.go | 101 ++++++++---------------- swarm/api/manifest.go | 30 ++++---- swarm/api/uri.go | 6 +- swarm/network/README.md | 2 +- swarm/storage/localstore_test.go | 4 +- swarm/storage/mru/doc.go | 2 +- swarm/storage/mru/error.go | 2 +- swarm/storage/mru/handler.go | 6 +- swarm/storage/mru/handler_test.go | 4 +- swarm/storage/mru/request_test.go | 4 +- swarm/swarm.go | 12 +-- swarm/testutil/http.go | 8 +- 19 files changed, 315 insertions(+), 382 deletions(-) diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go index 5acf87c71..4c4dfceb7 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -207,25 +207,25 @@ var ( Name: "compressed", Usage: "Prints encryption keys in compressed form", } - SwarmResourceNameFlag = cli.StringFlag{ + SwarmFeedNameFlag = cli.StringFlag{ Name: "name", - Usage: "User-defined name for the new resource, limited to 32 characters. If combined with topic, the resource will be a subtopic with this name", + Usage: "User-defined name for the new feed, limited to 32 characters. If combined with topic, it will refer to a subtopic with this name", } - SwarmResourceTopicFlag = cli.StringFlag{ + SwarmFeedTopicFlag = cli.StringFlag{ Name: "topic", - Usage: "User-defined topic this resource is tracking, hex encoded. Limited to 64 hexadecimal characters", + Usage: "User-defined topic this feed is tracking, hex encoded. Limited to 64 hexadecimal characters", } - SwarmResourceDataOnCreateFlag = cli.StringFlag{ + SwarmFeedDataOnCreateFlag = cli.StringFlag{ Name: "data", - Usage: "Initializes the resource with the given hex-encoded data. Data must be prefixed by 0x", + Usage: "Initializes the feed with the given hex-encoded data. Data must be prefixed by 0x", } - SwarmResourceManifestFlag = cli.StringFlag{ + SwarmFeedManifestFlag = cli.StringFlag{ Name: "manifest", - Usage: "Refers to the resource through a manifest", + Usage: "Refers to the feed through a manifest", } - SwarmResourceUserFlag = cli.StringFlag{ + SwarmFeedUserFlag = cli.StringFlag{ Name: "user", - Usage: "Indicates the user who updates the resource", + Usage: "Indicates the user who updates the feed", } ) @@ -346,62 +346,62 @@ func init() { }, { CustomHelpTemplate: helpTemplate, - Name: "resource", - Usage: "(Advanced) Create and update Mutable Resources", + Name: "feed", + Usage: "(Advanced) Create and update Swarm Feeds", ArgsUsage: "", - Description: "Works with Mutable Resource Updates", + Description: "Works with Swarm Feeds", Subcommands: []cli.Command{ { - Action: resourceCreate, + Action: feedCreateManifest, CustomHelpTemplate: helpTemplate, Name: "create", - Usage: "creates and publishes a new Mutable Resource manifest", - Description: `creates and publishes a new Mutable Resource manifest pointing to a specified user's updates about a particular topic. - The resource topic can be built in the following ways: + Usage: "creates and publishes a new Feed manifest", + Description: `creates and publishes a new Feed manifest pointing to a specified user's updates about a particular topic. + The feed topic can be built in the following ways: * use --topic to set the topic to an arbitrary binary hex string. * use --name to set the topic to a human-readable name. - For example --name could be set to "profile-picture", meaning this Mutable Resource allows to get this user's current profile picture. + For example --name could be set to "profile-picture", meaning this feed allows to get this user's current profile picture. * use both --topic and --name to create named subtopics. For example, --topic could be set to an Ethereum contract address and --name could be set to "comments", meaning - the Mutable Resource tracks a discussion about that contract. + this feed tracks a discussion about that contract. The --user flag allows to have this manifest refer to a user other than yourself. If not specified, it will then default to your local account (--bzzaccount)`, - Flags: []cli.Flag{SwarmResourceNameFlag, SwarmResourceTopicFlag, SwarmResourceUserFlag}, + Flags: []cli.Flag{SwarmFeedNameFlag, SwarmFeedTopicFlag, SwarmFeedUserFlag}, }, { - Action: resourceUpdate, + Action: feedUpdate, CustomHelpTemplate: helpTemplate, Name: "update", - Usage: "updates the content of an existing Mutable Resource", + Usage: "updates the content of an existing Swarm Feed", ArgsUsage: "<0x Hex data>", Description: `publishes a new update on the specified topic - The resource topic can be built in the following ways: + The feed topic can be built in the following ways: * use --topic to set the topic to an arbitrary binary hex string. * use --name to set the topic to a human-readable name. - For example --name could be set to "profile-picture", meaning this Mutable Resource allows to get this user's current profile picture. + For example --name could be set to "profile-picture", meaning this feed allows to get this user's current profile picture. * use both --topic and --name to create named subtopics. For example, --topic could be set to an Ethereum contract address and --name could be set to "comments", meaning - the Mutable Resource tracks a discussion about that contract. + this feed tracks a discussion about that contract. - If you have a manifest, you can specify it with --manifest to refer to the resource, + If you have a manifest, you can specify it with --manifest to refer to the feed, instead of using --topic / --name `, - Flags: []cli.Flag{SwarmResourceManifestFlag, SwarmResourceNameFlag, SwarmResourceTopicFlag}, + Flags: []cli.Flag{SwarmFeedManifestFlag, SwarmFeedNameFlag, SwarmFeedTopicFlag}, }, { - Action: resourceInfo, + Action: feedInfo, CustomHelpTemplate: helpTemplate, Name: "info", - Usage: "obtains information about an existing Mutable Resource", - Description: `obtains information about an existing Mutable Resource + Usage: "obtains information about an existing Swarm Feed", + Description: `obtains information about an existing Swarm Feed The topic can be specified directly with the --topic flag as an hex string If no topic is specified, the default topic (zero) will be used The --name flag can be used to specify subtopics with a specific name. The --user flag allows to refer to a user other than yourself. If not specified, it will then default to your local account (--bzzaccount) If you have a manifest, you can specify it with --manifest instead of --topic / --name / ---user - to refer to the resource`, - Flags: []cli.Flag{SwarmResourceManifestFlag, SwarmResourceNameFlag, SwarmResourceTopicFlag, SwarmResourceUserFlag}, + to refer to the feed`, + Flags: []cli.Flag{SwarmFeedManifestFlag, SwarmFeedNameFlag, SwarmFeedTopicFlag, SwarmFeedUserFlag}, }, }, }, @@ -738,7 +738,7 @@ func getAccount(bzzaccount string, ctx *cli.Context, stack *node.Node) *ecdsa.Pr } // getPrivKey returns the private key of the specified bzzaccount -// Used only by client commands, such as `resource` +// Used only by client commands, such as `feed` func getPrivKey(ctx *cli.Context) *ecdsa.PrivateKey { // booting up the swarm node just as we do in bzzd action bzzconfig, err := buildConfig(ctx) diff --git a/cmd/swarm/mru.go b/cmd/swarm/mru.go index afa73820f..6c6d44c0a 100644 --- a/cmd/swarm/mru.go +++ b/cmd/swarm/mru.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// Command resource allows the user to create and update signed Swarm Feeds +// Command feed allows the user to create and update signed Swarm Feeds package main import ( @@ -36,8 +36,8 @@ func NewGenericSigner(ctx *cli.Context) mru.Signer { } func getTopic(ctx *cli.Context) (topic mru.Topic) { - var name = ctx.String(SwarmResourceNameFlag.Name) - var relatedTopic = ctx.String(SwarmResourceTopicFlag.Name) + var name = ctx.String(SwarmFeedNameFlag.Name) + var relatedTopic = ctx.String(SwarmFeedTopicFlag.Name) var relatedTopicBytes []byte var err error @@ -55,35 +55,35 @@ func getTopic(ctx *cli.Context) (topic mru.Topic) { return topic } -// swarm resource create [--name ] [--data <0x Hexdata> [--multihash=false]] -// swarm resource update <0x Hexdata> [--multihash=false] -// swarm resource info +// swarm feed create [--name ] [--data <0x Hexdata> [--multihash=false]] +// swarm feed update <0x Hexdata> [--multihash=false] +// swarm feed info -func resourceCreate(ctx *cli.Context) { +func feedCreateManifest(ctx *cli.Context) { var ( bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") client = swarm.NewClient(bzzapi) ) - newResourceRequest := mru.NewFirstRequest(getTopic(ctx)) - newResourceRequest.Feed.User = resourceGetUser(ctx) + newFeedUpdateRequest := mru.NewFirstRequest(getTopic(ctx)) + newFeedUpdateRequest.Feed.User = feedGetUser(ctx) - manifestAddress, err := client.CreateResource(newResourceRequest) + manifestAddress, err := client.CreateFeedWithManifest(newFeedUpdateRequest) if err != nil { - utils.Fatalf("Error creating resource: %s", err.Error()) + utils.Fatalf("Error creating feed manifest: %s", err.Error()) return } fmt.Println(manifestAddress) // output manifest address to the user in a single line (useful for other commands to pick up) } -func resourceUpdate(ctx *cli.Context) { +func feedUpdate(ctx *cli.Context) { args := ctx.Args() var ( bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") client = swarm.NewClient(bzzapi) - manifestAddressOrDomain = ctx.String(SwarmResourceManifestFlag.Name) + manifestAddressOrDomain = ctx.String(SwarmFeedManifestFlag.Name) ) if len(args) < 1 { @@ -110,10 +110,10 @@ func resourceUpdate(ctx *cli.Context) { } - // Retrieve resource status and metadata out of the manifest - updateRequest, err = client.GetResourceMetadata(query, manifestAddressOrDomain) + // Retrieve feed status and metadata out of the manifest + updateRequest, err = client.GetFeedMetadata(query, manifestAddressOrDomain) if err != nil { - utils.Fatalf("Error retrieving resource status: %s", err.Error()) + utils.Fatalf("Error retrieving feed status: %s", err.Error()) } // set the new data @@ -121,34 +121,34 @@ func resourceUpdate(ctx *cli.Context) { // sign update if err = updateRequest.Sign(signer); err != nil { - utils.Fatalf("Error signing resource update: %s", err.Error()) + utils.Fatalf("Error signing feed update: %s", err.Error()) } // post update - err = client.UpdateResource(updateRequest) + err = client.UpdateFeed(updateRequest) if err != nil { - utils.Fatalf("Error updating resource: %s", err.Error()) + utils.Fatalf("Error updating feed: %s", err.Error()) return } } -func resourceInfo(ctx *cli.Context) { +func feedInfo(ctx *cli.Context) { var ( bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") client = swarm.NewClient(bzzapi) - manifestAddressOrDomain = ctx.String(SwarmResourceManifestFlag.Name) + manifestAddressOrDomain = ctx.String(SwarmFeedManifestFlag.Name) ) var query *mru.Query if manifestAddressOrDomain == "" { query = new(mru.Query) query.Topic = getTopic(ctx) - query.User = resourceGetUser(ctx) + query.User = feedGetUser(ctx) } - metadata, err := client.GetResourceMetadata(query, manifestAddressOrDomain) + metadata, err := client.GetFeedMetadata(query, manifestAddressOrDomain) if err != nil { - utils.Fatalf("Error retrieving resource metadata: %s", err.Error()) + utils.Fatalf("Error retrieving feed metadata: %s", err.Error()) return } encodedMetadata, err := metadata.MarshalJSON() @@ -158,8 +158,8 @@ func resourceInfo(ctx *cli.Context) { fmt.Println(string(encodedMetadata)) } -func resourceGetUser(ctx *cli.Context) common.Address { - var user = ctx.String(SwarmResourceUserFlag.Name) +func feedGetUser(ctx *cli.Context) common.Address { + var user = ctx.String(SwarmFeedUserFlag.Name) if user != "" { return common.HexToAddress(user) } diff --git a/cmd/swarm/mru_test.go b/cmd/swarm/mru_test.go index c52097a6e..c0c43aca4 100644 --- a/cmd/swarm/mru_test.go +++ b/cmd/swarm/mru_test.go @@ -38,12 +38,12 @@ import ( swarmhttp "github.com/ethereum/go-ethereum/swarm/api/http" ) -func TestCLIResourceUpdate(t *testing.T) { +func TestCLIFeedUpdate(t *testing.T) { srv := testutil.NewTestSwarmServer(t, func(api *api.API) testutil.TestServer { return swarmhttp.NewServer(api, "") }, nil) - log.Info("starting 1 node cluster") + log.Info("starting a test swarm server") defer srv.Close() // create a private key file for signing @@ -77,13 +77,13 @@ func TestCLIResourceUpdate(t *testing.T) { flags := []string{ "--bzzapi", srv.URL, "--bzzaccount", pkfile.Name(), - "resource", "update", + "feed", "update", "--topic", topic.Hex(), "--name", name, hexData} // create an update and expect an exit without errors - log.Info(fmt.Sprintf("updating a resource with 'swarm resource update'")) + log.Info(fmt.Sprintf("updating a feed with 'swarm feed update'")) cmd := runSwarm(t, flags...) cmd.ExpectExit() @@ -100,17 +100,17 @@ func TestCLIResourceUpdate(t *testing.T) { t.Fatal(err) } - // View configures whose updates we will be looking up. - view := mru.Feed{ + // Feed configures whose updates we will be looking up. + feed := mru.Feed{ Topic: topic, User: address, } // Build a query to get the latest update - query := mru.NewQueryLatest(&view, lookup.NoClue) + query := mru.NewQueryLatest(&feed, lookup.NoClue) // retrieve content! - reader, err := client.GetResource(query, "") + reader, err := client.QueryFeed(query, "") if err != nil { t.Fatal(err) } @@ -128,12 +128,12 @@ func TestCLIResourceUpdate(t *testing.T) { // Now retrieve info for the next update flags = []string{ "--bzzapi", srv.URL, - "resource", "info", + "feed", "info", "--topic", topic.Hex(), "--user", address.Hex(), } - log.Info(fmt.Sprintf("getting resource info with 'swarm resource info'")) + log.Info(fmt.Sprintf("getting feed info with 'swarm feed info'")) cmd = runSwarm(t, flags...) _, matches := cmd.ExpectRegexp(`.*`) // regex hack to extract stdout cmd.ExpectExit() @@ -145,28 +145,28 @@ func TestCLIResourceUpdate(t *testing.T) { t.Fatal(err) } - // make sure the retrieved view is the same - if request.Feed != view { - t.Fatalf("Expected view to be: %s, got %s", view, request.Feed) + // make sure the retrieved Feed is the same + if request.Feed != feed { + t.Fatalf("Expected feed to be: %s, got %s", feed, request.Feed) } // test publishing a manifest flags = []string{ "--bzzapi", srv.URL, "--bzzaccount", pkfile.Name(), - "resource", "create", + "feed", "create", "--topic", topic.Hex(), } - log.Info(fmt.Sprintf("Publishing manifest with 'swarm resource create'")) + log.Info(fmt.Sprintf("Publishing manifest with 'swarm feed create'")) cmd = runSwarm(t, flags...) _, matches = cmd.ExpectRegexp(`[a-f\d]{64}`) // regex hack to extract stdout cmd.ExpectExit() - manifestAddress := matches[0] // read the received resource manifest + manifestAddress := matches[0] // read the received feed manifest // now attempt to lookup the latest update using a manifest instead - reader, err = client.GetResource(nil, manifestAddress) + reader, err = client.QueryFeed(nil, manifestAddress) if err != nil { t.Fatal(err) } diff --git a/swarm/api/api.go b/swarm/api/api.go index e6b676dba..9b4571bee 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -235,18 +235,18 @@ on top of the FileStore it is the public interface of the FileStore which is included in the ethereum stack */ type API struct { - resource *mru.Handler + feeds *mru.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, resourceHandler *mru.Handler, pk *ecdsa.PrivateKey) (self *API) { +func NewAPI(fileStore *storage.FileStore, dns Resolver, feedsHandler *mru.Handler, pk *ecdsa.PrivateKey) (self *API) { self = &API{ fileStore: fileStore, dns: dns, - resource: resourceHandler, + feeds: feedsHandler, Decryptor: func(ctx context.Context, credentials string) DecryptFunc { return self.doDecrypt(ctx, credentials, pk) }, @@ -403,24 +403,24 @@ func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage return a.Get(ctx, decrypt, adr, entry.Path) } - // we need to do some extra work if this is a mutable resource manifest - if entry.ContentType == ResourceContentType { - if entry.ResourceView == nil { - return reader, mimeType, status, nil, fmt.Errorf("Cannot decode ResourceView in manifest") + // we need to do some extra work if this is a Feed manifest + if entry.ContentType == FeedContentType { + if entry.Feed == nil { + return reader, mimeType, status, nil, fmt.Errorf("Cannot decode Feed in manifest") } - _, err := a.resource.Lookup(ctx, mru.NewQueryLatest(entry.ResourceView, lookup.NoClue)) + _, err := a.feeds.Lookup(ctx, mru.NewQueryLatest(entry.Feed, lookup.NoClue)) if err != nil { apiGetNotFound.Inc(1) status = http.StatusNotFound - log.Debug(fmt.Sprintf("get resource content error: %v", err)) + log.Debug(fmt.Sprintf("get feed update content error: %v", err)) return reader, mimeType, status, nil, err } // get the data of the update - _, rsrcData, err := a.resource.GetContent(entry.ResourceView) + _, rsrcData, err := a.feeds.GetContent(entry.Feed) if err != nil { apiGetNotFound.Inc(1) status = http.StatusNotFound - log.Warn(fmt.Sprintf("get resource content error: %v", err)) + log.Warn(fmt.Sprintf("get feed update content error: %v", err)) return reader, mimeType, status, nil, err } @@ -429,18 +429,18 @@ func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage if err != nil { apiGetInvalid.Inc(1) status = http.StatusUnprocessableEntity - log.Warn("invalid resource multihash", "err", err) + log.Warn("invalid multihash in feed update", "err", err) return reader, mimeType, status, nil, err } manifestAddr = storage.Address(decodedMultihash) - log.Trace("resource is multihash", "key", manifestAddr) + log.Trace("feed update contains multihash", "key", manifestAddr) // get the manifest the multihash digest points to trie, err := loadManifest(ctx, a.fileStore, manifestAddr, nil, NOOPDecrypt) if err != nil { apiGetNotFound.Inc(1) status = http.StatusNotFound - log.Warn(fmt.Sprintf("loadManifestTrie (resource multihash) error: %v", err)) + log.Warn(fmt.Sprintf("loadManifestTrie (feed update multihash) error: %v", err)) return reader, mimeType, status, nil, err } @@ -450,13 +450,13 @@ func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage if entry == nil { status = http.StatusNotFound apiGetNotFound.Inc(1) - err = fmt.Errorf("manifest (resource multihash) entry for '%s' not found", path) - log.Trace("manifest (resource multihash) entry not found", "key", manifestAddr, "path", path) + err = fmt.Errorf("manifest (feed update multihash) entry for '%s' not found", path) + log.Trace("manifest (feed update multihash) entry not found", "key", manifestAddr, "path", path) return reader, mimeType, status, nil, err } } - // regardless of resource update manifests or normal manifests we will converge at this point + // regardless of feed update manifests or normal manifests we will converge at this point // get the key the manifest entry points to and serve it if it's unambiguous contentAddr = common.Hex2Bytes(entry.Hash) status = entry.Status @@ -956,68 +956,67 @@ func (a *API) BuildDirectoryTree(ctx context.Context, mhash string, nameresolver return addr, manifestEntryMap, nil } -// ResourceLookup finds Swarm Feeds at specific periods and versions -func (a *API) ResourceLookup(ctx context.Context, query *mru.Query) ([]byte, error) { - _, err := a.resource.Lookup(ctx, query) +// FeedsLookup finds Swarm Feeds Updates at specific points in time, or the latest update +func (a *API) FeedsLookup(ctx context.Context, query *mru.Query) ([]byte, error) { + _, err := a.feeds.Lookup(ctx, query) if err != nil { return nil, err } var data []byte - _, data, err = a.resource.GetContent(&query.Feed) + _, data, err = a.feeds.GetContent(&query.Feed) if err != nil { return nil, err } return data, nil } -// ResourceNewRequest creates a Request object to update a specific mutable resource -func (a *API) ResourceNewRequest(ctx context.Context, view *mru.Feed) (*mru.Request, error) { - return a.resource.NewRequest(ctx, view) +// FeedsNewRequest creates a Request object to update a specific Feed +func (a *API) FeedsNewRequest(ctx context.Context, feed *mru.Feed) (*mru.Request, error) { + return a.feeds.NewRequest(ctx, feed) } -// ResourceUpdate updates a Mutable Resource with arbitrary data. -// Upon retrieval the update will be retrieved verbatim as bytes. -func (a *API) ResourceUpdate(ctx context.Context, request *mru.Request) (storage.Address, error) { - return a.resource.Update(ctx, request) +// FeedsUpdate publishes a new update on the given Feed +func (a *API) FeedsUpdate(ctx context.Context, request *mru.Request) (storage.Address, error) { + return a.feeds.Update(ctx, request) } -// ResourceHashSize returned the size of the digest produced by the Mutable Resource hashing function -func (a *API) ResourceHashSize() int { - return a.resource.HashSize +// FeedsHashSize returned the size of the digest produced by Swarm Feeds' hashing function +func (a *API) FeedsHashSize() int { + return a.feeds.HashSize } -// ErrCannotLoadResourceManifest is returned when looking up a resource manifest fails -var ErrCannotLoadResourceManifest = errors.New("Cannot load resource manifest") +// ErrCannotLoadFeedManifest is returned when looking up a feeds manifest fails +var ErrCannotLoadFeedManifest = errors.New("Cannot load feed manifest") -// ErrNotAResourceManifest is returned when the address provided returned something other than a valid manifest -var ErrNotAResourceManifest = errors.New("Not a resource manifest") +// ErrNotAFeedManifest is returned when the address provided returned something other than a valid manifest +var ErrNotAFeedManifest = errors.New("Not a feed manifest") -// ResolveResourceManifest retrieves the Mutable Resource manifest for the given address, and returns the Resource's view ID. -func (a *API) ResolveResourceManifest(ctx context.Context, addr storage.Address) (*mru.Feed, error) { +// ResolveFeedManifest retrieves the Feed manifest for the given address, and returns the referenced Feed. +func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*mru.Feed, error) { trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt) if err != nil { - return nil, ErrCannotLoadResourceManifest + return nil, ErrCannotLoadFeedManifest } entry, _ := trie.getEntry("") - if entry.ContentType != ResourceContentType { - return nil, ErrNotAResourceManifest + if entry.ContentType != FeedContentType { + return nil, ErrNotAFeedManifest } - return entry.ResourceView, nil + return entry.Feed, nil } -// ErrCannotResolveResourceURI is returned when the ENS resolver is not able to translate a name to a resource -var ErrCannotResolveResourceURI = errors.New("Cannot resolve Resource URI") +// ErrCannotResolveFeedURI is returned when the ENS resolver is not able to translate a name to a Feed +var ErrCannotResolveFeedURI = errors.New("Cannot resolve Feed URI") -// ErrCannotResolveResourceView is returned when values provided are not enough or invalid to recreate a -// resource view out of them. -var ErrCannotResolveResourceView = errors.New("Cannot resolve resource view") +// ErrCannotResolveFeed is returned when values provided are not enough or invalid to recreate a +// Feed out of them. +var ErrCannotResolveFeed = errors.New("Cannot resolve Feed") -// ResolveResourceView attempts to extract View information out of the manifest, if provided -// If not, it attempts to extract the View out of a set of key-value pairs -func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Values) (*mru.Feed, error) { - var view *mru.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 mru.Values) (*mru.Feed, error) { + var feed *mru.Feed var err error if uri.Addr != "" { // resolve the content key. @@ -1025,25 +1024,25 @@ func (a *API) ResolveResourceView(ctx context.Context, uri *URI, values mru.Valu if manifestAddr == nil { manifestAddr, err = a.Resolve(ctx, uri.Addr) if err != nil { - return nil, ErrCannotResolveResourceURI + return nil, ErrCannotResolveFeedURI } } - // get the resource view from the manifest - view, err = a.ResolveResourceManifest(ctx, manifestAddr) + // get the Feed from the manifest + feed, err = a.ResolveFeedManifest(ctx, manifestAddr) if err != nil { return nil, err } - log.Debug("handle.get.resource: resolved", "manifestkey", manifestAddr, "view", view.Hex()) + log.Debug("handle.get.feed: resolved", "manifestkey", manifestAddr, "feed", feed.Hex()) } else { var v mru.Feed if err := v.FromValues(values); err != nil { - return nil, ErrCannotResolveResourceView + return nil, ErrCannotResolveFeed } - view = &v + feed = &v } - return view, nil + return feed, nil } // MimeOctetStream default value of http Content-Type header diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go index 47a6980de..76ada1297 100644 --- a/swarm/api/client/client.go +++ b/swarm/api/client/client.go @@ -601,16 +601,15 @@ func (c *Client) MultipartUpload(hash string, uploader Uploader) (string, error) return string(data), nil } -// ErrNoResourceUpdatesFound is returned when Swarm cannot find updates of the given resource -var ErrNoResourceUpdatesFound = errors.New("No updates found for this resource") +// ErrNoFeedUpdatesFound is returned when Swarm cannot find updates of the given feed +var ErrNoFeedUpdatesFound = errors.New("No updates found for this feed") -// CreateResource creates a Mutable Resource with the given name and frequency, initializing it with the provided -// data. Data is interpreted as multihash or not depending on the multihash parameter. -// startTime=0 means "now" -// Returns the resulting Mutable Resource manifest address that you can use to include in an ENS Resolver (setContent) -// or reference future updates (Client.UpdateResource) -func (c *Client) CreateResource(request *mru.Request) (string, error) { - responseStream, err := c.updateResource(request, true) +// CreateFeedWithManifest creates a Feed Manifest, initializing it with the provided +// 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 *mru.Request) (string, error) { + responseStream, err := c.updateFeed(request, true) if err != nil { return "", err } @@ -628,18 +627,18 @@ func (c *Client) CreateResource(request *mru.Request) (string, error) { return manifestAddress, nil } -// UpdateResource allows you to set a new version of your content -func (c *Client) UpdateResource(request *mru.Request) error { - _, err := c.updateResource(request, false) +// UpdateFeed allows you to set a new version of your content +func (c *Client) UpdateFeed(request *mru.Request) error { + _, err := c.updateFeed(request, false) return err } -func (c *Client) updateResource(request *mru.Request, createManifest bool) (io.ReadCloser, error) { +func (c *Client) updateFeed(request *mru.Request, createManifest bool) (io.ReadCloser, error) { URL, err := url.Parse(c.Gateway) if err != nil { return nil, err } - URL.Path = "/bzz-resource:/" + URL.Path = "/bzz-feed:/" values := URL.Query() body := request.AppendValues(values) if createManifest { @@ -660,23 +659,23 @@ func (c *Client) updateResource(request *mru.Request, createManifest bool) (io.R return res.Body, nil } -// GetResource returns a byte stream with the raw content of the resource -// manifestAddressOrDomain is the address you obtained in CreateResource or an ENS domain whose Resolver +// 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) GetResource(query *mru.Query, manifestAddressOrDomain string) (io.ReadCloser, error) { - return c.getResource(query, manifestAddressOrDomain, false) +func (c *Client) QueryFeed(query *mru.Query, manifestAddressOrDomain string) (io.ReadCloser, error) { + return c.queryFeed(query, manifestAddressOrDomain, false) } -// getResource returns a byte stream with the raw content of the resource -// manifestAddressOrDomain is the address you obtained in CreateResource or an ENS domain whose Resolver +// 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 -// meta set to true will instruct the node return resource metainformation instead -func (c *Client) getResource(query *mru.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) { +// meta set to true will instruct the node return Feed metainformation instead +func (c *Client) queryFeed(query *mru.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) { URL, err := url.Parse(c.Gateway) if err != nil { return nil, err } - URL.Path = "/bzz-resource:/" + manifestAddressOrDomain + URL.Path = "/bzz-feed:/" + manifestAddressOrDomain values := URL.Query() if query != nil { query.AppendValues(values) //adds query parameters @@ -692,7 +691,7 @@ func (c *Client) getResource(query *mru.Query, manifestAddressOrDomain string, m if res.StatusCode != http.StatusOK { if res.StatusCode == http.StatusNotFound { - return nil, ErrNoResourceUpdatesFound + return nil, ErrNoFeedUpdatesFound } errorMessageBytes, err := ioutil.ReadAll(res.Body) var errorMessage string @@ -701,18 +700,18 @@ func (c *Client) getResource(query *mru.Query, manifestAddressOrDomain string, m } else { errorMessage = string(errorMessageBytes) } - return nil, fmt.Errorf("Error retrieving resource: %s", errorMessage) + return nil, fmt.Errorf("Error retrieving feed updates: %s", errorMessage) } return res.Body, nil } -// GetResourceMetadata returns a structure that describes the Mutable Resource -// manifestAddressOrDomain is the address you obtained in CreateResource or an ENS domain whose Resolver +// GetFeedMetadata 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) GetResourceMetadata(query *mru.Query, manifestAddressOrDomain string) (*mru.Request, error) { +func (c *Client) GetFeedMetadata(query *mru.Query, manifestAddressOrDomain string) (*mru.Request, error) { - responseStream, err := c.getResource(query, manifestAddressOrDomain, true) + responseStream, err := c.queryFeed(query, manifestAddressOrDomain, true) if err != nil { return nil, err } diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go index c6ad0237b..fbc49a6e1 100644 --- a/swarm/api/client/client_test.go +++ b/swarm/api/client/client_test.go @@ -369,12 +369,12 @@ func newTestSigner() (*mru.GenericSigner, error) { return mru.NewGenericSigner(privKey), nil } -// test the transparent resolving of multihash resource types with bzz:// scheme +// test the transparent resolving of multihash feed updates with bzz:// scheme // -// first upload data, and store the multihash to the resulting manifest in a resource update +// first upload data, and store the multihash to the resulting manifest in a feed update // retrieving the update with the multihash should return the manifest pointing directly to the data // and raw retrieve of that hash should return the data -func TestClientCreateResourceMultihash(t *testing.T) { +func TestClientCreateFeedMultihash(t *testing.T) { signer, _ := newTestSigner() @@ -393,7 +393,7 @@ func TestClientCreateResourceMultihash(t *testing.T) { s := common.FromHex(swarmHash) mh := multihash.ToMultihash(s) - // our mutable resource topic + // our feed topic topic, _ := mru.NewTopic("foo.eth", nil) createRequest := mru.NewFirstRequest(topic) @@ -403,26 +403,26 @@ func TestClientCreateResourceMultihash(t *testing.T) { t.Fatalf("Error signing update: %s", err) } - resourceManifestHash, err := client.CreateResource(createRequest) + feedManifestHash, err := client.CreateFeedWithManifest(createRequest) if err != nil { - t.Fatalf("Error creating resource: %s", err) + t.Fatalf("Error creating feed manifest: %s", err) } - correctManifestAddrHex := "6ef40ba1492cf2a029dc9a8b5896c822cf689d3cd010842f4f1744e6db8824bd" - if resourceManifestHash != correctManifestAddrHex { - t.Fatalf("Response resource manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, resourceManifestHash) + correctManifestAddrHex := "bb056a5264c295c2b0f613c8409b9c87ce9d71576ace02458160df4cc894210b" + if feedManifestHash != correctManifestAddrHex { + t.Fatalf("Response feed manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, feedManifestHash) } - // Check we get a not found error when trying to get the resource with a made-up manifest - _, err = client.GetResource(nil, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") - if err != ErrNoResourceUpdatesFound { - t.Fatalf("Expected to receive ErrNoResourceUpdatesFound error. Got: %s", err) + // Check we get a not found error when trying to get feed updates with a made-up manifest + _, err = client.QueryFeed(nil, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") + if err != ErrNoFeedUpdatesFound { + t.Fatalf("Expected to receive ErrNoFeedUpdatesFound error. Got: %s", err) } - reader, err := client.GetResource(nil, correctManifestAddrHex) + reader, err := client.QueryFeed(nil, correctManifestAddrHex) if err != nil { - t.Fatalf("Error retrieving resource: %s", err) + t.Fatalf("Error retrieving feed updates: %s", err) } defer reader.Close() gotData, err := ioutil.ReadAll(reader) @@ -435,8 +435,8 @@ func TestClientCreateResourceMultihash(t *testing.T) { } -// TestClientCreateUpdateResource will check that mutable resources can be created and updated via the HTTP client. -func TestClientCreateUpdateResource(t *testing.T) { +// TestClientCreateUpdateFeed will check that feeds can be created and updated via the HTTP client. +func TestClientCreateUpdateFeed(t *testing.T) { signer, _ := newTestSigner() @@ -444,10 +444,10 @@ func TestClientCreateUpdateResource(t *testing.T) { client := NewClient(srv.URL) defer srv.Close() - // set raw data for the resource + // set raw data for the feed update databytes := []byte("En un lugar de La Mancha, de cuyo nombre no quiero acordarme...") - // our mutable resource name + // our feed topic name topic, _ := mru.NewTopic("El Quijote", nil) createRequest := mru.NewFirstRequest(topic) @@ -456,16 +456,16 @@ func TestClientCreateUpdateResource(t *testing.T) { t.Fatalf("Error signing update: %s", err) } - resourceManifestHash, err := client.CreateResource(createRequest) + feedManifestHash, err := client.CreateFeedWithManifest(createRequest) - correctManifestAddrHex := "fcb8e75f53e480e197c083ad1976d265674d0ce776f2bf359c09c413fb5230b8" - if resourceManifestHash != correctManifestAddrHex { - t.Fatalf("Response resource manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, resourceManifestHash) + correctManifestAddrHex := "0e9b645ebc3da167b1d56399adc3276f7a08229301b72a03336be0e7d4b71882" + if feedManifestHash != correctManifestAddrHex { + t.Fatalf("Response feed manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, feedManifestHash) } - reader, err := client.GetResource(nil, correctManifestAddrHex) + reader, err := client.QueryFeed(nil, correctManifestAddrHex) if err != nil { - t.Fatalf("Error retrieving resource: %s", err) + t.Fatalf("Error retrieving feed updates: %s", err) } defer reader.Close() gotData, err := ioutil.ReadAll(reader) @@ -479,7 +479,7 @@ func TestClientCreateUpdateResource(t *testing.T) { // define different data databytes = []byte("... no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero ...") - updateRequest, err := client.GetResourceMetadata(nil, correctManifestAddrHex) + updateRequest, err := client.GetFeedMetadata(nil, correctManifestAddrHex) if err != nil { t.Fatalf("Error retrieving update request template: %s", err) } @@ -489,13 +489,13 @@ func TestClientCreateUpdateResource(t *testing.T) { t.Fatalf("Error signing update: %s", err) } - if err = client.UpdateResource(updateRequest); err != nil { - t.Fatalf("Error updating resource: %s", err) + if err = client.UpdateFeed(updateRequest); err != nil { + t.Fatalf("Error updating feed: %s", err) } - reader, err = client.GetResource(nil, correctManifestAddrHex) + reader, err = client.QueryFeed(nil, correctManifestAddrHex) if err != nil { - t.Fatalf("Error retrieving resource: %s", err) + t.Fatalf("Error retrieving feed updates: %s", err) } defer reader.Close() gotData, err = ioutil.ReadAll(reader) @@ -506,17 +506,17 @@ func TestClientCreateUpdateResource(t *testing.T) { t.Fatalf("Expected: %v, got %v", databytes, gotData) } - // now try retrieving resource without a manifest + // now try retrieving feed updates without a manifest - view := &mru.Feed{ + feed := &mru.Feed{ Topic: topic, User: signer.Address(), } - lookupParams := mru.NewQueryLatest(view, lookup.NoClue) - reader, err = client.GetResource(lookupParams, "") + lookupParams := mru.NewQueryLatest(feed, lookup.NoClue) + reader, err = client.QueryFeed(lookupParams, "") if err != nil { - t.Fatalf("Error retrieving resource: %s", err) + t.Fatalf("Error retrieving feed updates: %s", err) } defer reader.Close() gotData, err = ioutil.ReadAll(reader) diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index 4c19dd6df..c5b3b564c 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -31,7 +31,6 @@ import ( "net/http" "os" "path" - "regexp" "strconv" "strings" "time" @@ -145,13 +144,13 @@ func NewServer(api *api.API, corsString string) *Server { defaultMiddlewares..., ), }) - mux.Handle("/bzz-resource:/", methodHandler{ + mux.Handle("/bzz-feed:/", methodHandler{ "GET": Adapt( - http.HandlerFunc(server.HandleGetResource), + http.HandlerFunc(server.HandleGetFeed), defaultMiddlewares..., ), "POST": Adapt( - http.HandlerFunc(server.HandlePostResource), + http.HandlerFunc(server.HandlePostFeed), defaultMiddlewares..., ), }) @@ -458,44 +457,13 @@ func (s *Server) HandleDelete(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, newKey) } -// Parses a resource update post url to corresponding action -// possible combinations: -// / add multihash update to existing hash -// /raw add raw update to existing hash -// /# create new resource with first update as mulitihash -// /raw/# create new resource with first update raw -func resourcePostMode(path string) (isRaw bool, frequency uint64, err error) { - re, err := regexp.Compile("^(raw)?/?([0-9]+)?$") - if err != nil { - return isRaw, frequency, err - } - m := re.FindAllStringSubmatch(path, 2) - var freqstr = "0" - if len(m) > 0 { - if m[0][1] != "" { - isRaw = true - } - if m[0][2] != "" { - freqstr = m[0][2] - } - } else if len(path) > 0 { - return isRaw, frequency, fmt.Errorf("invalid path") - } - frequency, err = strconv.ParseUint(freqstr, 10, 64) - return isRaw, frequency, err -} - -// Handles creation of new mutable resources and adding updates to existing mutable resources -// There are two types of updates available, "raw" and "multihash." -// If the latter is used, a subsequent bzz:// GET call to the manifest of the resource will return -// the page that the multihash is pointing to, as if it held a normal swarm content manifest -// -// The POST request admits a JSON structure as defined in the mru package: `mru.updateRequestJSON` -// The requests can be to a) create a resource, b) update a resource or c) both a+b: create a resource and set the initial content -func (s *Server) HandlePostResource(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 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()) uri := GetURI(r.Context()) - log.Debug("handle.post.resource", "ruid", ruid) + log.Debug("handle.post.feed", "ruid", ruid) var err error // Creation and update must send mru.updateRequestJSON JSON structure @@ -505,19 +473,19 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { return } - view, err := s.api.ResolveResourceView(r.Context(), uri, r.URL.Query()) + feed, 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 - if err == api.ErrCannotLoadResourceManifest || err == api.ErrCannotResolveResourceURI { + if err == api.ErrCannotLoadFeedManifest || err == api.ErrCannotResolveFeedURI { httpStatus = http.StatusNotFound } - RespondError(w, r, fmt.Sprintf("cannot retrieve resource view: %s", err), httpStatus) + RespondError(w, r, fmt.Sprintf("cannot retrieve feed from manifest: %s", err), httpStatus) return } var updateRequest mru.Request - updateRequest.Feed = *view + updateRequest.Feed = *feed query := r.URL.Query() if err := updateRequest.FromValues(query, body); err != nil { // decodes request from query parameters @@ -527,13 +495,13 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { if updateRequest.IsUpdate() { // Verify that the signature is intact and that the signer is authorized - // to update this resource - // Check this early, to avoid creating a resource and then not being able to set its first update. + // to update this feed + // Check this early, to avoid creating a feed and then not being able to set its first update. if err = updateRequest.Verify(); err != nil { RespondError(w, r, err.Error(), http.StatusForbidden) return } - _, err = s.api.ResourceUpdate(r.Context(), &updateRequest) + _, err = s.api.FeedsUpdate(r.Context(), &updateRequest) if err != nil { RespondError(w, r, err.Error(), http.StatusInternalServerError) return @@ -541,16 +509,16 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { } if query.Get("manifest") == "1" { - // we create a manifest so we can retrieve the resource with bzz:// later - // this manifest has a special "resource type" manifest, and saves the - // resource view ID used to retrieve the resource later - m, err := s.api.NewResourceManifest(r.Context(), &updateRequest.Feed) + // we create a manifest so we can retrieve feed updates with bzz:// later + // this manifest has a special "feed type" manifest, and saves the + // feed identification used to retrieve feed updates later + m, err := s.api.NewFeedManifest(r.Context(), &updateRequest.Feed) if err != nil { - RespondError(w, r, fmt.Sprintf("failed to create resource manifest: %v", err), http.StatusInternalServerError) + RespondError(w, r, fmt.Sprintf("failed to create feed manifest: %v", err), http.StatusInternalServerError) return } // the key to the manifest will be passed back to the client - // the client can access the view directly through its resourceView member + // the client can access the Feed directly through its Feed member // the manifest key can be set as content in the resolver of the ENS name outdata, err := json.Marshal(m) if err != nil { @@ -563,41 +531,49 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *http.Request) { } } -// Retrieve Swarm Feeds: -// bzz-resource:// - get latest update -// bzz-resource:///?period=n - get latest update on period n -// bzz-resource:///?period=n&version=m - get update version m of period n -// bzz-resource:///meta - get metadata and next version information -// = ens name or hash -// TODO: Enable pass maxPeriod parameter -func (s *Server) HandleGetResource(w http.ResponseWriter, r *http.Request) { +// HandleGetFeed retrieves Swarm Feeds updates: +// bzz-feed:// - get latest feed update, given a manifest address +// - or - +// specify user + topic (optional), subtopic name (optional) directly, without manifest: +// bzz-feed://?user=0x...&topic=0x...&name=subtopic name +// topic defaults to 0x000... if not specified. +// name defaults to empty string if not specified. +// thus, empty name and topic refers to the user's default feed. +// +// Optional parameters: +// time=xx - get the latest update before time (in epoch seconds) +// hint.time=xx - hint the lookup algorithm looking for updates at around that time +// hint.level=xx - hint the lookup algorithm looking for updates at around this frequency level +// meta=1 - get feed metadata and status information instead of performing a feed query +// NOTE: meta=1 will be deprecated in the near future +func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) { ruid := GetRUID(r.Context()) uri := GetURI(r.Context()) - log.Debug("handle.get.resource", "ruid", ruid) + log.Debug("handle.get.feed", "ruid", ruid) var err error - view, err := s.api.ResolveResourceView(r.Context(), uri, r.URL.Query()) + feed, 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 - if err == api.ErrCannotLoadResourceManifest || err == api.ErrCannotResolveResourceURI { + if err == api.ErrCannotLoadFeedManifest || err == api.ErrCannotResolveFeedURI { httpStatus = http.StatusNotFound } - RespondError(w, r, fmt.Sprintf("cannot retrieve resource view: %s", err), httpStatus) + RespondError(w, r, fmt.Sprintf("cannot retrieve feed information from manifest: %s", err), httpStatus) return } // 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.ResourceNewRequest(r.Context(), view) + unsignedUpdateRequest, err := s.api.FeedsNewRequest(r.Context(), feed) if err != nil { getFail.Inc(1) - RespondError(w, r, fmt.Sprintf("cannot retrieve resource metadata for view=%s: %s", view.Hex(), err), http.StatusNotFound) + RespondError(w, r, fmt.Sprintf("cannot retrieve feed metadata for feed=%s: %s", feed.Hex(), err), http.StatusNotFound) return } rawResponse, err := unsignedUpdateRequest.MarshalJSON() if err != nil { - RespondError(w, r, fmt.Sprintf("cannot encode unsigned UpdateRequest: %v", err), http.StatusInternalServerError) + RespondError(w, r, fmt.Sprintf("cannot encode unsigned feed update request: %v", err), http.StatusInternalServerError) return } w.Header().Add("Content-type", "application/json") @@ -606,28 +582,28 @@ func (s *Server) HandleGetResource(w http.ResponseWriter, r *http.Request) { return } - lookupParams := &mru.Query{Feed: *view} + lookupParams := &mru.Query{Feed: *feed} if err = lookupParams.FromValues(r.URL.Query()); err != nil { // parse period, version - RespondError(w, r, fmt.Sprintf("invalid mutable resource request:%s", err), http.StatusBadRequest) + RespondError(w, r, fmt.Sprintf("invalid feed update request:%s", err), http.StatusBadRequest) return } - data, err := s.api.ResourceLookup(r.Context(), lookupParams) + data, err := s.api.FeedsLookup(r.Context(), lookupParams) // any error from the switch statement will end up here if err != nil { - code, err2 := s.translateResourceError(w, r, "mutable resource lookup fail", err) + code, err2 := s.translateFeedError(w, r, "feed lookup fail", err) RespondError(w, r, err2.Error(), code) return } // All ok, serve the retrieved update - log.Debug("Found update", "view", view.Hex(), "ruid", ruid) + log.Debug("Found update", "feed", feed.Hex(), "ruid", ruid) w.Header().Set("Content-Type", api.MimeOctetStream) http.ServeContent(w, r, "", time.Now(), bytes.NewReader(data)) } -func (s *Server) translateResourceError(w http.ResponseWriter, r *http.Request, supErr string, err error) (int, error) { +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.(*mru.Error) diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 0855d30a2..a7c7e3003 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -58,47 +58,6 @@ func init() { log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) } -func TestResourcePostMode(t *testing.T) { - path := "" - errstr := "resourcePostMode for '%s' should be raw %v frequency %d, was raw %v, frequency %d" - r, f, err := resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if r || f != 0 { - t.Fatalf(errstr, path, false, 0, r, f) - } - - path = "raw" - r, f, err = resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if !r || f != 0 { - t.Fatalf(errstr, path, true, 0, r, f) - } - - path = "13" - r, f, err = resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if r || f == 0 { - t.Fatalf(errstr, path, false, 13, r, f) - } - - path = "raw/13" - r, f, err = resourcePostMode(path) - if err != nil { - t.Fatal(err) - } else if !r || f == 0 { - t.Fatalf(errstr, path, true, 13, r, f) - } - - path = "foo/13" - r, f, err = resourcePostMode(path) - if err == nil { - t.Fatal("resourcePostMode for 'foo/13' should fail, returned error nil") - } -} - func serverFunc(api *api.API) testutil.TestServer { return NewServer(api, "") } @@ -111,12 +70,12 @@ func newTestSigner() (*mru.GenericSigner, error) { return mru.NewGenericSigner(privKey), nil } -// test the transparent resolving of multihash resource types with bzz:// scheme +// test the transparent resolving of multihash-containing feed updates with bzz:// scheme // -// first upload data, and store the multihash to the resulting manifest in a resource update +// first upload data, and store the multihash to the resulting manifest in a feed update // retrieving the update with the multihash should return the manifest pointing directly to the data // and raw retrieve of that hash should return the data -func TestBzzResourceMultihash(t *testing.T) { +func TestBzzFeedMultihash(t *testing.T) { signer, _ := newTestSigner() @@ -154,7 +113,7 @@ func TestBzzResourceMultihash(t *testing.T) { } log.Info("added data", "manifest", string(b), "data", common.ToHex(mh)) - testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) + testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) if err != nil { t.Fatal(err) } @@ -182,12 +141,12 @@ func TestBzzResourceMultihash(t *testing.T) { t.Fatalf("data %s could not be unmarshaled: %v", b, err) } - correctManifestAddrHex := "6ef40ba1492cf2a029dc9a8b5896c822cf689d3cd010842f4f1744e6db8824bd" + correctManifestAddrHex := "bb056a5264c295c2b0f613c8409b9c87ce9d71576ace02458160df4cc894210b" if rsrcResp.Hex() != correctManifestAddrHex { - t.Fatalf("Response resource key mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) + t.Fatalf("Response feed manifest address mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) } - // get bzz manifest transparent resource resolve + // get bzz manifest transparent feed update resolve testBzzUrl = fmt.Sprintf("%s/bzz:/%s", srv.URL, rsrcResp) resp, err = http.Get(testBzzUrl) if err != nil { @@ -207,7 +166,7 @@ func TestBzzResourceMultihash(t *testing.T) { } // Test Swarm Feeds using the raw update methods -func TestBzzResource(t *testing.T) { +func TestBzzFeed(t *testing.T) { srv := testutil.NewTestSwarmServer(t, serverFunc, nil) signer, _ := newTestSigner() @@ -234,8 +193,8 @@ func TestBzzResource(t *testing.T) { t.Fatal(err) } - // creates resource and sets update 1 - testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) + // creates feed and sets update 1 + testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) if err != nil { t.Fatal(err) } @@ -262,9 +221,9 @@ func TestBzzResource(t *testing.T) { t.Fatalf("data %s could not be unmarshaled: %v", b, err) } - correctManifestAddrHex := "6ef40ba1492cf2a029dc9a8b5896c822cf689d3cd010842f4f1744e6db8824bd" + correctManifestAddrHex := "bb056a5264c295c2b0f613c8409b9c87ce9d71576ace02458160df4cc894210b" if rsrcResp.Hex() != correctManifestAddrHex { - t.Fatalf("Response resource manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) + t.Fatalf("Response feed manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) } // get the manifest @@ -289,12 +248,12 @@ func TestBzzResource(t *testing.T) { if len(manifest.Entries) != 1 { t.Fatalf("Manifest has %d entries", len(manifest.Entries)) } - correctViewHex := "0x666f6f2e65746800000000000000000000000000000000000000000000000000c96aaa54e2d44c299564da76e1cd3184a2386b8d" - if manifest.Entries[0].ResourceView.Hex() != correctViewHex { - t.Fatalf("Expected manifest Resource View '%s', got '%s'", correctViewHex, manifest.Entries[0].ResourceView.Hex()) + correctFeedHex := "0x666f6f2e65746800000000000000000000000000000000000000000000000000c96aaa54e2d44c299564da76e1cd3184a2386b8d" + if manifest.Entries[0].Feed.Hex() != correctFeedHex { + t.Fatalf("Expected manifest Feed '%s', got '%s'", correctFeedHex, manifest.Entries[0].Feed.Hex()) } - // get bzz manifest transparent resource resolve + // get bzz manifest transparent feed update resolve testBzzUrl := fmt.Sprintf("%s/bzz:/%s", srv.URL, rsrcResp) resp, err = http.Get(testBzzUrl) if err != nil { @@ -302,7 +261,7 @@ func TestBzzResource(t *testing.T) { } defer resp.Body.Close() if resp.StatusCode == http.StatusOK { - t.Fatal("Expected error status since resource is not multihash. Received 200 OK") + t.Fatal("Expected error status since feed update does not contain multihash. Received 200 OK") } b, err = ioutil.ReadAll(resp.Body) if err != nil { @@ -310,21 +269,21 @@ func TestBzzResource(t *testing.T) { } // get non-existent name, should fail - testBzzResUrl := fmt.Sprintf("%s/bzz-resource:/bar", srv.URL) + testBzzResUrl := fmt.Sprintf("%s/bzz-feed:/bar", srv.URL) resp, err = http.Get(testBzzResUrl) if err != nil { t.Fatal(err) } if resp.StatusCode != http.StatusNotFound { - t.Fatalf("Expected get non-existent resource to fail with StatusNotFound (404), got %d", resp.StatusCode) + t.Fatalf("Expected get non-existent feed manifest to fail with StatusNotFound (404), got %d", resp.StatusCode) } resp.Body.Close() - // get latest update (1.1) through resource directly + // get latest update through bzz-feed directly log.Info("get update latest = 1.1", "addr", correctManifestAddrHex) - testBzzResUrl = fmt.Sprintf("%s/bzz-resource:/%s", srv.URL, correctManifestAddrHex) + testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s", srv.URL, correctManifestAddrHex) resp, err = http.Get(testBzzResUrl) if err != nil { t.Fatal(err) @@ -346,15 +305,15 @@ func TestBzzResource(t *testing.T) { srv.CurrentTime++ log.Info("update 2") - // 1.- get metadata about this resource - testBzzResUrl = fmt.Sprintf("%s/bzz-resource:/%s/", srv.URL, correctManifestAddrHex) + // 1.- get metadata about this Feed + testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s/", srv.URL, correctManifestAddrHex) resp, err = http.Get(testBzzResUrl + "?meta=1") if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - t.Fatalf("Get resource metadata returned %s", resp.Status) + t.Fatalf("Get feed metadata returned %s", resp.Status) } b, err = ioutil.ReadAll(resp.Body) if err != nil { @@ -362,13 +321,13 @@ func TestBzzResource(t *testing.T) { } updateRequest = &mru.Request{} if err = updateRequest.UnmarshalJSON(b); err != nil { - t.Fatalf("Error decoding resource metadata: %s", err) + t.Fatalf("Error decoding feed metadata: %s", err) } updateRequest.SetData(update2Data) if err = updateRequest.Sign(signer); err != nil { t.Fatal(err) } - testUrl, err = url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) + testUrl, err = url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) if err != nil { t.Fatal(err) } @@ -385,9 +344,9 @@ func TestBzzResource(t *testing.T) { t.Fatalf("Update returned %s", resp.Status) } - // get latest update (1.2) through resource directly + // get latest update through bzz-feed directly log.Info("get update 1.2") - testBzzResUrl = fmt.Sprintf("%s/bzz-resource:/%s", srv.URL, correctManifestAddrHex) + testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s", srv.URL, correctManifestAddrHex) resp, err = http.Get(testBzzResUrl) if err != nil { t.Fatal(err) @@ -408,13 +367,13 @@ func TestBzzResource(t *testing.T) { log.Info("get first update in update1Timestamp via direct query") query := mru.NewQuery(&updateRequest.Feed, update1Timestamp, lookup.NoClue) - urlq, err := url.Parse(fmt.Sprintf("%s/bzz-resource:/", srv.URL)) + urlq, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) if err != nil { t.Fatal(err) } values := urlq.Query() - query.AppendValues(values) // this adds view query parameters + query.AppendValues(values) // this adds feed query parameters urlq.RawQuery = values.Encode() resp, err = http.Get(urlq.String()) if err != nil { diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index 9672ca540..f41a823bd 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -35,8 +35,8 @@ import ( ) const ( - ManifestType = "application/bzz-manifest+json" - ResourceContentType = "application/bzz-resource" + ManifestType = "application/bzz-manifest+json" + FeedContentType = "application/bzz-feed" manifestSizeLimit = 5 * 1024 * 1024 ) @@ -48,15 +48,15 @@ type Manifest struct { // ManifestEntry represents an entry in a swarm manifest type ManifestEntry struct { - Hash string `json:"hash,omitempty"` - Path string `json:"path,omitempty"` - ContentType string `json:"contentType,omitempty"` - Mode int64 `json:"mode,omitempty"` - Size int64 `json:"size,omitempty"` - ModTime time.Time `json:"mod_time,omitempty"` - Status int `json:"status,omitempty"` - Access *AccessEntry `json:"access,omitempty"` - ResourceView *mru.Feed `json:"resourceView,omitempty"` + Hash string `json:"hash,omitempty"` + Path string `json:"path,omitempty"` + ContentType string `json:"contentType,omitempty"` + Mode int64 `json:"mode,omitempty"` + Size int64 `json:"size,omitempty"` + ModTime time.Time `json:"mod_time,omitempty"` + Status int `json:"status,omitempty"` + Access *AccessEntry `json:"access,omitempty"` + Feed *mru.Feed `json:"feed,omitempty"` } // ManifestList represents the result of listing files in a manifest @@ -80,13 +80,13 @@ func (a *API) NewManifest(ctx context.Context, toEncrypt bool) (storage.Address, return addr, err } -// Manifest hack for supporting Mutable Resource Updates from the bzz: scheme +// Manifest hack for supporting Feeds from the bzz: scheme // see swarm/api/api.go:API.Get() for more information -func (a *API) NewResourceManifest(ctx context.Context, view *mru.Feed) (storage.Address, error) { +func (a *API) NewFeedManifest(ctx context.Context, feed *mru.Feed) (storage.Address, error) { var manifest Manifest entry := ManifestEntry{ - ResourceView: view, - ContentType: ResourceContentType, + Feed: feed, + ContentType: FeedContentType, } manifest.Entries = append(manifest.Entries, entry) data, err := json.Marshal(&manifest) diff --git a/swarm/api/uri.go b/swarm/api/uri.go index 808517088..09cfa4502 100644 --- a/swarm/api/uri.go +++ b/swarm/api/uri.go @@ -86,7 +86,7 @@ func Parse(rawuri string) (*URI, error) { // check the scheme is valid switch uri.Scheme { - case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-resource": + case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-feed": default: return nil, fmt.Errorf("unknown scheme %q", u.Scheme) } @@ -108,8 +108,8 @@ func Parse(rawuri string) (*URI, error) { } return uri, nil } -func (u *URI) Resource() bool { - return u.Scheme == "bzz-resource" +func (u *URI) Feed() bool { + return u.Scheme == "bzz-feed" } func (u *URI) Raw() bool { diff --git a/swarm/network/README.md b/swarm/network/README.md index 0955fe94e..33d215c4b 100644 --- a/swarm/network/README.md +++ b/swarm/network/README.md @@ -57,7 +57,7 @@ receipts for a deleted chunk easily to refute their challenge. - syncing should be resilient to cut connections, metadata should be persisted that keep track of syncing state across sessions, historical syncing state should survive restart - extra data structures to support syncing should be kept at minimum -- syncing is organized separately for chunk types (resource update v content chunk) +- syncing is organized separately for chunk types (Swarm Feed Updates v regular content chunk) - various types of streams should have common logic abstracted Syncing is now entirely mediated by the localstore, ie., no processes or memory leaks due to network contention. diff --git a/swarm/storage/localstore_test.go b/swarm/storage/localstore_test.go index 814d270d3..b8eea4350 100644 --- a/swarm/storage/localstore_test.go +++ b/swarm/storage/localstore_test.go @@ -30,8 +30,8 @@ var ( ) // tests that the content address validator correctly checks the data -// tests that resource update chunks are passed through content address validator -// the test checking the resouce update validator internal correctness is found in resource_test.go +// tests that Feed update chunks are passed through content address validator +// the test checking the resouce update validator internal correctness is found in storage/feeds/handler_test.go func TestValidator(t *testing.T) { // set up localstore datadir, err := ioutil.TempDir("", "storage-testvalidator") diff --git a/swarm/storage/mru/doc.go b/swarm/storage/mru/doc.go index 2cf2d3757..7ffd4a3c6 100644 --- a/swarm/storage/mru/doc.go +++ b/swarm/storage/mru/doc.go @@ -26,7 +26,7 @@ The Feed Update data is: updatedata = Feed|Epoch|data The full update data that goes in the chunk payload is: -resourcedata|sign(resourcedata) +updatedata|sign(updatedata) Structure Summary: diff --git a/swarm/storage/mru/error.go b/swarm/storage/mru/error.go index 714426449..452cc80f0 100644 --- a/swarm/storage/mru/error.go +++ b/swarm/storage/mru/error.go @@ -35,7 +35,7 @@ const ( ErrCnt ) -// Error is a the typed error object used for Mutable Resources +// Error is a the typed error object used for Swarm Feeds type Error struct { code int err string diff --git a/swarm/storage/mru/handler.go b/swarm/storage/mru/handler.go index 3ddeaafae..cc0da7df9 100644 --- a/swarm/storage/mru/handler.go +++ b/swarm/storage/mru/handler.go @@ -14,8 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Handler is the API for Mutable Resources -// It enables creating, updating, syncing and retrieving resources and their update data +// Handler is the API for Feeds +// It enables creating, updating, syncing and retrieving feed updates and their data package mru import ( @@ -265,7 +265,7 @@ func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Ad // send the chunk h.chunkStore.Put(ctx, chunk) log.Trace("feed update", "updateAddr", r.idAddr, "epoch time", r.Epoch.Time, "epoch level", r.Epoch.Level, "data", chunk.Data()) - // update our resources map cache entry if the new update is older than the one we have, if we have it. + // update our feed updates map cache entry if the new update is older than the one we have, if we have it. if feedUpdate != nil && r.Epoch.After(feedUpdate.Epoch) { feedUpdate.Epoch = r.Epoch feedUpdate.data = make([]byte, len(r.data)) diff --git a/swarm/storage/mru/handler_test.go b/swarm/storage/mru/handler_test.go index 3bf2bda8b..b66ff0c80 100644 --- a/swarm/storage/mru/handler_test.go +++ b/swarm/storage/mru/handler_test.go @@ -396,7 +396,7 @@ func TestValidatorInStore(t *testing.T) { signer := newAliceSigner() // set up localstore - datadir, err := ioutil.TempDir("", "storage-testresourcevalidator") + datadir, err := ioutil.TempDir("", "storage-testfeedsvalidator") if err != nil { t.Fatal(err) } @@ -463,7 +463,7 @@ func TestValidatorInStore(t *testing.T) { } } -// create rpc and resourcehandler +// create rpc and Feeds Handler func setupTest(timeProvider timestampProvider, signer Signer) (fh *TestHandler, datadir string, teardown func(), err error) { var fsClean func() diff --git a/swarm/storage/mru/request_test.go b/swarm/storage/mru/request_test.go index 33e975756..515de651c 100644 --- a/swarm/storage/mru/request_test.go +++ b/swarm/storage/mru/request_test.go @@ -228,7 +228,7 @@ func TestUpdateChunkSerializationErrorChecking(t *testing.T) { var recovered Request recovered.fromChunk(chunk.Address(), chunk.Data()) if !reflect.DeepEqual(recovered, r) { - t.Fatal("Expected recovered SignedResource update to equal the original one") + t.Fatal("Expected recovered Request update to equal the original one") } } @@ -248,7 +248,7 @@ func TestReverse(t *testing.T) { // signer containing private key signer := newAliceSigner() - // set up rpc and create resourcehandler + // set up rpc and create Feeds handler _, _, teardownTest, err := setupTest(timeProvider, signer) if err != nil { t.Fatal(err) diff --git a/swarm/swarm.go b/swarm/swarm.go index 0cd56d4eb..4d9bf724f 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -186,15 +186,15 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e // Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage self.fileStore = storage.NewFileStore(self.netStore, self.config.FileStoreParams) - var resourceHandler *mru.Handler - rhparams := &mru.HandlerParams{} + var feedsHandler *mru.Handler + fhParams := &mru.HandlerParams{} - resourceHandler = mru.NewHandler(rhparams) - resourceHandler.SetStore(self.netStore) + feedsHandler = mru.NewHandler(fhParams) + feedsHandler.SetStore(self.netStore) lstore.Validators = []storage.ChunkValidator{ storage.NewContentAddressValidator(storage.MakeHashFunc(storage.DefaultHash)), - resourceHandler, + feedsHandler, } log.Debug("Setup local storage") @@ -210,7 +210,7 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e pss.SetHandshakeController(self.ps, pss.NewHandshakeParams()) } - self.api = api.NewAPI(self.fileStore, self.dns, resourceHandler, self.privateKey) + self.api = api.NewAPI(self.fileStore, self.dns, feedsHandler, self.privateKey) self.sfs = fuse.NewSwarmFS(self.api) log.Debug("Initialized FUSE filesystem") diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go index 2309c39f0..2162da880 100644 --- a/swarm/testutil/http.go +++ b/swarm/testutil/http.go @@ -48,14 +48,14 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso } fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams()) - // mutable resources test setup - resourceDir, err := ioutil.TempDir("", "swarm-resource-test") + // Swarm Feeds test setup + feedsDir, err := ioutil.TempDir("", "swarm-feeds-test") if err != nil { t.Fatal(err) } rhparams := &mru.HandlerParams{} - rh, err := mru.NewTestHandler(resourceDir, rhparams) + rh, err := mru.NewTestHandler(feedsDir, rhparams) if err != nil { t.Fatal(err) } @@ -71,7 +71,7 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso srv.Close() rh.Close() os.RemoveAll(dir) - os.RemoveAll(resourceDir) + os.RemoveAll(feedsDir) }, CurrentTime: 42, } From b6ccc06cdaac80d09da17c25b2f450cd1f1b7914 Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Sun, 30 Sep 2018 09:51:11 +0200 Subject: [PATCH 4/8] swarm/storage/feeds: Final package rename and moved files --- .github/CODEOWNERS | 2 +- cmd/swarm/{mru.go => feeds.go} | 28 +++++++------- cmd/swarm/{mru_test.go => feeds_test.go} | 14 +++---- swarm/OWNERS | 2 +- swarm/api/api.go | 27 ++++++------- swarm/api/client/client.go | 18 ++++----- swarm/api/client/client_test.go | 22 +++++------ swarm/api/http/server.go | 10 ++--- swarm/api/http/server_test.go | 20 +++++----- swarm/api/manifest.go | 6 +-- swarm/pss/notify/notify.go | 2 +- .../{mru => feeds}/binaryserializer.go | 2 +- .../{mru => feeds}/binaryserializer_test.go | 2 +- swarm/storage/{mru => feeds}/cacheentry.go | 2 +- swarm/storage/{mru => feeds}/doc.go | 2 +- swarm/storage/{mru => feeds}/error.go | 4 +- swarm/storage/{mru/view.go => feeds/feed.go} | 38 +++++++++---------- .../{mru/view_test.go => feeds/feed_test.go} | 2 +- swarm/storage/{mru => feeds}/handler.go | 4 +- swarm/storage/{mru => feeds}/handler_test.go | 4 +- swarm/storage/{mru => feeds}/id.go | 4 +- swarm/storage/{mru => feeds}/id_test.go | 4 +- swarm/storage/{mru => feeds}/lookup/epoch.go | 0 .../{mru => feeds}/lookup/epoch_test.go | 2 +- swarm/storage/{mru => feeds}/lookup/lookup.go | 0 .../{mru => feeds}/lookup/lookup_test.go | 2 +- swarm/storage/{mru => feeds}/query.go | 4 +- swarm/storage/{mru => feeds}/query_test.go | 2 +- swarm/storage/{mru => feeds}/request.go | 4 +- swarm/storage/{mru => feeds}/request_test.go | 4 +- swarm/storage/{mru => feeds}/sign.go | 2 +- swarm/storage/{mru => feeds}/testutil.go | 2 +- .../{mru => feeds}/timestampprovider.go | 4 +- swarm/storage/{mru => feeds}/topic.go | 2 +- swarm/storage/{mru => feeds}/topic_test.go | 2 +- swarm/storage/{mru => feeds}/update.go | 2 +- swarm/storage/{mru => feeds}/update_test.go | 2 +- swarm/swarm.go | 8 ++-- swarm/testutil/http.go | 12 +++--- 39 files changed, 137 insertions(+), 136 deletions(-) rename cmd/swarm/{mru.go => feeds.go} (86%) rename cmd/swarm/{mru_test.go => feeds_test.go} (94%) rename swarm/storage/{mru => feeds}/binaryserializer.go (99%) rename swarm/storage/{mru => feeds}/binaryserializer_test.go (99%) rename swarm/storage/{mru => feeds}/cacheentry.go (99%) rename swarm/storage/{mru => feeds}/doc.go (99%) rename swarm/storage/{mru => feeds}/error.go (95%) rename swarm/storage/{mru/view.go => feeds/feed.go} (79%) rename swarm/storage/{mru/view_test.go => feeds/feed_test.go} (98%) rename swarm/storage/{mru => feeds}/handler.go (99%) rename swarm/storage/{mru => feeds}/handler_test.go (99%) rename swarm/storage/{mru => feeds}/id.go (97%) rename swarm/storage/{mru => feeds}/id_test.go (89%) rename swarm/storage/{mru => feeds}/lookup/epoch.go (100%) rename swarm/storage/{mru => feeds}/lookup/epoch_test.go (93%) rename swarm/storage/{mru => feeds}/lookup/lookup.go (100%) rename swarm/storage/{mru => feeds}/lookup/lookup_test.go (99%) rename swarm/storage/{mru => feeds}/query.go (97%) rename swarm/storage/{mru => feeds}/query_test.go (98%) rename swarm/storage/{mru => feeds}/request.go (99%) rename swarm/storage/{mru => feeds}/request_test.go (99%) rename swarm/storage/{mru => feeds}/sign.go (99%) rename swarm/storage/{mru => feeds}/testutil.go (99%) rename swarm/storage/{mru => feeds}/timestampprovider.go (97%) rename swarm/storage/{mru => feeds}/topic.go (99%) rename swarm/storage/{mru => feeds}/topic_test.go (98%) rename swarm/storage/{mru => feeds}/update.go (99%) rename swarm/storage/{mru => feeds}/update_test.go (99%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0a09baef7..e052cdae3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,6 +27,6 @@ swarm/services @zelig swarm/state @justelad swarm/storage/encryption @gbalint @zelig @nagydani swarm/storage/mock @janos -swarm/storage/mru @nolash +swarm/storage/feeds @nolash swarm/testutil @lmars whisper/ @gballet @gluk256 diff --git a/cmd/swarm/mru.go b/cmd/swarm/feeds.go similarity index 86% rename from cmd/swarm/mru.go rename to cmd/swarm/feeds.go index 6c6d44c0a..b7b513556 100644 --- a/cmd/swarm/mru.go +++ b/cmd/swarm/feeds.go @@ -27,15 +27,15 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/swarm/storage/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "gopkg.in/urfave/cli.v1" ) -func NewGenericSigner(ctx *cli.Context) mru.Signer { - return mru.NewGenericSigner(getPrivKey(ctx)) +func NewGenericSigner(ctx *cli.Context) feeds.Signer { + return feeds.NewGenericSigner(getPrivKey(ctx)) } -func getTopic(ctx *cli.Context) (topic mru.Topic) { +func getTopic(ctx *cli.Context) (topic feeds.Topic) { var name = ctx.String(SwarmFeedNameFlag.Name) var relatedTopic = ctx.String(SwarmFeedTopicFlag.Name) var relatedTopicBytes []byte @@ -48,7 +48,7 @@ func getTopic(ctx *cli.Context) (topic mru.Topic) { } } - topic, err = mru.NewTopic(name, relatedTopicBytes) + topic, err = feeds.NewTopic(name, relatedTopicBytes) if err != nil { utils.Fatalf("Error parsing topic: %s", err) } @@ -65,7 +65,7 @@ func feedCreateManifest(ctx *cli.Context) { client = swarm.NewClient(bzzapi) ) - newFeedUpdateRequest := mru.NewFirstRequest(getTopic(ctx)) + newFeedUpdateRequest := feeds.NewFirstRequest(getTopic(ctx)) newFeedUpdateRequest.Feed.User = feedGetUser(ctx) manifestAddress, err := client.CreateFeedWithManifest(newFeedUpdateRequest) @@ -100,18 +100,18 @@ func feedUpdate(ctx *cli.Context) { return } - var updateRequest *mru.Request - var query *mru.Query + var updateRequest *feeds.Request + var query *feeds.Query if manifestAddressOrDomain == "" { - query = new(mru.Query) + query = new(feeds.Query) query.User = signer.Address() query.Topic = getTopic(ctx) } - // Retrieve feed status and metadata out of the manifest - updateRequest, err = client.GetFeedMetadata(query, manifestAddressOrDomain) + // Retrieve a feed update request + updateRequest, err = client.GetFeedRequest(query, manifestAddressOrDomain) if err != nil { utils.Fatalf("Error retrieving feed status: %s", err.Error()) } @@ -139,14 +139,14 @@ func feedInfo(ctx *cli.Context) { manifestAddressOrDomain = ctx.String(SwarmFeedManifestFlag.Name) ) - var query *mru.Query + var query *feeds.Query if manifestAddressOrDomain == "" { - query = new(mru.Query) + query = new(feeds.Query) query.Topic = getTopic(ctx) query.User = feedGetUser(ctx) } - metadata, err := client.GetFeedMetadata(query, manifestAddressOrDomain) + metadata, err := client.GetFeedRequest(query, manifestAddressOrDomain) if err != nil { utils.Fatalf("Error retrieving feed metadata: %s", err.Error()) return diff --git a/cmd/swarm/mru_test.go b/cmd/swarm/feeds_test.go similarity index 94% rename from cmd/swarm/mru_test.go rename to cmd/swarm/feeds_test.go index c0c43aca4..a403f8fe4 100644 --- a/cmd/swarm/mru_test.go +++ b/cmd/swarm/feeds_test.go @@ -26,11 +26,11 @@ import ( "testing" "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" "github.com/ethereum/go-ethereum/swarm/testutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/storage/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" @@ -65,7 +65,7 @@ func TestCLIFeedUpdate(t *testing.T) { } // compose a topic. We'll be doing quotes about Miguel de Cervantes - var topic mru.Topic + var topic feeds.Topic subject := []byte("Miguel de Cervantes") copy(topic[:], subject[:]) name := "quotes" @@ -95,19 +95,19 @@ func TestCLIFeedUpdate(t *testing.T) { // build the same topic as before, this time // we use NewTopic to create a topic automatically. - topic, err = mru.NewTopic(name, subject) + topic, err = feeds.NewTopic(name, subject) if err != nil { t.Fatal(err) } // Feed configures whose updates we will be looking up. - feed := mru.Feed{ + feed := feeds.Feed{ Topic: topic, User: address, } // Build a query to get the latest update - query := mru.NewQueryLatest(&feed, lookup.NoClue) + query := feeds.NewQueryLatest(&feed, lookup.NoClue) // retrieve content! reader, err := client.QueryFeed(query, "") @@ -139,7 +139,7 @@ func TestCLIFeedUpdate(t *testing.T) { cmd.ExpectExit() // verify we can deserialize the result as a valid JSON - var request mru.Request + var request feeds.Request err = json.Unmarshal([]byte(matches[0]), &request) if err != nil { t.Fatal(err) diff --git a/swarm/OWNERS b/swarm/OWNERS index 774cd7db9..4681ed5ef 100644 --- a/swarm/OWNERS +++ b/swarm/OWNERS @@ -22,5 +22,5 @@ swarm ├── storage ─────────────── ethersphere │ ├── encryption ──────── @gbalint, @zelig, @nagydani │ ├── mock ────────────── @janos -│ └── mru ─────────────── @nolash +│ └── feeds ───────────── @nolash └── testutil ────────────── @lmars \ No newline at end of file diff --git a/swarm/api/api.go b/swarm/api/api.go index 9b4571bee..c61bd8064 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -45,9 +45,10 @@ 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/mru" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" - "github.com/opentracing/opentracing-go" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + + opentracing "github.com/opentracing/opentracing-go" ) var ( @@ -235,14 +236,14 @@ on top of the FileStore it is the public interface of the FileStore which is included in the ethereum stack */ type API struct { - feeds *mru.Handler + feeds *feeds.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 *mru.Handler, pk *ecdsa.PrivateKey) (self *API) { +func NewAPI(fileStore *storage.FileStore, dns Resolver, feedsHandler *feeds.Handler, pk *ecdsa.PrivateKey) (self *API) { self = &API{ fileStore: fileStore, dns: dns, @@ -408,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, mru.NewQueryLatest(entry.Feed, lookup.NoClue)) + _, err := a.feeds.Lookup(ctx, feeds.NewQueryLatest(entry.Feed, lookup.NoClue)) if err != nil { apiGetNotFound.Inc(1) status = http.StatusNotFound @@ -957,7 +958,7 @@ 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 *mru.Query) ([]byte, error) { +func (a *API) FeedsLookup(ctx context.Context, query *feeds.Query) ([]byte, error) { _, err := a.feeds.Lookup(ctx, query) if err != nil { return nil, err @@ -971,12 +972,12 @@ func (a *API) FeedsLookup(ctx context.Context, query *mru.Query) ([]byte, error) } // FeedsNewRequest creates a Request object to update a specific Feed -func (a *API) FeedsNewRequest(ctx context.Context, feed *mru.Feed) (*mru.Request, error) { +func (a *API) FeedsNewRequest(ctx context.Context, feed *feeds.Feed) (*feeds.Request, error) { return a.feeds.NewRequest(ctx, feed) } // FeedsUpdate publishes a new update on the given Feed -func (a *API) FeedsUpdate(ctx context.Context, request *mru.Request) (storage.Address, error) { +func (a *API) FeedsUpdate(ctx context.Context, request *feeds.Request) (storage.Address, error) { return a.feeds.Update(ctx, request) } @@ -992,7 +993,7 @@ var ErrCannotLoadFeedManifest = errors.New("Cannot load feed manifest") var ErrNotAFeedManifest = errors.New("Not a feed manifest") // ResolveFeedManifest retrieves the Feed manifest for the given address, and returns the referenced Feed. -func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*mru.Feed, error) { +func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*feeds.Feed, error) { trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt) if err != nil { return nil, ErrCannotLoadFeedManifest @@ -1015,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 mru.Values) (*mru.Feed, error) { - var feed *mru.Feed +func (a *API) ResolveFeed(ctx context.Context, uri *URI, values feeds.Values) (*feeds.Feed, error) { + var feed *feeds.Feed var err error if uri.Addr != "" { // resolve the content key. @@ -1035,7 +1036,7 @@ func (a *API) ResolveFeed(ctx context.Context, uri *URI, values mru.Values) (*mr } log.Debug("handle.get.feed: resolved", "manifestkey", manifestAddr, "feed", feed.Hex()) } else { - var v mru.Feed + var v feeds.Feed if err := v.FromValues(values); err != nil { return nil, ErrCannotResolveFeed diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go index 76ada1297..6b4614581 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/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" ) 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 *mru.Request) (string, error) { +func (c *Client) CreateFeedWithManifest(request *feeds.Request) (string, error) { responseStream, err := c.updateFeed(request, true) if err != nil { return "", err @@ -628,12 +628,12 @@ func (c *Client) CreateFeedWithManifest(request *mru.Request) (string, error) { } // UpdateFeed allows you to set a new version of your content -func (c *Client) UpdateFeed(request *mru.Request) error { +func (c *Client) UpdateFeed(request *feeds.Request) error { _, err := c.updateFeed(request, false) return err } -func (c *Client) updateFeed(request *mru.Request, createManifest bool) (io.ReadCloser, error) { +func (c *Client) updateFeed(request *feeds.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 *mru.Request, createManifest bool) (io.ReadC // 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 *mru.Query, manifestAddressOrDomain string) (io.ReadCloser, error) { +func (c *Client) QueryFeed(query *feeds.Query, manifestAddressOrDomain string) (io.ReadCloser, error) { return c.queryFeed(query, manifestAddressOrDomain, false) } @@ -670,7 +670,7 @@ func (c *Client) QueryFeed(query *mru.Query, manifestAddressOrDomain string) (io // 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 *mru.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) { +func (c *Client) queryFeed(query *feeds.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) { URL, err := url.Parse(c.Gateway) if err != nil { return nil, err @@ -706,10 +706,10 @@ func (c *Client) queryFeed(query *mru.Query, manifestAddressOrDomain string, met return res.Body, nil } -// GetFeedMetadata returns a structure that describes the referenced Feed status +// 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) GetFeedMetadata(query *mru.Query, manifestAddressOrDomain string) (*mru.Request, error) { +func (c *Client) GetFeedRequest(query *feeds.Query, manifestAddressOrDomain string) (*feeds.Request, error) { responseStream, err := c.queryFeed(query, manifestAddressOrDomain, true) if err != nil { @@ -722,7 +722,7 @@ func (c *Client) GetFeedMetadata(query *mru.Query, manifestAddressOrDomain strin return nil, err } - var metadata mru.Request + var metadata feeds.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 fbc49a6e1..4fad7fbc7 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/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/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/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "github.com/ethereum/go-ethereum/swarm/testutil" ) @@ -361,12 +361,12 @@ func TestClientMultipartUpload(t *testing.T) { } } -func newTestSigner() (*mru.GenericSigner, error) { +func newTestSigner() (*feeds.GenericSigner, error) { privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") if err != nil { return nil, err } - return mru.NewGenericSigner(privKey), nil + return feeds.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, _ := mru.NewTopic("foo.eth", nil) + topic, _ := feeds.NewTopic("foo.eth", nil) - createRequest := mru.NewFirstRequest(topic) + createRequest := feeds.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, _ := mru.NewTopic("El Quijote", nil) - createRequest := mru.NewFirstRequest(topic) + topic, _ := feeds.NewTopic("El Quijote", nil) + createRequest := feeds.NewFirstRequest(topic) createRequest.SetData(databytes) if err := createRequest.Sign(signer); err != nil { @@ -479,7 +479,7 @@ func TestClientCreateUpdateFeed(t *testing.T) { // define different data databytes = []byte("... no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero ...") - updateRequest, err := client.GetFeedMetadata(nil, correctManifestAddrHex) + updateRequest, err := client.GetFeedRequest(nil, correctManifestAddrHex) if err != nil { t.Fatalf("Error retrieving update request template: %s", err) } @@ -508,12 +508,12 @@ func TestClientCreateUpdateFeed(t *testing.T) { // now try retrieving feed updates without a manifest - feed := &mru.Feed{ + feed := &feeds.Feed{ Topic: topic, User: signer.Address(), } - lookupParams := mru.NewQueryLatest(feed, lookup.NoClue) + lookupParams := feeds.NewQueryLatest(feed, 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 c5b3b564c..84e06d09f 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/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "github.com/rs/cors" ) @@ -466,7 +466,7 @@ 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 mru.updateRequestJSON JSON structure + // Creation and update must send feeds.updateRequestJSON JSON structure body, err := ioutil.ReadAll(r.Body) if err != nil { RespondError(w, r, err.Error(), http.StatusInternalServerError) @@ -484,7 +484,7 @@ func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) { return } - var updateRequest mru.Request + var updateRequest feeds.Request updateRequest.Feed = *feed query := r.URL.Query() @@ -582,7 +582,7 @@ func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) { return } - lookupParams := &mru.Query{Feed: *feed} + lookupParams := &feeds.Query{Feed: *feed} 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 @@ -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.(*mru.Error) + rsrcErr, ok := err.(*feeds.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 a7c7e3003..16813cab5 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/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/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/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "github.com/ethereum/go-ethereum/swarm/testutil" ) @@ -62,12 +62,12 @@ func serverFunc(api *api.API) testutil.TestServer { return NewServer(api, "") } -func newTestSigner() (*mru.GenericSigner, error) { +func newTestSigner() (*feeds.GenericSigner, error) { privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") if err != nil { return nil, err } - return mru.NewGenericSigner(privKey), nil + return feeds.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, _ := mru.NewTopic("foo.eth", nil) - updateRequest := mru.NewFirstRequest(topic) + topic, _ := feeds.NewTopic("foo.eth", nil) + updateRequest := feeds.NewFirstRequest(topic) updateRequest.SetData(mh) @@ -182,8 +182,8 @@ func TestBzzFeed(t *testing.T) { //data for update 2 update2Data := []byte("foo") - topic, _ := mru.NewTopic("foo.eth", nil) - updateRequest := mru.NewFirstRequest(topic) + topic, _ := feeds.NewTopic("foo.eth", nil) + updateRequest := feeds.NewFirstRequest(topic) if err != nil { t.Fatal(err) } @@ -319,7 +319,7 @@ func TestBzzFeed(t *testing.T) { if err != nil { t.Fatal(err) } - updateRequest = &mru.Request{} + updateRequest = &feeds.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 := mru.NewQuery(&updateRequest.Feed, update1Timestamp, lookup.NoClue) + query := feeds.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 f41a823bd..9ac3214a5 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/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "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 *mru.Feed `json:"feed,omitempty"` + Feed *feeds.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 Feeds from the bzz: scheme // see swarm/api/api.go:API.Get() for more information -func (a *API) NewFeedManifest(ctx context.Context, feed *mru.Feed) (storage.Address, error) { +func (a *API) NewFeedManifest(ctx context.Context, feed *feeds.Feed) (storage.Address, error) { var manifest Manifest entry := ManifestEntry{ Feed: feed, diff --git a/swarm/pss/notify/notify.go b/swarm/pss/notify/notify.go index 723092c32..01ecb4ff9 100644 --- a/swarm/pss/notify/notify.go +++ b/swarm/pss/notify/notify.go @@ -317,7 +317,7 @@ func (c *Controller) handleStartMsg(msg *Msg, keyid string) (err error) { return err } - // TODO this is set to zero-length byte pending decision on protocol for initial message, whether it should include message or not, and how to trigger the initial message so that current state of MRU is sent upon subscription + // TODO this is set to zero-length byte pending decision on protocol for initial message, whether it should include message or not, and how to trigger the initial message so that current state of Swarm Feed is sent upon subscription notify := []byte{} replyMsg := NewMsg(MsgCodeNotifyWithKey, msg.namestring, make([]byte, len(notify)+symKeyLength)) copy(replyMsg.Payload, notify) diff --git a/swarm/storage/mru/binaryserializer.go b/swarm/storage/feeds/binaryserializer.go similarity index 99% rename from swarm/storage/mru/binaryserializer.go rename to swarm/storage/feeds/binaryserializer.go index 3123a82ee..ce146571b 100644 --- a/swarm/storage/mru/binaryserializer.go +++ b/swarm/storage/feeds/binaryserializer.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/swarm/storage/mru/binaryserializer_test.go b/swarm/storage/feeds/binaryserializer_test.go similarity index 99% rename from swarm/storage/mru/binaryserializer_test.go rename to swarm/storage/feeds/binaryserializer_test.go index f524157d6..0c81e7f18 100644 --- a/swarm/storage/mru/binaryserializer_test.go +++ b/swarm/storage/feeds/binaryserializer_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "encoding/json" diff --git a/swarm/storage/mru/cacheentry.go b/swarm/storage/feeds/cacheentry.go similarity index 99% rename from swarm/storage/mru/cacheentry.go rename to swarm/storage/feeds/cacheentry.go index f6ed72818..7a2f87b56 100644 --- a/swarm/storage/mru/cacheentry.go +++ b/swarm/storage/feeds/cacheentry.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "bytes" diff --git a/swarm/storage/mru/doc.go b/swarm/storage/feeds/doc.go similarity index 99% rename from swarm/storage/mru/doc.go rename to swarm/storage/feeds/doc.go index 7ffd4a3c6..d1edf5d6d 100644 --- a/swarm/storage/mru/doc.go +++ b/swarm/storage/feeds/doc.go @@ -40,4 +40,4 @@ Request: Feed Update with signature Epoch: time slot where the update is stored */ -package mru +package feeds diff --git a/swarm/storage/mru/error.go b/swarm/storage/feeds/error.go similarity index 95% rename from swarm/storage/mru/error.go rename to swarm/storage/feeds/error.go index 452cc80f0..13266b900 100644 --- a/swarm/storage/mru/error.go +++ b/swarm/storage/feeds/error.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "fmt" @@ -47,7 +47,7 @@ func (e *Error) Error() string { } // Code returns the error code -// Error codes are enumerated in the error.go file within the mru package +// Error codes are enumerated in the error.go file within the feeds package func (e *Error) Code() int { return e.code } diff --git a/swarm/storage/mru/view.go b/swarm/storage/feeds/feed.go similarity index 79% rename from swarm/storage/mru/view.go rename to swarm/storage/feeds/feed.go index 8d21ef7a4..8a807d506 100644 --- a/swarm/storage/mru/view.go +++ b/swarm/storage/feeds/feed.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "hash" @@ -37,9 +37,9 @@ type Feed struct { const feedLength = TopicLength + common.AddressLength // mapKey calculates a unique id for this feed. Used by the cache map in `Handler` -func (u *Feed) mapKey() uint64 { +func (f *Feed) mapKey() uint64 { serializedData := make([]byte, feedLength) - u.binaryPut(serializedData) + f.binaryPut(serializedData) hasher := hashPool.Get().(hash.Hash) defer hashPool.Put(hasher) hasher.Reset() @@ -49,54 +49,54 @@ func (u *Feed) mapKey() uint64 { } // binaryPut serializes this Feed instance into the provided slice -func (u *Feed) binaryPut(serializedData []byte) error { +func (f *Feed) binaryPut(serializedData []byte) error { if len(serializedData) != feedLength { return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize Feed. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int - copy(serializedData[cursor:cursor+TopicLength], u.Topic[:TopicLength]) + copy(serializedData[cursor:cursor+TopicLength], f.Topic[:TopicLength]) cursor += TopicLength - copy(serializedData[cursor:cursor+common.AddressLength], u.User[:]) + copy(serializedData[cursor:cursor+common.AddressLength], f.User[:]) cursor += common.AddressLength return nil } // binaryLength returns the expected size of this structure when serialized -func (u *Feed) binaryLength() int { +func (f *Feed) binaryLength() int { return feedLength } // binaryGet restores the current instance from the information contained in the passed slice -func (u *Feed) binaryGet(serializedData []byte) error { +func (f *Feed) binaryGet(serializedData []byte) error { if len(serializedData) != feedLength { return NewErrorf(ErrInvalidValue, "Incorrect slice size to read Feed. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int - copy(u.Topic[:], serializedData[cursor:cursor+TopicLength]) + copy(f.Topic[:], serializedData[cursor:cursor+TopicLength]) cursor += TopicLength - copy(u.User[:], serializedData[cursor:cursor+common.AddressLength]) + copy(f.User[:], serializedData[cursor:cursor+common.AddressLength]) cursor += common.AddressLength return nil } // Hex serializes the Feed to a hex string -func (u *Feed) Hex() string { +func (f *Feed) Hex() string { serializedData := make([]byte, feedLength) - u.binaryPut(serializedData) + f.binaryPut(serializedData) return hexutil.Encode(serializedData) } // FromValues deserializes this instance from a string key-value store // useful to parse query strings -func (u *Feed) FromValues(values Values) (err error) { +func (f *Feed) FromValues(values Values) (err error) { topic := values.Get("topic") if topic != "" { - if err := u.Topic.FromHex(values.Get("topic")); err != nil { + if err := f.Topic.FromHex(values.Get("topic")); err != nil { return err } } else { // see if the user set name and relatedcontent @@ -108,18 +108,18 @@ func (u *Feed) FromValues(values Values) (err error) { } relatedContent = relatedContent[:storage.AddressLength] } - u.Topic, err = NewTopic(name, relatedContent) + f.Topic, err = NewTopic(name, relatedContent) if err != nil { return err } } - u.User = common.HexToAddress(values.Get("user")) + f.User = common.HexToAddress(values.Get("user")) return nil } // AppendValues serializes this structure into the provided string key-value store // useful to build query strings -func (u *Feed) AppendValues(values Values) { - values.Set("topic", u.Topic.Hex()) - values.Set("user", u.User.Hex()) +func (f *Feed) AppendValues(values Values) { + values.Set("topic", f.Topic.Hex()) + values.Set("user", f.User.Hex()) } diff --git a/swarm/storage/mru/view_test.go b/swarm/storage/feeds/feed_test.go similarity index 98% rename from swarm/storage/mru/view_test.go rename to swarm/storage/feeds/feed_test.go index e2f4d6b30..7806e0ad7 100644 --- a/swarm/storage/mru/view_test.go +++ b/swarm/storage/feeds/feed_test.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "testing" diff --git a/swarm/storage/mru/handler.go b/swarm/storage/feeds/handler.go similarity index 99% rename from swarm/storage/mru/handler.go rename to swarm/storage/feeds/handler.go index cc0da7df9..9c69fd1b4 100644 --- a/swarm/storage/mru/handler.go +++ b/swarm/storage/feeds/handler.go @@ -16,7 +16,7 @@ // Handler is the API for Feeds // It enables creating, updating, syncing and retrieving feed updates and their data -package mru +package feeds import ( "bytes" @@ -25,7 +25,7 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" "github.com/ethereum/go-ethereum/swarm/log" "github.com/ethereum/go-ethereum/swarm/storage" diff --git a/swarm/storage/mru/handler_test.go b/swarm/storage/feeds/handler_test.go similarity index 99% rename from swarm/storage/mru/handler_test.go rename to swarm/storage/feeds/handler_test.go index b66ff0c80..8331980ca 100644 --- a/swarm/storage/mru/handler_test.go +++ b/swarm/storage/feeds/handler_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "bytes" @@ -31,7 +31,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/swarm/chunk" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) var ( diff --git a/swarm/storage/mru/id.go b/swarm/storage/feeds/id.go similarity index 97% rename from swarm/storage/mru/id.go rename to swarm/storage/feeds/id.go index dcc88ac2a..dd813ae89 100644 --- a/swarm/storage/mru/id.go +++ b/swarm/storage/feeds/id.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "fmt" @@ -22,7 +22,7 @@ import ( "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" "github.com/ethereum/go-ethereum/swarm/storage" ) diff --git a/swarm/storage/mru/id_test.go b/swarm/storage/feeds/id_test.go similarity index 89% rename from swarm/storage/mru/id_test.go rename to swarm/storage/feeds/id_test.go index 767b3c159..2ef12e891 100644 --- a/swarm/storage/mru/id_test.go +++ b/swarm/storage/feeds/id_test.go @@ -1,9 +1,9 @@ -package mru +package feeds import ( "testing" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) func getTestID() *ID { diff --git a/swarm/storage/mru/lookup/epoch.go b/swarm/storage/feeds/lookup/epoch.go similarity index 100% rename from swarm/storage/mru/lookup/epoch.go rename to swarm/storage/feeds/lookup/epoch.go diff --git a/swarm/storage/mru/lookup/epoch_test.go b/swarm/storage/feeds/lookup/epoch_test.go similarity index 93% rename from swarm/storage/mru/lookup/epoch_test.go rename to swarm/storage/feeds/lookup/epoch_test.go index 62cf5523d..70bfd836a 100644 --- a/swarm/storage/mru/lookup/epoch_test.go +++ b/swarm/storage/feeds/lookup/epoch_test.go @@ -3,7 +3,7 @@ package lookup_test import ( "testing" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) func TestMarshallers(t *testing.T) { diff --git a/swarm/storage/mru/lookup/lookup.go b/swarm/storage/feeds/lookup/lookup.go similarity index 100% rename from swarm/storage/mru/lookup/lookup.go rename to swarm/storage/feeds/lookup/lookup.go diff --git a/swarm/storage/mru/lookup/lookup_test.go b/swarm/storage/feeds/lookup/lookup_test.go similarity index 99% rename from swarm/storage/mru/lookup/lookup_test.go rename to swarm/storage/feeds/lookup/lookup_test.go index 34bcb61f0..7d5014608 100644 --- a/swarm/storage/mru/lookup/lookup_test.go +++ b/swarm/storage/feeds/lookup/lookup_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) type Data struct { diff --git a/swarm/storage/mru/query.go b/swarm/storage/feeds/query.go similarity index 97% rename from swarm/storage/mru/query.go rename to swarm/storage/feeds/query.go index a0b358bfd..7bd2800a8 100644 --- a/swarm/storage/mru/query.go +++ b/swarm/storage/feeds/query.go @@ -14,14 +14,14 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "fmt" "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) // Query is used to specify constraints when performing an update lookup diff --git a/swarm/storage/mru/query_test.go b/swarm/storage/feeds/query_test.go similarity index 98% rename from swarm/storage/mru/query_test.go rename to swarm/storage/feeds/query_test.go index 4cfc597b2..1420c69ae 100644 --- a/swarm/storage/mru/query_test.go +++ b/swarm/storage/feeds/query_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "testing" diff --git a/swarm/storage/mru/request.go b/swarm/storage/feeds/request.go similarity index 99% rename from swarm/storage/mru/request.go rename to swarm/storage/feeds/request.go index ca88adda1..719d8fba8 100644 --- a/swarm/storage/mru/request.go +++ b/swarm/storage/feeds/request.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "bytes" @@ -24,7 +24,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) // Request represents a request to sign or signed Feed Update message diff --git a/swarm/storage/mru/request_test.go b/swarm/storage/feeds/request_test.go similarity index 99% rename from swarm/storage/mru/request_test.go rename to swarm/storage/feeds/request_test.go index 515de651c..2e3783834 100644 --- a/swarm/storage/mru/request_test.go +++ b/swarm/storage/feeds/request_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "bytes" @@ -26,7 +26,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) func areEqualJSON(s1, s2 string) (bool, error) { diff --git a/swarm/storage/mru/sign.go b/swarm/storage/feeds/sign.go similarity index 99% rename from swarm/storage/mru/sign.go rename to swarm/storage/feeds/sign.go index 03b0fa2b6..a69942f2b 100644 --- a/swarm/storage/mru/sign.go +++ b/swarm/storage/feeds/sign.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "crypto/ecdsa" diff --git a/swarm/storage/mru/testutil.go b/swarm/storage/feeds/testutil.go similarity index 99% rename from swarm/storage/mru/testutil.go rename to swarm/storage/feeds/testutil.go index 80e0d4cf0..879f73348 100644 --- a/swarm/storage/mru/testutil.go +++ b/swarm/storage/feeds/testutil.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "context" diff --git a/swarm/storage/mru/timestampprovider.go b/swarm/storage/feeds/timestampprovider.go similarity index 97% rename from swarm/storage/mru/timestampprovider.go rename to swarm/storage/feeds/timestampprovider.go index 6ac153213..f6aa0775c 100644 --- a/swarm/storage/mru/timestampprovider.go +++ b/swarm/storage/feeds/timestampprovider.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "encoding/binary" @@ -22,7 +22,7 @@ import ( "time" ) -// TimestampProvider sets the time source of the mru package +// TimestampProvider sets the time source of the feeds package var TimestampProvider timestampProvider = NewDefaultTimestampProvider() // Timestamp encodes a point in time as a Unix epoch diff --git a/swarm/storage/mru/topic.go b/swarm/storage/feeds/topic.go similarity index 99% rename from swarm/storage/mru/topic.go rename to swarm/storage/feeds/topic.go index b6adb4cd7..2dc8c18cd 100644 --- a/swarm/storage/mru/topic.go +++ b/swarm/storage/feeds/topic.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "bytes" diff --git a/swarm/storage/mru/topic_test.go b/swarm/storage/feeds/topic_test.go similarity index 98% rename from swarm/storage/mru/topic_test.go rename to swarm/storage/feeds/topic_test.go index dad7c7ddc..8994002d7 100644 --- a/swarm/storage/mru/topic_test.go +++ b/swarm/storage/feeds/topic_test.go @@ -1,4 +1,4 @@ -package mru +package feeds import ( "testing" diff --git a/swarm/storage/mru/update.go b/swarm/storage/feeds/update.go similarity index 99% rename from swarm/storage/mru/update.go rename to swarm/storage/feeds/update.go index f6e70b4d8..02bd37522 100644 --- a/swarm/storage/mru/update.go +++ b/swarm/storage/feeds/update.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "fmt" diff --git a/swarm/storage/mru/update_test.go b/swarm/storage/feeds/update_test.go similarity index 99% rename from swarm/storage/mru/update_test.go rename to swarm/storage/feeds/update_test.go index 62c401f3f..7763da0c8 100644 --- a/swarm/storage/mru/update_test.go +++ b/swarm/storage/feeds/update_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package mru +package feeds import ( "testing" diff --git a/swarm/swarm.go b/swarm/swarm.go index 4d9bf724f..74c53dece 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -50,7 +50,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/state" "github.com/ethereum/go-ethereum/swarm/storage" "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/ethereum/go-ethereum/swarm/storage/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" "github.com/ethereum/go-ethereum/swarm/tracing" ) @@ -186,10 +186,10 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e // Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage self.fileStore = storage.NewFileStore(self.netStore, self.config.FileStoreParams) - var feedsHandler *mru.Handler - fhParams := &mru.HandlerParams{} + var feedsHandler *feeds.Handler + fhParams := &feeds.HandlerParams{} - feedsHandler = mru.NewHandler(fhParams) + feedsHandler = feeds.NewHandler(fhParams) feedsHandler.SetStore(self.netStore) lstore.Validators = []storage.ChunkValidator{ diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go index 2162da880..05b7c52e0 100644 --- a/swarm/testutil/http.go +++ b/swarm/testutil/http.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/api" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/mru" + "github.com/ethereum/go-ethereum/swarm/storage/feeds" ) type TestServer interface { @@ -54,8 +54,8 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso t.Fatal(err) } - rhparams := &mru.HandlerParams{} - rh, err := mru.NewTestHandler(feedsDir, rhparams) + rhparams := &feeds.HandlerParams{} + rh, err := feeds.NewTestHandler(feedsDir, rhparams) if err != nil { t.Fatal(err) } @@ -75,7 +75,7 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso }, CurrentTime: 42, } - mru.TimestampProvider = tss + feeds.TimestampProvider = tss return tss } @@ -92,6 +92,6 @@ func (t *TestSwarmServer) Close() { t.cleanup() } -func (t *TestSwarmServer) Now() mru.Timestamp { - return mru.Timestamp{Time: t.CurrentTime} +func (t *TestSwarmServer) Now() feeds.Timestamp { + return feeds.Timestamp{Time: t.CurrentTime} } From 68b8088cb9730bfe0ee2395dd5506dc744076fc2 Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Mon, 1 Oct 2018 18:36:05 +0200 Subject: [PATCH 5/8] swarm: Changed owners. --- .github/CODEOWNERS | 2 +- swarm/OWNERS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e052cdae3..e51afa24c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,6 +27,6 @@ swarm/services @zelig swarm/state @justelad swarm/storage/encryption @gbalint @zelig @nagydani swarm/storage/mock @janos -swarm/storage/feeds @nolash +swarm/storage/feeds @nolash @jpeletier swarm/testutil @lmars whisper/ @gballet @gluk256 diff --git a/swarm/OWNERS b/swarm/OWNERS index 4681ed5ef..cea47766f 100644 --- a/swarm/OWNERS +++ b/swarm/OWNERS @@ -22,5 +22,5 @@ swarm ├── storage ─────────────── ethersphere │ ├── encryption ──────── @gbalint, @zelig, @nagydani │ ├── mock ────────────── @janos -│ └── feeds ───────────── @nolash +│ └── feeds ───────────── @nolash, @jpeletier └── testutil ────────────── @lmars \ No newline at end of file From 58c0879c2fbc9f88f35ba503674088da23a8a5a7 Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Tue, 2 Oct 2018 09:32:46 +0200 Subject: [PATCH 6/8] swarm/storage/feeds: removed capital Feed throughout --- cmd/swarm/feeds.go | 2 +- cmd/swarm/feeds_test.go | 2 +- cmd/swarm/main.go | 8 ++++---- swarm/api/api.go | 22 +++++++++++----------- swarm/api/client/client.go | 8 ++++---- swarm/api/http/server.go | 4 ++-- swarm/api/http/server_test.go | 4 ++-- swarm/api/manifest.go | 2 +- swarm/network/README.md | 4 ++-- swarm/storage/feeds/cacheentry.go | 4 ++-- swarm/storage/feeds/error.go | 4 ++-- swarm/storage/feeds/feed.go | 10 +++++----- swarm/storage/feeds/handler.go | 12 ++++++------ swarm/storage/feeds/handler_test.go | 14 +++++++------- swarm/storage/feeds/lookup/lookup.go | 2 +- swarm/storage/feeds/request.go | 2 +- swarm/storage/feeds/request_test.go | 8 ++++---- swarm/storage/feeds/sign.go | 4 ++-- swarm/storage/localstore_test.go | 2 +- swarm/testutil/http.go | 2 +- 20 files changed, 60 insertions(+), 60 deletions(-) diff --git a/cmd/swarm/feeds.go b/cmd/swarm/feeds.go index b7b513556..4b34d6d95 100644 --- a/cmd/swarm/feeds.go +++ b/cmd/swarm/feeds.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// Command feed allows the user to create and update signed Swarm Feeds +// Command feed allows the user to create and update signed Swarm feeds package main import ( diff --git a/cmd/swarm/feeds_test.go b/cmd/swarm/feeds_test.go index a403f8fe4..055d0ab4c 100644 --- a/cmd/swarm/feeds_test.go +++ b/cmd/swarm/feeds_test.go @@ -145,7 +145,7 @@ func TestCLIFeedUpdate(t *testing.T) { t.Fatal(err) } - // make sure the retrieved Feed is the same + // make sure the retrieved feed is the same if request.Feed != feed { t.Fatalf("Expected feed to be: %s, got %s", feed, request.Feed) } diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go index 4c4dfceb7..cdc90a994 100644 --- a/cmd/swarm/main.go +++ b/cmd/swarm/main.go @@ -355,8 +355,8 @@ func init() { Action: feedCreateManifest, CustomHelpTemplate: helpTemplate, Name: "create", - Usage: "creates and publishes a new Feed manifest", - Description: `creates and publishes a new Feed manifest pointing to a specified user's updates about a particular topic. + Usage: "creates and publishes a new feed manifest", + Description: `creates and publishes a new feed manifest pointing to a specified user's updates about a particular topic. The feed topic can be built in the following ways: * use --topic to set the topic to an arbitrary binary hex string. * use --name to set the topic to a human-readable name. @@ -392,8 +392,8 @@ func init() { Action: feedInfo, CustomHelpTemplate: helpTemplate, Name: "info", - Usage: "obtains information about an existing Swarm Feed", - Description: `obtains information about an existing Swarm Feed + Usage: "obtains information about an existing Swarm feed", + Description: `obtains information about an existing Swarm feed The topic can be specified directly with the --topic flag as an hex string If no topic is specified, the default topic (zero) will be used The --name flag can be used to specify subtopics with a specific name. diff --git a/swarm/api/api.go b/swarm/api/api.go index c61bd8064..a23e09e68 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -404,7 +404,7 @@ func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage return a.Get(ctx, decrypt, adr, entry.Path) } - // we need to do some extra work if this is a Feed manifest + // we need to do some extra work if this is a Swarm feed manifest if entry.ContentType == FeedContentType { if entry.Feed == nil { return reader, mimeType, status, nil, fmt.Errorf("Cannot decode Feed in manifest") @@ -957,7 +957,7 @@ func (a *API) BuildDirectoryTree(ctx context.Context, mhash string, nameresolver return addr, manifestEntryMap, nil } -// FeedsLookup finds Swarm Feeds Updates at specific points in time, or the latest update +// 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) if err != nil { @@ -971,17 +971,17 @@ func (a *API) FeedsLookup(ctx context.Context, query *feeds.Query) ([]byte, erro return data, nil } -// FeedsNewRequest creates a Request object to update a specific Feed +// 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) } -// FeedsUpdate publishes a new update on the given 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) } -// FeedsHashSize returned the size of the digest produced by Swarm Feeds' hashing function +// FeedsHashSize returned the size of the digest produced by Swarm feeds' hashing function func (a *API) FeedsHashSize() int { return a.feeds.HashSize } @@ -992,7 +992,7 @@ var ErrCannotLoadFeedManifest = errors.New("Cannot load feed manifest") // ErrNotAFeedManifest is returned when the address provided returned something other than a valid manifest var ErrNotAFeedManifest = errors.New("Not a feed manifest") -// ResolveFeedManifest retrieves the Feed manifest for the given address, and returns the referenced Feed. +// 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) { trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt) if err != nil { @@ -1007,15 +1007,15 @@ func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*f return entry.Feed, nil } -// ErrCannotResolveFeedURI is returned when the ENS resolver is not able to translate a name to a Feed +// ErrCannotResolveFeedURI is returned when the ENS resolver is not able to translate a name to a Swarm feed var ErrCannotResolveFeedURI = errors.New("Cannot resolve Feed URI") // ErrCannotResolveFeed is returned when values provided are not enough or invalid to recreate a -// Feed out of them. +// feed out of them. 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 +// 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 var err error @@ -1029,7 +1029,7 @@ func (a *API) ResolveFeed(ctx context.Context, uri *URI, values feeds.Values) (* } } - // get the Feed from the manifest + // get the Swarm feed from the manifest feed, err = a.ResolveFeedManifest(ctx, manifestAddr) if err != nil { return nil, err diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go index 6b4614581..ac218e6a7 100644 --- a/swarm/api/client/client.go +++ b/swarm/api/client/client.go @@ -604,9 +604,9 @@ func (c *Client) MultipartUpload(hash string, uploader Uploader) (string, error) // ErrNoFeedUpdatesFound is returned when Swarm cannot find updates of the given feed var ErrNoFeedUpdatesFound = errors.New("No updates found for this feed") -// CreateFeedWithManifest creates a Feed Manifest, initializing it with the provided +// CreateFeedWithManifest creates a feed manifest, initializing it with the provided // data -// Returns the resulting Feed Manifest address that you can use to include in an ENS Resolver (setContent) +// 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) { responseStream, err := c.updateFeed(request, true) @@ -669,7 +669,7 @@ func (c *Client) QueryFeed(query *feeds.Query, manifestAddressOrDomain string) ( // 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 -// meta set to true will instruct the node return Feed metainformation instead +// 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) { URL, err := url.Parse(c.Gateway) if err != nil { @@ -706,7 +706,7 @@ func (c *Client) queryFeed(query *feeds.Query, manifestAddressOrDomain string, m return res.Body, nil } -// GetFeedRequest returns a structure that describes the referenced Feed status +// 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) { diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index 84e06d09f..0cfeb1f22 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -518,7 +518,7 @@ func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) { return } // the key to the manifest will be passed back to the client - // the client can access the Feed directly through its Feed member + // the client can access the feed directly through its Feed member // the manifest key can be set as content in the resolver of the ENS name outdata, err := json.Marshal(m) if err != nil { @@ -531,7 +531,7 @@ func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) { } } -// HandleGetFeed retrieves Swarm Feeds updates: +// HandleGetFeed retrieves Swarm feeds updates: // bzz-feed:// - get latest feed update, given a manifest address // - or - // specify user + topic (optional), subtopic name (optional) directly, without manifest: diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 16813cab5..4ab99b209 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -165,7 +165,7 @@ func TestBzzFeedMultihash(t *testing.T) { } } -// Test Swarm Feeds using the raw update methods +// Test Swarm feeds using the raw update methods func TestBzzFeed(t *testing.T) { srv := testutil.NewTestSwarmServer(t, serverFunc, nil) signer, _ := newTestSigner() @@ -305,7 +305,7 @@ func TestBzzFeed(t *testing.T) { srv.CurrentTime++ log.Info("update 2") - // 1.- get metadata about this Feed + // 1.- get metadata about this feed testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s/", srv.URL, correctManifestAddrHex) resp, err = http.Get(testBzzResUrl + "?meta=1") if err != nil { diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go index 9ac3214a5..e45ae85c4 100644 --- a/swarm/api/manifest.go +++ b/swarm/api/manifest.go @@ -80,7 +80,7 @@ func (a *API) NewManifest(ctx context.Context, toEncrypt bool) (storage.Address, return addr, err } -// Manifest hack for supporting Feeds from the bzz: scheme +// 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) { var manifest Manifest diff --git a/swarm/network/README.md b/swarm/network/README.md index 33d215c4b..684ad0c8c 100644 --- a/swarm/network/README.md +++ b/swarm/network/README.md @@ -37,7 +37,7 @@ Using the streamer logic, various stream types are easy to implement: * live session syncing * historical syncing * simple retrieve requests and deliveries -* Swarm Feeds streams +* swarm feeds streams * receipting for finger pointing ## Syncing @@ -57,7 +57,7 @@ receipts for a deleted chunk easily to refute their challenge. - syncing should be resilient to cut connections, metadata should be persisted that keep track of syncing state across sessions, historical syncing state should survive restart - extra data structures to support syncing should be kept at minimum -- syncing is organized separately for chunk types (Swarm Feed Updates v regular content chunk) +- syncing is not organized separately for chunk types (Swarm feed updates v regular content chunk) - various types of streams should have common logic abstracted Syncing is now entirely mediated by the localstore, ie., no processes or memory leaks due to network contention. diff --git a/swarm/storage/feeds/cacheentry.go b/swarm/storage/feeds/cacheentry.go index 7a2f87b56..e40037688 100644 --- a/swarm/storage/feeds/cacheentry.go +++ b/swarm/storage/feeds/cacheentry.go @@ -30,7 +30,7 @@ const ( defaultRetrieveTimeout = 100 * time.Millisecond ) -// cacheEntry caches the last known update of a specific Feed. +// cacheEntry caches the last known update of a specific Swarm feed. type cacheEntry struct { Update *bytes.Reader @@ -42,7 +42,7 @@ func (r *cacheEntry) Size(ctx context.Context, _ chan bool) (int64, error) { return int64(len(r.Update.data)), nil } -//returns the Feed's topic +//returns the feed's topic func (r *cacheEntry) Topic() Topic { return r.Feed.Topic } diff --git a/swarm/storage/feeds/error.go b/swarm/storage/feeds/error.go index 13266b900..7751a9f19 100644 --- a/swarm/storage/feeds/error.go +++ b/swarm/storage/feeds/error.go @@ -35,7 +35,7 @@ const ( ErrCnt ) -// Error is a the typed error object used for Swarm Feeds +// Error is a the typed error object used for Swarm feeds type Error struct { code int err string @@ -52,7 +52,7 @@ func (e *Error) Code() int { return e.code } -// NewError creates a new Swarm Feeds Error object with the specified code and custom error message +// NewError creates a new Swarm feeds Error object with the specified code and custom error message func NewError(code int, s string) error { if code < 0 || code >= ErrCnt { panic("no such error code!") diff --git a/swarm/storage/feeds/feed.go b/swarm/storage/feeds/feed.go index 8a807d506..d5b262555 100644 --- a/swarm/storage/feeds/feed.go +++ b/swarm/storage/feeds/feed.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/storage" ) -// Feed represents a particular user's stream of updates on a Topic +// Feed represents a particular user's stream of updates on a topic type Feed struct { Topic Topic `json:"topic"` User common.Address `json:"user"` @@ -48,10 +48,10 @@ func (f *Feed) mapKey() uint64 { return *(*uint64)(unsafe.Pointer(&hash[0])) } -// binaryPut serializes this Feed instance into the provided slice +// binaryPut serializes this feed instance into the provided slice func (f *Feed) binaryPut(serializedData []byte) error { if len(serializedData) != feedLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize Feed. Expected %d, got %d", feedLength, len(serializedData)) + return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize feed. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int copy(serializedData[cursor:cursor+TopicLength], f.Topic[:TopicLength]) @@ -71,7 +71,7 @@ func (f *Feed) binaryLength() int { // binaryGet restores the current instance from the information contained in the passed slice func (f *Feed) binaryGet(serializedData []byte) error { if len(serializedData) != feedLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to read Feed. Expected %d, got %d", feedLength, len(serializedData)) + return NewErrorf(ErrInvalidValue, "Incorrect slice size to read feed. Expected %d, got %d", feedLength, len(serializedData)) } var cursor int @@ -84,7 +84,7 @@ func (f *Feed) binaryGet(serializedData []byte) error { return nil } -// Hex serializes the Feed to a hex string +// Hex serializes the feed to a hex string func (f *Feed) Hex() string { serializedData := make([]byte, feedLength) f.binaryPut(serializedData) diff --git a/swarm/storage/feeds/handler.go b/swarm/storage/feeds/handler.go index 9c69fd1b4..2c5261614 100644 --- a/swarm/storage/feeds/handler.go +++ b/swarm/storage/feeds/handler.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Handler is the API for Feeds +// Handler is the API for feeds // It enables creating, updating, syncing and retrieving feed updates and their data package feeds @@ -57,7 +57,7 @@ func init() { } } -// NewHandler creates a new Swarm Feeds API +// NewHandler creates a new Swarm feeds API func NewHandler(params *HandlerParams) *Handler { fh := &Handler{ cache: make(map[uint64]*cacheEntry), @@ -74,7 +74,7 @@ func NewHandler(params *HandlerParams) *Handler { return fh } -// SetStore sets the store backend for the Swarm Feeds API +// SetStore sets the store backend for the Swarm feeds API func (h *Handler) SetStore(store *storage.NetStore) { h.chunkStore = store } @@ -110,7 +110,7 @@ func (h *Handler) Validate(chunkAddr storage.Address, data []byte) bool { return true } -// GetContent retrieves the data payload of the last synced update of the Feed +// GetContent retrieves the data payload of the last synced update of the feed func (h *Handler) GetContent(feed *Feed) (storage.Address, []byte, error) { if feed == nil { return nil, nil, NewError(ErrInvalidValue, "feed is nil") @@ -240,7 +240,7 @@ func (h *Handler) updateCache(request *Request) (*cacheEntry, error) { } // Update publishes a feed update -// Note that a Feed update cannot span chunks, and thus has a MAX NET LENGTH 4096, INCLUDING update header data and signature. +// Note that a feed update cannot span chunks, and thus has a MAX NET LENGTH 4096, INCLUDING update header data and signature. // This results in a max payload of `maxUpdateDataLength` (check update.go for more details) // An error will be returned if the total length of the chunk payload will exceed this limit. // Update can only check if the caller is trying to overwrite the very last known version, otherwise it just puts the update @@ -286,7 +286,7 @@ func (h *Handler) get(feed *Feed) *cacheEntry { return feedUpdate } -// Sets the feed update cache value for the given Feed +// Sets the feed update cache value for the given feed func (h *Handler) set(feed *Feed, feedUpdate *cacheEntry) { mapKey := feed.mapKey() h.cacheLock.Lock() diff --git a/swarm/storage/feeds/handler_test.go b/swarm/storage/feeds/handler_test.go index 8331980ca..967bc6d4b 100644 --- a/swarm/storage/feeds/handler_test.go +++ b/swarm/storage/feeds/handler_test.go @@ -89,11 +89,11 @@ func TestFeedsHandler(t *testing.T) { } defer teardownTest() - // create a new Feed + // create a new feed ctx, cancel := context.WithCancel(context.Background()) defer cancel() - topic, _ := NewTopic("Mess with Swarm Feeds code and see what ghost catches you", nil) + topic, _ := NewTopic("Mess with Swarm feeds code and see what ghost catches you", nil) feed := Feed{ Topic: topic, User: signer.Address(), @@ -266,7 +266,7 @@ func TestSparseUpdates(t *testing.T) { defer teardownTest() defer os.RemoveAll(datadir) - // create a new Feed + // create a new feed ctx, cancel := context.WithCancel(context.Background()) defer cancel() topic, _ := NewTopic("Very slow updates", nil) @@ -348,7 +348,7 @@ func TestValidator(t *testing.T) { } defer teardownTest() - // create new Feed + // create new feed topic, _ := NewTopic(subtopicName, nil) feed := Feed{ Topic: topic, @@ -382,7 +382,7 @@ func TestValidator(t *testing.T) { } // tests that the content address validator correctly checks the data -// tests that Feed update chunks are passed through content address validator +// tests that feed update chunks are passed through content address validator // there is some redundancy in this test as it also tests content addressed chunks, // which should be evaluated as invalid chunks by this validator func TestValidatorInStore(t *testing.T) { @@ -409,7 +409,7 @@ func TestValidatorInStore(t *testing.T) { t.Fatal(err) } - // set up Swarm Feeds handler and add is as a validator to the localstore + // set up Swarm feeds handler and add is as a validator to the localstore fhParams := &HandlerParams{} fh := NewHandler(fhParams) store.Validators = append(store.Validators, fh) @@ -463,7 +463,7 @@ func TestValidatorInStore(t *testing.T) { } } -// create rpc and Feeds Handler +// create rpc and feeds Handler func setupTest(timeProvider timestampProvider, signer Signer) (fh *TestHandler, datadir string, teardown func(), err error) { var fsClean func() diff --git a/swarm/storage/feeds/lookup/lookup.go b/swarm/storage/feeds/lookup/lookup.go index a5154d261..2f862d81c 100644 --- a/swarm/storage/feeds/lookup/lookup.go +++ b/swarm/storage/feeds/lookup/lookup.go @@ -15,7 +15,7 @@ // along with the go-ethereum library. If not, see . /* -Package lookup defines Feed lookup algorithms and provides tools to place updates +Package lookup defines feed lookup algorithms and provides tools to place updates so they can be found */ package lookup diff --git a/swarm/storage/feeds/request.go b/swarm/storage/feeds/request.go index 719d8fba8..81e1b10fe 100644 --- a/swarm/storage/feeds/request.go +++ b/swarm/storage/feeds/request.go @@ -27,7 +27,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" ) -// Request represents a request to sign or signed Feed Update message +// Request represents a request to sign or signed feed update message type Request struct { Update // actual content that will be put on the chunk, less signature Signature *Signature diff --git a/swarm/storage/feeds/request_test.go b/swarm/storage/feeds/request_test.go index 2e3783834..a9a4d1505 100644 --- a/swarm/storage/feeds/request_test.go +++ b/swarm/storage/feeds/request_test.go @@ -47,7 +47,7 @@ func areEqualJSON(s1, s2 string) (bool, error) { } // TestEncodingDecodingUpdateRequests ensures that requests are serialized properly -// while also checking cryptographically that only the owner of a Feed can update it. +// while also checking cryptographically that only the owner of a feed can update it. func TestEncodingDecodingUpdateRequests(t *testing.T) { charlie := newCharlieSigner() //Charlie @@ -136,7 +136,7 @@ func TestEncodingDecodingUpdateRequests(t *testing.T) { t.Fatal("Expected DecodeUpdateRequest to fail when trying to interpret a corrupt message with an invalid signature") } - // Now imagine Bob wants to create an update of his own about the same Feed, + // Now imagine Bob wants to create an update of his own about the same feed, // signing a message with his private key if err := request.Sign(bob); err != nil { t.Fatalf("Error signing: %s", err) @@ -228,7 +228,7 @@ func TestUpdateChunkSerializationErrorChecking(t *testing.T) { var recovered Request recovered.fromChunk(chunk.Address(), chunk.Data()) if !reflect.DeepEqual(recovered, r) { - t.Fatal("Expected recovered Request update to equal the original one") + t.Fatal("Expected recovered feed update request to equal the original one") } } @@ -248,7 +248,7 @@ func TestReverse(t *testing.T) { // signer containing private key signer := newAliceSigner() - // set up rpc and create Feeds handler + // set up rpc and create feeds handler _, _, teardownTest, err := setupTest(timeProvider, signer) if err != nil { t.Fatal(err) diff --git a/swarm/storage/feeds/sign.go b/swarm/storage/feeds/sign.go index a69942f2b..f5760c8f2 100644 --- a/swarm/storage/feeds/sign.go +++ b/swarm/storage/feeds/sign.go @@ -28,7 +28,7 @@ const signatureLength = 65 // Signature is an alias for a static byte array with the size of a signature type Signature [signatureLength]byte -// Signer signs Feed update payloads +// Signer signs feed update payloads type Signer interface { Sign(common.Hash) (Signature, error) Address() common.Address @@ -65,7 +65,7 @@ func (s *GenericSigner) Address() common.Address { return s.address } -// getUserAddr extracts the address of the Feed update signer +// getUserAddr extracts the address of the feed update signer func getUserAddr(digest common.Hash, signature Signature) (common.Address, error) { pub, err := crypto.SigToPub(digest.Bytes(), signature[:]) if err != nil { diff --git a/swarm/storage/localstore_test.go b/swarm/storage/localstore_test.go index b8eea4350..10f43f30f 100644 --- a/swarm/storage/localstore_test.go +++ b/swarm/storage/localstore_test.go @@ -30,7 +30,7 @@ var ( ) // tests that the content address validator correctly checks the data -// tests that Feed update chunks are passed through content address validator +// tests that feed update chunks are passed through content address validator // the test checking the resouce update validator internal correctness is found in storage/feeds/handler_test.go func TestValidator(t *testing.T) { // set up localstore diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go index 05b7c52e0..2e5735ece 100644 --- a/swarm/testutil/http.go +++ b/swarm/testutil/http.go @@ -48,7 +48,7 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso } fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams()) - // Swarm Feeds test setup + // Swarm feeds test setup feedsDir, err := ioutil.TempDir("", "swarm-feeds-test") if err != nil { t.Fatal(err) From 696bc9b01ce0ed3347fa1bd64460ccc08091e90a Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Tue, 2 Oct 2018 09:36:11 +0200 Subject: [PATCH 7/8] swarm/storage/feeds: renamed vars that can conflict with package name --- cmd/swarm/feeds_test.go | 8 ++++---- swarm/api/client/client_test.go | 4 ++-- swarm/storage/feeds/handler_test.go | 22 +++++++++++----------- swarm/storage/feeds/request_test.go | 4 ++-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/cmd/swarm/feeds_test.go b/cmd/swarm/feeds_test.go index 055d0ab4c..dd0651a25 100644 --- a/cmd/swarm/feeds_test.go +++ b/cmd/swarm/feeds_test.go @@ -101,13 +101,13 @@ func TestCLIFeedUpdate(t *testing.T) { } // Feed configures whose updates we will be looking up. - feed := feeds.Feed{ + fd := feeds.Feed{ Topic: topic, User: address, } // Build a query to get the latest update - query := feeds.NewQueryLatest(&feed, lookup.NoClue) + query := feeds.NewQueryLatest(&fd, lookup.NoClue) // retrieve content! reader, err := client.QueryFeed(query, "") @@ -146,8 +146,8 @@ func TestCLIFeedUpdate(t *testing.T) { } // make sure the retrieved feed is the same - if request.Feed != feed { - t.Fatalf("Expected feed to be: %s, got %s", feed, request.Feed) + if request.Feed != fd { + t.Fatalf("Expected feed to be: %s, got %s", fd, request.Feed) } // test publishing a manifest diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go index 4fad7fbc7..2aecdb299 100644 --- a/swarm/api/client/client_test.go +++ b/swarm/api/client/client_test.go @@ -508,12 +508,12 @@ func TestClientCreateUpdateFeed(t *testing.T) { // now try retrieving feed updates without a manifest - feed := &feeds.Feed{ + fd := &feeds.Feed{ Topic: topic, User: signer.Address(), } - lookupParams := feeds.NewQueryLatest(feed, lookup.NoClue) + lookupParams := feeds.NewQueryLatest(fd, lookup.NoClue) reader, err = client.QueryFeed(lookupParams, "") if err != nil { t.Fatalf("Error retrieving feed updates: %s", err) diff --git a/swarm/storage/feeds/handler_test.go b/swarm/storage/feeds/handler_test.go index 967bc6d4b..b35a7c1c1 100644 --- a/swarm/storage/feeds/handler_test.go +++ b/swarm/storage/feeds/handler_test.go @@ -94,7 +94,7 @@ func TestFeedsHandler(t *testing.T) { defer cancel() topic, _ := NewTopic("Mess with Swarm feeds code and see what ghost catches you", nil) - feed := Feed{ + fd := Feed{ Topic: topic, User: signer.Address(), } @@ -107,7 +107,7 @@ func TestFeedsHandler(t *testing.T) { "clyde", // t=4285 } - request := NewFirstRequest(feed.Topic) // this timestamps the update at t = 4200 (start time) + request := NewFirstRequest(fd.Topic) // this timestamps the update at t = 4200 (start time) chunkAddress := make(map[string]storage.Address) data := []byte(updates[0]) request.SetData(data) @@ -270,7 +270,7 @@ func TestSparseUpdates(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() topic, _ := NewTopic("Very slow updates", nil) - feed := Feed{ + fd := Feed{ Topic: topic, User: signer.Address(), } @@ -280,7 +280,7 @@ func TestSparseUpdates(t *testing.T) { var epoch lookup.Epoch var lastUpdateTime uint64 for T := uint64(0); T < today; T += 5 * Year { - request := NewFirstRequest(feed.Topic) + request := NewFirstRequest(fd.Topic) request.Epoch = lookup.GetNextEpoch(epoch, T) request.data = generateData(T) // this generates some data that depends on T, so we can check later request.Sign(signer) @@ -295,14 +295,14 @@ func TestSparseUpdates(t *testing.T) { lastUpdateTime = T } - query := NewQuery(&feed, today, lookup.NoClue) + query := NewQuery(&fd, today, lookup.NoClue) _, err = rh.Lookup(ctx, query) if err != nil { t.Fatal(err) } - _, content, err := rh.GetContent(&feed) + _, content, err := rh.GetContent(&fd) if err != nil { t.Fatal(err) } @@ -321,7 +321,7 @@ func TestSparseUpdates(t *testing.T) { t.Fatal(err) } - _, content, err = rh.GetContent(&feed) + _, content, err = rh.GetContent(&fd) if err != nil { t.Fatal(err) } @@ -350,11 +350,11 @@ func TestValidator(t *testing.T) { // create new feed topic, _ := NewTopic(subtopicName, nil) - feed := Feed{ + fd := Feed{ Topic: topic, User: signer.Address(), } - mr := NewFirstRequest(feed.Topic) + mr := NewFirstRequest(fd.Topic) // chunk with address data := []byte("foo") @@ -420,7 +420,7 @@ func TestValidatorInStore(t *testing.T) { badChunk := storage.NewChunk(chunks[1].Address(), goodChunk.Data()) topic, _ := NewTopic("xyzzy", nil) - feed := Feed{ + fd := Feed{ Topic: topic, User: signer.Address(), } @@ -430,7 +430,7 @@ func TestValidatorInStore(t *testing.T) { Epoch: lookup.Epoch{Time: 42, Level: 1, }, - Feed: feed, + Feed: fd, } updateAddr := id.Addr() diff --git a/swarm/storage/feeds/request_test.go b/swarm/storage/feeds/request_test.go index a9a4d1505..8a15815a4 100644 --- a/swarm/storage/feeds/request_test.go +++ b/swarm/storage/feeds/request_test.go @@ -256,7 +256,7 @@ func TestReverse(t *testing.T) { defer teardownTest() topic, _ := NewTopic("Cervantes quotes", nil) - feed := Feed{ + fd := Feed{ Topic: topic, User: signer.Address(), } @@ -264,7 +264,7 @@ func TestReverse(t *testing.T) { data := []byte("Donde una puerta se cierra, otra se abre") request := new(Request) - request.Feed = feed + request.Feed = fd request.Epoch = epoch request.data = data From de01178c18766b9f744acc94fe2b96804f998e40 Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Wed, 3 Oct 2018 09:15:17 +0200 Subject: [PATCH 8/8] swarm/storage/feed: Renamed package --- .github/CODEOWNERS | 2 +- cmd/swarm/feeds.go | 22 ++++----- cmd/swarm/feeds_test.go | 14 +++--- swarm/OWNERS | 2 +- swarm/api/api.go | 48 +++++++++---------- swarm/api/client/client.go | 16 +++---- swarm/api/client/client_test.go | 20 ++++---- swarm/api/http/server.go | 24 +++++----- swarm/api/http/server_test.go | 20 ++++---- swarm/api/manifest.go | 6 +-- swarm/pss/notify/notify.go | 2 +- .../{feeds => feed}/binaryserializer.go | 2 +- .../{feeds => feed}/binaryserializer_test.go | 2 +- swarm/storage/{feeds => feed}/cacheentry.go | 2 +- swarm/storage/{feeds => feed}/doc.go | 2 +- swarm/storage/{feeds => feed}/error.go | 2 +- swarm/storage/{feeds => feed}/feed.go | 2 +- swarm/storage/{feeds => feed}/feed_test.go | 2 +- swarm/storage/{feeds => feed}/handler.go | 4 +- swarm/storage/{feeds => feed}/handler_test.go | 4 +- swarm/storage/{feeds => feed}/id.go | 4 +- swarm/storage/{feeds => feed}/id_test.go | 4 +- swarm/storage/{feeds => feed}/lookup/epoch.go | 0 .../{feeds => feed}/lookup/epoch_test.go | 2 +- .../storage/{feeds => feed}/lookup/lookup.go | 0 .../{feeds => feed}/lookup/lookup_test.go | 2 +- swarm/storage/{feeds => feed}/query.go | 4 +- swarm/storage/{feeds => feed}/query_test.go | 2 +- swarm/storage/{feeds => feed}/request.go | 4 +- swarm/storage/{feeds => feed}/request_test.go | 4 +- swarm/storage/{feeds => feed}/sign.go | 2 +- swarm/storage/{feeds => feed}/testutil.go | 2 +- .../{feeds => feed}/timestampprovider.go | 2 +- swarm/storage/{feeds => feed}/topic.go | 2 +- swarm/storage/{feeds => feed}/topic_test.go | 2 +- swarm/storage/{feeds => feed}/update.go | 2 +- swarm/storage/{feeds => feed}/update_test.go | 2 +- swarm/swarm.go | 8 ++-- swarm/testutil/http.go | 12 ++--- 39 files changed, 129 insertions(+), 129 deletions(-) rename swarm/storage/{feeds => feed}/binaryserializer.go (99%) rename swarm/storage/{feeds => feed}/binaryserializer_test.go (99%) rename swarm/storage/{feeds => feed}/cacheentry.go (99%) rename swarm/storage/{feeds => feed}/doc.go (99%) rename swarm/storage/{feeds => feed}/error.go (99%) rename swarm/storage/{feeds => feed}/feed.go (99%) rename swarm/storage/{feeds => feed}/feed_test.go (98%) rename swarm/storage/{feeds => feed}/handler.go (99%) rename swarm/storage/{feeds => feed}/handler_test.go (99%) rename swarm/storage/{feeds => feed}/id.go (97%) rename swarm/storage/{feeds => feed}/id_test.go (89%) rename swarm/storage/{feeds => feed}/lookup/epoch.go (100%) rename swarm/storage/{feeds => feed}/lookup/epoch_test.go (93%) rename swarm/storage/{feeds => feed}/lookup/lookup.go (100%) rename swarm/storage/{feeds => feed}/lookup/lookup_test.go (99%) rename swarm/storage/{feeds => feed}/query.go (97%) rename swarm/storage/{feeds => feed}/query_test.go (98%) rename swarm/storage/{feeds => feed}/request.go (99%) rename swarm/storage/{feeds => feed}/request_test.go (99%) rename swarm/storage/{feeds => feed}/sign.go (99%) rename swarm/storage/{feeds => feed}/testutil.go (99%) rename swarm/storage/{feeds => feed}/timestampprovider.go (99%) rename swarm/storage/{feeds => feed}/topic.go (99%) rename swarm/storage/{feeds => feed}/topic_test.go (98%) rename swarm/storage/{feeds => feed}/update.go (99%) rename swarm/storage/{feeds => feed}/update_test.go (99%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e51afa24c..5a717da00 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -27,6 +27,6 @@ swarm/services @zelig swarm/state @justelad swarm/storage/encryption @gbalint @zelig @nagydani swarm/storage/mock @janos -swarm/storage/feeds @nolash @jpeletier +swarm/storage/feed @nolash @jpeletier swarm/testutil @lmars whisper/ @gballet @gluk256 diff --git a/cmd/swarm/feeds.go b/cmd/swarm/feeds.go index 4b34d6d95..6806c6cf4 100644 --- a/cmd/swarm/feeds.go +++ b/cmd/swarm/feeds.go @@ -27,15 +27,15 @@ import ( "github.com/ethereum/go-ethereum/cmd/utils" swarm "github.com/ethereum/go-ethereum/swarm/api/client" - "github.com/ethereum/go-ethereum/swarm/storage/feeds" + "github.com/ethereum/go-ethereum/swarm/storage/feed" "gopkg.in/urfave/cli.v1" ) -func NewGenericSigner(ctx *cli.Context) feeds.Signer { - return feeds.NewGenericSigner(getPrivKey(ctx)) +func NewGenericSigner(ctx *cli.Context) feed.Signer { + return feed.NewGenericSigner(getPrivKey(ctx)) } -func getTopic(ctx *cli.Context) (topic feeds.Topic) { +func getTopic(ctx *cli.Context) (topic feed.Topic) { var name = ctx.String(SwarmFeedNameFlag.Name) var relatedTopic = ctx.String(SwarmFeedTopicFlag.Name) var relatedTopicBytes []byte @@ -48,7 +48,7 @@ func getTopic(ctx *cli.Context) (topic feeds.Topic) { } } - topic, err = feeds.NewTopic(name, relatedTopicBytes) + topic, err = feed.NewTopic(name, relatedTopicBytes) if err != nil { utils.Fatalf("Error parsing topic: %s", err) } @@ -65,7 +65,7 @@ func feedCreateManifest(ctx *cli.Context) { client = swarm.NewClient(bzzapi) ) - newFeedUpdateRequest := feeds.NewFirstRequest(getTopic(ctx)) + newFeedUpdateRequest := feed.NewFirstRequest(getTopic(ctx)) newFeedUpdateRequest.Feed.User = feedGetUser(ctx) manifestAddress, err := client.CreateFeedWithManifest(newFeedUpdateRequest) @@ -100,11 +100,11 @@ func feedUpdate(ctx *cli.Context) { return } - var updateRequest *feeds.Request - var query *feeds.Query + var updateRequest *feed.Request + var query *feed.Query if manifestAddressOrDomain == "" { - query = new(feeds.Query) + query = new(feed.Query) query.User = signer.Address() query.Topic = getTopic(ctx) @@ -139,9 +139,9 @@ func feedInfo(ctx *cli.Context) { manifestAddressOrDomain = ctx.String(SwarmFeedManifestFlag.Name) ) - var query *feeds.Query + var query *feed.Query if manifestAddressOrDomain == "" { - query = new(feeds.Query) + query = new(feed.Query) query.Topic = getTopic(ctx) query.User = feedGetUser(ctx) } diff --git a/cmd/swarm/feeds_test.go b/cmd/swarm/feeds_test.go index dd0651a25..46727c21d 100644 --- a/cmd/swarm/feeds_test.go +++ b/cmd/swarm/feeds_test.go @@ -26,11 +26,11 @@ import ( "testing" "github.com/ethereum/go-ethereum/swarm/api" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" "github.com/ethereum/go-ethereum/swarm/testutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/swarm/storage/feeds" + "github.com/ethereum/go-ethereum/swarm/storage/feed" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/log" @@ -65,7 +65,7 @@ func TestCLIFeedUpdate(t *testing.T) { } // compose a topic. We'll be doing quotes about Miguel de Cervantes - var topic feeds.Topic + var topic feed.Topic subject := []byte("Miguel de Cervantes") copy(topic[:], subject[:]) name := "quotes" @@ -95,19 +95,19 @@ func TestCLIFeedUpdate(t *testing.T) { // build the same topic as before, this time // we use NewTopic to create a topic automatically. - topic, err = feeds.NewTopic(name, subject) + topic, err = feed.NewTopic(name, subject) if err != nil { t.Fatal(err) } // Feed configures whose updates we will be looking up. - fd := feeds.Feed{ + fd := feed.Feed{ Topic: topic, User: address, } // Build a query to get the latest update - query := feeds.NewQueryLatest(&fd, lookup.NoClue) + query := feed.NewQueryLatest(&fd, lookup.NoClue) // retrieve content! reader, err := client.QueryFeed(query, "") @@ -139,7 +139,7 @@ func TestCLIFeedUpdate(t *testing.T) { cmd.ExpectExit() // verify we can deserialize the result as a valid JSON - var request feeds.Request + var request feed.Request err = json.Unmarshal([]byte(matches[0]), &request) if err != nil { t.Fatal(err) diff --git a/swarm/OWNERS b/swarm/OWNERS index cea47766f..d4204e08c 100644 --- a/swarm/OWNERS +++ b/swarm/OWNERS @@ -22,5 +22,5 @@ swarm ├── storage ─────────────── ethersphere │ ├── encryption ──────── @gbalint, @zelig, @nagydani │ ├── mock ────────────── @janos -│ └── feeds ───────────── @nolash, @jpeletier +│ └── feed ────────────── @nolash, @jpeletier └── testutil ────────────── @lmars \ No newline at end of file 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, diff --git a/swarm/pss/notify/notify.go b/swarm/pss/notify/notify.go index 01ecb4ff9..3731fb9db 100644 --- a/swarm/pss/notify/notify.go +++ b/swarm/pss/notify/notify.go @@ -317,7 +317,7 @@ func (c *Controller) handleStartMsg(msg *Msg, keyid string) (err error) { return err } - // TODO this is set to zero-length byte pending decision on protocol for initial message, whether it should include message or not, and how to trigger the initial message so that current state of Swarm Feed is sent upon subscription + // TODO this is set to zero-length byte pending decision on protocol for initial message, whether it should include message or not, and how to trigger the initial message so that current state of Swarm feed is sent upon subscription notify := []byte{} replyMsg := NewMsg(MsgCodeNotifyWithKey, msg.namestring, make([]byte, len(notify)+symKeyLength)) copy(replyMsg.Payload, notify) diff --git a/swarm/storage/feeds/binaryserializer.go b/swarm/storage/feed/binaryserializer.go similarity index 99% rename from swarm/storage/feeds/binaryserializer.go rename to swarm/storage/feed/binaryserializer.go index ce146571b..4e4f67a09 100644 --- a/swarm/storage/feeds/binaryserializer.go +++ b/swarm/storage/feed/binaryserializer.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/swarm/storage/feeds/binaryserializer_test.go b/swarm/storage/feed/binaryserializer_test.go similarity index 99% rename from swarm/storage/feeds/binaryserializer_test.go rename to swarm/storage/feed/binaryserializer_test.go index 0c81e7f18..37828d1c9 100644 --- a/swarm/storage/feeds/binaryserializer_test.go +++ b/swarm/storage/feed/binaryserializer_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "encoding/json" diff --git a/swarm/storage/feeds/cacheentry.go b/swarm/storage/feed/cacheentry.go similarity index 99% rename from swarm/storage/feeds/cacheentry.go rename to swarm/storage/feed/cacheentry.go index e40037688..be42008e9 100644 --- a/swarm/storage/feeds/cacheentry.go +++ b/swarm/storage/feed/cacheentry.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "bytes" diff --git a/swarm/storage/feeds/doc.go b/swarm/storage/feed/doc.go similarity index 99% rename from swarm/storage/feeds/doc.go rename to swarm/storage/feed/doc.go index d1edf5d6d..1f07948f2 100644 --- a/swarm/storage/feeds/doc.go +++ b/swarm/storage/feed/doc.go @@ -40,4 +40,4 @@ Request: Feed Update with signature Epoch: time slot where the update is stored */ -package feeds +package feed diff --git a/swarm/storage/feeds/error.go b/swarm/storage/feed/error.go similarity index 99% rename from swarm/storage/feeds/error.go rename to swarm/storage/feed/error.go index 7751a9f19..206ba3316 100644 --- a/swarm/storage/feeds/error.go +++ b/swarm/storage/feed/error.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "fmt" diff --git a/swarm/storage/feeds/feed.go b/swarm/storage/feed/feed.go similarity index 99% rename from swarm/storage/feeds/feed.go rename to swarm/storage/feed/feed.go index d5b262555..b6ea665a6 100644 --- a/swarm/storage/feeds/feed.go +++ b/swarm/storage/feed/feed.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "hash" diff --git a/swarm/storage/feeds/feed_test.go b/swarm/storage/feed/feed_test.go similarity index 98% rename from swarm/storage/feeds/feed_test.go rename to swarm/storage/feed/feed_test.go index 7806e0ad7..6a575594f 100644 --- a/swarm/storage/feeds/feed_test.go +++ b/swarm/storage/feed/feed_test.go @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "testing" diff --git a/swarm/storage/feeds/handler.go b/swarm/storage/feed/handler.go similarity index 99% rename from swarm/storage/feeds/handler.go rename to swarm/storage/feed/handler.go index 2c5261614..9e2640282 100644 --- a/swarm/storage/feeds/handler.go +++ b/swarm/storage/feed/handler.go @@ -16,7 +16,7 @@ // Handler is the API for feeds // It enables creating, updating, syncing and retrieving feed updates and their data -package feeds +package feed import ( "bytes" @@ -25,7 +25,7 @@ import ( "sync" "time" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" "github.com/ethereum/go-ethereum/swarm/log" "github.com/ethereum/go-ethereum/swarm/storage" diff --git a/swarm/storage/feeds/handler_test.go b/swarm/storage/feed/handler_test.go similarity index 99% rename from swarm/storage/feeds/handler_test.go rename to swarm/storage/feed/handler_test.go index b35a7c1c1..cf95bc1f5 100644 --- a/swarm/storage/feeds/handler_test.go +++ b/swarm/storage/feed/handler_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "bytes" @@ -31,7 +31,7 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/swarm/chunk" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) var ( diff --git a/swarm/storage/feeds/id.go b/swarm/storage/feed/id.go similarity index 97% rename from swarm/storage/feeds/id.go rename to swarm/storage/feed/id.go index dd813ae89..7e17743c1 100644 --- a/swarm/storage/feeds/id.go +++ b/swarm/storage/feed/id.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "fmt" @@ -22,7 +22,7 @@ import ( "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" "github.com/ethereum/go-ethereum/swarm/storage" ) diff --git a/swarm/storage/feeds/id_test.go b/swarm/storage/feed/id_test.go similarity index 89% rename from swarm/storage/feeds/id_test.go rename to swarm/storage/feed/id_test.go index 2ef12e891..e561ff9b4 100644 --- a/swarm/storage/feeds/id_test.go +++ b/swarm/storage/feed/id_test.go @@ -1,9 +1,9 @@ -package feeds +package feed import ( "testing" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) func getTestID() *ID { diff --git a/swarm/storage/feeds/lookup/epoch.go b/swarm/storage/feed/lookup/epoch.go similarity index 100% rename from swarm/storage/feeds/lookup/epoch.go rename to swarm/storage/feed/lookup/epoch.go diff --git a/swarm/storage/feeds/lookup/epoch_test.go b/swarm/storage/feed/lookup/epoch_test.go similarity index 93% rename from swarm/storage/feeds/lookup/epoch_test.go rename to swarm/storage/feed/lookup/epoch_test.go index 70bfd836a..0629f3d1d 100644 --- a/swarm/storage/feeds/lookup/epoch_test.go +++ b/swarm/storage/feed/lookup/epoch_test.go @@ -3,7 +3,7 @@ package lookup_test import ( "testing" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) func TestMarshallers(t *testing.T) { diff --git a/swarm/storage/feeds/lookup/lookup.go b/swarm/storage/feed/lookup/lookup.go similarity index 100% rename from swarm/storage/feeds/lookup/lookup.go rename to swarm/storage/feed/lookup/lookup.go diff --git a/swarm/storage/feeds/lookup/lookup_test.go b/swarm/storage/feed/lookup/lookup_test.go similarity index 99% rename from swarm/storage/feeds/lookup/lookup_test.go rename to swarm/storage/feed/lookup/lookup_test.go index 7d5014608..d71e81e95 100644 --- a/swarm/storage/feeds/lookup/lookup_test.go +++ b/swarm/storage/feed/lookup/lookup_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/ethereum/go-ethereum/swarm/log" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) type Data struct { diff --git a/swarm/storage/feeds/query.go b/swarm/storage/feed/query.go similarity index 97% rename from swarm/storage/feeds/query.go rename to swarm/storage/feed/query.go index 7bd2800a8..8be78a952 100644 --- a/swarm/storage/feeds/query.go +++ b/swarm/storage/feed/query.go @@ -14,14 +14,14 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "fmt" "strconv" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) // Query is used to specify constraints when performing an update lookup diff --git a/swarm/storage/feeds/query_test.go b/swarm/storage/feed/query_test.go similarity index 98% rename from swarm/storage/feeds/query_test.go rename to swarm/storage/feed/query_test.go index 1420c69ae..9fa5e2980 100644 --- a/swarm/storage/feeds/query_test.go +++ b/swarm/storage/feed/query_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "testing" diff --git a/swarm/storage/feeds/request.go b/swarm/storage/feed/request.go similarity index 99% rename from swarm/storage/feeds/request.go rename to swarm/storage/feed/request.go index 81e1b10fe..6968d8b9a 100644 --- a/swarm/storage/feeds/request.go +++ b/swarm/storage/feed/request.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "bytes" @@ -24,7 +24,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) // Request represents a request to sign or signed feed update message diff --git a/swarm/storage/feeds/request_test.go b/swarm/storage/feed/request_test.go similarity index 99% rename from swarm/storage/feeds/request_test.go rename to swarm/storage/feed/request_test.go index 8a15815a4..f5de32b74 100644 --- a/swarm/storage/feeds/request_test.go +++ b/swarm/storage/feed/request_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "bytes" @@ -26,7 +26,7 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/feeds/lookup" + "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" ) func areEqualJSON(s1, s2 string) (bool, error) { diff --git a/swarm/storage/feeds/sign.go b/swarm/storage/feed/sign.go similarity index 99% rename from swarm/storage/feeds/sign.go rename to swarm/storage/feed/sign.go index f5760c8f2..5f0ea0b33 100644 --- a/swarm/storage/feeds/sign.go +++ b/swarm/storage/feed/sign.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "crypto/ecdsa" diff --git a/swarm/storage/feeds/testutil.go b/swarm/storage/feed/testutil.go similarity index 99% rename from swarm/storage/feeds/testutil.go rename to swarm/storage/feed/testutil.go index 879f73348..b513fa1f2 100644 --- a/swarm/storage/feeds/testutil.go +++ b/swarm/storage/feed/testutil.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "context" diff --git a/swarm/storage/feeds/timestampprovider.go b/swarm/storage/feed/timestampprovider.go similarity index 99% rename from swarm/storage/feeds/timestampprovider.go rename to swarm/storage/feed/timestampprovider.go index f6aa0775c..072dc3a48 100644 --- a/swarm/storage/feeds/timestampprovider.go +++ b/swarm/storage/feed/timestampprovider.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "encoding/binary" diff --git a/swarm/storage/feeds/topic.go b/swarm/storage/feed/topic.go similarity index 99% rename from swarm/storage/feeds/topic.go rename to swarm/storage/feed/topic.go index 2dc8c18cd..43a7b4ba4 100644 --- a/swarm/storage/feeds/topic.go +++ b/swarm/storage/feed/topic.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "bytes" diff --git a/swarm/storage/feeds/topic_test.go b/swarm/storage/feed/topic_test.go similarity index 98% rename from swarm/storage/feeds/topic_test.go rename to swarm/storage/feed/topic_test.go index 8994002d7..0403204f7 100644 --- a/swarm/storage/feeds/topic_test.go +++ b/swarm/storage/feed/topic_test.go @@ -1,4 +1,4 @@ -package feeds +package feed import ( "testing" diff --git a/swarm/storage/feeds/update.go b/swarm/storage/feed/update.go similarity index 99% rename from swarm/storage/feeds/update.go rename to swarm/storage/feed/update.go index 02bd37522..627a537d1 100644 --- a/swarm/storage/feeds/update.go +++ b/swarm/storage/feed/update.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "fmt" diff --git a/swarm/storage/feeds/update_test.go b/swarm/storage/feed/update_test.go similarity index 99% rename from swarm/storage/feeds/update_test.go rename to swarm/storage/feed/update_test.go index 7763da0c8..4007223c6 100644 --- a/swarm/storage/feeds/update_test.go +++ b/swarm/storage/feed/update_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package feeds +package feed import ( "testing" diff --git a/swarm/swarm.go b/swarm/swarm.go index 74c53dece..6aa15edd9 100644 --- a/swarm/swarm.go +++ b/swarm/swarm.go @@ -49,8 +49,8 @@ import ( "github.com/ethereum/go-ethereum/swarm/pss" "github.com/ethereum/go-ethereum/swarm/state" "github.com/ethereum/go-ethereum/swarm/storage" + "github.com/ethereum/go-ethereum/swarm/storage/feed" "github.com/ethereum/go-ethereum/swarm/storage/mock" - "github.com/ethereum/go-ethereum/swarm/storage/feeds" "github.com/ethereum/go-ethereum/swarm/tracing" ) @@ -186,10 +186,10 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e // Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage self.fileStore = storage.NewFileStore(self.netStore, self.config.FileStoreParams) - var feedsHandler *feeds.Handler - fhParams := &feeds.HandlerParams{} + var feedsHandler *feed.Handler + fhParams := &feed.HandlerParams{} - feedsHandler = feeds.NewHandler(fhParams) + feedsHandler = feed.NewHandler(fhParams) feedsHandler.SetStore(self.netStore) lstore.Validators = []storage.ChunkValidator{ diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go index 2e5735ece..cdf9239d0 100644 --- a/swarm/testutil/http.go +++ b/swarm/testutil/http.go @@ -25,7 +25,7 @@ import ( "github.com/ethereum/go-ethereum/swarm/api" "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/ethereum/go-ethereum/swarm/storage/feeds" + "github.com/ethereum/go-ethereum/swarm/storage/feed" ) type TestServer interface { @@ -54,8 +54,8 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso t.Fatal(err) } - rhparams := &feeds.HandlerParams{} - rh, err := feeds.NewTestHandler(feedsDir, rhparams) + rhparams := &feed.HandlerParams{} + rh, err := feed.NewTestHandler(feedsDir, rhparams) if err != nil { t.Fatal(err) } @@ -75,7 +75,7 @@ func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, reso }, CurrentTime: 42, } - feeds.TimestampProvider = tss + feed.TimestampProvider = tss return tss } @@ -92,6 +92,6 @@ func (t *TestSwarmServer) Close() { t.cleanup() } -func (t *TestSwarmServer) Now() feeds.Timestamp { - return feeds.Timestamp{Time: t.CurrentTime} +func (t *TestSwarmServer) Now() feed.Timestamp { + return feed.Timestamp{Time: t.CurrentTime} }