@sapphire/ratelimits 3.0.0-pr-601.2f2c308a.0 → 3.0.0-pr-935.7da5c8bb

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/CHANGELOG.md CHANGED
@@ -2,6 +2,43 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ # [@sapphire/ratelimits@2.4.10](https://github.com/sapphiredev/utilities/compare/@sapphire/ratelimits@2.4.9...@sapphire/ratelimits@2.4.10) - (2024-11-02)
6
+
7
+ ## 🐛 Bug Fixes
8
+
9
+ - Move browser imports ([100ffb0](https://github.com/sapphiredev/utilities/commit/100ffb0a2471bb9f74cc580d282d11059e1a0a68)) ([#826](https://github.com/sapphiredev/utilities/pull/826) by @kyranet)
10
+ - **deps:** Update all non-major dependencies ([083376a](https://github.com/sapphiredev/utilities/commit/083376aac55094dbeddb5194e8a8f0d794b8cceb)) ([#763](https://github.com/sapphiredev/utilities/pull/763) by @renovate[bot])
11
+ - **deps:** Update all non-major dependencies ([e7fdc5d](https://github.com/sapphiredev/utilities/commit/e7fdc5db3632a7f90292ef3978898da32730343a)) ([#752](https://github.com/sapphiredev/utilities/pull/752) by @renovate[bot])
12
+
13
+ ## 📝 Documentation
14
+
15
+ - **readme:** Fix readme table of contents ([c60e8bd](https://github.com/sapphiredev/utilities/commit/c60e8bd9fc89156cf973871597ec3f0ef0308c08))
16
+
17
+ # [@sapphire/ratelimits@2.4.9](https://github.com/sapphiredev/utilities/compare/@sapphire/ratelimits@2.4.9...@sapphire/ratelimits@2.4.9) - (2024-01-19)
18
+
19
+ ## 🐛 Bug Fixes
20
+
21
+ - Fixed commonjs typings export mapping (#707) ([216ff02](https://github.com/sapphiredev/utilities/commit/216ff0260d63a9590357f9a5069f1ae2b34eaf5d))
22
+
23
+ # [@sapphire/ratelimits@2.4.8](https://github.com/sapphiredev/utilities/compare/@sapphire/ratelimits@2.4.8...@sapphire/ratelimits@2.4.8) - (2023-12-04)
24
+
25
+ ## 🐛 Bug Fixes
26
+
27
+ - **ratelimits:** Properly split CJS, ESM and IIFE ([fc1a7d7](https://github.com/sapphiredev/utilities/commit/fc1a7d7ba96a6a6ab8dbaed486e221a9a064e108))
28
+
29
+ # [@sapphire/ratelimits@2.4.7](https://github.com/sapphiredev/utilities/compare/@sapphire/ratelimits@2.4.6...@sapphire/ratelimits@2.4.7) - (2023-09-10)
30
+
31
+ ## 🐛 Bug Fixes
32
+
33
+ - **ratelimits:** Fixed support for `@types/node` `>=v20` ([d2bdd53](https://github.com/sapphiredev/utilities/commit/d2bdd53a6fa01b4e95f163b5d6c4f2de280fad45))
34
+ - Update export mapping for proper ESM/CJS split ([dd0cff8](https://github.com/sapphiredev/utilities/commit/dd0cff8e9b03a15812f25f7a1180501a92422629))
35
+ - **deps:** Update all non-major dependencies (#607) ([9cc8bd0](https://github.com/sapphiredev/utilities/commit/9cc8bd0d4b5d650deab2c913e6c3d713861bae28))
36
+ - **deps:** Update all non-major dependencies (#577) ([291dd67](https://github.com/sapphiredev/utilities/commit/291dd6783e57d8f075ce566218ba076ef6c4bbbd))
37
+
38
+ ## 🧪 Testing
39
+
40
+ - Update vitest to coverage v8 ([a4bc6e4](https://github.com/sapphiredev/utilities/commit/a4bc6e4f24ea60143a150ecc76fda6484f172ab9))
41
+
5
42
  # [@sapphire/ratelimits@2.4.6](https://github.com/sapphiredev/utilities/compare/@sapphire/ratelimits@2.4.5...@sapphire/ratelimits@2.4.6) - (2023-03-09)
6
43
 
7
44
  ## 🏠 Refactor
package/README.md CHANGED
@@ -7,7 +7,6 @@
7
7
  **Bucket implementation for Ratelimits.**
8
8
 
9
9
  [![GitHub](https://img.shields.io/github/license/sapphiredev/utilities)](https://github.com/sapphiredev/utilities/blob/main/LICENSE.md)
10
- [![codecov](https://codecov.io/gh/sapphiredev/utilities/branch/main/graph/badge.svg?token=OEGIV6RFDO)](https://codecov.io/gh/sapphiredev/utilities)
11
10
  [![npm bundle size](https://img.shields.io/bundlephobia/min/@sapphire/ratelimits?logo=webpack&style=flat-square)](https://bundlephobia.com/result?p=@sapphire/ratelimits)
12
11
  [![npm](https://img.shields.io/npm/v/@sapphire/ratelimits?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@sapphire/ratelimits)
13
12
 
@@ -22,7 +21,7 @@
22
21
  - [Token RateLimitManager](#token-ratelimitmanager)
23
22
  - [Leaky RateLimitManager](#leaky-ratelimitmanager)
24
23
  - [Buy us some doughnuts](#buy-us-some-doughnuts)
25
- - [Contributors](#contributors-%E2%9C%A8)
24
+ - [Contributors](#contributors)
26
25
 
27
26
  ## Description
28
27
 
@@ -3,13 +3,10 @@
3
3
  var __defProp = Object.defineProperty;
4
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
5
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
- var __publicField = (obj, key, value) => {
7
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
- return value;
9
- };
6
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
7
 
11
8
  // src/lib/RateLimit.ts
12
- var RateLimit = class {
9
+ var _RateLimit = class _RateLimit {
13
10
  /**
14
11
  * @param manager The manager for this entry.
15
12
  */
@@ -51,10 +48,8 @@ var RateLimit = class {
51
48
  * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.
52
49
  */
53
50
  consume() {
54
- if (this.limited)
55
- throw new Error("Cannot consume a limited bucket");
56
- if (this.expired)
57
- this.reset();
51
+ if (this.limited) throw new Error("Cannot consume a limited bucket");
52
+ if (this.expired) this.reset();
58
53
  this.remaining--;
59
54
  return this;
60
55
  }
@@ -79,10 +74,11 @@ var RateLimit = class {
79
74
  return this;
80
75
  }
81
76
  };
82
- __name(RateLimit, "RateLimit");
77
+ __name(_RateLimit, "RateLimit");
78
+ var RateLimit = _RateLimit;
83
79
 
84
80
  // src/lib/RateLimitManager.ts
85
- var _RateLimitManager = class extends Map {
81
+ var _RateLimitManager = class _RateLimitManager extends Map {
86
82
  /**
87
83
  * @param time The amount of milliseconds for the ratelimits from this manager to expire.
88
84
  * @param limit The amount of times a {@link RateLimit} can drip before it's limited.
@@ -134,23 +130,22 @@ var _RateLimitManager = class extends Map {
134
130
  */
135
131
  sweep() {
136
132
  for (const [id, value] of this.entries()) {
137
- if (value.expired)
138
- this.delete(id);
133
+ if (value.expired) this.delete(id);
139
134
  }
140
- if (this.size === 0 && this.sweepInterval !== null) {
135
+ if (this.size === 0 && this.sweepInterval !== void 0 && this.sweepInterval !== null) {
141
136
  clearInterval(this.sweepInterval);
142
137
  this.sweepInterval = null;
143
138
  }
144
139
  }
145
140
  };
146
- var RateLimitManager = _RateLimitManager;
147
- __name(RateLimitManager, "RateLimitManager");
141
+ __name(_RateLimitManager, "RateLimitManager");
148
142
  /**
149
143
  * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.
150
144
  */
151
- __publicField(RateLimitManager, "sweepIntervalDuration", 3e4);
145
+ __publicField(_RateLimitManager, "sweepIntervalDuration", 3e4);
146
+ var RateLimitManager = _RateLimitManager;
152
147
 
153
148
  exports.RateLimit = RateLimit;
154
149
  exports.RateLimitManager = RateLimitManager;
155
- //# sourceMappingURL=out.js.map
156
- //# sourceMappingURL=index.js.map
150
+ //# sourceMappingURL=index.cjs.map
151
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/RateLimit.ts","../../src/lib/RateLimitManager.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RateLimitManager } from './RateLimitManager';\n\nexport class RateLimit<K = string> {\n\t/**\n\t * The remaining amount of times this entry can be dripped before the bucket is empty.\n\t */\n\tpublic remaining!: number;\n\n\t/**\n\t * The timestamp that represents when this entry will reset back to a available state.\n\t */\n\tpublic expires!: number;\n\n\t/**\n\t * The {@link RateLimitManager} this entry is for.\n\t */\n\tprivate manager: RateLimitManager<K>;\n\n\t/**\n\t * @param manager The manager for this entry.\n\t */\n\tpublic constructor(manager: RateLimitManager<K>) {\n\t\tthis.manager = manager;\n\t\tthis.reset();\n\t}\n\n\t/**\n\t * Whether this entry is expired or not, allowing the bucket to be reset.\n\t */\n\tpublic get expired(): boolean {\n\t\treturn this.remainingTime === 0;\n\t}\n\n\t/**\n\t * Whether this entry is limited or not.\n\t */\n\tpublic get limited(): boolean {\n\t\treturn this.remaining === 0 && !this.expired;\n\t}\n\n\t/**\n\t * The remaining time in milliseconds before resetting.\n\t */\n\tpublic get remainingTime(): number {\n\t\treturn Math.max(this.expires - Date.now(), 0);\n\t}\n\n\t/**\n\t * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.\n\t */\n\tpublic consume(): this {\n\t\tif (this.limited) throw new Error('Cannot consume a limited bucket');\n\t\tif (this.expired) this.reset();\n\n\t\tthis.remaining--;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry back to it's full state.\n\t */\n\tpublic reset(): this {\n\t\treturn this.resetRemaining().resetTime();\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.remaining} uses back to full state.\n\t */\n\tpublic resetRemaining(): this {\n\t\tthis.remaining = this.manager.limit;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.\n\t */\n\tpublic resetTime(): this {\n\t\tthis.expires = Date.now() + this.manager.time;\n\t\treturn this;\n\t}\n}\n","import { RateLimit } from './RateLimit';\n\nexport class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {\n\t/**\n\t * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.\n\t */\n\tpublic readonly time: number;\n\n\t/**\n\t * The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic readonly limit: number;\n\n\t/**\n\t * The interval to sweep expired {@link RateLimit ratelimits}.\n\t */\n\tprivate sweepInterval!: NodeJS.Timeout | undefined | null;\n\n\t/**\n\t * @param time The amount of milliseconds for the ratelimits from this manager to expire.\n\t * @param limit The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic constructor(time: number, limit = 1) {\n\t\tsuper();\n\n\t\tthis.time = time;\n\t\tthis.limit = limit;\n\t}\n\n\t/**\n\t * Gets a {@link RateLimit} from this manager or creates it if it does not exist.\n\t * @param id The id for the {@link RateLimit}\n\t */\n\tpublic acquire(id: K): RateLimit<K> {\n\t\treturn this.get(id) ?? this.create(id);\n\t}\n\n\t/**\n\t * Creates a {@link RateLimit} for this manager.\n\t * @param id The id the {@link RateLimit} belongs to\n\t */\n\tpublic create(id: K): RateLimit<K> {\n\t\tconst value = new RateLimit(this);\n\t\tthis.set(id, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.\n\t * @param id The id the {@link RateLimit} belongs to\n\t * @param value The {@link RateLimit} to set\n\t */\n\tpublic override set(id: K, value: RateLimit<K>): this {\n\t\tthis.sweepInterval ??= setInterval(this.sweep.bind(this), RateLimitManager.sweepIntervalDuration);\n\t\treturn super.set(id, value);\n\t}\n\n\t/**\n\t * Wraps Collection's sweep method to clear the interval when this manager is empty.\n\t */\n\tpublic sweep(): void {\n\t\tfor (const [id, value] of this.entries()) {\n\t\t\tif (value.expired) this.delete(id);\n\t\t}\n\n\t\tif (this.size === 0 && this.sweepInterval !== undefined && this.sweepInterval !== null) {\n\t\t\tclearInterval(this.sweepInterval);\n\t\t\tthis.sweepInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.\n\t */\n\tpublic static sweepIntervalDuration = 30_000;\n}\n"]}
@@ -0,0 +1,92 @@
1
+ declare class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {
2
+ /**
3
+ * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.
4
+ */
5
+ readonly time: number;
6
+ /**
7
+ * The amount of times a {@link RateLimit} can drip before it's limited.
8
+ */
9
+ readonly limit: number;
10
+ /**
11
+ * The interval to sweep expired {@link RateLimit ratelimits}.
12
+ */
13
+ private sweepInterval;
14
+ /**
15
+ * @param time The amount of milliseconds for the ratelimits from this manager to expire.
16
+ * @param limit The amount of times a {@link RateLimit} can drip before it's limited.
17
+ */
18
+ constructor(time: number, limit?: number);
19
+ /**
20
+ * Gets a {@link RateLimit} from this manager or creates it if it does not exist.
21
+ * @param id The id for the {@link RateLimit}
22
+ */
23
+ acquire(id: K): RateLimit<K>;
24
+ /**
25
+ * Creates a {@link RateLimit} for this manager.
26
+ * @param id The id the {@link RateLimit} belongs to
27
+ */
28
+ create(id: K): RateLimit<K>;
29
+ /**
30
+ * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.
31
+ * @param id The id the {@link RateLimit} belongs to
32
+ * @param value The {@link RateLimit} to set
33
+ */
34
+ set(id: K, value: RateLimit<K>): this;
35
+ /**
36
+ * Wraps Collection's sweep method to clear the interval when this manager is empty.
37
+ */
38
+ sweep(): void;
39
+ /**
40
+ * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.
41
+ */
42
+ static sweepIntervalDuration: number;
43
+ }
44
+
45
+ declare class RateLimit<K = string> {
46
+ /**
47
+ * The remaining amount of times this entry can be dripped before the bucket is empty.
48
+ */
49
+ remaining: number;
50
+ /**
51
+ * The timestamp that represents when this entry will reset back to a available state.
52
+ */
53
+ expires: number;
54
+ /**
55
+ * The {@link RateLimitManager} this entry is for.
56
+ */
57
+ private manager;
58
+ /**
59
+ * @param manager The manager for this entry.
60
+ */
61
+ constructor(manager: RateLimitManager<K>);
62
+ /**
63
+ * Whether this entry is expired or not, allowing the bucket to be reset.
64
+ */
65
+ get expired(): boolean;
66
+ /**
67
+ * Whether this entry is limited or not.
68
+ */
69
+ get limited(): boolean;
70
+ /**
71
+ * The remaining time in milliseconds before resetting.
72
+ */
73
+ get remainingTime(): number;
74
+ /**
75
+ * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.
76
+ */
77
+ consume(): this;
78
+ /**
79
+ * Resets the entry back to it's full state.
80
+ */
81
+ reset(): this;
82
+ /**
83
+ * Resets the entry's {@link RateLimit.remaining} uses back to full state.
84
+ */
85
+ resetRemaining(): this;
86
+ /**
87
+ * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.
88
+ */
89
+ resetTime(): this;
90
+ }
91
+
92
+ export { RateLimit, RateLimitManager };
@@ -1,13 +1,10 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
4
- var __publicField = (obj, key, value) => {
5
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
- return value;
7
- };
4
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
5
 
9
6
  // src/lib/RateLimit.ts
10
- var RateLimit = class {
7
+ var _RateLimit = class _RateLimit {
11
8
  /**
12
9
  * @param manager The manager for this entry.
13
10
  */
@@ -49,10 +46,8 @@ var RateLimit = class {
49
46
  * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.
50
47
  */
51
48
  consume() {
52
- if (this.limited)
53
- throw new Error("Cannot consume a limited bucket");
54
- if (this.expired)
55
- this.reset();
49
+ if (this.limited) throw new Error("Cannot consume a limited bucket");
50
+ if (this.expired) this.reset();
56
51
  this.remaining--;
57
52
  return this;
58
53
  }
@@ -77,10 +72,11 @@ var RateLimit = class {
77
72
  return this;
78
73
  }
79
74
  };
80
- __name(RateLimit, "RateLimit");
75
+ __name(_RateLimit, "RateLimit");
76
+ var RateLimit = _RateLimit;
81
77
 
82
78
  // src/lib/RateLimitManager.ts
83
- var _RateLimitManager = class extends Map {
79
+ var _RateLimitManager = class _RateLimitManager extends Map {
84
80
  /**
85
81
  * @param time The amount of milliseconds for the ratelimits from this manager to expire.
86
82
  * @param limit The amount of times a {@link RateLimit} can drip before it's limited.
@@ -132,22 +128,21 @@ var _RateLimitManager = class extends Map {
132
128
  */
133
129
  sweep() {
134
130
  for (const [id, value] of this.entries()) {
135
- if (value.expired)
136
- this.delete(id);
131
+ if (value.expired) this.delete(id);
137
132
  }
138
- if (this.size === 0 && this.sweepInterval !== null) {
133
+ if (this.size === 0 && this.sweepInterval !== void 0 && this.sweepInterval !== null) {
139
134
  clearInterval(this.sweepInterval);
140
135
  this.sweepInterval = null;
141
136
  }
142
137
  }
143
138
  };
144
- var RateLimitManager = _RateLimitManager;
145
- __name(RateLimitManager, "RateLimitManager");
139
+ __name(_RateLimitManager, "RateLimitManager");
146
140
  /**
147
141
  * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.
148
142
  */
149
- __publicField(RateLimitManager, "sweepIntervalDuration", 3e4);
143
+ __publicField(_RateLimitManager, "sweepIntervalDuration", 3e4);
144
+ var RateLimitManager = _RateLimitManager;
150
145
 
151
146
  export { RateLimit, RateLimitManager };
152
- //# sourceMappingURL=out.js.map
147
+ //# sourceMappingURL=index.mjs.map
153
148
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/RateLimit.ts","../../src/lib/RateLimitManager.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { RateLimitManager } from './RateLimitManager';\n\nexport class RateLimit<K = string> {\n\t/**\n\t * The remaining amount of times this entry can be dripped before the bucket is empty.\n\t */\n\tpublic remaining!: number;\n\n\t/**\n\t * The timestamp that represents when this entry will reset back to a available state.\n\t */\n\tpublic expires!: number;\n\n\t/**\n\t * The {@link RateLimitManager} this entry is for.\n\t */\n\tprivate manager: RateLimitManager<K>;\n\n\t/**\n\t * @param manager The manager for this entry.\n\t */\n\tpublic constructor(manager: RateLimitManager<K>) {\n\t\tthis.manager = manager;\n\t\tthis.reset();\n\t}\n\n\t/**\n\t * Whether this entry is expired or not, allowing the bucket to be reset.\n\t */\n\tpublic get expired(): boolean {\n\t\treturn this.remainingTime === 0;\n\t}\n\n\t/**\n\t * Whether this entry is limited or not.\n\t */\n\tpublic get limited(): boolean {\n\t\treturn this.remaining === 0 && !this.expired;\n\t}\n\n\t/**\n\t * The remaining time in milliseconds before resetting.\n\t */\n\tpublic get remainingTime(): number {\n\t\treturn Math.max(this.expires - Date.now(), 0);\n\t}\n\n\t/**\n\t * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.\n\t */\n\tpublic consume(): this {\n\t\tif (this.limited) throw new Error('Cannot consume a limited bucket');\n\t\tif (this.expired) this.reset();\n\n\t\tthis.remaining--;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry back to it's full state.\n\t */\n\tpublic reset(): this {\n\t\treturn this.resetRemaining().resetTime();\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.remaining} uses back to full state.\n\t */\n\tpublic resetRemaining(): this {\n\t\tthis.remaining = this.manager.limit;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.\n\t */\n\tpublic resetTime(): this {\n\t\tthis.expires = Date.now() + this.manager.time;\n\t\treturn this;\n\t}\n}\n","import { RateLimit } from './RateLimit';\n\nexport class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {\n\t/**\n\t * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.\n\t */\n\tpublic readonly time: number;\n\n\t/**\n\t * The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic readonly limit: number;\n\n\t/**\n\t * The interval to sweep expired {@link RateLimit ratelimits}.\n\t */\n\tprivate sweepInterval!: NodeJS.Timeout | undefined | null;\n\n\t/**\n\t * @param time The amount of milliseconds for the ratelimits from this manager to expire.\n\t * @param limit The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic constructor(time: number, limit = 1) {\n\t\tsuper();\n\n\t\tthis.time = time;\n\t\tthis.limit = limit;\n\t}\n\n\t/**\n\t * Gets a {@link RateLimit} from this manager or creates it if it does not exist.\n\t * @param id The id for the {@link RateLimit}\n\t */\n\tpublic acquire(id: K): RateLimit<K> {\n\t\treturn this.get(id) ?? this.create(id);\n\t}\n\n\t/**\n\t * Creates a {@link RateLimit} for this manager.\n\t * @param id The id the {@link RateLimit} belongs to\n\t */\n\tpublic create(id: K): RateLimit<K> {\n\t\tconst value = new RateLimit(this);\n\t\tthis.set(id, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.\n\t * @param id The id the {@link RateLimit} belongs to\n\t * @param value The {@link RateLimit} to set\n\t */\n\tpublic override set(id: K, value: RateLimit<K>): this {\n\t\tthis.sweepInterval ??= setInterval(this.sweep.bind(this), RateLimitManager.sweepIntervalDuration);\n\t\treturn super.set(id, value);\n\t}\n\n\t/**\n\t * Wraps Collection's sweep method to clear the interval when this manager is empty.\n\t */\n\tpublic sweep(): void {\n\t\tfor (const [id, value] of this.entries()) {\n\t\t\tif (value.expired) this.delete(id);\n\t\t}\n\n\t\tif (this.size === 0 && this.sweepInterval !== undefined && this.sweepInterval !== null) {\n\t\t\tclearInterval(this.sweepInterval);\n\t\t\tthis.sweepInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.\n\t */\n\tpublic static sweepIntervalDuration = 30_000;\n}\n"]}
@@ -1,16 +1,13 @@
1
- var SapphireRatelimits = (function (exports) {
1
+ var SapphireSnowflake = (function (exports) {
2
2
  'use strict';
3
3
 
4
4
  var __defProp = Object.defineProperty;
5
5
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
6
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- var __publicField = (obj, key, value) => {
8
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
- return value;
10
- };
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
8
 
12
9
  // src/lib/RateLimit.ts
13
- var RateLimit = class {
10
+ var _RateLimit = class _RateLimit {
14
11
  /**
15
12
  * @param manager The manager for this entry.
16
13
  */
@@ -52,10 +49,8 @@ var SapphireRatelimits = (function (exports) {
52
49
  * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.
53
50
  */
54
51
  consume() {
55
- if (this.limited)
56
- throw new Error("Cannot consume a limited bucket");
57
- if (this.expired)
58
- this.reset();
52
+ if (this.limited) throw new Error("Cannot consume a limited bucket");
53
+ if (this.expired) this.reset();
59
54
  this.remaining--;
60
55
  return this;
61
56
  }
@@ -80,10 +75,11 @@ var SapphireRatelimits = (function (exports) {
80
75
  return this;
81
76
  }
82
77
  };
83
- __name(RateLimit, "RateLimit");
78
+ __name(_RateLimit, "RateLimit");
79
+ var RateLimit = _RateLimit;
84
80
 
85
81
  // src/lib/RateLimitManager.ts
86
- var _RateLimitManager = class extends Map {
82
+ var _RateLimitManager = class _RateLimitManager extends Map {
87
83
  /**
88
84
  * @param time The amount of milliseconds for the ratelimits from this manager to expire.
89
85
  * @param limit The amount of times a {@link RateLimit} can drip before it's limited.
@@ -135,21 +131,20 @@ var SapphireRatelimits = (function (exports) {
135
131
  */
136
132
  sweep() {
137
133
  for (const [id, value] of this.entries()) {
138
- if (value.expired)
139
- this.delete(id);
134
+ if (value.expired) this.delete(id);
140
135
  }
141
- if (this.size === 0 && this.sweepInterval !== null) {
136
+ if (this.size === 0 && this.sweepInterval !== void 0 && this.sweepInterval !== null) {
142
137
  clearInterval(this.sweepInterval);
143
138
  this.sweepInterval = null;
144
139
  }
145
140
  }
146
141
  };
147
- var RateLimitManager = _RateLimitManager;
148
- __name(RateLimitManager, "RateLimitManager");
142
+ __name(_RateLimitManager, "RateLimitManager");
149
143
  /**
150
144
  * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.
151
145
  */
152
- __publicField(RateLimitManager, "sweepIntervalDuration", 3e4);
146
+ __publicField(_RateLimitManager, "sweepIntervalDuration", 3e4);
147
+ var RateLimitManager = _RateLimitManager;
153
148
 
154
149
  exports.RateLimit = RateLimit;
155
150
  exports.RateLimitManager = RateLimitManager;
@@ -157,5 +152,5 @@ var SapphireRatelimits = (function (exports) {
157
152
  return exports;
158
153
 
159
154
  })({});
160
- //# sourceMappingURL=out.js.map
155
+ //# sourceMappingURL=index.global.js.map
161
156
  //# sourceMappingURL=index.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/RateLimit.ts","../../src/lib/RateLimitManager.ts"],"names":[],"mappings":"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","file":"index.global.js","sourcesContent":["import type { RateLimitManager } from './RateLimitManager';\n\nexport class RateLimit<K = string> {\n\t/**\n\t * The remaining amount of times this entry can be dripped before the bucket is empty.\n\t */\n\tpublic remaining!: number;\n\n\t/**\n\t * The timestamp that represents when this entry will reset back to a available state.\n\t */\n\tpublic expires!: number;\n\n\t/**\n\t * The {@link RateLimitManager} this entry is for.\n\t */\n\tprivate manager: RateLimitManager<K>;\n\n\t/**\n\t * @param manager The manager for this entry.\n\t */\n\tpublic constructor(manager: RateLimitManager<K>) {\n\t\tthis.manager = manager;\n\t\tthis.reset();\n\t}\n\n\t/**\n\t * Whether this entry is expired or not, allowing the bucket to be reset.\n\t */\n\tpublic get expired(): boolean {\n\t\treturn this.remainingTime === 0;\n\t}\n\n\t/**\n\t * Whether this entry is limited or not.\n\t */\n\tpublic get limited(): boolean {\n\t\treturn this.remaining === 0 && !this.expired;\n\t}\n\n\t/**\n\t * The remaining time in milliseconds before resetting.\n\t */\n\tpublic get remainingTime(): number {\n\t\treturn Math.max(this.expires - Date.now(), 0);\n\t}\n\n\t/**\n\t * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.\n\t */\n\tpublic consume(): this {\n\t\tif (this.limited) throw new Error('Cannot consume a limited bucket');\n\t\tif (this.expired) this.reset();\n\n\t\tthis.remaining--;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry back to it's full state.\n\t */\n\tpublic reset(): this {\n\t\treturn this.resetRemaining().resetTime();\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.remaining} uses back to full state.\n\t */\n\tpublic resetRemaining(): this {\n\t\tthis.remaining = this.manager.limit;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.\n\t */\n\tpublic resetTime(): this {\n\t\tthis.expires = Date.now() + this.manager.time;\n\t\treturn this;\n\t}\n}\n","import { RateLimit } from './RateLimit';\n\nexport class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {\n\t/**\n\t * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.\n\t */\n\tpublic readonly time: number;\n\n\t/**\n\t * The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic readonly limit: number;\n\n\t/**\n\t * The interval to sweep expired {@link RateLimit ratelimits}.\n\t */\n\tprivate sweepInterval!: NodeJS.Timeout | undefined | null;\n\n\t/**\n\t * @param time The amount of milliseconds for the ratelimits from this manager to expire.\n\t * @param limit The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic constructor(time: number, limit = 1) {\n\t\tsuper();\n\n\t\tthis.time = time;\n\t\tthis.limit = limit;\n\t}\n\n\t/**\n\t * Gets a {@link RateLimit} from this manager or creates it if it does not exist.\n\t * @param id The id for the {@link RateLimit}\n\t */\n\tpublic acquire(id: K): RateLimit<K> {\n\t\treturn this.get(id) ?? this.create(id);\n\t}\n\n\t/**\n\t * Creates a {@link RateLimit} for this manager.\n\t * @param id The id the {@link RateLimit} belongs to\n\t */\n\tpublic create(id: K): RateLimit<K> {\n\t\tconst value = new RateLimit(this);\n\t\tthis.set(id, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.\n\t * @param id The id the {@link RateLimit} belongs to\n\t * @param value The {@link RateLimit} to set\n\t */\n\tpublic override set(id: K, value: RateLimit<K>): this {\n\t\tthis.sweepInterval ??= setInterval(this.sweep.bind(this), RateLimitManager.sweepIntervalDuration);\n\t\treturn super.set(id, value);\n\t}\n\n\t/**\n\t * Wraps Collection's sweep method to clear the interval when this manager is empty.\n\t */\n\tpublic sweep(): void {\n\t\tfor (const [id, value] of this.entries()) {\n\t\t\tif (value.expired) this.delete(id);\n\t\t}\n\n\t\tif (this.size === 0 && this.sweepInterval !== undefined && this.sweepInterval !== null) {\n\t\t\tclearInterval(this.sweepInterval);\n\t\t\tthis.sweepInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.\n\t */\n\tpublic static sweepIntervalDuration = 30_000;\n}\n"]}
package/package.json CHANGED
@@ -1,29 +1,37 @@
1
1
  {
2
2
  "name": "@sapphire/ratelimits",
3
- "version": "3.0.0-pr-601.2f2c308a.0",
3
+ "version": "3.0.0-pr-935.7da5c8bb",
4
4
  "description": "Bucket implementation for Ratelimits.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
7
- "main": "dist/index.js",
8
- "module": "dist/index.mjs",
9
- "browser": "dist/index.global.js",
10
- "unpkg": "dist/index.global.js",
11
- "types": "dist/index.d.ts",
7
+ "main": "dist/cjs/index.cjs",
8
+ "module": "dist/esm/index.mjs",
9
+ "browser": "dist/iife/index.global.js",
10
+ "unpkg": "dist/iife/index.global.js",
11
+ "types": "dist/cjs/index.d.cts",
12
12
  "exports": {
13
- "import": "./dist/index.mjs",
14
- "require": "./dist/index.js",
15
- "types": "./dist/index.d.ts"
13
+ "import": {
14
+ "types": "./dist/esm/index.d.mts",
15
+ "default": "./dist/esm/index.mjs"
16
+ },
17
+ "require": {
18
+ "types": "./dist/cjs/index.d.cts",
19
+ "default": "./dist/cjs/index.cjs"
20
+ },
21
+ "browser": "./dist/iife/index.global.js"
16
22
  },
17
23
  "sideEffects": false,
18
24
  "homepage": "https://github.com/sapphiredev/utilities/tree/main/packages/ratelimits",
19
25
  "scripts": {
20
26
  "test": "vitest run",
21
27
  "lint": "eslint src tests --ext ts --fix -c ../../.eslintrc",
22
- "build": "tsup",
28
+ "build": "yarn gen-index && tsup && yarn build:rename-cjs-index",
29
+ "build:rename-cjs-index": "tsx ../../scripts/rename-cjs-index.cts",
23
30
  "docs": "typedoc-json-parser",
24
31
  "prepack": "yarn build",
25
32
  "bump": "cliff-jumper",
26
- "check-update": "cliff-jumper --dry-run"
33
+ "check-update": "cliff-jumper --dry-run",
34
+ "gen-index": "tsx ../../scripts/gen-index.cts ratelimits --write"
27
35
  },
28
36
  "repository": {
29
37
  "type": "git",
@@ -31,9 +39,7 @@
31
39
  "directory": "packages/ratelimits"
32
40
  },
33
41
  "files": [
34
- "dist/**/*.js*",
35
- "dist/**/*.mjs*",
36
- "dist/**/*.d*"
42
+ "dist/"
37
43
  ],
38
44
  "engines": {
39
45
  "node": ">=v14.0.0",
@@ -56,12 +62,13 @@
56
62
  "access": "public"
57
63
  },
58
64
  "devDependencies": {
59
- "@favware/cliff-jumper": "^2.0.1",
60
- "@vitest/coverage-c8": "^0.31.1",
61
- "tsup": "^6.7.0",
62
- "typedoc": "^0.24.7",
63
- "typedoc-json-parser": "^8.1.2",
64
- "typescript": "^5.0.4",
65
- "vitest": "^0.31.1"
65
+ "@favware/cliff-jumper": "^6.0.0",
66
+ "@vitest/coverage-v8": "^3.2.4",
67
+ "tsup": "^8.5.0",
68
+ "tsx": "^4.20.6",
69
+ "typedoc": "^0.26.11",
70
+ "typedoc-json-parser": "^10.2.0",
71
+ "typescript": "~5.4.5",
72
+ "vitest": "^3.2.4"
66
73
  }
67
74
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/RateLimit.ts","../src/lib/RateLimitManager.ts"],"names":[],"mappings":";;;;;;;;;AAEO,IAAM,YAAN,MAA4B;AAAA;AAAA;AAAA;AAAA,EAmB3B,YAAY,SAA8B;AAfjD;AAAA;AAAA;AAAA,wBAAO;AAKP;AAAA;AAAA;AAAA,wBAAO;AAKP;AAAA;AAAA;AAAA,wBAAQ;AAMP,SAAK,UAAU;AACf,SAAK,MAAM;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC7B,WAAO,KAAK,kBAAkB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC7B,WAAO,KAAK,cAAc,KAAK,CAAC,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,gBAAwB;AAClC,WAAO,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,GAAG,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACtB,QAAI,KAAK;AAAS,YAAM,IAAI,MAAM,iCAAiC;AACnE,QAAI,KAAK;AAAS,WAAK,MAAM;AAE7B,SAAK;AACL,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACpB,WAAO,KAAK,eAAe,EAAE,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAuB;AAC7B,SAAK,YAAY,KAAK,QAAQ;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,YAAkB;AACxB,SAAK,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;AACzC,WAAO;AAAA,EACR;AACD;AA9Ea;;;ACAN,IAAM,oBAAN,cAA2C,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB/D,YAAY,MAAc,QAAQ,GAAG;AAC3C,UAAM;AAjBP;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAQ;AASP,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,IAAqB;AACnC,WAAO,KAAK,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,OAAO,IAAqB;AAClC,UAAM,QAAQ,IAAI,UAAU,IAAI;AAChC,SAAK,IAAI,IAAI,KAAK;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOgB,IAAI,IAAO,OAA2B;AACrD,SAAK,kBAAL,KAAK,gBAAkB,YAAY,KAAK,MAAM,KAAK,IAAI,GAAG,kBAAiB,qBAAqB;AAChG,WAAO,MAAM,IAAI,IAAI,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACpB,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,MAAM;AAAS,aAAK,OAAO,EAAE;AAAA,IAClC;AAEA,QAAI,KAAK,SAAS,KAAK,KAAK,kBAAkB,MAAM;AACnD,oBAAc,KAAK,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACtB;AAAA,EACD;AAMD;AAzEO,IAAM,mBAAN;AAAM;AAAA;AAAA;AAAA;AAwEZ,cAxEY,kBAwEE,yBAAwB","sourcesContent":["import type { RateLimitManager } from './RateLimitManager';\n\nexport class RateLimit<K = string> {\n\t/**\n\t * The remaining amount of times this entry can be dripped before the bucket is empty.\n\t */\n\tpublic remaining!: number;\n\n\t/**\n\t * The timestamp that represents when this entry will reset back to a available state.\n\t */\n\tpublic expires!: number;\n\n\t/**\n\t * The {@link RateLimitManager} this entry is for.\n\t */\n\tprivate manager: RateLimitManager<K>;\n\n\t/**\n\t * @param manager The manager for this entry.\n\t */\n\tpublic constructor(manager: RateLimitManager<K>) {\n\t\tthis.manager = manager;\n\t\tthis.reset();\n\t}\n\n\t/**\n\t * Whether this entry is expired or not, allowing the bucket to be reset.\n\t */\n\tpublic get expired(): boolean {\n\t\treturn this.remainingTime === 0;\n\t}\n\n\t/**\n\t * Whether this entry is limited or not.\n\t */\n\tpublic get limited(): boolean {\n\t\treturn this.remaining === 0 && !this.expired;\n\t}\n\n\t/**\n\t * The remaining time in milliseconds before resetting.\n\t */\n\tpublic get remainingTime(): number {\n\t\treturn Math.max(this.expires - Date.now(), 0);\n\t}\n\n\t/**\n\t * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.\n\t */\n\tpublic consume(): this {\n\t\tif (this.limited) throw new Error('Cannot consume a limited bucket');\n\t\tif (this.expired) this.reset();\n\n\t\tthis.remaining--;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry back to it's full state.\n\t */\n\tpublic reset(): this {\n\t\treturn this.resetRemaining().resetTime();\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.remaining} uses back to full state.\n\t */\n\tpublic resetRemaining(): this {\n\t\tthis.remaining = this.manager.limit;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.\n\t */\n\tpublic resetTime(): this {\n\t\tthis.expires = Date.now() + this.manager.time;\n\t\treturn this;\n\t}\n}\n","import { RateLimit } from './RateLimit';\n\nexport class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {\n\t/**\n\t * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.\n\t */\n\tpublic readonly time: number;\n\n\t/**\n\t * The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic readonly limit: number;\n\n\t/**\n\t * The interval to sweep expired {@link RateLimit ratelimits}.\n\t */\n\tprivate sweepInterval!: NodeJS.Timer | null;\n\n\t/**\n\t * @param time The amount of milliseconds for the ratelimits from this manager to expire.\n\t * @param limit The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic constructor(time: number, limit = 1) {\n\t\tsuper();\n\n\t\tthis.time = time;\n\t\tthis.limit = limit;\n\t}\n\n\t/**\n\t * Gets a {@link RateLimit} from this manager or creates it if it does not exist.\n\t * @param id The id for the {@link RateLimit}\n\t */\n\tpublic acquire(id: K): RateLimit<K> {\n\t\treturn this.get(id) ?? this.create(id);\n\t}\n\n\t/**\n\t * Creates a {@link RateLimit} for this manager.\n\t * @param id The id the {@link RateLimit} belongs to\n\t */\n\tpublic create(id: K): RateLimit<K> {\n\t\tconst value = new RateLimit(this);\n\t\tthis.set(id, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.\n\t * @param id The id the {@link RateLimit} belongs to\n\t * @param value The {@link RateLimit} to set\n\t */\n\tpublic override set(id: K, value: RateLimit<K>): this {\n\t\tthis.sweepInterval ??= setInterval(this.sweep.bind(this), RateLimitManager.sweepIntervalDuration);\n\t\treturn super.set(id, value);\n\t}\n\n\t/**\n\t * Wraps Collection's sweep method to clear the interval when this manager is empty.\n\t */\n\tpublic sweep(): void {\n\t\tfor (const [id, value] of this.entries()) {\n\t\t\tif (value.expired) this.delete(id);\n\t\t}\n\n\t\tif (this.size === 0 && this.sweepInterval !== null) {\n\t\t\tclearInterval(this.sweepInterval);\n\t\t\tthis.sweepInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.\n\t */\n\tpublic static sweepIntervalDuration = 30_000;\n}\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/RateLimit.ts","../src/lib/RateLimitManager.ts"],"names":[],"mappings":";;;;;;;;;AAEO,IAAM,YAAN,MAA4B;AAAA;AAAA;AAAA;AAAA,EAmB3B,YAAY,SAA8B;AAfjD;AAAA;AAAA;AAAA,wBAAO;AAKP;AAAA;AAAA;AAAA,wBAAO;AAKP;AAAA;AAAA;AAAA,wBAAQ;AAMP,SAAK,UAAU;AACf,SAAK,MAAM;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC7B,WAAO,KAAK,kBAAkB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC7B,WAAO,KAAK,cAAc,KAAK,CAAC,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,gBAAwB;AAClC,WAAO,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,GAAG,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACtB,QAAI,KAAK;AAAS,YAAM,IAAI,MAAM,iCAAiC;AACnE,QAAI,KAAK;AAAS,WAAK,MAAM;AAE7B,SAAK;AACL,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACpB,WAAO,KAAK,eAAe,EAAE,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAuB;AAC7B,SAAK,YAAY,KAAK,QAAQ;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,YAAkB;AACxB,SAAK,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;AACzC,WAAO;AAAA,EACR;AACD;AA9Ea;;;ACAN,IAAM,oBAAN,cAA2C,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB/D,YAAY,MAAc,QAAQ,GAAG;AAC3C,UAAM;AAjBP;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAQ;AASP,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,IAAqB;AACnC,WAAO,KAAK,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,OAAO,IAAqB;AAClC,UAAM,QAAQ,IAAI,UAAU,IAAI;AAChC,SAAK,IAAI,IAAI,KAAK;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOgB,IAAI,IAAO,OAA2B;AACrD,SAAK,kBAAL,KAAK,gBAAkB,YAAY,KAAK,MAAM,KAAK,IAAI,GAAG,kBAAiB,qBAAqB;AAChG,WAAO,MAAM,IAAI,IAAI,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACpB,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,MAAM;AAAS,aAAK,OAAO,EAAE;AAAA,IAClC;AAEA,QAAI,KAAK,SAAS,KAAK,KAAK,kBAAkB,MAAM;AACnD,oBAAc,KAAK,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACtB;AAAA,EACD;AAMD;AAzEO,IAAM,mBAAN;AAAM;AAAA;AAAA;AAAA;AAwEZ,cAxEY,kBAwEE,yBAAwB","sourcesContent":["import type { RateLimitManager } from './RateLimitManager';\n\nexport class RateLimit<K = string> {\n\t/**\n\t * The remaining amount of times this entry can be dripped before the bucket is empty.\n\t */\n\tpublic remaining!: number;\n\n\t/**\n\t * The timestamp that represents when this entry will reset back to a available state.\n\t */\n\tpublic expires!: number;\n\n\t/**\n\t * The {@link RateLimitManager} this entry is for.\n\t */\n\tprivate manager: RateLimitManager<K>;\n\n\t/**\n\t * @param manager The manager for this entry.\n\t */\n\tpublic constructor(manager: RateLimitManager<K>) {\n\t\tthis.manager = manager;\n\t\tthis.reset();\n\t}\n\n\t/**\n\t * Whether this entry is expired or not, allowing the bucket to be reset.\n\t */\n\tpublic get expired(): boolean {\n\t\treturn this.remainingTime === 0;\n\t}\n\n\t/**\n\t * Whether this entry is limited or not.\n\t */\n\tpublic get limited(): boolean {\n\t\treturn this.remaining === 0 && !this.expired;\n\t}\n\n\t/**\n\t * The remaining time in milliseconds before resetting.\n\t */\n\tpublic get remainingTime(): number {\n\t\treturn Math.max(this.expires - Date.now(), 0);\n\t}\n\n\t/**\n\t * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.\n\t */\n\tpublic consume(): this {\n\t\tif (this.limited) throw new Error('Cannot consume a limited bucket');\n\t\tif (this.expired) this.reset();\n\n\t\tthis.remaining--;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry back to it's full state.\n\t */\n\tpublic reset(): this {\n\t\treturn this.resetRemaining().resetTime();\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.remaining} uses back to full state.\n\t */\n\tpublic resetRemaining(): this {\n\t\tthis.remaining = this.manager.limit;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.\n\t */\n\tpublic resetTime(): this {\n\t\tthis.expires = Date.now() + this.manager.time;\n\t\treturn this;\n\t}\n}\n","import { RateLimit } from './RateLimit';\n\nexport class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {\n\t/**\n\t * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.\n\t */\n\tpublic readonly time: number;\n\n\t/**\n\t * The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic readonly limit: number;\n\n\t/**\n\t * The interval to sweep expired {@link RateLimit ratelimits}.\n\t */\n\tprivate sweepInterval!: NodeJS.Timer | null;\n\n\t/**\n\t * @param time The amount of milliseconds for the ratelimits from this manager to expire.\n\t * @param limit The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic constructor(time: number, limit = 1) {\n\t\tsuper();\n\n\t\tthis.time = time;\n\t\tthis.limit = limit;\n\t}\n\n\t/**\n\t * Gets a {@link RateLimit} from this manager or creates it if it does not exist.\n\t * @param id The id for the {@link RateLimit}\n\t */\n\tpublic acquire(id: K): RateLimit<K> {\n\t\treturn this.get(id) ?? this.create(id);\n\t}\n\n\t/**\n\t * Creates a {@link RateLimit} for this manager.\n\t * @param id The id the {@link RateLimit} belongs to\n\t */\n\tpublic create(id: K): RateLimit<K> {\n\t\tconst value = new RateLimit(this);\n\t\tthis.set(id, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.\n\t * @param id The id the {@link RateLimit} belongs to\n\t * @param value The {@link RateLimit} to set\n\t */\n\tpublic override set(id: K, value: RateLimit<K>): this {\n\t\tthis.sweepInterval ??= setInterval(this.sweep.bind(this), RateLimitManager.sweepIntervalDuration);\n\t\treturn super.set(id, value);\n\t}\n\n\t/**\n\t * Wraps Collection's sweep method to clear the interval when this manager is empty.\n\t */\n\tpublic sweep(): void {\n\t\tfor (const [id, value] of this.entries()) {\n\t\t\tif (value.expired) this.delete(id);\n\t\t}\n\n\t\tif (this.size === 0 && this.sweepInterval !== null) {\n\t\t\tclearInterval(this.sweepInterval);\n\t\t\tthis.sweepInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.\n\t */\n\tpublic static sweepIntervalDuration = 30_000;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/RateLimit.ts","../src/lib/RateLimitManager.ts"],"names":[],"mappings":";;;;;;;;;AAEO,IAAM,YAAN,MAA4B;AAAA;AAAA;AAAA;AAAA,EAmB3B,YAAY,SAA8B;AAfjD;AAAA;AAAA;AAAA,wBAAO;AAKP;AAAA;AAAA;AAAA,wBAAO;AAKP;AAAA;AAAA;AAAA,wBAAQ;AAMP,SAAK,UAAU;AACf,SAAK,MAAM;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC7B,WAAO,KAAK,kBAAkB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC7B,WAAO,KAAK,cAAc,KAAK,CAAC,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,gBAAwB;AAClC,WAAO,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,GAAG,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACtB,QAAI,KAAK;AAAS,YAAM,IAAI,MAAM,iCAAiC;AACnE,QAAI,KAAK;AAAS,WAAK,MAAM;AAE7B,SAAK;AACL,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACpB,WAAO,KAAK,eAAe,EAAE,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAuB;AAC7B,SAAK,YAAY,KAAK,QAAQ;AAC9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,YAAkB;AACxB,SAAK,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;AACzC,WAAO;AAAA,EACR;AACD;AA9Ea;;;ACAN,IAAM,oBAAN,cAA2C,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB/D,YAAY,MAAc,QAAQ,GAAG;AAC3C,UAAM;AAjBP;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAQ;AASP,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,IAAqB;AACnC,WAAO,KAAK,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,OAAO,IAAqB;AAClC,UAAM,QAAQ,IAAI,UAAU,IAAI;AAChC,SAAK,IAAI,IAAI,KAAK;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOgB,IAAI,IAAO,OAA2B;AACrD,SAAK,kBAAL,KAAK,gBAAkB,YAAY,KAAK,MAAM,KAAK,IAAI,GAAG,kBAAiB,qBAAqB;AAChG,WAAO,MAAM,IAAI,IAAI,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,QAAc;AACpB,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,MAAM;AAAS,aAAK,OAAO,EAAE;AAAA,IAClC;AAEA,QAAI,KAAK,SAAS,KAAK,KAAK,kBAAkB,MAAM;AACnD,oBAAc,KAAK,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACtB;AAAA,EACD;AAMD;AAzEO,IAAM,mBAAN;AAAM;AAAA;AAAA;AAAA;AAwEZ,cAxEY,kBAwEE,yBAAwB","sourcesContent":["import type { RateLimitManager } from './RateLimitManager';\n\nexport class RateLimit<K = string> {\n\t/**\n\t * The remaining amount of times this entry can be dripped before the bucket is empty.\n\t */\n\tpublic remaining!: number;\n\n\t/**\n\t * The timestamp that represents when this entry will reset back to a available state.\n\t */\n\tpublic expires!: number;\n\n\t/**\n\t * The {@link RateLimitManager} this entry is for.\n\t */\n\tprivate manager: RateLimitManager<K>;\n\n\t/**\n\t * @param manager The manager for this entry.\n\t */\n\tpublic constructor(manager: RateLimitManager<K>) {\n\t\tthis.manager = manager;\n\t\tthis.reset();\n\t}\n\n\t/**\n\t * Whether this entry is expired or not, allowing the bucket to be reset.\n\t */\n\tpublic get expired(): boolean {\n\t\treturn this.remainingTime === 0;\n\t}\n\n\t/**\n\t * Whether this entry is limited or not.\n\t */\n\tpublic get limited(): boolean {\n\t\treturn this.remaining === 0 && !this.expired;\n\t}\n\n\t/**\n\t * The remaining time in milliseconds before resetting.\n\t */\n\tpublic get remainingTime(): number {\n\t\treturn Math.max(this.expires - Date.now(), 0);\n\t}\n\n\t/**\n\t * Consumes {@link RateLimit.remaining} by one if it's not limited, calling {@link RateLimit.reset} first if {@link RateLimit.expired} is true.\n\t */\n\tpublic consume(): this {\n\t\tif (this.limited) throw new Error('Cannot consume a limited bucket');\n\t\tif (this.expired) this.reset();\n\n\t\tthis.remaining--;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry back to it's full state.\n\t */\n\tpublic reset(): this {\n\t\treturn this.resetRemaining().resetTime();\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.remaining} uses back to full state.\n\t */\n\tpublic resetRemaining(): this {\n\t\tthis.remaining = this.manager.limit;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Resets the entry's {@link RateLimit.expires} to the current time plus {@link RateLimitManager.time}.\n\t */\n\tpublic resetTime(): this {\n\t\tthis.expires = Date.now() + this.manager.time;\n\t\treturn this;\n\t}\n}\n","import { RateLimit } from './RateLimit';\n\nexport class RateLimitManager<K = string> extends Map<K, RateLimit<K>> {\n\t/**\n\t * The amount of milliseconds for the {@link RateLimit ratelimits} from this manager to expire.\n\t */\n\tpublic readonly time: number;\n\n\t/**\n\t * The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic readonly limit: number;\n\n\t/**\n\t * The interval to sweep expired {@link RateLimit ratelimits}.\n\t */\n\tprivate sweepInterval!: NodeJS.Timer | null;\n\n\t/**\n\t * @param time The amount of milliseconds for the ratelimits from this manager to expire.\n\t * @param limit The amount of times a {@link RateLimit} can drip before it's limited.\n\t */\n\tpublic constructor(time: number, limit = 1) {\n\t\tsuper();\n\n\t\tthis.time = time;\n\t\tthis.limit = limit;\n\t}\n\n\t/**\n\t * Gets a {@link RateLimit} from this manager or creates it if it does not exist.\n\t * @param id The id for the {@link RateLimit}\n\t */\n\tpublic acquire(id: K): RateLimit<K> {\n\t\treturn this.get(id) ?? this.create(id);\n\t}\n\n\t/**\n\t * Creates a {@link RateLimit} for this manager.\n\t * @param id The id the {@link RateLimit} belongs to\n\t */\n\tpublic create(id: K): RateLimit<K> {\n\t\tconst value = new RateLimit(this);\n\t\tthis.set(id, value);\n\t\treturn value;\n\t}\n\n\t/**\n\t * Wraps Collection's set method to set interval to sweep inactive {@link RateLimit}s.\n\t * @param id The id the {@link RateLimit} belongs to\n\t * @param value The {@link RateLimit} to set\n\t */\n\tpublic override set(id: K, value: RateLimit<K>): this {\n\t\tthis.sweepInterval ??= setInterval(this.sweep.bind(this), RateLimitManager.sweepIntervalDuration);\n\t\treturn super.set(id, value);\n\t}\n\n\t/**\n\t * Wraps Collection's sweep method to clear the interval when this manager is empty.\n\t */\n\tpublic sweep(): void {\n\t\tfor (const [id, value] of this.entries()) {\n\t\t\tif (value.expired) this.delete(id);\n\t\t}\n\n\t\tif (this.size === 0 && this.sweepInterval !== null) {\n\t\t\tclearInterval(this.sweepInterval);\n\t\t\tthis.sweepInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * The delay in milliseconds for {@link RateLimitManager.sweepInterval}.\n\t */\n\tpublic static sweepIntervalDuration = 30_000;\n}\n"]}
File without changes