24 lines
948 B
JavaScript
24 lines
948 B
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { ipBackoff } from '../../src/auth/rate-limit.js';
|
|
|
|
test('first failure → small delay; repeated failures → exponential up to 30s', () => {
|
|
ipBackoff.reset('1.2.3.4');
|
|
assert.equal(ipBackoff.delayMs('1.2.3.4'), 0);
|
|
ipBackoff.recordFailure('1.2.3.4');
|
|
assert.equal(ipBackoff.delayMs('1.2.3.4'), 1000);
|
|
ipBackoff.recordFailure('1.2.3.4');
|
|
assert.equal(ipBackoff.delayMs('1.2.3.4'), 2000);
|
|
ipBackoff.recordFailure('1.2.3.4');
|
|
assert.equal(ipBackoff.delayMs('1.2.3.4'), 4000);
|
|
for (let i = 0; i < 10; i++) ipBackoff.recordFailure('1.2.3.4');
|
|
assert.equal(ipBackoff.delayMs('1.2.3.4'), 30000);
|
|
});
|
|
|
|
test('successful login resets the counter', () => {
|
|
ipBackoff.reset('5.6.7.8');
|
|
ipBackoff.recordFailure('5.6.7.8');
|
|
ipBackoff.recordFailure('5.6.7.8');
|
|
ipBackoff.recordSuccess('5.6.7.8');
|
|
assert.equal(ipBackoff.delayMs('5.6.7.8'), 0);
|
|
});
|