view mod_http_stats_stream/mod_http_stats_stream.lua @ 4530:33c149d0261d

mod_rest: Add mappings for a whole pile of XEPs Look ma, programming in JSON! XEP-0012: Last Activity XEP-0077: In-Band Registration XEP-0115: Entity Capabilities XEP-0153: vCard-Based Avatars XEP-0297: Stanza Forwarding XEP-0308: Last Message Correction XEP-0319: Last User Interaction in Presence XEP-0333: Chat Markers XEP-0367: Message Attaching XEP-0372: References XEP-0421: Anonymous unique occupant identifiers for MUCs XEP-0428: Fallback Indication XEP-0444: Message Reactions
author Kim Alvefur <zash@zash.se>
date Tue, 23 Mar 2021 23:18:33 +0100
parents 740870196b97
children bac3dae031ee
line wrap: on
line source

module:set_global();

local statsman = require "core.statsmanager";
local http = require "net.http.server";
local json = require "util.json";

local sessions = {};

local function updates_client_closed(response)
	module:log("debug", "Streamstats client closed");
	sessions[response] = nil;
end

local function get_updates(event)
	local request, response = event.request, event.response;

	response.on_destroy = updates_client_closed;

	response.headers.content_type = "text/event-stream";
	response.headers.x_accel_buffering = "no"; -- for nginx maybe?
	local resp = http.prepare_header(response);
	table.insert(resp, "event: stats-full\r\n");
	table.insert(resp, "data: ");
	table.insert(resp, json.encode(statsman.get_stats()));
	table.insert(resp, "\r\n\r\n");
	response.conn:write(table.concat(resp));

	sessions[response] = request;
	return true;
end


module:hook("stats-updated", function (event)
	local data = table.concat({
		"event: stats-updated";
		"data: "..json.encode(event.changed_stats);
		"";
		"";
	}, "\r\n")
	for response in pairs(sessions) do
		response.conn:write(data);
	end
end);


module:depends("http");
module:provides("http", {
	route = {
		GET = get_updates;
	}
});