@@ -11,10 +11,11 @@ import (
1111)
1212
1313var (
14- errEventBusUninitialized = errors .New ("cqrs/bus: event bus is not initialized" )
15- errEventPublisherNil = errors .New ("cqrs/bus: publisher is required" )
16- errEventMarshalerNil = errors .New ("cqrs/bus: marshaler is required" )
17- errEventPayloadNil = errors .New ("cqrs/bus: event is nil" )
14+ errEventBusUninitialized = errors .New ("cqrs/bus: event bus is not initialized" )
15+ errEventPublisherNil = errors .New ("cqrs/bus: publisher is required" )
16+ errEventMarshalerNil = errors .New ("cqrs/bus: marshaler is required" )
17+ errEventPayloadNil = errors .New ("cqrs/bus: event is nil" )
18+ errEventPublishRequiresTx = errors .New ("cqrs/bus: event publishing requires UoW transaction (use Publish inside UnitOfWork)" )
1819)
1920
2021// EventBus publishes domain events.
@@ -59,16 +60,18 @@ func NewEventBusWithOptions(
5960 bus .forwarder = newForwarderState (cfg .outbox )
6061 bus .publisher = bus .forwarder .wrapPublisher (pub )
6162 }
63+ // When only WithTxAwareOutbox is set, pub may be nil; Publish without tx will return errEventPublishRequiresTx.
6264
6365 return bus , nil
6466}
6567
6668// validate checks that the event bus and its dependencies are properly initialized.
69+ // When only WithTxAwareOutbox is used (no forwarder), publisher may be nil.
6770func (b * EventBus ) validate (evt any ) error {
6871 if b == nil {
6972 return errEventBusUninitialized
7073 }
71- if b .publisher == nil {
74+ if b .publisher == nil && ( b . txOutbox == nil || b . forwarder != nil ) {
7275 return errEventPublisherNil
7376 }
7477 if b .marshaler == nil {
@@ -108,6 +111,9 @@ func (b *EventBus) Publish(ctx context.Context, evt any, opts ...PublishOption)
108111 }
109112 publisher = txPub
110113 }
114+ if publisher == nil {
115+ return errEventPublishRequiresTx
116+ }
111117 defer func () {
112118 if txPub != nil {
113119 if c , ok := txPub .(interface { Close () error }); ok {
0 commit comments