1 module
:depends("http");
2 local nodeprep
= require
"util.encodings".stringprep
.nodeprep
;
4 local jid_split
= require
"util.jid".split
;
5 local json
= require
"util.json";
9 function client_closed(response
)
10 local node
= response
._eventsource_node
;
11 module
:log("debug", "Destroying client for %q", node
);
12 streams
[node
][response
] = nil;
13 if next(streams
[node
]) == nil then
18 function serve_stream(event
, node
)
19 local response
= event
.response
;
21 node
= nodeprep(node
);
26 module
:log("debug", "Client subscribed to: %s", node
);
28 response
.on_destroy
= client_closed
;
29 response
._eventsource_node
= node
;
31 response
.conn
:write(table.concat({
33 "Content-Type: text/event-stream";
34 "Access-Control-Allow-Origin: *";
35 "Access-Control-Allow-Methods: GET";
36 "Access-Control-Max-Age: 7200";
41 local clientlist
= streams
[node
];
42 if not clientlist
then
44 streams
[node
] = clientlist
;
46 clientlist
[response
] = response
.conn
;
51 function handle_message(event
)
52 local room
, stanza
= event
.room
, event
.stanza
;
53 local node
= (jid_split(event
.room
.jid
));
54 local clientlist
= streams
[node
];
55 if not clientlist
then module
:log("debug", "No clients for %q", node
); return; end
57 -- Extract body from message
58 local body
= event
.stanza
:get_child_text("body");
62 local nick
= select(3, jid_split(stanza
.attr
.from
));
63 -- Encode body and broadcast to eventsource subscribers
64 local json_data
= json
.encode({
68 local data
= "data: "..json_data
:gsub("\n", "\ndata: \n").."\n\n";
69 for response
, conn
in pairs(clientlist
) do
74 module
:provides("http", {
77 ["GET /*"] = serve_stream
;
82 module
:hook("muc-broadcast-message", handle_message
);