implement optional channel removal hooks

add configuration variables to the default config
pull/1/head
ansuz 9 years ago
parent d59824929d
commit 3232671a6a

@ -62,6 +62,17 @@ dropUser = function (ctx, user) {
if (chan.length === 0) { if (chan.length === 0) {
console.log("Removing empty channel ["+chanName+"]"); console.log("Removing empty channel ["+chanName+"]");
delete ctx.channels[chanName]; delete ctx.channels[chanName];
/* Call removeChannel if it is a function and channel removal is
set to true in the config file */
if (ctx.config.removeChannels && typeof(ctx.store.removeChannel) === 'function') {
ctx.timeouts[chanName] = setTimeout(function () {
ctx.store.removeChannel(chanName, function (err) {
if (err) { console.error("[removeChannelErr]: %s", err); }
console.log("Deleted channel [%s] history from database...", chanName);
});
}, ctx.config.channelRemovalTimeout);
}
} else { } else {
sendChannelMessage(ctx, chan, [user.id, 'LEAVE', chanName, 'Quit: [ dropUser() ]']); sendChannelMessage(ctx, chan, [user.id, 'LEAVE', chanName, 'Quit: [ dropUser() ]']);
} }
@ -91,6 +102,12 @@ const handleMessage = function (ctx, user, msg) {
let chanName = obj || randName(); let chanName = obj || randName();
sendMsg(ctx, user, [seq, 'JACK', chanName]); sendMsg(ctx, user, [seq, 'JACK', chanName]);
let chan = ctx.channels[chanName] = ctx.channels[chanName] || []; let chan = ctx.channels[chanName] = ctx.channels[chanName] || [];
// prevent removal of the channel if there is a pending timeout
if (ctx.config.removeChannels && ctx.timeouts[chanName]) {
clearTimeout(ctx.timeouts[chanName]);
}
chan.id = chanName; chan.id = chanName;
if (USE_HISTORY_KEEPER) { if (USE_HISTORY_KEEPER) {
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'JOIN', chanName]); sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'JOIN', chanName]);
@ -154,9 +171,16 @@ const handleMessage = function (ctx, user, msg) {
}; };
let run = module.exports.run = function (storage, socketServer, config) { let run = module.exports.run = function (storage, socketServer, config) {
/* Channel removal timeout defaults to 60000ms (one minute) */
config.channelRemovalTimeout =
typeof(config.channelRemovalTimeout) === 'number'?
config.channelRemovalTimeout:
60000;
let ctx = { let ctx = {
users: {}, users: {},
channels: {}, channels: {},
timeouts: {},
store: (USE_FILE_BACKUP_STORAGE) ? LogStore.create('messages.log', storage) : storage, store: (USE_FILE_BACKUP_STORAGE) ? LogStore.create('messages.log', storage) : storage,
config: config config: config
}; };

@ -17,6 +17,15 @@ module.exports = {
*/ */
logToStdout: false, logToStdout: false,
/* Cryptpad can be configured to remove channels some number of ms
after the last remaining client has disconnected.
Default behaviour is to keep channels forever.
If you enable channel removal, the default removal time is one minute
*/
removeChannels: false,
channelRemovalTimeout: 60000,
// You now have a choice of storage engines // You now have a choice of storage engines
/* amnesiadb only exists in memory. /* amnesiadb only exists in memory.

Loading…
Cancel
Save