2018-02-19 14:13:18 +00:00
|
|
|
package floodsub
|
|
|
|
|
|
|
|
import (
|
|
|
|
pb "github.com/libp2p/go-floodsub/pb"
|
|
|
|
)
|
|
|
|
|
2018-02-19 19:24:17 +00:00
|
|
|
func NewMessageCache(gossip, history int) *MessageCache {
|
2018-02-20 11:56:23 +00:00
|
|
|
return &MessageCache{
|
|
|
|
msgs: make(map[string]*pb.Message),
|
|
|
|
history: make([][]CacheEntry, history),
|
|
|
|
gossip: gossip,
|
|
|
|
}
|
2018-02-19 14:13:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type MessageCache struct {
|
2018-02-20 11:56:23 +00:00
|
|
|
msgs map[string]*pb.Message
|
|
|
|
history [][]CacheEntry
|
|
|
|
gossip int
|
|
|
|
}
|
|
|
|
|
|
|
|
type CacheEntry struct {
|
|
|
|
mid string
|
|
|
|
topics []string
|
2018-02-19 14:13:18 +00:00
|
|
|
}
|
|
|
|
|
2018-02-19 19:24:17 +00:00
|
|
|
func (mc *MessageCache) Put(msg *pb.Message) {
|
2018-02-20 11:56:23 +00:00
|
|
|
mid := msgID(msg)
|
|
|
|
mc.msgs[mid] = msg
|
|
|
|
mc.history[0] = append(mc.history[0], CacheEntry{mid: mid, topics: msg.GetTopicIDs()})
|
2018-02-19 14:13:18 +00:00
|
|
|
}
|
2018-02-19 16:45:10 +00:00
|
|
|
|
|
|
|
func (mc *MessageCache) Get(mid string) (*pb.Message, bool) {
|
2018-02-20 11:56:23 +00:00
|
|
|
m, ok := mc.msgs[mid]
|
|
|
|
return m, ok
|
2018-02-19 16:45:10 +00:00
|
|
|
}
|
2018-02-19 19:24:17 +00:00
|
|
|
|
2018-02-20 10:08:18 +00:00
|
|
|
func (mc *MessageCache) GetGossipIDs(topic string) []string {
|
2018-02-20 11:56:23 +00:00
|
|
|
var mids []string
|
|
|
|
for _, entries := range mc.history[:mc.gossip] {
|
|
|
|
for _, entry := range entries {
|
|
|
|
for _, t := range entry.topics {
|
|
|
|
if t == topic {
|
|
|
|
mids = append(mids, entry.mid)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return mids
|
2018-02-20 10:08:18 +00:00
|
|
|
}
|
|
|
|
|
2018-02-19 19:24:17 +00:00
|
|
|
func (mc *MessageCache) Shift() {
|
2018-02-20 11:56:23 +00:00
|
|
|
last := mc.history[len(mc.history)-1]
|
|
|
|
for _, entry := range last {
|
|
|
|
delete(mc.msgs, entry.mid)
|
|
|
|
}
|
|
|
|
for i := len(mc.history) - 2; i >= 0; i-- {
|
|
|
|
mc.history[i+1] = mc.history[i]
|
|
|
|
}
|
|
|
|
mc.history[0] = nil
|
2018-02-19 19:24:17 +00:00
|
|
|
}
|