From 6477b036b7d5ebdf46aa02b7d58f55e91cb7d610 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Tue, 10 Sep 2024 13:38:38 +0300 Subject: [PATCH] fix: rm logs and put script hashes under single/multi region --- src/hash.ts | 6 -- src/lua-scripts/hash.test.ts | 6 +- src/lua-scripts/hash.ts | 121 ++++++++++++++++++----------------- src/multi.ts | 8 +-- src/single.ts | 18 +++--- 5 files changed, 80 insertions(+), 79 deletions(-) diff --git a/src/hash.ts b/src/hash.ts index f9f8eef..472a4be 100644 --- a/src/hash.ts +++ b/src/hash.ts @@ -22,13 +22,7 @@ export const safeEval = async ( return await ctx.redis.evalsha(script.hash, keys, args) } catch (error) { if (`${error}`.includes("NOSCRIPT")) { - console.log( - "Upstash Ratelimit: Script to run wasn't found in" - + " redis db. Script will be loaded to Redis before continuing." - ); const hash = await ctx.redis.scriptLoad(script.script) - - console.log("Upstash Ratelimit: Script loaded successfully."); if (hash !== script.hash) { console.warn( diff --git a/src/lua-scripts/hash.test.ts b/src/lua-scripts/hash.test.ts index 2bfd93b..7c61e42 100644 --- a/src/lua-scripts/hash.test.ts +++ b/src/lua-scripts/hash.test.ts @@ -10,8 +10,12 @@ describe("should use correct hash for lua scripts", () => { expect(hash).toBe(expectedHash) } + const algorithms = [ + ...Object.entries(SCRIPTS.singleRegion), ...Object.entries(SCRIPTS.multiRegion) + ] + // for each algorithm (fixedWindow, slidingWindow etc) - for (const [algorithm, scripts] of Object.entries(SCRIPTS)) { + for (const [algorithm, scripts] of algorithms) { describe(`${algorithm}`, () => { // for each method (limit & getRemaining) for (const [method, scriptInfo] of Object.entries(scripts)) { diff --git a/src/lua-scripts/hash.ts b/src/lua-scripts/hash.ts index bacef4a..326d090 100644 --- a/src/lua-scripts/hash.ts +++ b/src/lua-scripts/hash.ts @@ -17,72 +17,75 @@ type AlgorithmKind = | "slidingWindow" | "tokenBucket" | "cachedFixedWindow" - | "multiRegionFixedWindow" - | "multiRegionSlidingWindow"; -export const SCRIPTS: {[T in AlgorithmKind]: Algorithm} = { - /** SINGLE REGION */ - fixedWindow: { - limit: { - script: Single.fixedWindowLimitScript, - hash: "b13943e359636db027ad280f1def143f02158c13" +export const SCRIPTS: { + singleRegion: Record, + multiRegion: Record, Algorithm>, +} = { + singleRegion: { + fixedWindow: { + limit: { + script: Single.fixedWindowLimitScript, + hash: "b13943e359636db027ad280f1def143f02158c13" + }, + getRemaining: { + script: Single.fixedWindowRemainingTokensScript, + hash: "8c4c341934502aee132643ffbe58ead3450e5208" + }, }, - getRemaining: { - script: Single.fixedWindowRemainingTokensScript, - hash: "8c4c341934502aee132643ffbe58ead3450e5208" + slidingWindow: { + limit: { + script: Single.slidingWindowLimitScript, + hash: "e1391e429b699c780eb0480350cd5b7280fd9213" + }, + getRemaining: { + script: Single.slidingWindowRemainingTokensScript, + hash: "65a73ac5a05bf9712903bc304b77268980c1c417" + }, }, - }, - slidingWindow: { - limit: { - script: Single.slidingWindowLimitScript, - hash: "e1391e429b699c780eb0480350cd5b7280fd9213" - }, - getRemaining: { - script: Single.slidingWindowRemainingTokensScript, - hash: "65a73ac5a05bf9712903bc304b77268980c1c417" - }, - }, - tokenBucket: { - limit: { - script: Single.tokenBucketLimitScript, - hash: "5bece90aeef8189a8cfd28995b479529e270b3c6" - }, - getRemaining: { - script: Single.tokenBucketRemainingTokensScript, - hash: "a15be2bb1db2a15f7c82db06146f9d08983900d0" - }, - }, - cachedFixedWindow: { - limit: { - script: Single.cachedFixedWindowLimitScript, - hash: "c26b12703dd137939b9a69a3a9b18e906a2d940f" - }, - getRemaining: { - script: Single.cachedFixedWindowRemainingTokenScript, - hash: "8e8f222ccae68b595ee6e3f3bf2199629a62b91a" - }, - }, - /** MULTI REGION */ - multiRegionFixedWindow: { - limit: { - script: Multi.fixedWindowLimitScript, - hash: "a8c14f3835aa87bd70e5e2116081b81664abcf5c" - }, - getRemaining: { - script: Multi.fixedWindowRemainingTokensScript, - hash: "8ab8322d0ed5fe5ac8eb08f0c2e4557f1b4816fd" + tokenBucket: { + limit: { + script: Single.tokenBucketLimitScript, + hash: "5bece90aeef8189a8cfd28995b479529e270b3c6" + }, + getRemaining: { + script: Single.tokenBucketRemainingTokensScript, + hash: "a15be2bb1db2a15f7c82db06146f9d08983900d0" + }, }, + cachedFixedWindow: { + limit: { + script: Single.cachedFixedWindowLimitScript, + hash: "c26b12703dd137939b9a69a3a9b18e906a2d940f" + }, + getRemaining: { + script: Single.cachedFixedWindowRemainingTokenScript, + hash: "8e8f222ccae68b595ee6e3f3bf2199629a62b91a" + }, + } }, - multiRegionSlidingWindow: { - limit: { - script: Multi.slidingWindowLimitScript, - hash: "cb4fdc2575056df7c6d422764df0de3a08d6753b" + multiRegion: { + fixedWindow: { + limit: { + script: Multi.fixedWindowLimitScript, + hash: "a8c14f3835aa87bd70e5e2116081b81664abcf5c" + }, + getRemaining: { + script: Multi.fixedWindowRemainingTokensScript, + hash: "8ab8322d0ed5fe5ac8eb08f0c2e4557f1b4816fd" + }, }, - getRemaining: { - script: Multi.slidingWindowRemainingTokensScript, - hash: "558c9306b7ec54abb50747fe0b17e5d44bd24868" + slidingWindow: { + limit: { + script: Multi.slidingWindowLimitScript, + hash: "cb4fdc2575056df7c6d422764df0de3a08d6753b" + }, + getRemaining: { + script: Multi.slidingWindowRemainingTokensScript, + hash: "558c9306b7ec54abb50747fe0b17e5d44bd24868" + }, }, - }, + } } /** COMMON */ diff --git a/src/multi.ts b/src/multi.ts index 141c736..9980a0a 100644 --- a/src/multi.ts +++ b/src/multi.ts @@ -177,7 +177,7 @@ export class MultiRegionRatelimit extends Ratelimit { redis: regionContext.redis, request: safeEval( regionContext, - SCRIPTS.multiRegionFixedWindow.limit, + SCRIPTS.multiRegion.fixedWindow.limit, [key], [requestId, windowDuration, incrementBy], ) as Promise, @@ -282,7 +282,7 @@ export class MultiRegionRatelimit extends Ratelimit { redis: regionContext.redis, request: safeEval( regionContext, - SCRIPTS.multiRegionFixedWindow.getRemaining, + SCRIPTS.multiRegion.fixedWindow.getRemaining, [key], [null] ) as Promise, @@ -381,7 +381,7 @@ export class MultiRegionRatelimit extends Ratelimit { redis: regionContext.redis, request: safeEval( regionContext, - SCRIPTS.multiRegionSlidingWindow.limit, + SCRIPTS.multiRegion.slidingWindow.limit, [currentKey, previousKey], [tokens, now, windowDuration, requestId, incrementBy], // lua seems to return `1` for true and `null` for false @@ -503,7 +503,7 @@ export class MultiRegionRatelimit extends Ratelimit { redis: regionContext.redis, request: safeEval( regionContext, - SCRIPTS.multiRegionSlidingWindow.getRemaining, + SCRIPTS.multiRegion.slidingWindow.getRemaining, [currentKey, previousKey], [now, windowSize], // lua seems to return `1` for true and `null` for false diff --git a/src/single.ts b/src/single.ts index 5f4315e..9896ddc 100644 --- a/src/single.ts +++ b/src/single.ts @@ -183,7 +183,7 @@ export class RegionRatelimit extends Ratelimit { const usedTokensAfterUpdate = await safeEval( ctx, - SCRIPTS.fixedWindow.limit, + SCRIPTS.singleRegion.fixedWindow.limit, [key], [windowDuration, incrementBy], ) as number; @@ -211,7 +211,7 @@ export class RegionRatelimit extends Ratelimit { const usedTokens = await safeEval( ctx, - SCRIPTS.fixedWindow.getRemaining, + SCRIPTS.singleRegion.fixedWindow.getRemaining, [key], [null], ) as number; @@ -291,7 +291,7 @@ export class RegionRatelimit extends Ratelimit { const remainingTokens = await safeEval( ctx, - SCRIPTS.slidingWindow.limit, + SCRIPTS.singleRegion.slidingWindow.limit, [currentKey, previousKey], [tokens, now, windowSize, incrementBy], ) as number; @@ -319,7 +319,7 @@ export class RegionRatelimit extends Ratelimit { const usedTokens = await safeEval( ctx, - SCRIPTS.slidingWindow.getRemaining, + SCRIPTS.singleRegion.slidingWindow.getRemaining, [currentKey, previousKey], [now, windowSize], ) as number; @@ -399,7 +399,7 @@ export class RegionRatelimit extends Ratelimit { const [remaining, reset] = await safeEval( ctx, - SCRIPTS.tokenBucket.limit, + SCRIPTS.singleRegion.tokenBucket.limit, [identifier], [maxTokens, intervalDuration, refillRate, now, incrementBy], ) as [number, number]; @@ -421,7 +421,7 @@ export class RegionRatelimit extends Ratelimit { const [remainingTokens, refilledAt] = await safeEval( ctx, - SCRIPTS.tokenBucket.getRemaining, + SCRIPTS.singleRegion.tokenBucket.getRemaining, [identifier], [maxTokens], ) as [number, number]; @@ -503,7 +503,7 @@ export class RegionRatelimit extends Ratelimit { const pending = success ? safeEval( ctx, - SCRIPTS.cachedFixedWindow.limit, + SCRIPTS.singleRegion.cachedFixedWindow.limit, [key], [windowDuration, incrementBy] ) @@ -520,7 +520,7 @@ export class RegionRatelimit extends Ratelimit { const usedTokensAfterUpdate = await safeEval( ctx, - SCRIPTS.cachedFixedWindow.limit, + SCRIPTS.singleRegion.cachedFixedWindow.limit, [key], [windowDuration, incrementBy] ) as number; @@ -554,7 +554,7 @@ export class RegionRatelimit extends Ratelimit { const usedTokens = await safeEval( ctx, - SCRIPTS.cachedFixedWindow.getRemaining, + SCRIPTS.singleRegion.cachedFixedWindow.getRemaining, [key], [null], ) as number;