wildduck/lib/counters.js
2017-11-12 15:13:32 +02:00

68 lines
2 KiB
JavaScript

'use strict';
const fs = require('fs');
const ttlCounterScript = fs.readFileSync(__dirname + '/lua/ttlcounter.lua', 'utf-8');
const cachedCounterScript = fs.readFileSync(__dirname + '/lua/cachedcounter.lua', 'utf-8');
const limitedCounterScript = fs.readFileSync(__dirname + '/lua/limitedcounter.lua', 'utf-8');
const clientVersion = Date.now();
module.exports = redis => {
redis.defineCommand('ttlcounter', {
numberOfKeys: 1,
lua: ttlCounterScript
});
redis.defineCommand('cachedcounter', {
numberOfKeys: 1,
lua: cachedCounterScript
});
redis.defineCommand('limitedcounter', {
numberOfKeys: 1,
lua: limitedCounterScript
});
return {
ttlcounter(key, count, max, windowSize, callback) {
if (!max || isNaN(max)) {
return callback(null, {
success: true,
value: 0,
ttl: 0
});
}
redis.ttlcounter(key, count, max, windowSize || 86400, (err, res) => {
if (err) {
return callback(err);
}
return callback(null, {
success: !!((res && res[0]) || 0),
value: (res && res[1]) || 0,
ttl: (res && res[2]) || 0
});
});
},
cachedcounter(key, count, ttl, callback) {
redis.cachedcounter(key, count, ttl, (err, res) => {
if (err) {
return callback(err);
}
callback(null, res);
});
},
limitedcounter(key, entry, count, limit, callback) {
redis.limitedcounter(key, entry, count, limit, clientVersion, (err, res) => {
if (err) {
return callback(err);
}
return callback(null, {
success: !!((res && res[0]) || 0),
value: (res && res[1]) || 0
});
});
}
};
};