mirror of
https://github.com/jhillyerd/inbucket.git
synced 2026-01-28 05:55:56 +00:00
feat: Monitor tab dynamically updates when messages are deleted (#337)
* WIP: msghub handles deletes, UI does not yet display them Signed-off-by: James Hillyerd <james@hillyerd.com> * socket and UI support message deletes Signed-off-by: James Hillyerd <james@hillyerd.com> * use Delete naming for consistency Signed-off-by: James Hillyerd <james@hillyerd.com> --------- Signed-off-by: James Hillyerd <james@hillyerd.com>
This commit is contained in:
@@ -15,6 +15,7 @@ const opChanLen = 100
|
||||
// Listener receives the contents of the history buffer, followed by new messages
|
||||
type Listener interface {
|
||||
Receive(msg event.MessageMetadata) error
|
||||
Delete(mailbox string, id string) error
|
||||
}
|
||||
|
||||
// Hub relays messages on to its listeners
|
||||
@@ -42,6 +43,12 @@ func New(historyLen int, extHost *extension.Host) *Hub {
|
||||
return nil
|
||||
})
|
||||
|
||||
extHost.Events.AfterMessageDeleted.AddListener("msghub",
|
||||
func(msg event.MessageMetadata) *extension.Void {
|
||||
hub.Delete(msg.Mailbox, msg.ID)
|
||||
return nil
|
||||
})
|
||||
|
||||
return hub
|
||||
}
|
||||
|
||||
@@ -68,7 +75,7 @@ func (hub *Hub) Dispatch(msg event.MessageMetadata) {
|
||||
h.history.Value = msg
|
||||
h.history = h.history.Next()
|
||||
|
||||
// Deliver message to all listeners, removing listeners if they return an error
|
||||
// Relay event to all listeners, removing listeners if they return an error.
|
||||
for l := range h.listeners {
|
||||
if err := l.Receive(msg); err != nil {
|
||||
delete(h.listeners, l)
|
||||
@@ -78,6 +85,37 @@ func (hub *Hub) Dispatch(msg event.MessageMetadata) {
|
||||
}
|
||||
}
|
||||
|
||||
// Delete removes the message from the history buffer and instructs listeners to do the same.
|
||||
func (hub *Hub) Delete(mailbox string, id string) {
|
||||
hub.opChan <- func(h *Hub) {
|
||||
if h.history == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Locate and remove history entry.
|
||||
p := h.history
|
||||
end := p
|
||||
for {
|
||||
if next, ok := p.Next().Value.(event.MessageMetadata); ok {
|
||||
if mailbox == next.Mailbox && id == next.ID {
|
||||
p.Unlink(1) // Remove next node.
|
||||
break
|
||||
}
|
||||
}
|
||||
if p = p.Next(); p == end {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Relay event to all listeners, removing listeners if they return an error.
|
||||
for l := range h.listeners {
|
||||
if err := l.Delete(mailbox, id); err != nil {
|
||||
delete(h.listeners, l)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// AddListener registers a listener to receive broadcasted messages.
|
||||
func (hub *Hub) AddListener(l Listener) {
|
||||
hub.opChan <- func(h *Hub) {
|
||||
|
||||
Reference in New Issue
Block a user