feat: WithValidatorData publishing option (#603)

Micro optimization that helps preventing deserialization of published
messages in local subscribtions
This commit is contained in:
Hlib Kanunnikov 2025-03-13 11:59:39 +01:00 committed by GitHub
parent f486808fbe
commit 68726389f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -213,9 +213,10 @@ type RouterReady func(rt PubSubRouter, topic string) (bool, error)
type ProvideKey func() (crypto.PrivKey, peer.ID)
type PublishOptions struct {
ready RouterReady
customKey ProvideKey
local bool
ready RouterReady
customKey ProvideKey
local bool
validatorData any
}
type PubOpt func(pub *PublishOptions) error
@ -308,7 +309,7 @@ func (t *Topic) Publish(ctx context.Context, data []byte, opts ...PubOpt) error
}
}
return t.p.val.PushLocal(&Message{m, "", t.p.host.ID(), nil, pub.local})
return t.p.val.PushLocal(&Message{m, "", t.p.host.ID(), pub.validatorData, pub.local})
}
// WithReadiness returns a publishing option for only publishing when the router is ready.
@ -332,6 +333,15 @@ func WithLocalPublication(local bool) PubOpt {
}
}
// WithValidatorData returns a publishing option to set custom validator data for the message.
// This allows users to avoid deserialization of the message data when validating the message locally.
func WithValidatorData(data any) PubOpt {
return func(pub *PublishOptions) error {
pub.validatorData = data
return nil
}
}
// WithSecretKeyAndPeerId returns a publishing option for providing a custom private key and its corresponding peer ID
// This option is useful when we want to send messages from "virtual", never-connectable peers in the network
func WithSecretKeyAndPeerId(key crypto.PrivKey, pid peer.ID) PubOpt {