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.
|
// 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 {
|
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.
|
// Void indicates the event emitter will ignore any value returned by listeners.
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ func (s *StoreManager) Deliver(
|
|||||||
Date: delivery.Date(),
|
Date: delivery.Date(),
|
||||||
Size: delivery.Size(),
|
Size: delivery.Size(),
|
||||||
}
|
}
|
||||||
s.ExtHost.Events.MessageStored.Emit(&event)
|
go s.ExtHost.Events.AfterMessageStored.Emit(&event)
|
||||||
|
|
||||||
return id, nil
|
return id, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package message_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/inbucket/inbucket/pkg/extension"
|
"github.com/inbucket/inbucket/pkg/extension"
|
||||||
"github.com/inbucket/inbucket/pkg/extension/event"
|
"github.com/inbucket/inbucket/pkg/extension/event"
|
||||||
@@ -20,11 +21,13 @@ func TestManagerEmitsMessageStoredEvent(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Capture message event.
|
// Capture message event.
|
||||||
var got *event.MessageMetadata
|
gotc := make(chan *event.MessageMetadata)
|
||||||
extHost.Events.MessageStored.AddListener(
|
defer close(gotc)
|
||||||
|
|
||||||
|
extHost.Events.AfterMessageStored.AddListener(
|
||||||
"test",
|
"test",
|
||||||
func(msg event.MessageMetadata) *extension.Void {
|
func(msg event.MessageMetadata) *extension.Void {
|
||||||
got = &msg
|
gotc <- &msg
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -39,5 +42,10 @@ func TestManagerEmitsMessageStoredEvent(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.NotNil(t, got, "No event received, or it was nil")
|
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.
|
// Register an extension event listener for MessageStored.
|
||||||
extHost.Events.MessageStored.AddListener("msghub",
|
extHost.Events.AfterMessageStored.AddListener("msghub",
|
||||||
func(msg event.MessageMetadata) *extension.Void {
|
func(msg event.MessageMetadata) *extension.Void {
|
||||||
hub.Dispatch(msg)
|
hub.Dispatch(msg)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user