@zeitar/throttle 1.0.0 → 1.1.0
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 +17 -0
- package/dist/CompoundLimiter.d.ts +0 -1
- package/dist/CompoundLimiter.js +0 -1
- package/dist/CompoundRateLimiterFactory.d.ts +0 -1
- package/dist/CompoundRateLimiterFactory.js +0 -1
- package/dist/LimiterInterface.d.ts +0 -1
- package/dist/LimiterInterface.js +0 -1
- package/dist/LimiterStateInterface.d.ts +0 -1
- package/dist/LimiterStateInterface.js +0 -1
- package/dist/RateLimit.d.ts +0 -1
- package/dist/RateLimit.js +0 -1
- package/dist/RateLimiterFactory.d.ts +0 -1
- package/dist/RateLimiterFactory.js +0 -1
- package/dist/RateLimiterFactoryInterface.d.ts +0 -1
- package/dist/RateLimiterFactoryInterface.js +0 -1
- package/dist/Reservation.d.ts +0 -1
- package/dist/Reservation.js +0 -1
- package/dist/errors/InvalidIntervalError.d.ts +0 -1
- package/dist/errors/InvalidIntervalError.js +0 -1
- package/dist/errors/MaxWaitDurationExceededError.d.ts +0 -1
- package/dist/errors/MaxWaitDurationExceededError.js +0 -1
- package/dist/errors/RateLimitExceededError.d.ts +0 -1
- package/dist/errors/RateLimitExceededError.js +0 -1
- package/dist/errors/ReserveNotSupportedError.d.ts +0 -1
- package/dist/errors/ReserveNotSupportedError.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/policy/FixedWindowLimiter.d.ts +0 -1
- package/dist/policy/FixedWindowLimiter.js +0 -1
- package/dist/policy/NoLimiter.d.ts +0 -1
- package/dist/policy/NoLimiter.js +0 -1
- package/dist/policy/Rate.d.ts +0 -1
- package/dist/policy/Rate.js +0 -1
- package/dist/policy/SlidingWindow.d.ts +0 -1
- package/dist/policy/SlidingWindow.js +0 -1
- package/dist/policy/SlidingWindowLimiter.d.ts +0 -1
- package/dist/policy/SlidingWindowLimiter.js +0 -1
- package/dist/policy/TokenBucket.d.ts +0 -1
- package/dist/policy/TokenBucket.js +0 -1
- package/dist/policy/TokenBucketLimiter.d.ts +0 -1
- package/dist/policy/TokenBucketLimiter.js +0 -1
- package/dist/policy/Window.d.ts +0 -1
- package/dist/policy/Window.js +0 -1
- package/dist/storage/InMemoryStorage.d.ts +0 -1
- package/dist/storage/InMemoryStorage.js +0 -1
- package/dist/storage/LockInterface.d.ts +0 -1
- package/dist/storage/LockInterface.js +0 -1
- package/dist/storage/StorageInterface.d.ts +0 -1
- package/dist/storage/StorageInterface.js +0 -1
- package/dist/util/TimeUtil.d.ts +0 -1
- package/dist/util/TimeUtil.js +0 -1
- package/package.json +1 -2
- package/dist/CompoundLimiter.d.ts.map +0 -1
- package/dist/CompoundLimiter.js.map +0 -1
- package/dist/CompoundRateLimiterFactory.d.ts.map +0 -1
- package/dist/CompoundRateLimiterFactory.js.map +0 -1
- package/dist/LimiterInterface.d.ts.map +0 -1
- package/dist/LimiterInterface.js.map +0 -1
- package/dist/LimiterStateInterface.d.ts.map +0 -1
- package/dist/LimiterStateInterface.js.map +0 -1
- package/dist/RateLimit.d.ts.map +0 -1
- package/dist/RateLimit.js.map +0 -1
- package/dist/RateLimiterFactory.d.ts.map +0 -1
- package/dist/RateLimiterFactory.js.map +0 -1
- package/dist/RateLimiterFactoryInterface.d.ts.map +0 -1
- package/dist/RateLimiterFactoryInterface.js.map +0 -1
- package/dist/Reservation.d.ts.map +0 -1
- package/dist/Reservation.js.map +0 -1
- package/dist/__tests__/CompoundLimiter.test.d.ts +0 -2
- package/dist/__tests__/CompoundLimiter.test.d.ts.map +0 -1
- package/dist/__tests__/CompoundLimiter.test.js +0 -231
- package/dist/__tests__/CompoundLimiter.test.js.map +0 -1
- package/dist/__tests__/CompoundRateLimiterFactory.test.d.ts +0 -2
- package/dist/__tests__/CompoundRateLimiterFactory.test.d.ts.map +0 -1
- package/dist/__tests__/CompoundRateLimiterFactory.test.js +0 -213
- package/dist/__tests__/CompoundRateLimiterFactory.test.js.map +0 -1
- package/dist/__tests__/RateLimit.test.d.ts +0 -2
- package/dist/__tests__/RateLimit.test.d.ts.map +0 -1
- package/dist/__tests__/RateLimit.test.js +0 -108
- package/dist/__tests__/RateLimit.test.js.map +0 -1
- package/dist/__tests__/RateLimiterFactory.test.d.ts +0 -2
- package/dist/__tests__/RateLimiterFactory.test.d.ts.map +0 -1
- package/dist/__tests__/RateLimiterFactory.test.js +0 -323
- package/dist/__tests__/RateLimiterFactory.test.js.map +0 -1
- package/dist/__tests__/Reservation.test.d.ts +0 -2
- package/dist/__tests__/Reservation.test.d.ts.map +0 -1
- package/dist/__tests__/Reservation.test.js +0 -110
- package/dist/__tests__/Reservation.test.js.map +0 -1
- package/dist/errors/InvalidIntervalError.d.ts.map +0 -1
- package/dist/errors/InvalidIntervalError.js.map +0 -1
- package/dist/errors/MaxWaitDurationExceededError.d.ts.map +0 -1
- package/dist/errors/MaxWaitDurationExceededError.js.map +0 -1
- package/dist/errors/RateLimitExceededError.d.ts.map +0 -1
- package/dist/errors/RateLimitExceededError.js.map +0 -1
- package/dist/errors/ReserveNotSupportedError.d.ts.map +0 -1
- package/dist/errors/ReserveNotSupportedError.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/policy/FixedWindowLimiter.d.ts.map +0 -1
- package/dist/policy/FixedWindowLimiter.js.map +0 -1
- package/dist/policy/NoLimiter.d.ts.map +0 -1
- package/dist/policy/NoLimiter.js.map +0 -1
- package/dist/policy/Rate.d.ts.map +0 -1
- package/dist/policy/Rate.js.map +0 -1
- package/dist/policy/SlidingWindow.d.ts.map +0 -1
- package/dist/policy/SlidingWindow.js.map +0 -1
- package/dist/policy/SlidingWindowLimiter.d.ts.map +0 -1
- package/dist/policy/SlidingWindowLimiter.js.map +0 -1
- package/dist/policy/TokenBucket.d.ts.map +0 -1
- package/dist/policy/TokenBucket.js.map +0 -1
- package/dist/policy/TokenBucketLimiter.d.ts.map +0 -1
- package/dist/policy/TokenBucketLimiter.js.map +0 -1
- package/dist/policy/Window.d.ts.map +0 -1
- package/dist/policy/Window.js.map +0 -1
- package/dist/policy/__tests__/FixedWindowLimiter.test.d.ts +0 -2
- package/dist/policy/__tests__/FixedWindowLimiter.test.d.ts.map +0 -1
- package/dist/policy/__tests__/FixedWindowLimiter.test.js +0 -180
- package/dist/policy/__tests__/FixedWindowLimiter.test.js.map +0 -1
- package/dist/policy/__tests__/NoLimiter.test.d.ts +0 -2
- package/dist/policy/__tests__/NoLimiter.test.d.ts.map +0 -1
- package/dist/policy/__tests__/NoLimiter.test.js +0 -40
- package/dist/policy/__tests__/NoLimiter.test.js.map +0 -1
- package/dist/policy/__tests__/Rate.test.d.ts +0 -2
- package/dist/policy/__tests__/Rate.test.d.ts.map +0 -1
- package/dist/policy/__tests__/Rate.test.js +0 -162
- package/dist/policy/__tests__/Rate.test.js.map +0 -1
- package/dist/policy/__tests__/SlidingWindow.test.d.ts +0 -2
- package/dist/policy/__tests__/SlidingWindow.test.d.ts.map +0 -1
- package/dist/policy/__tests__/SlidingWindow.test.js +0 -257
- package/dist/policy/__tests__/SlidingWindow.test.js.map +0 -1
- package/dist/policy/__tests__/SlidingWindowLimiter.test.d.ts +0 -2
- package/dist/policy/__tests__/SlidingWindowLimiter.test.d.ts.map +0 -1
- package/dist/policy/__tests__/SlidingWindowLimiter.test.js +0 -201
- package/dist/policy/__tests__/SlidingWindowLimiter.test.js.map +0 -1
- package/dist/policy/__tests__/TokenBucket.test.d.ts +0 -2
- package/dist/policy/__tests__/TokenBucket.test.d.ts.map +0 -1
- package/dist/policy/__tests__/TokenBucket.test.js +0 -171
- package/dist/policy/__tests__/TokenBucket.test.js.map +0 -1
- package/dist/policy/__tests__/TokenBucketLimiter.test.d.ts +0 -2
- package/dist/policy/__tests__/TokenBucketLimiter.test.d.ts.map +0 -1
- package/dist/policy/__tests__/TokenBucketLimiter.test.js +0 -175
- package/dist/policy/__tests__/TokenBucketLimiter.test.js.map +0 -1
- package/dist/policy/__tests__/Window.test.d.ts +0 -2
- package/dist/policy/__tests__/Window.test.d.ts.map +0 -1
- package/dist/policy/__tests__/Window.test.js +0 -193
- package/dist/policy/__tests__/Window.test.js.map +0 -1
- package/dist/storage/InMemoryStorage.d.ts.map +0 -1
- package/dist/storage/InMemoryStorage.js.map +0 -1
- package/dist/storage/LockInterface.d.ts.map +0 -1
- package/dist/storage/LockInterface.js.map +0 -1
- package/dist/storage/StorageInterface.d.ts.map +0 -1
- package/dist/storage/StorageInterface.js.map +0 -1
- package/dist/storage/__tests__/InMemoryStorage.test.d.ts +0 -2
- package/dist/storage/__tests__/InMemoryStorage.test.d.ts.map +0 -1
- package/dist/storage/__tests__/InMemoryStorage.test.js +0 -154
- package/dist/storage/__tests__/InMemoryStorage.test.js.map +0 -1
- package/dist/util/TimeUtil.d.ts.map +0 -1
- package/dist/util/TimeUtil.js.map +0 -1
- package/dist/util/__tests__/TimeUtil.test.d.ts +0 -2
- package/dist/util/__tests__/TimeUtil.test.d.ts.map +0 -1
- package/dist/util/__tests__/TimeUtil.test.js +0 -132
- package/dist/util/__tests__/TimeUtil.test.js.map +0 -1
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const SlidingWindow_1 = require("../SlidingWindow");
|
|
4
|
-
describe('SlidingWindow', () => {
|
|
5
|
-
describe('constructor', () => {
|
|
6
|
-
it('should create a sliding window with default values', () => {
|
|
7
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60);
|
|
8
|
-
expect(window.getId()).toBe('test');
|
|
9
|
-
expect(window.getInterval()).toBe(60);
|
|
10
|
-
expect(window.getCurrentWindowHitCount()).toBe(0);
|
|
11
|
-
expect(window.getPreviousWindowHitCount()).toBe(0);
|
|
12
|
-
});
|
|
13
|
-
it('should accept custom hit counts', () => {
|
|
14
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20);
|
|
15
|
-
expect(window.getCurrentWindowHitCount()).toBe(10);
|
|
16
|
-
expect(window.getPreviousWindowHitCount()).toBe(20);
|
|
17
|
-
});
|
|
18
|
-
it('should accept custom window end time', () => {
|
|
19
|
-
const windowEndAt = 2000;
|
|
20
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, windowEndAt);
|
|
21
|
-
expect(window.getWindowEndAt()).toBe(windowEndAt);
|
|
22
|
-
});
|
|
23
|
-
it('should calculate default window end time', () => {
|
|
24
|
-
const beforeCreation = Date.now() / 1000;
|
|
25
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60);
|
|
26
|
-
const afterCreation = Date.now() / 1000;
|
|
27
|
-
const windowEndAt = window.getWindowEndAt();
|
|
28
|
-
expect(windowEndAt).toBeGreaterThanOrEqual(beforeCreation + 60);
|
|
29
|
-
expect(windowEndAt).toBeLessThanOrEqual(afterCreation + 60);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
describe('add', () => {
|
|
33
|
-
it('should add hits to current window', () => {
|
|
34
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0);
|
|
35
|
-
window.add(5);
|
|
36
|
-
expect(window.getCurrentWindowHitCount()).toBe(5);
|
|
37
|
-
window.add(3);
|
|
38
|
-
expect(window.getCurrentWindowHitCount()).toBe(8);
|
|
39
|
-
});
|
|
40
|
-
it('should not affect previous window hits', () => {
|
|
41
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20);
|
|
42
|
-
window.add(5);
|
|
43
|
-
expect(window.getCurrentWindowHitCount()).toBe(15);
|
|
44
|
-
expect(window.getPreviousWindowHitCount()).toBe(20);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
describe('getHitCount (sliding calculation)', () => {
|
|
48
|
-
it('should return current hits when at window start', () => {
|
|
49
|
-
const now = 1000;
|
|
50
|
-
const windowEndAt = now + 60;
|
|
51
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20, windowEndAt);
|
|
52
|
-
// At window start (0% into window)
|
|
53
|
-
const count = window.getHitCount(now);
|
|
54
|
-
// (20 * (1 - 0)) + 10 = 20 + 10 = 30
|
|
55
|
-
expect(count).toBe(30);
|
|
56
|
-
});
|
|
57
|
-
it('should calculate sliding count at 50% into window', () => {
|
|
58
|
-
const now = 1000;
|
|
59
|
-
const windowEndAt = now + 60;
|
|
60
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20, windowEndAt);
|
|
61
|
-
// At 50% into window
|
|
62
|
-
const count = window.getHitCount(now + 30);
|
|
63
|
-
// (20 * (1 - 0.5)) + 10 = 10 + 10 = 20
|
|
64
|
-
expect(count).toBe(20);
|
|
65
|
-
});
|
|
66
|
-
it('should return only current hits at window end', () => {
|
|
67
|
-
const now = 1000;
|
|
68
|
-
const windowEndAt = now + 60;
|
|
69
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20, windowEndAt);
|
|
70
|
-
// At window end (100% into window)
|
|
71
|
-
const count = window.getHitCount(now + 60);
|
|
72
|
-
// Past window end, returns current hits
|
|
73
|
-
expect(count).toBe(10);
|
|
74
|
-
});
|
|
75
|
-
it('should handle zero previous window hits', () => {
|
|
76
|
-
const now = 1000;
|
|
77
|
-
const windowEndAt = now + 60;
|
|
78
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 0, windowEndAt);
|
|
79
|
-
const count = window.getHitCount(now + 30);
|
|
80
|
-
// (0 * 0.5) + 10 = 10
|
|
81
|
-
expect(count).toBe(10);
|
|
82
|
-
});
|
|
83
|
-
it('should handle zero current window hits', () => {
|
|
84
|
-
const now = 1000;
|
|
85
|
-
const windowEndAt = now + 60;
|
|
86
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 20, windowEndAt);
|
|
87
|
-
const count = window.getHitCount(now + 30);
|
|
88
|
-
// (20 * 0.5) + 0 = 10
|
|
89
|
-
expect(count).toBe(10);
|
|
90
|
-
});
|
|
91
|
-
it('should floor the result', () => {
|
|
92
|
-
const now = 1000;
|
|
93
|
-
const windowEndAt = now + 60;
|
|
94
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 1, 10, windowEndAt);
|
|
95
|
-
// At 25% into window
|
|
96
|
-
const count = window.getHitCount(now + 15);
|
|
97
|
-
// (10 * 0.75) + 1 = 7.5 + 1 = 8.5, floored to 8
|
|
98
|
-
expect(count).toBe(8);
|
|
99
|
-
});
|
|
100
|
-
it('should use current time when not provided', () => {
|
|
101
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20);
|
|
102
|
-
const count = window.getHitCount();
|
|
103
|
-
expect(count).toBeGreaterThanOrEqual(0);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
describe('isExpired', () => {
|
|
107
|
-
it('should not be expired during current window', () => {
|
|
108
|
-
const now = 1000;
|
|
109
|
-
const windowEndAt = now + 60;
|
|
110
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, windowEndAt);
|
|
111
|
-
expect(window.isExpired(now + 30)).toBe(false);
|
|
112
|
-
expect(window.isExpired(now + 59)).toBe(false);
|
|
113
|
-
});
|
|
114
|
-
it('should not be expired right after window end', () => {
|
|
115
|
-
const now = 1000;
|
|
116
|
-
const windowEndAt = now + 60;
|
|
117
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, windowEndAt);
|
|
118
|
-
expect(window.isExpired(now + 60)).toBe(false);
|
|
119
|
-
expect(window.isExpired(now + 100)).toBe(false);
|
|
120
|
-
});
|
|
121
|
-
it('should be expired after window end plus interval', () => {
|
|
122
|
-
const now = 1000;
|
|
123
|
-
const windowEndAt = now + 60;
|
|
124
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, windowEndAt);
|
|
125
|
-
// Expired after windowEndAt + interval
|
|
126
|
-
expect(window.isExpired(now + 120)).toBe(true);
|
|
127
|
-
expect(window.isExpired(now + 130)).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
it('should use current time when not provided', () => {
|
|
130
|
-
const futureWindowEndAt = (Date.now() / 1000) + 1000;
|
|
131
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, futureWindowEndAt);
|
|
132
|
-
expect(window.isExpired()).toBe(false);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
describe('createFromPreviousWindow', () => {
|
|
136
|
-
it('should create new window with previous hits preserved', () => {
|
|
137
|
-
const now = 1000;
|
|
138
|
-
const oldWindow = new SlidingWindow_1.SlidingWindow('test', 60, 50, 30, now + 60);
|
|
139
|
-
const newWindow = SlidingWindow_1.SlidingWindow.createFromPreviousWindow('test', 60, oldWindow, now + 70);
|
|
140
|
-
expect(newWindow.getCurrentWindowHitCount()).toBe(0);
|
|
141
|
-
expect(newWindow.getPreviousWindowHitCount()).toBe(50); // Old current becomes new previous
|
|
142
|
-
expect(newWindow.getWindowEndAt()).toBe(now + 70 + 60);
|
|
143
|
-
});
|
|
144
|
-
it('should set correct window end time', () => {
|
|
145
|
-
const now = 2000;
|
|
146
|
-
const oldWindow = new SlidingWindow_1.SlidingWindow('test', 120, 25, 10, now);
|
|
147
|
-
const newWindow = SlidingWindow_1.SlidingWindow.createFromPreviousWindow('test', 120, oldWindow, now);
|
|
148
|
-
expect(newWindow.getWindowEndAt()).toBe(now + 120);
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
describe('calculateTimeForTokens', () => {
|
|
152
|
-
it('should return 0 when tokens are available', () => {
|
|
153
|
-
const now = 1000;
|
|
154
|
-
const windowEndAt = now + 60;
|
|
155
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 0, windowEndAt);
|
|
156
|
-
// maxSize 100, used 10, have 90 available, need 50
|
|
157
|
-
expect(window.calculateTimeForTokens(100, 50, now + 30)).toBe(0);
|
|
158
|
-
});
|
|
159
|
-
it('should calculate wait time when tokens not available', () => {
|
|
160
|
-
const now = 1000;
|
|
161
|
-
const windowEndAt = now + 60;
|
|
162
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 90, 20, windowEndAt);
|
|
163
|
-
// At 50% into window: (20 * 0.5) + 90 = 100 used
|
|
164
|
-
// maxSize 100, all used, need to wait for window end
|
|
165
|
-
const waitTime = window.calculateTimeForTokens(100, 10, now + 30);
|
|
166
|
-
expect(waitTime).toBe(30); // 30 seconds until window ends
|
|
167
|
-
});
|
|
168
|
-
it('should handle exact availability', () => {
|
|
169
|
-
const now = 1000;
|
|
170
|
-
const windowEndAt = now + 60;
|
|
171
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 50, 0, windowEndAt);
|
|
172
|
-
// maxSize 100, used 50, have exactly 50 available
|
|
173
|
-
expect(window.calculateTimeForTokens(100, 50, now)).toBe(0);
|
|
174
|
-
});
|
|
175
|
-
it('should use current time when not provided', () => {
|
|
176
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 90, 0);
|
|
177
|
-
const waitTime = window.calculateTimeForTokens(100, 50);
|
|
178
|
-
expect(waitTime).toBeGreaterThanOrEqual(0);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
describe('getExpirationTime', () => {
|
|
182
|
-
it('should calculate expiration as window end plus interval', () => {
|
|
183
|
-
const windowEndAt = 1000;
|
|
184
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, windowEndAt);
|
|
185
|
-
expect(window.getExpirationTime()).toBe(1060); // ceil(1000 + 60)
|
|
186
|
-
});
|
|
187
|
-
it('should round up expiration time', () => {
|
|
188
|
-
const windowEndAt = 1000.5;
|
|
189
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 0, 0, windowEndAt);
|
|
190
|
-
expect(window.getExpirationTime()).toBe(1061); // ceil(1000.5 + 60)
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
describe('toJSON and fromJSON', () => {
|
|
194
|
-
it('should serialize to JSON', () => {
|
|
195
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 10, 20, 2000);
|
|
196
|
-
const json = window.toJSON();
|
|
197
|
-
expect(json).toEqual({
|
|
198
|
-
id: 'test',
|
|
199
|
-
hitCount: 10,
|
|
200
|
-
hitCountForLastWindow: 20,
|
|
201
|
-
windowEndAt: 2000,
|
|
202
|
-
intervalInSeconds: 60,
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
it('should deserialize from JSON', () => {
|
|
206
|
-
const json = {
|
|
207
|
-
id: 'test-window',
|
|
208
|
-
hitCount: 15,
|
|
209
|
-
hitCountForLastWindow: 25,
|
|
210
|
-
windowEndAt: 3000,
|
|
211
|
-
intervalInSeconds: 120,
|
|
212
|
-
};
|
|
213
|
-
const window = SlidingWindow_1.SlidingWindow.fromJSON(json);
|
|
214
|
-
expect(window.getId()).toBe('test-window');
|
|
215
|
-
expect(window.getCurrentWindowHitCount()).toBe(15);
|
|
216
|
-
expect(window.getPreviousWindowHitCount()).toBe(25);
|
|
217
|
-
expect(window.getWindowEndAt()).toBe(3000);
|
|
218
|
-
expect(window.getInterval()).toBe(120);
|
|
219
|
-
});
|
|
220
|
-
it('should round-trip serialize/deserialize', () => {
|
|
221
|
-
const window = new SlidingWindow_1.SlidingWindow('round-trip', 300, 100, 200, 5000);
|
|
222
|
-
const json = window.toJSON();
|
|
223
|
-
const restored = SlidingWindow_1.SlidingWindow.fromJSON(json);
|
|
224
|
-
expect(restored.getId()).toBe(window.getId());
|
|
225
|
-
expect(restored.getCurrentWindowHitCount()).toBe(window.getCurrentWindowHitCount());
|
|
226
|
-
expect(restored.getPreviousWindowHitCount()).toBe(window.getPreviousWindowHitCount());
|
|
227
|
-
expect(restored.getWindowEndAt()).toBe(window.getWindowEndAt());
|
|
228
|
-
expect(restored.getInterval()).toBe(window.getInterval());
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
describe('edge cases', () => {
|
|
232
|
-
it('should handle interval of 1 second', () => {
|
|
233
|
-
const now = 1000;
|
|
234
|
-
const windowEndAt = now + 1;
|
|
235
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 1, 5, 10, windowEndAt);
|
|
236
|
-
const count = window.getHitCount(now + 0.5);
|
|
237
|
-
// (10 * 0.5) + 5 = 10
|
|
238
|
-
expect(count).toBe(10);
|
|
239
|
-
});
|
|
240
|
-
it('should handle very large intervals', () => {
|
|
241
|
-
const now = 1000;
|
|
242
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 86400, 100, 200, now + 86400);
|
|
243
|
-
const count = window.getHitCount(now + 43200); // 50% into day
|
|
244
|
-
// (200 * 0.5) + 100 = 200
|
|
245
|
-
expect(count).toBe(200);
|
|
246
|
-
});
|
|
247
|
-
it('should handle time past window end', () => {
|
|
248
|
-
const now = 1000;
|
|
249
|
-
const windowEndAt = now + 60;
|
|
250
|
-
const window = new SlidingWindow_1.SlidingWindow('test', 60, 50, 30, windowEndAt);
|
|
251
|
-
// Past window end
|
|
252
|
-
const count = window.getHitCount(now + 100);
|
|
253
|
-
expect(count).toBe(50); // Just current window hits
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
//# sourceMappingURL=SlidingWindow.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SlidingWindow.test.js","sourceRoot":"","sources":["../../../src/policy/__tests__/SlidingWindow.test.ts"],"names":[],"mappings":";;AAAA,oDAAiD;AAEjD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE7C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAErD,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAExC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACnB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAErD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAElE,mCAAmC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACtC,qCAAqC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAElE,qBAAqB;YACrB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3C,uCAAuC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAElE,mCAAmC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3C,wCAAwC;YACxC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEjE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3C,sBAAsB;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAEjE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3C,sBAAsB;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAEjE,qBAAqB;YACrB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YAC3C,gDAAgD;YAChD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAErD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhE,uCAAuC;YACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,iBAAiB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAEtE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,SAAS,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAElE,MAAM,SAAS,GAAG,6BAAa,CAAC,wBAAwB,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAE1F,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,SAAS,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,mCAAmC;YAC3F,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,SAAS,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAE9D,MAAM,SAAS,GAAG,6BAAa,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YAEtF,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEjE,mDAAmD;YACnD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAElE,iDAAiD;YACjD,qDAAqD;YACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,+BAA+B;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEjE,kDAAkD;YAClD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,WAAW,GAAG,MAAM,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YAE3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;gBACnB,EAAE,EAAE,MAAM;gBACV,QAAQ,EAAE,EAAE;gBACZ,qBAAqB,EAAE,EAAE;gBACzB,WAAW,EAAE,IAAI;gBACjB,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,IAAI,GAAG;gBACX,EAAE,EAAE,aAAa;gBACjB,QAAQ,EAAE,EAAE;gBACZ,qBAAqB,EAAE,EAAE;gBACzB,WAAW,EAAE,IAAI;gBACjB,iBAAiB,EAAE,GAAG;aACvB,CAAC;YAEF,MAAM,MAAM,GAAG,6BAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAEpE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,6BAAa,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC;YAErD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,QAAQ,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,CAAC;YACtF,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAEhE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YAC5C,sBAAsB;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;YAEvE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe;YAC9D,0BAA0B;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YAElE,kBAAkB;YAClB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SlidingWindowLimiter.test.d.ts","sourceRoot":"","sources":["../../../src/policy/__tests__/SlidingWindowLimiter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const SlidingWindowLimiter_1 = require("../SlidingWindowLimiter");
|
|
4
|
-
const InMemoryStorage_1 = require("../../storage/InMemoryStorage");
|
|
5
|
-
const MaxWaitDurationExceededError_1 = require("../../errors/MaxWaitDurationExceededError");
|
|
6
|
-
describe('SlidingWindowLimiter', () => {
|
|
7
|
-
let storage;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
storage = new InMemoryStorage_1.InMemoryStorage();
|
|
10
|
-
});
|
|
11
|
-
describe('consume', () => {
|
|
12
|
-
it('should accept requests within limit', async () => {
|
|
13
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
14
|
-
const result = await limiter.consume(5);
|
|
15
|
-
expect(result.isAccepted()).toBe(true);
|
|
16
|
-
expect(result.getRemainingTokens()).toBe(5);
|
|
17
|
-
expect(result.getLimit()).toBe(10);
|
|
18
|
-
});
|
|
19
|
-
it('should reject requests when limit exceeded', async () => {
|
|
20
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
21
|
-
await limiter.consume(10);
|
|
22
|
-
const result = await limiter.consume(1);
|
|
23
|
-
expect(result.isAccepted()).toBe(false);
|
|
24
|
-
expect(result.getRemainingTokens()).toBe(0);
|
|
25
|
-
});
|
|
26
|
-
it('should track hits within window', async () => {
|
|
27
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
28
|
-
const r1 = await limiter.consume(3);
|
|
29
|
-
const r2 = await limiter.consume(2);
|
|
30
|
-
const r3 = await limiter.consume(4);
|
|
31
|
-
expect(r1.getRemainingTokens()).toBe(7);
|
|
32
|
-
expect(r2.getRemainingTokens()).toBe(5);
|
|
33
|
-
expect(r3.getRemainingTokens()).toBe(1);
|
|
34
|
-
});
|
|
35
|
-
it('should smooth requests across window boundaries', async () => {
|
|
36
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
37
|
-
// Use up the limit
|
|
38
|
-
await limiter.consume(10);
|
|
39
|
-
// Should be rate limited now
|
|
40
|
-
const result = await limiter.consume(1);
|
|
41
|
-
expect(result.isAccepted()).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
it('should provide retry time when rate limited', async () => {
|
|
44
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
45
|
-
await limiter.consume(10);
|
|
46
|
-
const result = await limiter.consume(1);
|
|
47
|
-
expect(result.isAccepted()).toBe(false);
|
|
48
|
-
expect(result.getRetryAfter().getTime()).toBeGreaterThan(Date.now());
|
|
49
|
-
});
|
|
50
|
-
it('should transition to new window correctly', async () => {
|
|
51
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
52
|
-
// Use some tokens
|
|
53
|
-
await limiter.consume(8);
|
|
54
|
-
// Should still have tokens available
|
|
55
|
-
const result = await limiter.consume(1);
|
|
56
|
-
expect(result.isAccepted()).toBe(true);
|
|
57
|
-
expect(result.getRemainingTokens()).toBe(1);
|
|
58
|
-
});
|
|
59
|
-
it('should create fresh window when expired', async () => {
|
|
60
|
-
jest.useFakeTimers();
|
|
61
|
-
const now = 1000;
|
|
62
|
-
jest.setSystemTime(now * 1000);
|
|
63
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
64
|
-
await limiter.consume(10);
|
|
65
|
-
// Move past expiration (window end + interval)
|
|
66
|
-
jest.setSystemTime((now + 130) * 1000);
|
|
67
|
-
const result = await limiter.consume(10);
|
|
68
|
-
expect(result.isAccepted()).toBe(true);
|
|
69
|
-
expect(result.getRemainingTokens()).toBe(0);
|
|
70
|
-
jest.useRealTimers();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
describe('reserve', () => {
|
|
74
|
-
it('should reserve tokens when available', async () => {
|
|
75
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
76
|
-
const reservation = await limiter.reserve(5);
|
|
77
|
-
expect(reservation.getWaitDuration()).toBe(0);
|
|
78
|
-
expect(reservation.getRateLimit().isAccepted()).toBe(true);
|
|
79
|
-
expect(reservation.getRateLimit().getRemainingTokens()).toBe(5);
|
|
80
|
-
});
|
|
81
|
-
it('should calculate wait time when tokens not available', async () => {
|
|
82
|
-
jest.useFakeTimers();
|
|
83
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
84
|
-
await limiter.consume(10);
|
|
85
|
-
const reservation = await limiter.reserve(5);
|
|
86
|
-
expect(reservation.getWaitDuration()).toBeGreaterThan(0);
|
|
87
|
-
expect(reservation.getRateLimit().isAccepted()).toBe(true);
|
|
88
|
-
jest.useRealTimers();
|
|
89
|
-
});
|
|
90
|
-
it('should throw error when exceeding maxTime', async () => {
|
|
91
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
92
|
-
await limiter.consume(10);
|
|
93
|
-
await expect(limiter.reserve(5, 1)).rejects.toThrow(MaxWaitDurationExceededError_1.MaxWaitDurationExceededError);
|
|
94
|
-
});
|
|
95
|
-
it('should throw error when requesting more than limit', async () => {
|
|
96
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
97
|
-
await expect(limiter.reserve(15)).rejects.toThrow('Cannot reserve 15 tokens, limit is 10');
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
describe('reset', () => {
|
|
101
|
-
it('should reset the limiter state', async () => {
|
|
102
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
103
|
-
await limiter.consume(10);
|
|
104
|
-
await limiter.reset();
|
|
105
|
-
const result = await limiter.consume(10);
|
|
106
|
-
expect(result.isAccepted()).toBe(true);
|
|
107
|
-
});
|
|
108
|
-
it('should start fresh after reset', async () => {
|
|
109
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
110
|
-
await limiter.consume(5);
|
|
111
|
-
await limiter.reset();
|
|
112
|
-
const result = await limiter.consume(1);
|
|
113
|
-
expect(result.getRemainingTokens()).toBe(9);
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
describe('multiple limiters', () => {
|
|
117
|
-
it('should maintain separate state for different IDs', async () => {
|
|
118
|
-
const limiter1 = new SlidingWindowLimiter_1.SlidingWindowLimiter('user1', 10, 60, storage);
|
|
119
|
-
const limiter2 = new SlidingWindowLimiter_1.SlidingWindowLimiter('user2', 10, 60, storage);
|
|
120
|
-
await limiter1.consume(8);
|
|
121
|
-
await limiter2.consume(3);
|
|
122
|
-
const r1 = await limiter1.consume(1);
|
|
123
|
-
const r2 = await limiter2.consume(1);
|
|
124
|
-
expect(r1.getRemainingTokens()).toBe(1);
|
|
125
|
-
expect(r2.getRemainingTokens()).toBe(6);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
describe('sliding window behavior', () => {
|
|
129
|
-
it('should smoothly distribute capacity across windows', async () => {
|
|
130
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 100, 60, storage);
|
|
131
|
-
// Fill partial window
|
|
132
|
-
await limiter.consume(50);
|
|
133
|
-
// Should still have capacity
|
|
134
|
-
const result = await limiter.consume(20);
|
|
135
|
-
expect(result.isAccepted()).toBe(true);
|
|
136
|
-
expect(result.getRemainingTokens()).toBe(30);
|
|
137
|
-
});
|
|
138
|
-
it('should prevent bursts at window boundaries', async () => {
|
|
139
|
-
jest.useFakeTimers();
|
|
140
|
-
const now = 1000;
|
|
141
|
-
jest.setSystemTime(now * 1000);
|
|
142
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
143
|
-
// Use 10 tokens
|
|
144
|
-
await limiter.consume(10);
|
|
145
|
-
// Just after window end (1 second into new window)
|
|
146
|
-
jest.setSystemTime((now + 61) * 1000);
|
|
147
|
-
// Previous: 10 * (1 - 1/60) ≈ 9.83, Current: 0
|
|
148
|
-
// Available: ~0
|
|
149
|
-
const result = await limiter.consume(5);
|
|
150
|
-
expect(result.isAccepted()).toBe(false);
|
|
151
|
-
jest.useRealTimers();
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
describe('edge cases', () => {
|
|
155
|
-
it('should handle limit of 1', async () => {
|
|
156
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 1, 60, storage);
|
|
157
|
-
const r1 = await limiter.consume(1);
|
|
158
|
-
const r2 = await limiter.consume(1);
|
|
159
|
-
expect(r1.isAccepted()).toBe(true);
|
|
160
|
-
expect(r2.isAccepted()).toBe(false);
|
|
161
|
-
});
|
|
162
|
-
it('should handle small intervals', async () => {
|
|
163
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 1, storage);
|
|
164
|
-
await limiter.consume(5);
|
|
165
|
-
const result = await limiter.consume(3);
|
|
166
|
-
expect(result.isAccepted()).toBe(true);
|
|
167
|
-
expect(result.getRemainingTokens()).toBe(2);
|
|
168
|
-
});
|
|
169
|
-
it('should handle default parameters', async () => {
|
|
170
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
171
|
-
const result = await limiter.consume(); // Default 1 token
|
|
172
|
-
expect(result.isAccepted()).toBe(true);
|
|
173
|
-
expect(result.getRemainingTokens()).toBe(9);
|
|
174
|
-
});
|
|
175
|
-
it('should handle very large intervals', async () => {
|
|
176
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 1000, 86400, storage); // 1 day
|
|
177
|
-
await limiter.consume(500);
|
|
178
|
-
const result = await limiter.consume(400);
|
|
179
|
-
expect(result.isAccepted()).toBe(true);
|
|
180
|
-
expect(result.getRemainingTokens()).toBe(100);
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
describe('window state transitions', () => {
|
|
184
|
-
it('should handle multiple window transitions', async () => {
|
|
185
|
-
jest.useFakeTimers();
|
|
186
|
-
const now = 1000;
|
|
187
|
-
jest.setSystemTime(now * 1000);
|
|
188
|
-
const limiter = new SlidingWindowLimiter_1.SlidingWindowLimiter('test', 10, 60, storage);
|
|
189
|
-
await limiter.consume(5);
|
|
190
|
-
// First transition
|
|
191
|
-
jest.setSystemTime((now + 70) * 1000);
|
|
192
|
-
await limiter.consume(3);
|
|
193
|
-
// Second transition
|
|
194
|
-
jest.setSystemTime((now + 140) * 1000);
|
|
195
|
-
const result = await limiter.consume(2);
|
|
196
|
-
expect(result.isAccepted()).toBe(true);
|
|
197
|
-
jest.useRealTimers();
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
//# sourceMappingURL=SlidingWindowLimiter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SlidingWindowLimiter.test.js","sourceRoot":"","sources":["../../../src/policy/__tests__/SlidingWindowLimiter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TokenBucket.test.d.ts","sourceRoot":"","sources":["../../../src/policy/__tests__/TokenBucket.test.ts"],"names":[],"mappings":""}
|