cranberry
1package memorypool2
3import (4"sync"5"time"6
7pbapi "gitverse.ru/IvanTimofeev/cranberry/pkg/grpc"8utility "gitverse.ru/IvanTimofeev/cranberry/pkg/utility"9)
10
11type memoryPoolEntry struct {12txc *pbapi.TxContainer13timestamp time.Time14}
15
16type MemoryPool struct {17txStore sync.Map18}
19
20func NewMemoryPool() *MemoryPool {21return &MemoryPool{}22}
23
24func (mp *MemoryPool) PutTx(txc *pbapi.TxContainer) {25mp.txStore.Store(string(utility.TxToHash(txc.Tx)), memoryPoolEntry{txc: txc, timestamp: time.Now()})26}
27
28func (mp *MemoryPool) GetTx(hash string) (*pbapi.TxContainer, bool) {29if mpe, ok := mp.txStore.Load(string(hash)); ok {30return mpe.(memoryPoolEntry).txc, true31} else {32return nil, false33}34}
35
36func (mp *MemoryPool) ExtractTx() (txc *pbapi.TxContainer, ok bool) {37mp.txStore.Range(func(key, value any) bool {38txc = value.(memoryPoolEntry).txc39mp.txStore.Delete(key)40ok = true41return false42})43return txc, ok44}
45
46func (mp *MemoryPool) ClearOldTxs() {47mp.txStore.Range(func(key, value any) bool {48if mpe, ok := value.(memoryPoolEntry); ok {49if mpe.timestamp.Add(60 * time.Second).Before(time.Now()) {50mp.txStore.Delete(key)51}52}53return true54})55}
56