util/helpers.lua
author Kim Alvefur <zash@zash.se>
Thu, 04 Nov 2021 01:00:06 +0100
branch0.11
changeset 12093 76b4e3f12b53
parent 8414 a9e8523a5e73
child 11063 ad89e3cc67b6
permissions -rw-r--r--
mod_pep: Wipe pubsub service on user deletion Data is already wiped from storage, but this ensures everything is properly unsubscribed, possibly with notifications etc. Clears recipient cache as well, since it is no longer relevant.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1964
101a8df23b29 util.helpers: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 1959
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1964
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1964
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5415
diff changeset
     4
--
1964
101a8df23b29 util.helpers: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 1959
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
101a8df23b29 util.helpers: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 1959
diff changeset
     6
-- COPYING file in the source package for more information.
101a8df23b29 util.helpers: Add copyright header
Matthew Wild <mwild1@gmail.com>
parents: 1959
diff changeset
     7
--
1531
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
4681
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
     9
local debug = require "util.debug";
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    10
1531
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
-- Helper functions for debugging
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
local log = require "util.logger".init("util.debug");
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    15
local function log_events(events, name, logger)
1531
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
	local f = events.fire_event;
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
	if not f then
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
		error("Object does not appear to be a util.events object");
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
	end
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
	logger = logger or log;
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
	name = name or tostring(events);
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	function events.fire_event(event, ...)
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
		logger("debug", "%s firing event: %s", name, event);
1795
0e933d6f2c31 util.helpers: It would be a good idea to fire an event when we say we are
Matthew Wild <mwild1@gmail.com>
parents: 1531
diff changeset
    24
		return f(event, ...);
1531
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
	end
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
	events[events.fire_event] = f;
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
	return events;
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
end
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    30
local function revert_log_events(events)
4536
285450536ec0 util.helpers: After nearly 'fixing' this code, I conclude it instead only deserves a bigger smile
Matthew Wild <mwild1@gmail.com>
parents: 2923
diff changeset
    31
	events.fire_event, events[events.fire_event] = events[events.fire_event], nil; -- :))
1531
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
end
21051377f11b util.helpers: New util library to aid with debugging, etc.
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
6786
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    34
local function log_host_events(host)
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    35
	return log_events(prosody.hosts[host].events, host);
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    36
end
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    37
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    38
local function revert_log_host_events(host)
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    39
	return revert_log_events(prosody.hosts[host].events);
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    40
end
cd44427c7295 util.helpers: Fix order of functions using each other [fixes 00412b36166f]
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    41
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    42
local function show_events(events, specific_event)
4681
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    43
	local event_handlers = events._handlers;
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    44
	local events_array = {};
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    45
	local event_handler_arrays = {};
7723
7166750fb963 util.helpers: List event priorities instead of useless array index
Kim Alvefur <zash@zash.se>
parents: 6786
diff changeset
    46
	for event, priorities in pairs(events._event_map) do
4681
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    47
		local handlers = event_handlers[event];
4705
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    48
		if handlers and (event == specific_event or not specific_event) then
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    49
			table.insert(events_array, event);
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    50
			local handler_strings = {};
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    51
			for i, handler in ipairs(handlers) do
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    52
				local upvals = debug.string_from_var_table(debug.get_upvalues_table(handler));
8414
a9e8523a5e73 util.helpers: Handle missing priorities, happens due to wildcard magic in net.http.server (fixes #1044)
Kim Alvefur <zash@zash.se>
parents: 7723
diff changeset
    53
				handler_strings[i] = "  "..(priorities[handler] or "?")..": "..tostring(handler)..(upvals and ("\n        "..upvals) or "");
4705
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    54
			end
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    55
			event_handler_arrays[event] = handler_strings;
4681
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    56
		end
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    57
	end
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    58
	table.sort(events_array);
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    59
	local i = 1;
4705
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    60
	while i <= #events_array do
4681
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    61
		local handlers = event_handler_arrays[events_array[i]];
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    62
		for j=#handlers, 1, -1 do
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    63
			table.insert(events_array, i+1, handlers[j]);
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    64
		end
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    65
		if i > 1 then events_array[i] = "\n"..events_array[i]; end
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    66
		i = i + #handlers + 1
4705
447f5a94792d util.helpers: show_events(): Make more robust, and allow filtering results to a specific event
Matthew Wild <mwild1@gmail.com>
parents: 4681
diff changeset
    67
	end
4681
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    68
	return table.concat(events_array, "\n");
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    69
end
3299223bbed5 util.helpers: Add show_events(), to show the events and handlers in a util.events object
Matthew Wild <mwild1@gmail.com>
parents: 4536
diff changeset
    70
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    71
local function get_upvalue(f, get_name)
1959
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    72
	local i, name, value = 0;
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    73
	repeat
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    74
		i = i + 1;
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    75
		name, value = debug.getupvalue(f, i);
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    76
	until name == get_name or name == nil;
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    77
	return value;
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    78
end
f56670ce64de util.helpers: Add get_upvalue(function, name) helper
Matthew Wild <mwild1@gmail.com>
parents: 1795
diff changeset
    79
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    80
return {
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    81
	log_host_events = log_host_events;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    82
	revert_log_host_events = revert_log_host_events;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    83
	log_events = log_events;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    84
	revert_log_events = revert_log_events;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    85
	show_events = show_events;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    86
	get_upvalue = get_upvalue;
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    87
};