/**
* Instruments list operations with rate limiting.
*
* @param {function} listOperation - The function to instrument (e.g., add, remove, get).
* @param {number} maxRequestsPerSecond - The maximum number of requests allowed per second.
* @returns {function} - A wrapped function that applies rate limiting.
*/
function rateLimitListOperations(listOperation, maxRequestsPerSecond) {
let queue = [];
let lastExecutionTime = 0;
async function executeWithRateLimit() {
if (queue.length > 0) {
const now = Date.now();
const timeSinceLastExecution = now - lastExecutionTime;
const delay = Math.max(0, 1000 / (maxRequestsPerSecond - Math.floor(timeSinceLastExecution / 1000))); // Calculate delay
await new Promise(resolve => setTimeout(resolve, delay));
const nextOperation = queue.shift();
return nextOperation();
}
return Promise.resolve(listOperation()); // Execute if queue is empty
}
return async function (...args) {
return executeWithRateLimit().then(result => {
lastExecutionTime = Date.now();
queue.push(() => result);
return result;
});
};
}
Add your comment