mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-24 23:55:18 +00:00
53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package blossomsub
|
|
|
|
import (
|
|
"sync"
|
|
|
|
pb "source.quilibrium.com/quilibrium/monorepo/go-libp2p-blossomsub/pb"
|
|
)
|
|
|
|
// msgIDGenerator handles computing IDs for msgs
|
|
// It allows setting custom generators(MsgIdFunction) per bitmask
|
|
type msgIDGenerator struct {
|
|
Default MsgIdFunction
|
|
|
|
bitmaskGensLk sync.RWMutex
|
|
bitmaskGens map[string]MsgIdFunction
|
|
}
|
|
|
|
func newMsgIdGenerator() *msgIDGenerator {
|
|
return &msgIDGenerator{
|
|
Default: DefaultMsgIdFn,
|
|
bitmaskGens: make(map[string]MsgIdFunction),
|
|
}
|
|
}
|
|
|
|
// Set sets custom id generator(MsgIdFunction) for bitmask.
|
|
func (m *msgIDGenerator) Set(bitmask []byte, gen MsgIdFunction) {
|
|
m.bitmaskGensLk.Lock()
|
|
m.bitmaskGens[string(bitmask)] = gen
|
|
m.bitmaskGensLk.Unlock()
|
|
}
|
|
|
|
// ID computes ID for the msg or short-circuits with the cached value.
|
|
func (m *msgIDGenerator) ID(msg *Message) []byte {
|
|
if len(msg.ID) != 0 {
|
|
return msg.ID
|
|
}
|
|
|
|
msg.ID = m.RawID(msg.Message)
|
|
return msg.ID
|
|
}
|
|
|
|
// RawID computes ID for the proto 'msg'.
|
|
func (m *msgIDGenerator) RawID(msg *pb.Message) []byte {
|
|
m.bitmaskGensLk.RLock()
|
|
gen, ok := m.bitmaskGens[string(msg.GetBitmask())]
|
|
m.bitmaskGensLk.RUnlock()
|
|
if !ok {
|
|
gen = m.Default
|
|
}
|
|
|
|
return gen(msg)
|
|
}
|