@yveskaufmann/koa2-ratelimit
Version:
IP rate-limiting middleware for Koajs 2. Use to limit repeated requests to APIs and/or endpoints such as password reset.
62 lines • 2.28 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MemoryStore = void 0;
const Store_1 = require("./Store");
const Time_1 = require("../Time");
class MemoryStore extends Store_1.Store {
static cleanAll() {
MemoryStore.Hits = {};
}
_getHit(key, options) {
if (!MemoryStore.Hits[key]) {
MemoryStore.Hits[key] = {
counter: 0,
dateEnd: Date.now() + Time_1.Time.toMs(options.interval),
};
}
return MemoryStore.Hits[key];
}
_resetAll() {
const now = Date.now();
for (const key in MemoryStore.Hits) {
// eslint-disable-line
this._resetKey(key, now);
}
}
_resetKey(key, now) {
now = now || Date.now();
if (MemoryStore.Hits[key] && MemoryStore.Hits[key].dateEnd <= now) {
delete MemoryStore.Hits[key];
}
}
incr(key, options, weight) {
return __awaiter(this, void 0, void 0, function* () {
this._resetAll();
const hits = this._getHit(key, options);
hits.counter += weight;
return {
counter: hits.counter,
dateEnd: hits.dateEnd,
};
});
}
decrement(key, options, weight) {
return __awaiter(this, void 0, void 0, function* () {
const hits = this._getHit(key);
hits.counter -= weight;
});
}
saveAbuse() { }
}
exports.MemoryStore = MemoryStore;
MemoryStore.Hits = {};
//# sourceMappingURL=MemoryStore.js.map