Documentation
¶
Index ¶
- Constants
- Variables
- func AllowBroadcast(t *testing.T, actor1, actor2 ucan.CapabilityContext, ...)
- func AllowReciprocal(t *testing.T, actorCap ucan.CapabilityContext, rootTrust did.TrustContext, ...)
- func MakeCapabilityContext(t *testing.T, actorDID, rootDID did.DID, trust, root did.TrustContext) ucan.CapabilityContext
- func MakeExpiry(d time.Duration) uint64
- func MakeRootTrustContext(t *testing.T) (did.DID, did.TrustContext)
- func MakeTrustContext(t *testing.T, privk crypto.PrivKey) (did.DID, did.TrustContext)
- func NewLibp2pNetwork(t *testing.T, bootstrap []multiaddr.Multiaddr) ([]multiaddr.Multiaddr, crypto.PrivKey, *libp2p.Libp2p)
- type Actor
- type Address
- type BasicActor
- func (a *BasicActor) AddBehavior(behavior string, continuation Behavior, opt ...BehaviorOption) error
- func (a *BasicActor) Context() context.Context
- func (a *BasicActor) CreateChild(super Handle, params BasicActorParams) (*BasicActor, error)
- func (a *BasicActor) Handle() Handle
- func (a *BasicActor) Invoke(msg Envelope) (<-chan Envelope, error)
- func (a *BasicActor) Limiter() RateLimiter
- func (a *BasicActor) Publish(msg Envelope) error
- func (a *BasicActor) Receive(msg Envelope) error
- func (a *BasicActor) RemoveBehavior(behavior string)
- func (a *BasicActor) Security() SecurityContext
- func (a *BasicActor) Send(msg Envelope) error
- func (a *BasicActor) Start() error
- func (a *BasicActor) Stop() error
- func (a *BasicActor) Subscribe(topic string, setup ...BroadcastSetup) error
- type BasicActorParams
- type BasicRateLimiter
- type BasicSecurityContext
- func (s *BasicSecurityContext) Capability() ucan.CapabilityContext
- func (s *BasicSecurityContext) DID() DID
- func (s *BasicSecurityContext) Discard(msg Envelope)
- func (s *BasicSecurityContext) ID() ID
- func (s *BasicSecurityContext) Nonce() uint64
- func (s *BasicSecurityContext) PrivKey() crypto.PrivKey
- func (s *BasicSecurityContext) Provide(msg *Envelope, invoke []Capability, delegate []Capability) error
- func (s *BasicSecurityContext) ProvideBroadcast(msg *Envelope, topic string, broadcast []Capability) error
- func (s *BasicSecurityContext) Require(msg Envelope, cap []Capability) error
- func (s *BasicSecurityContext) RequireBroadcast(msg Envelope, topic string, broadcast []Capability) error
- func (s *BasicSecurityContext) Sign(msg *Envelope) error
- func (s *BasicSecurityContext) Verify(msg Envelope) error
- type Behavior
- type BehaviorOption
- type BehaviorOptions
- type BehaviorState
- type BroadcastSetup
- type Capability
- type DID
- type Dispatch
- type DispatchOption
- type DispatchOptions
- type Envelope
- type EnvelopeOptions
- type Handle
- type HealthCheckResponse
- type ID
- type Info
- type MessageOption
- func WithMessageExpiry(expiry uint64) MessageOption
- func WithMessageExpiryTime(t time.Time) MessageOption
- func WithMessageReplyTo(replyto string) MessageOption
- func WithMessageSignature(sctx SecurityContext, invoke []Capability, delegate []Capability) MessageOption
- func WithMessageSource(source Handle) MessageOption
- func WithMessageTimeout(timeo time.Duration) MessageOption
- func WithMessageTopic(topic string) MessageOption
- type NoRateLimiter
- type RateLimiter
- type RateLimiterConfig
- type Registry
- type SecurityContext
Constants ¶
const ( HealthCheckBehavior = "/dms/actor/healthcheck" HealthCheckInterval = 30 * time.Second HealthCheckGrantDuration = 2 * time.Hour )
Variables ¶
var ( DefaultDispatchGCInterval = 120 * time.Second DefaultDispatchWorkers = 1 )
var ( ErrInvalidMessage = errors.New("invalid message") ErrMissingOption = errors.New("missing option") ErrSignatureVerification = errors.New("signature verification failed") ErrInvalidSecurityContext = errors.New("invalid security context") ErrMessageExpired = errors.New("message expired") ErrBadSender = errors.New("bad sender") ErrRateLimitExceeded = errors.New("rate limited exceeded") ErrTODO = errors.New("TODO") )
Functions ¶
func AllowBroadcast ¶
func AllowBroadcast(t *testing.T, actor1, actor2 ucan.CapabilityContext, root1, root2 did.TrustContext, root1DID, root2DID did.DID, topic string, actorCap ...Capability)
func AllowReciprocal ¶
func AllowReciprocal(t *testing.T, actorCap ucan.CapabilityContext, rootTrust did.TrustContext, rootDID, otherRootDID did.DID, cap string)
func MakeCapabilityContext ¶
func MakeCapabilityContext(t *testing.T, actorDID, rootDID did.DID, trust, root did.TrustContext) ucan.CapabilityContext
func MakeExpiry ¶
func MakeRootTrustContext ¶
func MakeTrustContext ¶
Types ¶
type Actor ¶
type Actor interface { Context() context.Context Handle() Handle Security() SecurityContext AddBehavior(behavior string, continuation Behavior, opt ...BehaviorOption) error RemoveBehavior(behavior string) Receive(msg Envelope) error Send(msg Envelope) error Invoke(msg Envelope) (<-chan Envelope, error) Publish(msg Envelope) error Subscribe(topic string, setup ...BroadcastSetup) error Start() error Stop() error CreateChild(super Handle, params BasicActorParams) (*BasicActor, error) Limiter() RateLimiter }
Actor is the local interface to the actor system
type Address ¶
type Address struct { HostID string `json:"host,omitempty"` InboxAddress string `json:"inbox,omitempty"` }
ActorAddress is a raw actor address representation
func AddressFromString ¶
type BasicActor ¶
type BasicActor struct {
// contains filtered or unexported fields
}
func CreateActor ¶
func CreateActor(t *testing.T, peer *libp2p.Libp2p, cap ucan.CapabilityContext) *BasicActor
func New ¶
func New( supervisor Handle, net network.Network, security *BasicSecurityContext, limiter RateLimiter, params BasicActorParams, self Handle, opt ...DispatchOption, ) (*BasicActor, error)
New creates a new basic actor.
func (*BasicActor) AddBehavior ¶
func (a *BasicActor) AddBehavior(behavior string, continuation Behavior, opt ...BehaviorOption) error
func (*BasicActor) Context ¶
func (a *BasicActor) Context() context.Context
func (*BasicActor) CreateChild ¶
func (a *BasicActor) CreateChild( super Handle, params BasicActorParams, ) (*BasicActor, error)
func (*BasicActor) Handle ¶
func (a *BasicActor) Handle() Handle
func (*BasicActor) Limiter ¶
func (a *BasicActor) Limiter() RateLimiter
func (*BasicActor) Publish ¶
func (a *BasicActor) Publish(msg Envelope) error
func (*BasicActor) Receive ¶
func (a *BasicActor) Receive(msg Envelope) error
func (*BasicActor) RemoveBehavior ¶
func (a *BasicActor) RemoveBehavior(behavior string)
func (*BasicActor) Security ¶
func (a *BasicActor) Security() SecurityContext
func (*BasicActor) Send ¶
func (a *BasicActor) Send(msg Envelope) error
func (*BasicActor) Start ¶
func (a *BasicActor) Start() error
func (*BasicActor) Stop ¶
func (a *BasicActor) Stop() error
func (*BasicActor) Subscribe ¶
func (a *BasicActor) Subscribe(topic string, setup ...BroadcastSetup) error
type BasicActorParams ¶
type BasicActorParams struct{}
type BasicRateLimiter ¶
type BasicRateLimiter struct {
// contains filtered or unexported fields
}
func (*BasicRateLimiter) Acquire ¶
func (l *BasicRateLimiter) Acquire(msg Envelope) error
func (*BasicRateLimiter) Allow ¶
func (l *BasicRateLimiter) Allow(msg Envelope) bool
func (*BasicRateLimiter) Config ¶
func (l *BasicRateLimiter) Config() RateLimiterConfig
func (*BasicRateLimiter) Release ¶
func (l *BasicRateLimiter) Release(msg Envelope)
func (*BasicRateLimiter) SetConfig ¶
func (l *BasicRateLimiter) SetConfig(cfg RateLimiterConfig)
type BasicSecurityContext ¶
type BasicSecurityContext struct {
// contains filtered or unexported fields
}
func NewBasicSecurityContext ¶
func NewBasicSecurityContext(pubk crypto.PubKey, privk crypto.PrivKey, cap ucan.CapabilityContext) (*BasicSecurityContext, error)
func (*BasicSecurityContext) Capability ¶
func (s *BasicSecurityContext) Capability() ucan.CapabilityContext
func (*BasicSecurityContext) DID ¶
func (s *BasicSecurityContext) DID() DID
func (*BasicSecurityContext) Discard ¶
func (s *BasicSecurityContext) Discard(msg Envelope)
func (*BasicSecurityContext) ID ¶
func (s *BasicSecurityContext) ID() ID
func (*BasicSecurityContext) Nonce ¶
func (s *BasicSecurityContext) Nonce() uint64
func (*BasicSecurityContext) PrivKey ¶
func (s *BasicSecurityContext) PrivKey() crypto.PrivKey
func (*BasicSecurityContext) Provide ¶
func (s *BasicSecurityContext) Provide(msg *Envelope, invoke []Capability, delegate []Capability) error
func (*BasicSecurityContext) ProvideBroadcast ¶
func (s *BasicSecurityContext) ProvideBroadcast(msg *Envelope, topic string, broadcast []Capability) error
func (*BasicSecurityContext) Require ¶
func (s *BasicSecurityContext) Require(msg Envelope, cap []Capability) error
func (*BasicSecurityContext) RequireBroadcast ¶
func (s *BasicSecurityContext) RequireBroadcast(msg Envelope, topic string, broadcast []Capability) error
func (*BasicSecurityContext) Sign ¶
func (s *BasicSecurityContext) Sign(msg *Envelope) error
func (*BasicSecurityContext) Verify ¶
func (s *BasicSecurityContext) Verify(msg Envelope) error
type BehaviorOption ¶
type BehaviorOption func(opt *BehaviorOptions) error
func WithBehaviorCapability ¶
func WithBehaviorCapability(require ...Capability) BehaviorOption
func WithBehaviorExpiry ¶
func WithBehaviorExpiry(expire uint64) BehaviorOption
func WithBehaviorOneShot ¶
func WithBehaviorOneShot(oneShot bool) BehaviorOption
func WithBehaviorTopic ¶
func WithBehaviorTopic(topic string) BehaviorOption
type BehaviorOptions ¶
type BehaviorOptions struct { Capability []Capability Expire uint64 OneShot bool Topic string }
type BehaviorState ¶
type BehaviorState struct {
// contains filtered or unexported fields
}
type BroadcastSetup ¶
type Capability ¶
type Capability = ucan.Capability
type Dispatch ¶
type Dispatch struct {
// contains filtered or unexported fields
}
Dispatch provides a reaction kernel with multithreaded dispatch and oneshot continuations.
func NewDispatch ¶
func NewDispatch(sctx SecurityContext, opt ...DispatchOption) *Dispatch
func (*Dispatch) AddBehavior ¶
func (k *Dispatch) AddBehavior(behavior string, continuation Behavior, opt ...BehaviorOption) error
func (*Dispatch) RemoveBehavior ¶
type DispatchOption ¶
type DispatchOption func(o *DispatchOptions)
func WithDispatchGCInterval ¶
func WithDispatchGCInterval(dt time.Duration) DispatchOption
func WithDispatchWorkers ¶
func WithDispatchWorkers(count int) DispatchOption
func WithRateLimiter ¶
func WithRateLimiter(limiter RateLimiter) DispatchOption
type DispatchOptions ¶
type DispatchOptions struct { Limiter RateLimiter GCInterval time.Duration Workers int }
type Envelope ¶
type Envelope struct { To Handle `json:"to"` Behavior string `json:"be"` From Handle `json:"from"` Nonce uint64 `json:"nonce"` Options EnvelopeOptions `json:"opt"` Message []byte `json:"msg"` Capability []byte `json:"cap,omitempty"` Signature []byte `json:"sig,omitempty"` Discard func() `json:"-"` }
Envelope is the envelope for messages in the actor system
func Message ¶
func Message(src Handle, dest Handle, behavior string, payload interface{}, opt ...MessageOption) (Envelope, error)
Message constructs a new message envelope and applies the options
func ReplyTo ¶
func ReplyTo(msg Envelope, payload interface{}, opt ...MessageOption) (Envelope, error)
func (*Envelope) IsBroadcast ¶
func (*Envelope) SignatureData ¶
type EnvelopeOptions ¶
type EnvelopeOptions struct { Expire uint64 `json:"exp"` ReplyTo string `json:"cont,omitempty"` Topic string `json:"topic,omitempty"` }
EnvelopeOptions are sender specified options for processing an envelope
type Handle ¶
ActorHandle is a handle for naming an actor reachable in the network
func HandleFromDID ¶
func HandleFromPeerID ¶
func HandleFromString ¶
type HealthCheckResponse ¶
type MessageOption ¶
func WithMessageExpiry ¶
func WithMessageExpiry(expiry uint64) MessageOption
WithMessageExpiry sets the message expiry
NOTE: created with Message message have an implicit timeout of DefaultMessageTimeout
func WithMessageExpiryTime ¶
func WithMessageExpiryTime(t time.Time) MessageOption
WithMessageExpiry TODO
func WithMessageReplyTo ¶
func WithMessageReplyTo(replyto string) MessageOption
WithMessageReplyTo sets the message replyto behavior
NOTE: ReplyTo is set implicitly in Invoke and the appropriate capability
tokens are delegated by Provide.
func WithMessageSignature ¶
func WithMessageSignature(sctx SecurityContext, invoke []Capability, delegate []Capability) MessageOption
WithMessageContext provides the necessary envelope and signs it.
NOTE: If this option must be passed last, otherwise the signature will be invalidated by further modifications.
NOTE: Signing is implicit in Send.
func WithMessageSource ¶
func WithMessageSource(source Handle) MessageOption
WithMessageSource sets the message source
func WithMessageTimeout ¶
func WithMessageTimeout(timeo time.Duration) MessageOption
WithMessageTimeout sets the message expiration from a relative timeout
NOTE: messages created with Message have an implicit timeout of DefaultMessageTimeout
func WithMessageTopic ¶
func WithMessageTopic(topic string) MessageOption
WithMessageTopic sets the broadcast topic
type NoRateLimiter ¶
type NoRateLimiter struct{}
NoRateLimiter is the null limiter, that does not rate limit
func (NoRateLimiter) Acquire ¶
func (l NoRateLimiter) Acquire(_ Envelope) error
func (NoRateLimiter) Config ¶
func (l NoRateLimiter) Config() RateLimiterConfig
func (NoRateLimiter) Release ¶
func (l NoRateLimiter) Release(_ Envelope)
func (NoRateLimiter) SetConfig ¶
func (l NoRateLimiter) SetConfig(_ RateLimiterConfig)
type RateLimiter ¶
type RateLimiter interface { Allow(msg Envelope) bool Acquire(msg Envelope) error Release(msg Envelope) Config() RateLimiterConfig SetConfig(cfg RateLimiterConfig) }
RateLimiter implements a stateful resource access limiter This is necessary to combat spam attacks and ensure that our system does not become overloaded with too many goroutines.
func NewRateLimiter ¶
func NewRateLimiter(cfg RateLimiterConfig) RateLimiter
type RateLimiterConfig ¶
type RateLimiterConfig struct { PublicLimitAllow int PublicLimitAcquire int BroadcastLimitAllow int BroadcastLimitAcquire int TopicDefaultLimit int TopicLimit map[string]int }
func DefaultRateLimiterConfig ¶
func DefaultRateLimiterConfig() RateLimiterConfig
func (*RateLimiterConfig) Valid ¶
func (cfg *RateLimiterConfig) Valid() bool
type SecurityContext ¶
type SecurityContext interface { ID() ID DID() DID Nonce() uint64 PrivKey() crypto.PrivKey // Require checks the capability token(s). // It succeeds if and only if // - the signature is valid // - the capability token(s) in the envelope grants the origin actor ID/DID // any of the specified capabilities. Require(msg Envelope, invoke []Capability) error // Provide populates the envelope with necessary capability tokens and signs it. // the envelope is modified in place Provide(msg *Envelope, invoke []Capability, delegate []Capability) error // Require verifies the envelope and checks the capability tokens // for a broadcast topic RequireBroadcast(msg Envelope, topic string, broadcast []Capability) error // ProvideBroadcast populates the envelope with the necessary capability tokens // for broadcast in the topic and signs it ProvideBroadcast(msg *Envelope, topic string, broadcast []Capability) error // Verify verifies the message signature in an envelope Verify(msg Envelope) error // Sign signs an envelope; the envelope is modified in place. Sign(msg *Envelope) error // Disparcrd discards unwanted tokens from a consumed envelope Discard(msg Envelope) // Return the capability context Capability() ucan.CapabilityContext }
ActorSecurityContext provides a context for which to perform cryptographic operations for an actor. This includes: - signing messages - verifying message signatures - requiring capabilities - granting capabilities