Merge OnMessage and OnMessageModify

This commit is contained in:
mochi
2022-01-05 20:59:14 +00:00
parent d14d944de9
commit c2a42a16ca
4 changed files with 18 additions and 28 deletions

View File

@@ -45,18 +45,13 @@ func main() {
}()
// Add OnMessage Event Hook
server.Events.OnMessage = func(cl events.Client, pk events.Packet) {
fmt.Printf("< OnMessage received message from client %s: %s\n", cl.ID, string(pk.Payload))
}
// Add OnMessage Event Hook
server.Events.OnMessageModify = func(cl events.Client, pk events.Packet) (pkx events.Packet, err error) {
server.Events.OnMessage = func(cl events.Client, pk events.Packet) (pkx events.Packet, err error) {
pkx = pk
if string(pk.Payload) == "hello" {
pkx.Payload = []byte("hello world")
fmt.Printf("< OnMessageModify modified message from client %s: %s\n", cl.ID, string(pkx.Payload))
fmt.Printf("< OnMessage modified message from client %s: %s\n", cl.ID, string(pkx.Payload))
} else {
fmt.Printf("< OnMessageModify received message from client %s: %s\n", cl.ID, string(pkx.Payload))
fmt.Printf("< OnMessage received message from client %s: %s\n", cl.ID, string(pkx.Payload))
}
return pkx, nil

View File

@@ -6,8 +6,7 @@ import (
)
type Events struct {
OnMessage // published message receieved.
OnMessageModify // modify a received published message.
OnMessage // published message receieved.
}
type Packet packets.Packet
@@ -28,13 +27,10 @@ func FromClient(cl clients.Client) Client {
// OnMessage function is called when a publish message is received. Note,
// this hook is ONLY called by connected client publishers, it is not triggered when
// using the direct s.Publish method. The function receives the sent message and the
// data of the client who published it. This function will block message dispatching
// until it returns. To minimise this, have the function open a new goroutine on the
// embedding side.
type OnMessage func(Client, Packet)
// OnMessageModify is the same as OnMessage except it allows the packet to be modified
// before it is dispatched to subscribers. If an error occurs, the original packet will
// be dispatched as if the event hook had not been triggered. Please implement your own
// error handling within the hook. This function will block message dispatching until it returns.
type OnMessageModify func(Client, Packet) (Packet, error)
// data of the client who published it, and allows the packet to be modified
// before it is dispatched to subscribers. If no modification is required, return
// the original packet data. If an error occurs, the original packet will
// be dispatched as if the event hook had not been triggered.
// This function will block message dispatching until it returns. To minimise this,
// have the function open a new goroutine on the embedding side.
type OnMessage func(Client, Packet) (Packet, error)

View File

@@ -415,9 +415,9 @@ func (s *Server) processPublish(cl *clients.Client, pk packets.Packet) error {
s.Events.OnMessage(events.FromClient(*cl), events.Packet(pk))
}
// if an OnMessageModify hook exists, potentially modify the packet.
if s.Events.OnMessageModify != nil {
if pkx, err := s.Events.OnMessageModify(events.FromClient(*cl), events.Packet(pk)); err == nil {
// if an OnMessage hook exists, potentially modify the packet.
if s.Events.OnMessage != nil {
if pkx, err := s.Events.OnMessage(events.FromClient(*cl), events.Packet(pk)); err == nil {
pk = packets.Packet(pkx)
}
}

View File

@@ -929,9 +929,8 @@ func TestServerProcessPublishHookOnMessage(t *testing.T) {
var hookedPacket events.Packet
var hookedClient events.Client
s.Events.OnMessage = func(cl events.Client, pk events.Packet) {
hookedPacket = pk
hookedClient = cl
s.Events.OnMessage = func(cl events.Client, pk events.Packet) (events.Packet, error) {
return pk, nil
}
ack1 := make(chan []byte)
@@ -981,7 +980,7 @@ func TestServerProcessPublishHookOnMessageModify(t *testing.T) {
var hookedPacket events.Packet
var hookedClient events.Client
s.Events.OnMessageModify = func(cl events.Client, pk events.Packet) (events.Packet, error) {
s.Events.OnMessage = func(cl events.Client, pk events.Packet) (events.Packet, error) {
hookedPacket = pk
hookedPacket.Payload = []byte("world")
hookedClient = cl
@@ -1031,7 +1030,7 @@ func TestServerProcessPublishHookOnMessageModifyError(t *testing.T) {
s.Clients.Add(cl1)
s.Topics.Subscribe("a/b/+", cl1.ID, 0)
s.Events.OnMessageModify = func(cl events.Client, pk events.Packet) (events.Packet, error) {
s.Events.OnMessage = func(cl events.Client, pk events.Packet) (events.Packet, error) {
pkx := pk
pkx.Payload = []byte("world")
return pkx, fmt.Errorf("error")