1
1
--- Module to simplify sending a message to multiple receivers
2
- local listener = require " ludobits.m.listener"
2
+ --
3
+ -- @usage
4
+ --
5
+ -- -- script_a.script
6
+ --
7
+ -- local broadcast = require "ludobits.m.listener"
8
+ --
9
+ -- function init(self)
10
+ -- broadcast.register("foo")
11
+ -- broadcast.register("bar", function(message, sender)
12
+ -- -- handle message
13
+ -- end)
14
+ -- end
15
+ --
16
+ -- function final(self)
17
+ -- broadcast.unregister("foo")
18
+ -- broadcast.unregister("bar")
19
+ -- end
20
+ --
21
+ -- function on_message(self, message_id, message, sender)
22
+ -- if broadcast.on_message(message_id, message, sender) then
23
+ -- -- message was handled
24
+ -- return
25
+ -- end
26
+ -- if message_id == hash("foo") then
27
+ -- -- handle message "foo"
28
+ -- end
29
+ -- end
30
+ --
31
+ --
32
+ -- -- script_b.script
33
+ --
34
+ -- local broadcast = require "ludobits.m.listener"
35
+ --
36
+ -- function update(self, dt)
37
+ -- if some condition then
38
+ -- broadcast.send("foo")
39
+ -- end
40
+ -- end
3
41
4
42
local M = {}
5
43
@@ -17,34 +55,56 @@ function M.send(message_id, message)
17
55
local key = ensure_hash (message_id )
18
56
if receivers [key ] then
19
57
message = message or {}
20
- receivers [key ].trigger (message_id , message )
58
+ for url ,_ in pairs (receivers [key ]) do
59
+ msg .post (url , message_id , message )
60
+ end
21
61
end
22
62
end
23
63
24
64
--- Register the current script as a receiver for a specific message
25
65
-- @param message_id
26
- -- @param url_or_fn Optional URL or function to register. Defaults to the
27
- -- current script url
28
- function M .register (message_id , url_or_fn )
66
+ -- @param on_message_handler Optional message handler function to call
67
+ -- when a message is received. The function will receive the message
68
+ -- and sender as it's arguments. You must call @{on_message} for this
69
+ -- to work
70
+ function M .register (message_id , on_message_handler )
29
71
assert (message_id )
30
- url_or_fn = url_or_fn or msg .url ()
31
72
local key = ensure_hash (message_id )
32
- receivers [key ] = receivers [key ] or listener . create ()
33
- receivers [key ]. add ( url_or_fn )
73
+ receivers [key ] = receivers [key ] or {}
74
+ receivers [key ][ msg . url ()] = on_message_handler or true
34
75
end
35
76
36
77
--- Unregister the current script from receiving a previously registered message
37
78
-- @param message_id
38
- -- @param url_or_fn Optional URL or function to unregister. Defaults to the current
39
- -- script url
40
- function M .unregister (message_id , url_or_fn )
79
+ function M .unregister (message_id )
41
80
assert (message_id )
42
- url_or_fn = url_or_fn or msg .url ()
43
81
local key = ensure_hash (message_id )
44
82
if receivers [key ] then
45
- receivers [key ]. remove ( url_or_fn )
83
+ receivers [key ][ msg . url ()] = nil
46
84
end
47
85
end
48
86
87
+ --- Forward received messages in scripts where the broadcast module is used and where
88
+ -- registered messages have also provide a message handler function. If no message
89
+ -- handler functions are used then there is no need to call this function.
90
+ -- @param message_id
91
+ -- @param message
92
+ -- @param sender
93
+ function M .on_message (message_id , message , sender )
94
+ local message_receivers = receivers [message_id ]
95
+ if not message_receivers then
96
+ return false
97
+ end
98
+ local message_receiver = message_receivers [msg .url ()]
99
+ if not message_receiver then
100
+ return false
101
+ end
102
+ if message_receiver == true then
103
+ return false
104
+ end
105
+ message_receiver (message , sender )
106
+ return true
107
+ end
108
+
49
109
50
110
return M
0 commit comments