@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/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: "472e55443b62f60d0991028456c57815a387066d"
502
+ hash: "4ef8749b9e927b157546ebad13061fa86b9ffc2e"
503
503
  },
504
504
  getRemaining: {
505
505
  script: fixedWindowRemainingTokensScript,
506
- hash: "40515c9dd0a08f8584f5f9b593935f6a87c1c1c3"
506
+ hash: "e62252cb05b4676b27a5d396da02f0ca0d375d88"
507
507
  }
508
508
  },
509
509
  slidingWindow: {
510
510
  limit: {
511
511
  script: slidingWindowLimitScript,
512
- hash: "977fb636fb5ceb7e98a96d1b3a1272ba018efdae"
512
+ hash: "5cd9665be7533e4dfabb3581021737fc69b41ae8"
513
513
  },
514
514
  getRemaining: {
515
515
  script: slidingWindowRemainingTokensScript,
516
- hash: "ee3a3265fad822f83acad23f8a1e2f5c0b156b03"
516
+ hash: "1bdbbdb2082bb557084518c64486d7d5a29d1bfe"
517
517
  }
518
518
  },
519
519
  tokenBucket: {
520
520
  limit: {
521
521
  script: tokenBucketLimitScript,
522
- hash: "b35c5bc0b7fdae7dd0573d4529911cabaf9d1d89"
522
+ hash: "8f7286b9b0f65d631f760ba615f7b3c598a569a3"
523
523
  },
524
524
  getRemaining: {
525
525
  script: tokenBucketRemainingTokensScript,
526
- hash: "deb03663e8af5a968deee895dd081be553d2611b"
526
+ hash: "08d3b3381c507b6f7bfec1bbfa0a6053434b16bd"
527
527
  }
528
528
  },
529
529
  cachedFixedWindow: {
530
530
  limit: {
531
531
  script: cachedFixedWindowLimitScript,
532
- hash: "c26b12703dd137939b9a69a3a9b18e906a2d940f"
532
+ hash: "1861a700bafe96c833a483af6b1c28a8897cfdb0"
533
533
  },
534
534
  getRemaining: {
535
535
  script: cachedFixedWindowRemainingTokenScript,
536
- hash: "8e8f222ccae68b595ee6e3f3bf2199629a62b91a"
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: "a8c14f3835aa87bd70e5e2116081b81664abcf5c"
544
+ hash: "e04b753a75909b7f99aae4c04cf8869a8de02a9e"
545
545
  },
546
546
  getRemaining: {
547
547
  script: fixedWindowRemainingTokensScript2,
548
- hash: "8ab8322d0ed5fe5ac8eb08f0c2e4557f1b4816fd"
548
+ hash: "e066c8ce3eaca142b0894ad1541e0a58c9924819"
549
549
  }
550
550
  },
551
551
  slidingWindow: {
552
552
  limit: {
553
553
  script: slidingWindowLimitScript2,
554
- hash: "1e7ca8dcd2d600a6d0124a67a57ea225ed62921b"
554
+ hash: "aeb4d8f381e8dafc8e69041baae1324d254ded44"
555
555
  },
556
556
  getRemaining: {
557
557
  script: slidingWindowRemainingTokensScript2,
558
- hash: "558c9306b7ec54abb50747fe0b17e5d44bd24868"
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.