@upstash/ratelimit 2.0.8 → 2.1.0-rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/index.d.mts +22 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +49 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +49 -24
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -156,7 +156,7 @@ var safeEval = async (ctx, script, keys, args) => {
|
|
|
156
156
|
};
|
|
157
157
|
|
|
158
158
|
// src/lua-scripts/single.ts
|
|
159
|
-
var fixedWindowLimitScript =
|
|
159
|
+
var fixedWindowLimitScript = `#!lua flags=allow-key-locking
|
|
160
160
|
local key = KEYS[1]
|
|
161
161
|
local dynamicLimitKey = KEYS[2] -- optional: key for dynamic limit in redis
|
|
162
162
|
local tokens = tonumber(ARGV[1]) -- default limit
|
|
@@ -181,7 +181,7 @@ var fixedWindowLimitScript = `
|
|
|
181
181
|
|
|
182
182
|
return {r, effectiveLimit}
|
|
183
183
|
`;
|
|
184
|
-
var fixedWindowRemainingTokensScript =
|
|
184
|
+
var fixedWindowRemainingTokensScript = `#!lua flags=allow-key-locking
|
|
185
185
|
local key = KEYS[1]
|
|
186
186
|
local dynamicLimitKey = KEYS[2] -- optional: key for dynamic limit in redis
|
|
187
187
|
local tokens = tonumber(ARGV[1]) -- default limit
|
|
@@ -203,7 +203,7 @@ var fixedWindowRemainingTokensScript = `
|
|
|
203
203
|
|
|
204
204
|
return {effectiveLimit - usedTokens, effectiveLimit}
|
|
205
205
|
`;
|
|
206
|
-
var slidingWindowLimitScript =
|
|
206
|
+
var slidingWindowLimitScript = `#!lua flags=allow-key-locking
|
|
207
207
|
local currentKey = KEYS[1] -- identifier including prefixes
|
|
208
208
|
local previousKey = KEYS[2] -- key of the previous bucket
|
|
209
209
|
local dynamicLimitKey = KEYS[3] -- optional: key for dynamic limit in redis
|
|
@@ -247,7 +247,7 @@ var slidingWindowLimitScript = `
|
|
|
247
247
|
end
|
|
248
248
|
return {effectiveLimit - ( newValue + requestsInPreviousWindow ), effectiveLimit}
|
|
249
249
|
`;
|
|
250
|
-
var slidingWindowRemainingTokensScript =
|
|
250
|
+
var slidingWindowRemainingTokensScript = `#!lua flags=allow-key-locking
|
|
251
251
|
local currentKey = KEYS[1] -- identifier including prefixes
|
|
252
252
|
local previousKey = KEYS[2] -- key of the previous bucket
|
|
253
253
|
local dynamicLimitKey = KEYS[3] -- optional: key for dynamic limit in redis
|
|
@@ -281,7 +281,7 @@ var slidingWindowRemainingTokensScript = `
|
|
|
281
281
|
local usedTokens = requestsInPreviousWindow + requestsInCurrentWindow
|
|
282
282
|
return {effectiveLimit - usedTokens, effectiveLimit}
|
|
283
283
|
`;
|
|
284
|
-
var tokenBucketLimitScript =
|
|
284
|
+
var tokenBucketLimitScript = `#!lua flags=allow-key-locking
|
|
285
285
|
local key = KEYS[1] -- identifier including prefixes
|
|
286
286
|
local dynamicLimitKey = KEYS[2] -- optional: key for dynamic limit in redis
|
|
287
287
|
local maxTokens = tonumber(ARGV[1]) -- default maximum number of tokens
|
|
@@ -335,7 +335,7 @@ var tokenBucketLimitScript = `
|
|
|
335
335
|
return {remaining, refilledAt + interval, effectiveLimit}
|
|
336
336
|
`;
|
|
337
337
|
var tokenBucketIdentifierNotFound = -1;
|
|
338
|
-
var tokenBucketRemainingTokensScript =
|
|
338
|
+
var tokenBucketRemainingTokensScript = `#!lua flags=allow-key-locking
|
|
339
339
|
local key = KEYS[1]
|
|
340
340
|
local dynamicLimitKey = KEYS[2] -- optional: key for dynamic limit in redis
|
|
341
341
|
local maxTokens = tonumber(ARGV[1]) -- default maximum number of tokens
|
|
@@ -357,7 +357,7 @@ var tokenBucketRemainingTokensScript = `
|
|
|
357
357
|
|
|
358
358
|
return {tonumber(bucket[2]), tonumber(bucket[1]), effectiveLimit}
|
|
359
359
|
`;
|
|
360
|
-
var cachedFixedWindowLimitScript =
|
|
360
|
+
var cachedFixedWindowLimitScript = `#!lua flags=allow-key-locking
|
|
361
361
|
local key = KEYS[1]
|
|
362
362
|
local window = ARGV[1]
|
|
363
363
|
local incrementBy = ARGV[2] -- increment rate per request at a given value, default is 1
|
|
@@ -371,7 +371,7 @@ var cachedFixedWindowLimitScript = `
|
|
|
371
371
|
|
|
372
372
|
return r
|
|
373
373
|
`;
|
|
374
|
-
var cachedFixedWindowRemainingTokenScript =
|
|
374
|
+
var cachedFixedWindowRemainingTokenScript = `#!lua flags=allow-key-locking
|
|
375
375
|
local key = KEYS[1]
|
|
376
376
|
local tokens = 0
|
|
377
377
|
|
|
@@ -383,7 +383,7 @@ var cachedFixedWindowRemainingTokenScript = `
|
|
|
383
383
|
`;
|
|
384
384
|
|
|
385
385
|
// src/lua-scripts/multi.ts
|
|
386
|
-
var fixedWindowLimitScript2 =
|
|
386
|
+
var fixedWindowLimitScript2 = `#!lua flags=allow-key-locking
|
|
387
387
|
local key = KEYS[1]
|
|
388
388
|
local id = ARGV[1]
|
|
389
389
|
local window = ARGV[2]
|
|
@@ -399,7 +399,7 @@ var fixedWindowLimitScript2 = `
|
|
|
399
399
|
|
|
400
400
|
return fields
|
|
401
401
|
`;
|
|
402
|
-
var fixedWindowRemainingTokensScript2 =
|
|
402
|
+
var fixedWindowRemainingTokensScript2 = `#!lua flags=allow-key-locking
|
|
403
403
|
local key = KEYS[1]
|
|
404
404
|
local tokens = 0
|
|
405
405
|
|
|
@@ -407,7 +407,7 @@ var fixedWindowRemainingTokensScript2 = `
|
|
|
407
407
|
|
|
408
408
|
return fields
|
|
409
409
|
`;
|
|
410
|
-
var slidingWindowLimitScript2 =
|
|
410
|
+
var slidingWindowLimitScript2 = `#!lua flags=allow-key-locking
|
|
411
411
|
local currentKey = KEYS[1] -- identifier including prefixes
|
|
412
412
|
local previousKey = KEYS[2] -- key of the previous bucket
|
|
413
413
|
local tokens = tonumber(ARGV[1]) -- tokens per window
|
|
@@ -444,7 +444,7 @@ var slidingWindowLimitScript2 = `
|
|
|
444
444
|
end
|
|
445
445
|
return {currentFields, previousFields, true}
|
|
446
446
|
`;
|
|
447
|
-
var slidingWindowRemainingTokensScript2 =
|
|
447
|
+
var slidingWindowRemainingTokensScript2 = `#!lua flags=allow-key-locking
|
|
448
448
|
local currentKey = KEYS[1] -- identifier including prefixes
|
|
449
449
|
local previousKey = KEYS[2] -- key of the previous bucket
|
|
450
450
|
local now = ARGV[1] -- current timestamp in milliseconds
|
|
@@ -499,41 +499,41 @@ var SCRIPTS = {
|
|
|
499
499
|
fixedWindow: {
|
|
500
500
|
limit: {
|
|
501
501
|
script: fixedWindowLimitScript,
|
|
502
|
-
hash: "
|
|
502
|
+
hash: "4ef8749b9e927b157546ebad13061fa86b9ffc2e"
|
|
503
503
|
},
|
|
504
504
|
getRemaining: {
|
|
505
505
|
script: fixedWindowRemainingTokensScript,
|
|
506
|
-
hash: "
|
|
506
|
+
hash: "e62252cb05b4676b27a5d396da02f0ca0d375d88"
|
|
507
507
|
}
|
|
508
508
|
},
|
|
509
509
|
slidingWindow: {
|
|
510
510
|
limit: {
|
|
511
511
|
script: slidingWindowLimitScript,
|
|
512
|
-
hash: "
|
|
512
|
+
hash: "5cd9665be7533e4dfabb3581021737fc69b41ae8"
|
|
513
513
|
},
|
|
514
514
|
getRemaining: {
|
|
515
515
|
script: slidingWindowRemainingTokensScript,
|
|
516
|
-
hash: "
|
|
516
|
+
hash: "1bdbbdb2082bb557084518c64486d7d5a29d1bfe"
|
|
517
517
|
}
|
|
518
518
|
},
|
|
519
519
|
tokenBucket: {
|
|
520
520
|
limit: {
|
|
521
521
|
script: tokenBucketLimitScript,
|
|
522
|
-
hash: "
|
|
522
|
+
hash: "8f7286b9b0f65d631f760ba615f7b3c598a569a3"
|
|
523
523
|
},
|
|
524
524
|
getRemaining: {
|
|
525
525
|
script: tokenBucketRemainingTokensScript,
|
|
526
|
-
hash: "
|
|
526
|
+
hash: "08d3b3381c507b6f7bfec1bbfa0a6053434b16bd"
|
|
527
527
|
}
|
|
528
528
|
},
|
|
529
529
|
cachedFixedWindow: {
|
|
530
530
|
limit: {
|
|
531
531
|
script: cachedFixedWindowLimitScript,
|
|
532
|
-
hash: "
|
|
532
|
+
hash: "1861a700bafe96c833a483af6b1c28a8897cfdb0"
|
|
533
533
|
},
|
|
534
534
|
getRemaining: {
|
|
535
535
|
script: cachedFixedWindowRemainingTokenScript,
|
|
536
|
-
hash: "
|
|
536
|
+
hash: "eb82f0e853d2fc9a236fa9bfbe704fda6ac2fc36"
|
|
537
537
|
}
|
|
538
538
|
}
|
|
539
539
|
},
|
|
@@ -541,21 +541,21 @@ var SCRIPTS = {
|
|
|
541
541
|
fixedWindow: {
|
|
542
542
|
limit: {
|
|
543
543
|
script: fixedWindowLimitScript2,
|
|
544
|
-
hash: "
|
|
544
|
+
hash: "e04b753a75909b7f99aae4c04cf8869a8de02a9e"
|
|
545
545
|
},
|
|
546
546
|
getRemaining: {
|
|
547
547
|
script: fixedWindowRemainingTokensScript2,
|
|
548
|
-
hash: "
|
|
548
|
+
hash: "e066c8ce3eaca142b0894ad1541e0a58c9924819"
|
|
549
549
|
}
|
|
550
550
|
},
|
|
551
551
|
slidingWindow: {
|
|
552
552
|
limit: {
|
|
553
553
|
script: slidingWindowLimitScript2,
|
|
554
|
-
hash: "
|
|
554
|
+
hash: "aeb4d8f381e8dafc8e69041baae1324d254ded44"
|
|
555
555
|
},
|
|
556
556
|
getRemaining: {
|
|
557
557
|
script: slidingWindowRemainingTokensScript2,
|
|
558
|
-
hash: "
|
|
558
|
+
hash: "87828c1088f6a8d1f512a434ea330189982a1c0a"
|
|
559
559
|
}
|
|
560
560
|
}
|
|
561
561
|
}
|
|
@@ -1036,6 +1036,27 @@ var Ratelimit = class {
|
|
|
1036
1036
|
};
|
|
1037
1037
|
};
|
|
1038
1038
|
|
|
1039
|
+
// src/version.ts
|
|
1040
|
+
var VERSION = "2.1.0-rc";
|
|
1041
|
+
|
|
1042
|
+
// src/telemetry.ts
|
|
1043
|
+
var taggedClients = /* @__PURE__ */ new WeakSet();
|
|
1044
|
+
var getSafeEnv = () => typeof process === "object" && process && typeof process.env === "object" ? process.env : {};
|
|
1045
|
+
var addTelemetry = (redis, enableTelemetry = true) => {
|
|
1046
|
+
if (!enableTelemetry || getSafeEnv().UPSTASH_DISABLE_TELEMETRY)
|
|
1047
|
+
return;
|
|
1048
|
+
if (!redis || typeof redis !== "object")
|
|
1049
|
+
return;
|
|
1050
|
+
if (taggedClients.has(redis))
|
|
1051
|
+
return;
|
|
1052
|
+
taggedClients.add(redis);
|
|
1053
|
+
try {
|
|
1054
|
+
const client = redis;
|
|
1055
|
+
client.addTelemetry?.({ sdk: `@upstash/ratelimit@${VERSION}` });
|
|
1056
|
+
} catch {
|
|
1057
|
+
}
|
|
1058
|
+
};
|
|
1059
|
+
|
|
1039
1060
|
// src/multi.ts
|
|
1040
1061
|
function randomId() {
|
|
1041
1062
|
let result = "";
|
|
@@ -1065,6 +1086,9 @@ var MultiRegionRatelimit = class extends Ratelimit {
|
|
|
1065
1086
|
cache: config.ephemeralCache ? new Cache(config.ephemeralCache) : void 0
|
|
1066
1087
|
}
|
|
1067
1088
|
});
|
|
1089
|
+
for (const redis of config.redis) {
|
|
1090
|
+
addTelemetry(redis, config.enableTelemetry);
|
|
1091
|
+
}
|
|
1068
1092
|
if (config.dynamicLimits) {
|
|
1069
1093
|
console.warn(
|
|
1070
1094
|
"Warning: Dynamic limits are not yet supported for multi-region rate limiters. The dynamicLimits option will be ignored."
|
|
@@ -1435,6 +1459,7 @@ var RegionRatelimit = class extends Ratelimit {
|
|
|
1435
1459
|
denyListThreshold: config.denyListThreshold,
|
|
1436
1460
|
dynamicLimits: config.dynamicLimits
|
|
1437
1461
|
});
|
|
1462
|
+
addTelemetry(config.redis, config.enableTelemetry);
|
|
1438
1463
|
}
|
|
1439
1464
|
/**
|
|
1440
1465
|
* Each request inside a fixed time increases a counter.
|