ceremonyclient/go-libp2p-blossomsub/blossomsub_feat.go
petricadaipegsp a543a607be
IDONTWANT Support (#376)
* blossomsub: Remove unused mutex

* blossomsub: Add RPC queue

* blossomsub: Use RPC queue

* blossomsub: Add IDONTWANT control message to protos

* blossomsub: Add IDONTWANT tracing support

* blossomsub: Add pre-validation

* blossomsub: Add IDONTWANT feature flag

* blossomsub: Add IDONTWANT parameters

* blossomsub: Add IDONTWANT observability

* blossomsub: Send IDONTWANT control messages

* blossomsub: Handle IDONTWANT control messages

* blossomsub: Clear maps efficiently

* blossomsub: Increase IDONTWANT parameter defaults

* blossomsub: Do not send IDONTWANT to original sender

* blossomsub: Add IDONTWANT unit tests
2024-11-23 17:15:41 -06:00

57 lines
1.7 KiB
Go

package blossomsub
import (
"fmt"
"github.com/libp2p/go-libp2p/core/protocol"
)
// BlossomSubFeatureTest is a feature test function; it takes a feature and a protocol ID and
// should return true if the feature is supported by the protocol
type BlossomSubFeatureTest = func(BlossomSubFeature, protocol.ID) bool
// BlossomSubFeature is a feature discriminant enum
type BlossomSubFeature int
const (
// Protocol supports basic BlossomSub Mesh -- BlossomSub-v2 compatible
BlossomSubFeatureMesh = iota
// Protocol supports Peer eXchange on prune -- BlossomSub-v2 compatible
BlossomSubFeaturePX
// Protocol supports IDONTWANT -- BlossomSub-v2.1 compatible
BlossomSubFeatureIdontwant
)
// BlossomSubDefaultProtocols is the default BlossomSub router protocol list
var BlossomSubDefaultProtocols = []protocol.ID{BlossomSubID_v21, BlossomSubID_v2}
// BlossomSubDefaultFeatures is the feature test function for the default BlossomSub protocols
func BlossomSubDefaultFeatures(feat BlossomSubFeature, proto protocol.ID) bool {
switch feat {
case BlossomSubFeatureMesh:
return proto == BlossomSubID_v21 || proto == BlossomSubID_v2
case BlossomSubFeaturePX:
return proto == BlossomSubID_v21 || proto == BlossomSubID_v2
case BlossomSubFeatureIdontwant:
return proto == BlossomSubID_v21
default:
return false
}
}
// WithBlossomSubProtocols is a BlossomSub router option that configures a custom protocol list
// and feature test function
func WithBlossomSubProtocols(protos []protocol.ID, feature BlossomSubFeatureTest) Option {
return func(ps *PubSub) error {
gs, ok := ps.rt.(*BlossomSubRouter)
if !ok {
return fmt.Errorf("pubsub router is not BlossomSub")
}
gs.protos = protos
gs.feature = feature
return nil
}
}