Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrClosed = errors.New("eventbus: closed")
ErrClosed is returned by Publish/Subscribe after Inmem.Close.
Functions ¶
This section is empty.
Types ¶
type EventBus ¶
type EventBus interface {
Publish(ctx context.Context, channel string, data []byte) error
// Subscribe returns a receive-only channel of payloads and a close function. The caller must call close when done.
Subscribe(ctx context.Context, channel string) (data <-chan []byte, closeFn func() error, err error)
// Close releases bus resources and closes all subscriber channels. Idempotent.
Close()
}
EventBus is pub/sub for agent events (streaming, approval fan-in). SDK runtimes use this internally; application code does not construct EventBus. Implementations may be in-memory, Redis-backed, or bridged from Temporal updates.
type Inmem ¶
type Inmem struct {
// contains filtered or unexported fields
}
Inmem is a process-local pub/sub suitable for streaming and approval fan-in on one host.
mu is a RWMutex, not a plain Mutex: Publish holds RLock for its entire send loop (not just the subscriber-list snapshot) so that Subscribe/Unsubscribe/Close — which all take the exclusive Lock — cannot close a subscriber channel while Publish is still sending to it. Concurrent Publish calls still proceed in parallel (RLock is shared); only a close(ch) has to wait for in-flight publishes to finish.
func NewInmem ¶
NewInmem returns an EventBus backed by in-memory channels. Logger may be nil (logging disabled).
func (*Inmem) Close ¶ added in v0.3.0
func (c *Inmem) Close()
Close closes all subscriber channels and rejects further Publish/Subscribe. Idempotent; safe if individual closeFns run afterward.
func (*Inmem) Publish ¶
Publish sends a copy of data to all subscribers of channel.
Holds RLock for the whole call (snapshot + every send), not just the snapshot: this is what keeps Unsubscribe/Close from calling close(ch) on a channel this call is still writing to (see the Inmem.mu doc). Without that, a subscriber unsubscribing mid-publish would race a send against a close on the very same channel — a real data race per the Go memory model, not just a benign timing hazard, even though the runtime's panic on it is deterministic.