Mercurial > prosody-modules
view mod_http_stats_stream/mod_http_stats_stream.lua @ 5186:fa3059e653fa
mod_http_oauth2: Implement the Implicit flow
Everyone says this is insecure and bad, but it's also the only thing
that makes sense for e.g. pure JavaScript clients, but hey implement
this even more complicated thing instead!
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 02 Mar 2023 22:06:50 +0100 |
parents | bac3dae031ee |
children |
line wrap: on
line source
module:set_global(); local statsman = require "core.statsmanager"; local http = require "net.http.server"; local json = require "util.json"; assert(statsman.get_stats, "not compatible with trunk based on openmetrics"); 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; } });