wildduck/lib/counters.js
2023-03-10 11:13:12 +02:00

82 lines
2.4 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 processLockScript = fs.readFileSync(__dirname + '/lua/process-lock.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
});
redis.defineCommand('processlock', {
numberOfKeys: 1,
lua: processLockScript
});
let asyncTTLCounter = async (key, count, max, windowSize) => {
if (!max || isNaN(max)) {
return {
success: true,
value: 0,
ttl: 0
};
}
let res = await redis.ttlcounter(key, count, max, windowSize || 86400);
return {
success: !!((res && res[0]) || 0),
value: (res && res[1]) || 0,
ttl: (res && res[2]) || 0
};
};
return {
asyncTTLCounter,
ttlcounter(key, count, max, windowSize, callback) {
return asyncTTLCounter(key, count, max, windowSize)
.then(res => callback(null, res))
.catch(callback);
},
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
});
});
},
async processlock(key, identifier, ttl) {
return await redis.processlock(key, identifier, ttl);
}
};
};