Skip to content

Commit

Permalink
fix: rm logs and put script hashes under single/multi region
Browse files Browse the repository at this point in the history
  • Loading branch information
CahidArda committed Sep 10, 2024
1 parent 01d7293 commit 6477b03
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 79 deletions.
6 changes: 0 additions & 6 deletions src/hash.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
6 changes: 5 additions & 1 deletion src/lua-scripts/hash.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
121 changes: 62 additions & 59 deletions src/lua-scripts/hash.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<AlgorithmKind, Algorithm>,
multiRegion: Record<Exclude<AlgorithmKind, "tokenBucket" | "cachedFixedWindow">, 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 */
Expand Down
8 changes: 4 additions & 4 deletions src/multi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ export class MultiRegionRatelimit extends Ratelimit<MultiRegionContext> {
redis: regionContext.redis,
request: safeEval(
regionContext,
SCRIPTS.multiRegionFixedWindow.limit,
SCRIPTS.multiRegion.fixedWindow.limit,
[key],
[requestId, windowDuration, incrementBy],
) as Promise<string[]>,
Expand Down Expand Up @@ -282,7 +282,7 @@ export class MultiRegionRatelimit extends Ratelimit<MultiRegionContext> {
redis: regionContext.redis,
request: safeEval(
regionContext,
SCRIPTS.multiRegionFixedWindow.getRemaining,
SCRIPTS.multiRegion.fixedWindow.getRemaining,
[key],
[null]
) as Promise<string[]>,
Expand Down Expand Up @@ -381,7 +381,7 @@ export class MultiRegionRatelimit extends Ratelimit<MultiRegionContext> {
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
Expand Down Expand Up @@ -503,7 +503,7 @@ export class MultiRegionRatelimit extends Ratelimit<MultiRegionContext> {
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
Expand Down
18 changes: 9 additions & 9 deletions src/single.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const usedTokensAfterUpdate = await safeEval(
ctx,
SCRIPTS.fixedWindow.limit,
SCRIPTS.singleRegion.fixedWindow.limit,
[key],
[windowDuration, incrementBy],
) as number;
Expand Down Expand Up @@ -211,7 +211,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const usedTokens = await safeEval(
ctx,
SCRIPTS.fixedWindow.getRemaining,
SCRIPTS.singleRegion.fixedWindow.getRemaining,
[key],
[null],
) as number;
Expand Down Expand Up @@ -291,7 +291,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const remainingTokens = await safeEval(
ctx,
SCRIPTS.slidingWindow.limit,
SCRIPTS.singleRegion.slidingWindow.limit,
[currentKey, previousKey],
[tokens, now, windowSize, incrementBy],
) as number;
Expand Down Expand Up @@ -319,7 +319,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const usedTokens = await safeEval(
ctx,
SCRIPTS.slidingWindow.getRemaining,
SCRIPTS.singleRegion.slidingWindow.getRemaining,
[currentKey, previousKey],
[now, windowSize],
) as number;
Expand Down Expand Up @@ -399,7 +399,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const [remaining, reset] = await safeEval(
ctx,
SCRIPTS.tokenBucket.limit,
SCRIPTS.singleRegion.tokenBucket.limit,
[identifier],
[maxTokens, intervalDuration, refillRate, now, incrementBy],
) as [number, number];
Expand All @@ -421,7 +421,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const [remainingTokens, refilledAt] = await safeEval(
ctx,
SCRIPTS.tokenBucket.getRemaining,
SCRIPTS.singleRegion.tokenBucket.getRemaining,
[identifier],
[maxTokens],
) as [number, number];
Expand Down Expand Up @@ -503,7 +503,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {
const pending = success
? safeEval(
ctx,
SCRIPTS.cachedFixedWindow.limit,
SCRIPTS.singleRegion.cachedFixedWindow.limit,
[key],
[windowDuration, incrementBy]
)
Expand All @@ -520,7 +520,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const usedTokensAfterUpdate = await safeEval(
ctx,
SCRIPTS.cachedFixedWindow.limit,
SCRIPTS.singleRegion.cachedFixedWindow.limit,
[key],
[windowDuration, incrementBy]
) as number;
Expand Down Expand Up @@ -554,7 +554,7 @@ export class RegionRatelimit extends Ratelimit<RegionContext> {

const usedTokens = await safeEval(
ctx,
SCRIPTS.cachedFixedWindow.getRemaining,
SCRIPTS.singleRegion.cachedFixedWindow.getRemaining,
[key],
[null],
) as number;
Expand Down

0 comments on commit 6477b03

Please sign in to comment.