mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +00:00
extension: Make AfterMessageStored async (#319)
This commit is contained in:
@@ -10,8 +10,17 @@ type Host struct {
|
||||
}
|
||||
|
||||
// Events defines all the event types supported by the extension host.
|
||||
//
|
||||
// Before-events provide an opportunity for extensions to alter how Inbucket responds to that type
|
||||
// of event. These events are processed synchronously; expensive operations will reduce the
|
||||
// perceived performance of Inbucket. The first listener in the list to respond with a non-nil
|
||||
// value will determine the response, and the remaining listeners will not be called.
|
||||
//
|
||||
// After-events allow extensions to take an action after an event has completed. These events are
|
||||
// processed asynchronously with respect to the rest of Inbuckets operation. However, an event
|
||||
// listener will not be called until the one before it complets.
|
||||
type Events struct {
|
||||
MessageStored EventBroker[event.MessageMetadata, Void]
|
||||
AfterMessageStored EventBroker[event.MessageMetadata, Void]
|
||||
}
|
||||
|
||||
// Void indicates the event emitter will ignore any value returned by listeners.
|
||||
|
||||
@@ -92,7 +92,7 @@ func (s *StoreManager) Deliver(
|
||||
Date: delivery.Date(),
|
||||
Size: delivery.Size(),
|
||||
}
|
||||
s.ExtHost.Events.MessageStored.Emit(&event)
|
||||
go s.ExtHost.Events.AfterMessageStored.Emit(&event)
|
||||
|
||||
return id, nil
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package message_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/inbucket/inbucket/pkg/extension"
|
||||
"github.com/inbucket/inbucket/pkg/extension/event"
|
||||
@@ -20,11 +21,13 @@ func TestManagerEmitsMessageStoredEvent(t *testing.T) {
|
||||
}
|
||||
|
||||
// Capture message event.
|
||||
var got *event.MessageMetadata
|
||||
extHost.Events.MessageStored.AddListener(
|
||||
gotc := make(chan *event.MessageMetadata)
|
||||
defer close(gotc)
|
||||
|
||||
extHost.Events.AfterMessageStored.AddListener(
|
||||
"test",
|
||||
func(msg event.MessageMetadata) *extension.Void {
|
||||
got = &msg
|
||||
gotc <- &msg
|
||||
return nil
|
||||
})
|
||||
|
||||
@@ -39,5 +42,10 @@ func TestManagerEmitsMessageStoredEvent(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
select {
|
||||
case got := <-gotc:
|
||||
assert.NotNil(t, got, "No event received, or it was nil")
|
||||
case <-time.After(time.Second * 2):
|
||||
t.Fatal("Timeout waiting for message event")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ func New(historyLen int, extHost *extension.Host) *Hub {
|
||||
}
|
||||
|
||||
// Register an extension event listener for MessageStored.
|
||||
extHost.Events.MessageStored.AddListener("msghub",
|
||||
extHost.Events.AfterMessageStored.AddListener("msghub",
|
||||
func(msg event.MessageMetadata) *extension.Void {
|
||||
hub.Dispatch(msg)
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user