util/events.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 11062 c99afee1c548
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1507
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1522
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5749
diff changeset
     4
--
1522
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1507
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1507
diff changeset
     6
-- COPYING file in the source package for more information.
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1507
diff changeset
     7
--
569d58d21612 Add copyright header to those files missing one
Matthew Wild <mwild1@gmail.com>
parents: 1507
diff changeset
     8
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
     9
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    10
local pairs = pairs;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    11
local t_insert = table.insert;
6651
999434eb1bbf util.events: Add local reference to table.remove (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 6644
diff changeset
    12
local t_remove = table.remove;
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    13
local t_sort = table.sort;
3501
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    14
local setmetatable = setmetatable;
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    15
local next = next;
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    16
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: 6668
diff changeset
    17
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8385
diff changeset
    18
-- luacheck: std none
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    19
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: 6668
diff changeset
    20
local function new()
7042
138241cc1b3a util.events: Document data structures
Matthew Wild <mwild1@gmail.com>
parents: 6780
diff changeset
    21
	-- Map event name to ordered list of handlers (lazily built): handlers[event_name] = array_of_handler_functions
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    22
	local handlers = {};
7042
138241cc1b3a util.events: Document data structures
Matthew Wild <mwild1@gmail.com>
parents: 6780
diff changeset
    23
	-- Array of wrapper functions that wrap all events (nil if empty)
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    24
	local global_wrappers;
7042
138241cc1b3a util.events: Document data structures
Matthew Wild <mwild1@gmail.com>
parents: 6780
diff changeset
    25
	-- Per-event wrappers: wrappers[event_name] = wrapper_function
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    26
	local wrappers = {};
7042
138241cc1b3a util.events: Document data structures
Matthew Wild <mwild1@gmail.com>
parents: 6780
diff changeset
    27
	-- Event map: event_map[handler_function] = priority_number
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    28
	local event_map = {};
11062
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    29
	-- Debug hook, if any
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    30
	local active_debug_hook = nil;
7042
138241cc1b3a util.events: Document data structures
Matthew Wild <mwild1@gmail.com>
parents: 6780
diff changeset
    31
	-- Called on-demand to build handlers entries
8385
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    32
	local function _rebuild_index(self, event)
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    33
		local _handlers = event_map[event];
3501
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    34
		if not _handlers or next(_handlers) == nil then return; end
3500
a49ed9166820 util.events: Create new index on handler change instead of modifying existing one (this makes util.events fully reentrant).
Waqas Hussain <waqas20@gmail.com>
parents: 3499
diff changeset
    35
		local index = {};
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    36
		for handler in pairs(_handlers) do
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    37
			t_insert(index, handler);
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    38
		end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    39
		t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);
8385
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    40
		self[event] = index;
3501
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    41
		return index;
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    42
	end;
3501
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    43
	setmetatable(handlers, { __index = _rebuild_index });
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    44
	local function add_handler(event, handler, priority)
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    45
		local map = event_map[event];
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    46
		if map then
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    47
			map[handler] = priority or 0;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    48
		else
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    49
			map = {[handler] = priority or 0};
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    50
			event_map[event] = map;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    51
		end
3501
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    52
		handlers[event] = nil;
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    53
	end;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    54
	local function remove_handler(event, handler)
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    55
		local map = event_map[event];
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    56
		if map then
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    57
			map[handler] = nil;
3501
90c18e0355af util.events: Event handler indices are now built lazily (faster server startup for large number of hosts).
Waqas Hussain <waqas20@gmail.com>
parents: 3500
diff changeset
    58
			handlers[event] = nil;
3776
bc4f67a0658d util.events: Remove an event's table when it has no more handlers.
Waqas Hussain <waqas20@gmail.com>
parents: 3501
diff changeset
    59
			if next(map) == nil then
bc4f67a0658d util.events: Remove an event's table when it has no more handlers.
Waqas Hussain <waqas20@gmail.com>
parents: 3501
diff changeset
    60
				event_map[event] = nil;
bc4f67a0658d util.events: Remove an event's table when it has no more handlers.
Waqas Hussain <waqas20@gmail.com>
parents: 3501
diff changeset
    61
			end
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    62
		end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    63
	end;
6667
5466f24e51c9 util.events: Add get_handlers() method
Matthew Wild <mwild1@gmail.com>
parents: 6644
diff changeset
    64
	local function get_handlers(event)
5466f24e51c9 util.events: Add get_handlers() method
Matthew Wild <mwild1@gmail.com>
parents: 6644
diff changeset
    65
		return handlers[event];
5466f24e51c9 util.events: Add get_handlers() method
Matthew Wild <mwild1@gmail.com>
parents: 6644
diff changeset
    66
	end;
8385
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    67
	local function add_handlers(self)
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    68
		for event, handler in pairs(self) do
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    69
			add_handler(event, handler);
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    70
		end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    71
	end;
8385
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    72
	local function remove_handlers(self)
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    73
		for event, handler in pairs(self) do
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    74
			remove_handler(event, handler);
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    75
		end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    76
	end;
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    77
	local function _fire_event(event_name, event_data)
5749
60b3b6d27364 util.events: Remove varargs, event handlers can now only accept a single parameter
Matthew Wild <mwild1@gmail.com>
parents: 3776
diff changeset
    78
		local h = handlers[event_name];
11062
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    79
		if h and not active_debug_hook then
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    80
			for i=1,#h do
5749
60b3b6d27364 util.events: Remove varargs, event handlers can now only accept a single parameter
Matthew Wild <mwild1@gmail.com>
parents: 3776
diff changeset
    81
				local ret = h[i](event_data);
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    82
				if ret ~= nil then return ret; end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    83
			end
11062
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    84
		elseif h and active_debug_hook then
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    85
			for i=1,#h do
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    86
				local ret = active_debug_hook(h[i], event_name, event_data);
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    87
				if ret ~= nil then return ret; end
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
    88
			end
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    89
		end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
    90
	end;
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    91
	local function fire_event(event_name, event_data)
8385
e5d00bf4a4d5 util: Various minor changes to please [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7427
diff changeset
    92
		-- luacheck: ignore 432/event_name 432/event_data
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    93
		local w = wrappers[event_name] or global_wrappers;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    94
		if w then
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    95
			local curr_wrapper = #w;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    96
			local function c(event_name, event_data)
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    97
				curr_wrapper = curr_wrapper - 1;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    98
				if curr_wrapper == 0 then
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
    99
					if global_wrappers == nil or w == global_wrappers then
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   100
						return _fire_event(event_name, event_data);
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   101
					end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   102
					w, curr_wrapper = global_wrappers, #global_wrappers;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   103
					return w[curr_wrapper](c, event_name, event_data);
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   104
				else
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   105
					return w[curr_wrapper](c, event_name, event_data);
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   106
				end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   107
			end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   108
			return w[curr_wrapper](c, event_name, event_data);
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   109
		end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   110
		return _fire_event(event_name, event_data);
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   111
	end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   112
	local function add_wrapper(event_name, wrapper)
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   113
		local w;
6644
b44ebfe81c73 util.events: Change from nil to false to indicate adding a global wrapper
Matthew Wild <mwild1@gmail.com>
parents: 6641
diff changeset
   114
		if event_name == false then
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   115
			w = global_wrappers;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   116
			if not w then
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   117
				w = {};
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   118
				global_wrappers = w;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   119
			end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   120
		else
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   121
			w = wrappers[event_name];
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   122
			if not w then
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   123
				w = {};
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   124
				wrappers[event_name] = w;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   125
			end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   126
		end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   127
		w[#w+1] = wrapper;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   128
	end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   129
	local function remove_wrapper(event_name, wrapper)
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   130
		local w;
6644
b44ebfe81c73 util.events: Change from nil to false to indicate adding a global wrapper
Matthew Wild <mwild1@gmail.com>
parents: 6641
diff changeset
   131
		if event_name == false then
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   132
			w = global_wrappers;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   133
		else
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   134
			w = wrappers[event_name];
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   135
		end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   136
		if not w then return; end
8761
c380a22d52d5 util.events: Fix loop construct (negative step required)
Matthew Wild <mwild1@gmail.com>
parents: 7427
diff changeset
   137
		for i = #w, 1, -1 do
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   138
			if w[i] == wrapper then
6651
999434eb1bbf util.events: Add local reference to table.remove (fixes traceback)
Kim Alvefur <zash@zash.se>
parents: 6644
diff changeset
   139
				t_remove(w, i);
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   140
			end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   141
		end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   142
		if #w == 0 then
7427
ba83ff7d9bd7 util.events: Fix comparison of event_name with nil instead of false (fixes #554)
Matthew Wild <mwild1@gmail.com>
parents: 7042
diff changeset
   143
			if event_name == false then
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   144
				global_wrappers = nil;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   145
			else
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   146
				wrappers[event_name] = nil;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   147
			end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   148
		end
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   149
	end
11062
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   150
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   151
	local function set_debug_hook(new_hook)
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   152
		local old_hook = active_debug_hook;
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   153
		active_debug_hook = new_hook;
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   154
		return old_hook;
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   155
	end
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   156
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   157
	return {
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   158
		add_handler = add_handler;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   159
		remove_handler = remove_handler;
3499
91c55ae31ef3 util.events: Fixed the exposed API for adding/removing sets of event handlers.
Waqas Hussain <waqas20@gmail.com>
parents: 3498
diff changeset
   160
		add_handlers = add_handlers;
91c55ae31ef3 util.events: Fixed the exposed API for adding/removing sets of event handlers.
Waqas Hussain <waqas20@gmail.com>
parents: 3498
diff changeset
   161
		remove_handlers = remove_handlers;
6667
5466f24e51c9 util.events: Add get_handlers() method
Matthew Wild <mwild1@gmail.com>
parents: 6644
diff changeset
   162
		get_handlers = get_handlers;
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   163
		wrappers = {
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   164
			add_handler = add_wrapper;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   165
			remove_handler = remove_wrapper;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   166
		};
11062
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   167
6641
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   168
		add_wrapper = add_wrapper;
9d2b56fd6b47 util.events: Add support for event wrappers, functions which can wrap the calling of event handlers to run code before/after an event (for debugging, statistics, logging purposes, etc.)
Matthew Wild <mwild1@gmail.com>
parents: 5776
diff changeset
   169
		remove_wrapper = remove_wrapper;
11062
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   170
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   171
		set_debug_hook = set_debug_hook;
c99afee1c548 util.events: Add set_debug_hook() method
Matthew Wild <mwild1@gmail.com>
parents: 8762
diff changeset
   172
1507
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   173
		fire_event = fire_event;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   174
		_handlers = handlers;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   175
		_event_map = event_map;
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   176
	};
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   177
end
92357dffe743 util.events: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 1417
diff changeset
   178
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: 6668
diff changeset
   179
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: 6668
diff changeset
   180
	new = new;
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: 6668
diff changeset
   181
};