28 lines
741 B
JavaScript
28 lines
741 B
JavaScript
'use strict';
|
|
|
|
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
|
|
class PoliteGate {
|
|
constructor({ minMs = 8000, maxMs = 15000 } = {}) {
|
|
if (!Number.isFinite(minMs) || !Number.isFinite(maxMs) || minMs < 0 || maxMs < minMs) {
|
|
throw new Error('Invalid delay range');
|
|
}
|
|
this.minMs = minMs;
|
|
this.maxMs = maxMs;
|
|
this.lastRequestAt = 0;
|
|
}
|
|
|
|
async wait() {
|
|
if (!this.lastRequestAt) return;
|
|
const target = this.minMs + Math.floor(Math.random() * (this.maxMs - this.minMs + 1));
|
|
const remaining = target - (Date.now() - this.lastRequestAt);
|
|
if (remaining > 0) await sleep(remaining);
|
|
}
|
|
|
|
mark() {
|
|
this.lastRequestAt = Date.now();
|
|
}
|
|
}
|
|
|
|
module.exports = { PoliteGate, sleep };
|