Files

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 };