1
0
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:
James Hillyerd
2023-01-22 16:26:52 -08:00
committed by GitHub
parent b383fbf9ab
commit e74efbaa77
4 changed files with 24 additions and 7 deletions

View File

@@ -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.

View File

@@ -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
} }

View File

@@ -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")
}
} }

View File

@@ -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