redis-sliding-rate-limiter
Version:
Flexible and performant rate limiter based on sliding window algorithm with arbitrary precision
103 lines (102 loc) • 4.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertWindowUnitToSubdivision = exports.MicrosecondsToWindowSubdivision = exports.WindowUnitToMilliseconds = exports.Unit = void 0;
var Unit;
(function (Unit) {
Unit[Unit["MILLISECOND"] = -3] = "MILLISECOND";
Unit[Unit["CENTISECOND"] = -2] = "CENTISECOND";
Unit[Unit["DECISECOND"] = -1] = "DECISECOND";
Unit[Unit["SECOND"] = 0] = "SECOND";
Unit[Unit["MINUTE"] = 1] = "MINUTE";
Unit[Unit["HOUR"] = 2] = "HOUR";
Unit[Unit["DAY"] = 3] = "DAY";
Unit[Unit["WEEK"] = 4] = "WEEK";
Unit[Unit["MONTH"] = 5] = "MONTH";
Unit[Unit["YEAR"] = 6] = "YEAR";
})(Unit || (exports.Unit = Unit = {}));
exports.WindowUnitToMilliseconds = {
[Unit.MILLISECOND]: 1,
[Unit.CENTISECOND]: 10,
[Unit.DECISECOND]: 100,
[Unit.SECOND]: 1000,
[Unit.MINUTE]: 1000 * 60,
[Unit.HOUR]: 1000 * 60 * 60,
[Unit.DAY]: 1000 * 60 * 60 * 24,
[Unit.WEEK]: 1000 * 60 * 60 * 24 * 7,
[Unit.MONTH]: 1000 * 60 * 60 * 24 * 30,
[Unit.YEAR]: 1000 * 60 * 60 * 24 * 365,
};
exports.MicrosecondsToWindowSubdivision = {
[Unit.MILLISECOND]: 1 / 1000,
[Unit.CENTISECOND]: 1 / 10000,
[Unit.DECISECOND]: 1 / 100000,
[Unit.SECOND]: 1 / 1000000,
[Unit.MINUTE]: 1 / (1000000 * 60),
[Unit.HOUR]: 1 / (1000000 * 60 * 60),
[Unit.DAY]: 1 / (1000000 * 60 * 60 * 24),
[Unit.WEEK]: 1 / (1000000 * 60 * 60 * 24 * 7),
[Unit.MONTH]: 1 / (1000000 * 60 * 60 * 24 * 30),
[Unit.YEAR]: 1 / (1000000 * 60 * 60 * 365),
};
const WindowUnitToSubdivision = {
[`${Unit.MILLISECOND}:${Unit.MILLISECOND}`]: 1,
[`${Unit.CENTISECOND}:${Unit.CENTISECOND}`]: 1,
[`${Unit.CENTISECOND}:${Unit.MILLISECOND}`]: 10,
[`${Unit.DECISECOND}:${Unit.DECISECOND}`]: 1,
[`${Unit.DECISECOND}:${Unit.CENTISECOND}`]: 10,
[`${Unit.DECISECOND}:${Unit.MILLISECOND}`]: 100,
[`${Unit.SECOND}:${Unit.SECOND}`]: 1,
[`${Unit.SECOND}:${Unit.DECISECOND}`]: 10,
[`${Unit.SECOND}:${Unit.CENTISECOND}`]: 100,
[`${Unit.SECOND}:${Unit.MILLISECOND}`]: 1000,
[`${Unit.MINUTE}:${Unit.MINUTE}`]: 1,
[`${Unit.MINUTE}:${Unit.SECOND}`]: 60,
[`${Unit.MINUTE}:${Unit.DECISECOND}`]: 60 * 10,
[`${Unit.MINUTE}:${Unit.CENTISECOND}`]: 60 * 100,
[`${Unit.MINUTE}:${Unit.MILLISECOND}`]: 60 * 1000,
[`${Unit.HOUR}:${Unit.HOUR}`]: 1,
[`${Unit.HOUR}:${Unit.MINUTE}`]: 60,
[`${Unit.HOUR}:${Unit.SECOND}`]: 60 * 60,
[`${Unit.HOUR}:${Unit.DECISECOND}`]: 60 * 60 * 10,
[`${Unit.HOUR}:${Unit.CENTISECOND}`]: 60 * 60 * 100,
[`${Unit.HOUR}:${Unit.MILLISECOND}`]: 60 * 60 * 1000,
[`${Unit.DAY}:${Unit.DAY}`]: 1,
[`${Unit.DAY}:${Unit.HOUR}`]: 24,
[`${Unit.DAY}:${Unit.MINUTE}`]: 24 * 60,
[`${Unit.DAY}:${Unit.SECOND}`]: 24 * 60 * 60,
[`${Unit.DAY}:${Unit.DECISECOND}`]: 24 * 60 * 60 * 10,
[`${Unit.DAY}:${Unit.CENTISECOND}`]: 24 * 60 * 60 * 100,
[`${Unit.DAY}:${Unit.MILLISECOND}`]: 24 * 60 * 60 * 1000,
[`${Unit.WEEK}:${Unit.WEEK}`]: 1,
[`${Unit.WEEK}:${Unit.DAY}`]: 7,
[`${Unit.WEEK}:${Unit.HOUR}`]: 7 * 24,
[`${Unit.WEEK}:${Unit.MINUTE}`]: 7 * 24 * 60,
[`${Unit.WEEK}:${Unit.SECOND}`]: 7 * 24 * 60 * 60,
[`${Unit.WEEK}:${Unit.DECISECOND}`]: 7 * 24 * 60 * 60 * 10,
[`${Unit.WEEK}:${Unit.CENTISECOND}`]: 7 * 24 * 60 * 60 * 100,
[`${Unit.WEEK}:${Unit.MILLISECOND}`]: 7 * 24 * 60 * 60 * 1000,
[`${Unit.MONTH}:${Unit.MONTH}`]: 1,
[`${Unit.MONTH}:${Unit.WEEK}`]: 4,
[`${Unit.MONTH}:${Unit.DAY}`]: 30,
[`${Unit.MONTH}:${Unit.HOUR}`]: 30 * 24,
[`${Unit.MONTH}:${Unit.MINUTE}`]: 30 * 24 * 60,
[`${Unit.MONTH}:${Unit.SECOND}`]: 30 * 24 * 60 * 60,
[`${Unit.MONTH}:${Unit.DECISECOND}`]: 30 * 24 * 60 * 60 * 10,
[`${Unit.MONTH}:${Unit.CENTISECOND}`]: 30 * 24 * 60 * 60 * 100,
[`${Unit.MONTH}:${Unit.MILLISECOND}`]: 30 * 24 * 60 * 60 * 1000,
[`${Unit.YEAR}:${Unit.YEAR}`]: 1,
[`${Unit.YEAR}:${Unit.MONTH}`]: 12,
[`${Unit.YEAR}:${Unit.WEEK}`]: 52,
[`${Unit.YEAR}:${Unit.DAY}`]: 365,
[`${Unit.YEAR}:${Unit.HOUR}`]: 365 * 24,
[`${Unit.YEAR}:${Unit.MINUTE}`]: 365 * 24 * 60,
[`${Unit.YEAR}:${Unit.SECOND}`]: 365 * 24 * 60 * 60,
[`${Unit.YEAR}:${Unit.DECISECOND}`]: 365 * 24 * 60 * 60 * 10,
[`${Unit.YEAR}:${Unit.CENTISECOND}`]: 365 * 24 * 60 * 60 * 100,
[`${Unit.YEAR}:${Unit.MILLISECOND}`]: 365 * 24 * 60 * 60 * 1000,
};
const convertWindowUnitToSubdivision = (windowUnit, subdivision) => {
// @ts-ignore
return WindowUnitToSubdivision[`${windowUnit}:${subdivision}`];
};
exports.convertWindowUnitToSubdivision = convertWindowUnitToSubdivision;