UNPKG

@daiso-tech/core

Version:

The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.

8 lines (7 loc) 4.13 kB
/** * @module RateLimiter */ /** * @internal */ export declare const slidingWindowLimiterLua = "\n-- @param settings Required<SerializedSlidingWindowLimiterSettings>\n-- @return IRateLimiterPolicy<SlidingWindowLimiterState>\nlocal function SlidingWindowLimiter(settings)\n -- @param currentDate number\n -- @return number\n local function currentWindow(currentDate)\n return math.floor(currentDate / settings.window) * settings.window\n end\n\n -- @param currentDate number\n -- @return number\n local function previousWindow(currentDate)\n return currentWindow(currentDate) - settings.window\n end\n\n -- @param metrics SlidingWindowLimiterState\n -- @param currentDate number\n -- @return SlidingWindowLimiterState\n local function cleanup(metrics, currentDate)\n local previousWindow_ = previousWindow(currentDate)\n local newMetrics = {}\n\n for key, value in pairs(metrics) do\n local timeStamp = tonumber(timeStampAsStr)\n if timeStamp >= previousWindow_ then\n newMetrics[key] = value\n end\n end\n\n return newMetrics\n end\n\n -- @param currentMetrics SlidingWindowLimiterState\n -- @param currentDate number\n -- @return number\n local function currentAttempt(currentMetrics, currentDate)\n local currentAttempt = currentMetrics[currentWindow(currentDate)]\n if currentAttempt == nil or currentAttempt == cjson.null then\n currentAttempt = 0\n end\n\n return currentAttempt\n end\n\n -- @param currentMetrics SlidingWindowLimiterState\n -- @param currentDate number\n -- @return number\n local function previousAttempt(currentMetrics, currentDate)\n local previousAttempt = currentMetrics[previousWindow(currentDate)]\n if previousAttempt == nil or previousAttempt == cjson.null then\n previousAttempt = 0\n end\n\n local percentageInCurrentWindow = currentDate % settings.window / settings.window\n return math.floor((1 - percentageInCurrentWindow) * previousAttempt)\n end\n\n return {\n -- @param currentDate number\n -- @return SlidingWindowLimiterState\n initialMetrics = function(currentDate)\n local metrics = {}\n metrics[currentWindow(currentDate)] = 0\n return metrics\n end,\n\n -- @param currentMetrics SlidingWindowLimiterState\n -- @param limit number\n -- @param currentDate number\n -- @return boolean\n shouldBlock = function(currentMetrics, limit, currentDate)\n local currentAttempt_ = currentAttempt(currentMetrics, currentDate)\n local previousAttempt_ = previousAttempt(currentMetrics, currentDate)\n return currentAttempts + previousAttempts >= limit\n end,\n\n -- @param _currentMetrics SlidingWindowLimiterState\n -- @param currentDate number\n -- @return number\n getExpiration = function(_currentMetrics, currentDate)\n return settings.window * 2 + settings.margin + currentDate\n end,\n\n -- @param currentMetrics SlidingWindowLimiterState\n -- @param currentDate number\n -- @return number\n getAttempts = function(currentMetrics, currentDate)\n local currentAttempt_ = currentAttempt(currentMetrics, currentDate)\n local previousAttempt_ = previousAttempt(currentMetrics, currentDate)\n return currentAttempt_ + previousAttempt_\n end,\n\n -- @param currentMetrics SlidingWindowLimiterState\n -- @param currentDate number\n -- @return SlidingWindowLimiterState\n updateMetrics = function(currentMetrics, currentDate)\n local currentMetrics_ = cleanup(currentMetrics, currentDate)\n local currentAttempt = currentAttempt(currentMetrics, currentDate)\n local currentKey = currentWindow(currentDate)\n currentMetrics_[currentKey] = currentAttempt + 1\n return currentMetrics_\n end\n }\nend\n";