IrcServer memory leak fix
[KiwiIRC.git] / server / irc / eventbinder.js
CommitLineData
635e02c3
D
1var _ = require('lodash');
2
635e02c3 3
ba21099b 4module.exports.bindIrcEvents = function (events_scope, event_map, context, irc_connection) {
4c25c0d7
D
5 var namespace_prefix = events_scope ?
6 events_scope + ':' :
7 '';
8
d2c73ae6
D
9 // Make sure we have a holder for the bound events
10 if (!event_map._bound_events)
11 event_map._bound_events = {};
12
635e02c3 13 _.each(event_map, function (fn, event_name) {
d2c73ae6
D
14 if (event_name[0] === '_') return;
15
635e02c3 16 // Bind the event to `context`, storing it with the event listing
d2c73ae6 17 if (!event_map._bound_events[event_name]) {
ac24e0a7 18 event_map._bound_events[event_name] = _.bind(fn, context);
635e02c3
D
19 }
20
21 // Add the listener to the IRC connection object
4c25c0d7 22 irc_connection.on(namespace_prefix + event_name, event_map._bound_events[event_name]);
635e02c3
D
23 });
24};
25
26
ba21099b 27module.exports.unbindIrcEvents = function (events_scope, event_map, irc_connection) {
4c25c0d7
D
28 var namespace_prefix = events_scope ?
29 events_scope + ':' :
30 '';
31
d2c73ae6
D
32 // No bound events? Then we have nothing to do
33 if (!event_map._bound_events) return;
34
635e02c3 35 _.each(event_map, function(fn, event_name) {
d2c73ae6
D
36 if (event_name[0] === '_') return;
37
38 if (event_map._bound_events[event_name]) {
635e02c3 39 // Remove the listener from the IRC connection object
4c25c0d7 40 irc_connection.removeListener(namespace_prefix + event_name, event_map._bound_events[event_name]);
635e02c3
D
41
42 // Remove the bound function as no longer needed
ac24e0a7 43 delete event_map._bound_events[event_name];
635e02c3
D
44 }
45 });
ac24e0a7
D
46
47 delete event_map._bound_events;
635e02c3 48};