@@ -27,41 +27,17 @@ const (
2727 defaultCacheMaxQueries = maxImmediateRetries
2828)
2929
30- //go:generate counterfeiter -o token_fetcher_fake_test.go -fake-name FakeTokenFetcher . tokenFetcher
31- type tokenFetcher interface {
32- UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (iterator [* token2.UnspentTokenInWallet ], error )
33- }
34-
35- //go:generate counterfeiter -o tokendb_fake_test.go -fake-name FakeTokenDB . TokenDB
36- type TokenDB interface {
37- SpendableTokensIteratorBy (ctx context.Context , walletID string , typ token2.Type ) (driver.SpendableTokensIterator , error )
38- }
39-
40- type enhancedIterator [T any ] interface {
41- HasNext () bool
42- }
43-
44- type permutatableIterator [T any ] interface {
45- iterators.Iterator [T ]
46- NewPermutation () iterators.Iterator [T ]
47- }
48-
4930type FetcherStrategy string
5031
5132const (
52- Lazy = "lazy"
53- Eager = "eager"
54- Mixed = "mixed"
55- Listener = "listener"
56- Cached = "cached"
33+ Lazy FetcherStrategy = "lazy"
34+ Eager FetcherStrategy = "eager"
35+ Mixed FetcherStrategy = "mixed"
36+ Listener FetcherStrategy = "listener"
37+ Cached FetcherStrategy = "cached"
5738)
5839
59- //go:generate counterfeiter -o fetcher_provider_fake_test.go -fake-name FakeFetcherProvider . FetcherProvider
60- type FetcherProvider interface {
61- GetFetcher (tmsID token.TMSID ) (tokenFetcher , error )
62- }
63-
64- type fetchFunc func (db * tokendb.StoreService , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) tokenFetcher
40+ type fetchFunc func (db * tokendb.StoreService , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) TokenFetcher
6541
6642type fetcherProvider struct {
6743 tokenStoreServiceManager tokendb.StoreServiceManager
@@ -73,7 +49,7 @@ type fetcherProvider struct {
7349}
7450
7551var fetchers = map [FetcherStrategy ]fetchFunc {
76- Mixed : func (db * tokendb.StoreService , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) tokenFetcher {
52+ Mixed : func (db * tokendb.StoreService , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) TokenFetcher {
7753 return newMixedFetcher (db , m , cacheSize , freshnessInterval , maxQueries )
7854 },
7955}
@@ -96,7 +72,7 @@ func NewFetcherProvider(storeServiceManager tokendb.StoreServiceManager, metrics
9672}
9773
9874// GetFetcher returns a token fetcher instance for the specified TMS ID.
99- func (p * fetcherProvider ) GetFetcher (tmsID token.TMSID ) (tokenFetcher , error ) {
75+ func (p * fetcherProvider ) GetFetcher (tmsID token.TMSID ) (TokenFetcher , error ) {
10076 tokenDB , err := p .tokenStoreServiceManager .StoreServiceByTMSId (tmsID )
10177 if err != nil {
10278 return nil , err
@@ -115,17 +91,17 @@ type mixedFetcher struct {
11591 m * Metrics
11692}
11793
118- // newMixedFetcher creates a fetcher that combines eager (cached) and lazy (on-demand) strategies.
119- func newMixedFetcher (tokenDB TokenDB , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) * mixedFetcher {
94+ // NewMixedFetcher creates a fetcher that combines eager (cached) and lazy (on-demand) strategies.
95+ func NewMixedFetcher (tokenDB TokenDB , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) * mixedFetcher {
12096 return & mixedFetcher {
12197 lazyFetcher : NewLazyFetcher (tokenDB ),
122- eagerFetcher : newCachedFetcher (tokenDB , cacheSize , freshnessInterval , maxQueries ),
98+ eagerFetcher : NewCachedFetcher (tokenDB , cacheSize , freshnessInterval , maxQueries ),
12399 m : m ,
124100 }
125101}
126102
127103// UnspentTokensIteratorBy returns an iterator for unspent tokens, trying cached results first, falling back to database query.
128- func (f * mixedFetcher ) UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (iterator [* token2.UnspentTokenInWallet ], error ) {
104+ func (f * mixedFetcher ) UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (Iterator [* token2.UnspentTokenInWallet ], error ) {
129105 logger .DebugfContext (ctx , "call unspent tokens iterator" )
130106 it , err := f .eagerFetcher .UnspentTokensIteratorBy (ctx , walletID , currency )
131107 logger .DebugfContext (ctx , "fetched eager iterator" )
@@ -142,6 +118,17 @@ func (f *mixedFetcher) UnspentTokensIteratorBy(ctx context.Context, walletID str
142118 return f .lazyFetcher .UnspentTokensIteratorBy (ctx , walletID , currency )
143119}
144120
121+ // newCachedFetcher is an internal alias for NewCachedFetcher to maintain compatibility within the package if needed,
122+ // though we usually just use the exported version now.
123+ func newCachedFetcher (tokenDB TokenDB , cacheSize int64 , freshnessInterval time.Duration , maxQueriesBeforeRefresh int ) * cachedFetcher {
124+ return NewCachedFetcher (tokenDB , cacheSize , freshnessInterval , maxQueriesBeforeRefresh )
125+ }
126+
127+ // newMixedFetcher is an internal alias for NewMixedFetcher.
128+ func newMixedFetcher (tokenDB TokenDB , m * Metrics , cacheSize int64 , freshnessInterval time.Duration , maxQueries int ) * mixedFetcher {
129+ return NewMixedFetcher (tokenDB , m , cacheSize , freshnessInterval , maxQueries )
130+ }
131+
145132// lazyFetcher only looks up the results when requested
146133type lazyFetcher struct {
147134 tokenDB TokenDB
@@ -153,7 +140,7 @@ func NewLazyFetcher(tokenDB TokenDB) *lazyFetcher {
153140}
154141
155142// UnspentTokensIteratorBy queries the database directly for unspent tokens.
156- func (f * lazyFetcher ) UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (iterator [* token2.UnspentTokenInWallet ], error ) {
143+ func (f * lazyFetcher ) UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (Iterator [* token2.UnspentTokenInWallet ], error ) {
157144 logger .DebugfContext (ctx , "Query the DB for new tokens" )
158145 it , err := f .tokenDB .SpendableTokensIteratorBy (ctx , walletID , currency )
159146 if err != nil {
@@ -163,6 +150,16 @@ func (f *lazyFetcher) UnspentTokensIteratorBy(ctx context.Context, walletID stri
163150 return collections.NewPermutatedIterator [token2.UnspentTokenInWallet ](it )
164151}
165152
153+ type enhancedIterator [T any ] interface {
154+ iterators.Iterator [T ]
155+ HasNext () bool
156+ }
157+
158+ type permutatableIterator [T any ] interface {
159+ iterators.Iterator [T ]
160+ NewPermutation () iterators.Iterator [T ]
161+ }
162+
166163type tokenCache interface {
167164 Get (key string ) (permutatableIterator [* token2.UnspentTokenInWallet ], bool )
168165 Add (key string , value permutatableIterator [* token2.UnspentTokenInWallet ])
@@ -187,8 +184,8 @@ type cachedFetcher struct {
187184 mu sync.RWMutex
188185}
189186
190- // newCachedFetcher creates a fetcher that maintains a periodically refreshed cache of all tokens.
191- func newCachedFetcher (tokenDB TokenDB , cacheSize int64 , freshnessInterval time.Duration , maxQueriesBeforeRefresh int ) * cachedFetcher {
187+ // NewCachedFetcher creates a fetcher that maintains a periodically refreshed cache of all tokens.
188+ func NewCachedFetcher (tokenDB TokenDB , cacheSize int64 , freshnessInterval time.Duration , maxQueriesBeforeRefresh int ) * cachedFetcher {
192189 // Use defaults if values are not provided (zero values)
193190 if freshnessInterval <= 0 {
194191 freshnessInterval = defaultCacheFreshnessInterval
@@ -284,7 +281,7 @@ func (f *cachedFetcher) updateCache(ctx context.Context, tokensByKey map[string]
284281}
285282
286283// UnspentTokensIteratorBy returns cached unspent tokens, triggering a refresh if the cache is stale or overused.
287- func (f * cachedFetcher ) UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (iterator [* token2.UnspentTokenInWallet ], error ) {
284+ func (f * cachedFetcher ) UnspentTokensIteratorBy (ctx context.Context , walletID string , currency token2.Type ) (Iterator [* token2.UnspentTokenInWallet ], error ) {
288285 defer atomic .AddUint32 (& f .queriesResponded , 1 )
289286 if f .isCacheOverused () {
290287 logger .DebugfContext (ctx , "Overused data. Soft refresh (in the background)..." )
0 commit comments