From a632099c078af37fcb523735bad3e7706815db66 Mon Sep 17 00:00:00 2001
From: josh <josh@elixxir.io>
Date: Wed, 15 Dec 2021 15:53:16 -0800
Subject: [PATCH] Add bucket to session object

---
 storage/session.go | 49 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 46 insertions(+), 3 deletions(-)

diff --git a/storage/session.go b/storage/session.go
index 8ee2b43d3..38ea878bb 100644
--- a/storage/session.go
+++ b/storage/session.go
@@ -13,6 +13,7 @@ import (
 	"gitlab.com/elixxir/client/storage/edge"
 	"gitlab.com/elixxir/client/storage/hostList"
 	"gitlab.com/elixxir/client/storage/rounds"
+	"gitlab.com/xx_network/primitives/rateLimiting"
 	"sync"
 	"testing"
 	"time"
@@ -64,6 +65,8 @@ type Session struct {
 	auth                *auth.Store
 	criticalMessages    *utility.E2eMessageBuffer
 	criticalRawMessages *utility.CmixMessageBuffer
+	bucketStore         *rateLimiting.Bucket
+	bucketParamStore    *utility.BucketParamStore
 	garbledMessages     *utility.MeteredCmixMessageBuffer
 	reception           *reception.Store
 	clientVersion       *clientVersion.Store
@@ -89,8 +92,10 @@ func initStore(baseDir, password string) (*Session, error) {
 }
 
 // Creates new UserData in the session
-func New(baseDir, password string, u userInterface.User, currentVersion version.Version,
-	cmixGrp, e2eGrp *cyclic.Group, rng *fastRNG.StreamGenerator) (*Session, error) {
+func New(baseDir, password string, u userInterface.User,
+	currentVersion version.Version, cmixGrp, e2eGrp *cyclic.Group,
+	rng *fastRNG.StreamGenerator,
+	rateLimitParams ndf.RateLimiting) (*Session, error) {
 
 	s, err := initStore(baseDir, password)
 	if err != nil {
@@ -159,8 +164,19 @@ func New(baseDir, password string, u userInterface.User, currentVersion version.
 
 	s.edgeCheck, err = edge.NewStore(s.kv, u.ReceptionID)
 	if err != nil {
-		return nil, errors.WithMessage(err, "Failed to edge check store")
+		return nil, errors.WithMessage(err, "Failed to create edge check store")
 	}
+
+	s.bucketParamStore, err = utility.NewBucketParamsStore(
+		uint32(rateLimitParams.Capacity), uint32(rateLimitParams.LeakedTokens),
+		time.Duration(rateLimitParams.LeakDuration), s.kv)
+	if err != nil {
+		return nil, errors.WithMessage(err, "Failed to create bucket params store")
+	}
+
+	s.bucketStore = utility.NewStoredBucket(uint32(rateLimitParams.Capacity), uint32(rateLimitParams.LeakedTokens),
+		time.Duration(rateLimitParams.LeakDuration), s.kv)
+
 	return s, nil
 }
 
@@ -244,6 +260,20 @@ func Load(baseDir, password string, currentVersion version.Version,
 		return nil, errors.WithMessage(err, "Failed to load edge check store")
 	}
 
+	s.bucketParamStore, err = utility.LoadBucketParamsStore(s.kv)
+	if err != nil {
+		return nil, errors.WithMessage(err,
+			"Failed to load bucket params store")
+	}
+
+	params := s.bucketParamStore.Get()
+	s.bucketStore, err = utility.LoadBucket(params.Capacity, params.LeakedTokens,
+		params.LeakDuration, s.kv)
+	if err != nil {
+		return nil, errors.WithMessage(err,
+			"Failed to load bucket store")
+	}
+
 	return s, nil
 }
 
@@ -333,6 +363,19 @@ func (s *Session) GetEdge() *edge.Store {
 	return s.edgeCheck
 }
 
+// GetBucketParams returns the bucket params store.
+func (s *Session) GetBucketParams() *utility.BucketParamStore {
+	s.mux.RLock()
+	defer s.mux.RUnlock()
+	return s.bucketParamStore
+}
+
+func (s *Session) GetBucket() *rateLimiting.Bucket {
+	s.mux.RLock()
+	defer s.mux.RUnlock()
+	return s.bucketStore
+}
+
 // Get an object from the session
 func (s *Session) Get(key string) (*versioned.Object, error) {
 	return s.kv.Get(key, currentSessionVersion)
-- 
GitLab