@@ -2,6 +2,7 @@ package capabilities
22
33import (
44 "context"
5+ "fmt"
56 "sync"
67 "time"
78
@@ -103,9 +104,18 @@ func NewBaseTriggerCapability[T proto.Message](
103104 }
104105}
105106
107+ func (b * BaseTriggerCapability [T ]) retransmitEnabled () bool {
108+ return b .tRetransmit > 0
109+ }
110+
106111func (b * BaseTriggerCapability [T ]) Start (ctx context.Context ) error {
107112 b .lggr .Info ("starting base trigger" )
108113
114+ if ! b .retransmitEnabled () {
115+ b .lggr .Warn ("retransmits disabled (tRetransmit <= 0), events will be delivered once without persistence or ACK tracking" )
116+ return nil
117+ }
118+
109119 recs , err := b .store .List (ctx )
110120 if err != nil {
111121 b .lggr .Errorf ("failed to load persisted trigger events" )
@@ -169,6 +179,10 @@ func (b *BaseTriggerCapability[T]) DeliverEvent(
169179 te TriggerEvent ,
170180 triggerID string ,
171181) error {
182+ if ! b .retransmitEnabled () {
183+ return b .sendToInbox (triggerID , te .ID , te .Payload .GetValue ())
184+ }
185+
172186 rec := PendingEvent {
173187 TriggerId : triggerID ,
174188 EventId : te .ID ,
@@ -192,8 +206,38 @@ func (b *BaseTriggerCapability[T]) DeliverEvent(
192206 return nil
193207}
194208
209+ // sendToInbox unmarshals the payload and delivers it to the registered inbox channel.
210+ func (b * BaseTriggerCapability [T ]) sendToInbox (triggerID , eventID string , payload []byte ) error {
211+ b .mu .Lock ()
212+ sendCh , ok := b .inboxes [triggerID ]
213+ b .mu .Unlock ()
214+
215+ if ! ok {
216+ b .metrics .IncInboxMissing (triggerID )
217+ return fmt .Errorf ("no inbox registered for trigger %s" , triggerID )
218+ }
219+
220+ msg := b .newMsg ()
221+ if err := proto .Unmarshal (payload , msg ); err != nil {
222+ return fmt .Errorf ("failed to unmarshal payload: %w" , err )
223+ }
224+
225+ wrapped := TriggerAndId [T ]{Trigger : msg , Id : eventID }
226+ if ! safeSend (sendCh , wrapped ) {
227+ b .metrics .IncInboxFull (triggerID )
228+ return fmt .Errorf ("inbox full or closed for trigger %s" , triggerID )
229+ }
230+
231+ b .lggr .Infof ("event dispatched: capability=%s trigger=%s event=%s" ,
232+ b .capabilityId , triggerID , eventID )
233+ return nil
234+ }
235+
195236func (b * BaseTriggerCapability [T ]) AckEvent (ctx context.Context , triggerId string , eventId string ) error {
196- b .lggr .Infof ("Event ACK (triggerID: %s, eventID %s)" , triggerId , eventId )
237+ b .lggr .Infow ("Event ACK" , "triggerID" , triggerId , "eventID" , eventId )
238+ if ! b .retransmitEnabled () {
239+ return nil
240+ }
197241
198242 var (
199243 attempts int
@@ -297,7 +341,6 @@ func (b *BaseTriggerCapability[T]) scanPending() {
297341// It updates Attempts and LastSentAt on every attempt locally. Success is determined
298342// later by an AckEvent call.
299343func (b * BaseTriggerCapability [T ]) trySend (event PendingEvent ) {
300- b .lggr .Infof ("resending event (triggerID: %s, eventID: %s)" , event .TriggerId , event .EventId )
301344 b .mu .Lock ()
302345 eventsForTrigger , ok := b .pending [event .TriggerId ]
303346 if ! ok || eventsForTrigger == nil {
@@ -314,9 +357,7 @@ func (b *BaseTriggerCapability[T]) trySend(event PendingEvent) {
314357 rec .Attempts ++
315358 rec .LastSentAt = time .Now ()
316359
317- typeURL := rec .AnyTypeURL
318360 payloadCopy := append ([]byte (nil ), rec .Payload ... )
319- sendCh , inboxOk := b .inboxes [event .TriggerId ]
320361 attempts := rec .Attempts
321362 lastSent := rec .LastSentAt
322363 b .mu .Unlock ()
@@ -326,31 +367,10 @@ func (b *BaseTriggerCapability[T]) trySend(event PendingEvent) {
326367 b .lggr .Errorf ("failed to persist delivery update for trigger=%s event=%s: %v" , event .TriggerId , event .EventId , err )
327368 }
328369
329- if ! inboxOk {
330- b .metrics .IncInboxMissing (event .TriggerId )
331- b .lggr .Errorf ("no inbox registered for trigger %s" , event .TriggerId )
332- return
333- }
334-
335- msg := b .newMsg ()
336- if err := proto .Unmarshal (payloadCopy , msg ); err != nil {
337- b .lggr .Errorf ("failed to unmarshal payload to message type (typeURL=%s): %v" , typeURL , err )
338- return
339- }
340-
341- wrapped := TriggerAndId [T ]{
342- Trigger : msg ,
343- Id : event .EventId ,
344- }
345-
346- if ! safeSend (sendCh , wrapped ) {
347- b .metrics .IncInboxFull (event .TriggerId )
348- b .lggr .Warnf ("inbox full or closed for trigger %s" , event .TriggerId )
370+ if err := b .sendToInbox (event .TriggerId , event .EventId , payloadCopy ); err != nil {
371+ b .lggr .Errorf ("trySend failed: %v" , err )
349372 return
350373 }
351-
352- b .lggr .Infof ("event dispatched: capability =%s trigger=%s event=%s attempt=%d" ,
353- b .capabilityId , event .TriggerId , event .EventId , attempts )
354374}
355375
356376func safeSend [T any ](ch chan <- T , val T ) (sent bool ) {
0 commit comments