Socket
Socket
Sign inDemoInstall

@nestjs/throttler

Package Overview
Dependencies
Maintainers
2
Versions
25
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nestjs/throttler - npm Package Compare versions

Comparing version 2.0.0 to 2.0.1

CHANGELOG.md

73

dist/index.js

@@ -1,47 +0,28 @@

'use strict';
var __createBinding =
(this && this.__createBinding) ||
(Object.create
? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
},
});
}
: function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __exportStar =
(this && this.__exportStar) ||
function (m, exports) {
for (var p in m)
if (p !== 'default' && !Object.prototype.hasOwnProperty.call(exports, p))
__createBinding(exports, m, p);
};
Object.defineProperty(exports, '__esModule', { value: true });
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStorageToken = exports.getOptionsToken = void 0;
__exportStar(require('./throttler-module-options.interface'), exports);
__exportStar(require('./throttler-storage.interface'), exports);
__exportStar(require('./throttler.decorator'), exports);
__exportStar(require('./throttler.exception'), exports);
__exportStar(require('./throttler.guard'), exports);
__exportStar(require('./throttler.module'), exports);
var throttler_providers_1 = require('./throttler.providers');
Object.defineProperty(exports, 'getOptionsToken', {
enumerable: true,
get: function () {
return throttler_providers_1.getOptionsToken;
},
});
Object.defineProperty(exports, 'getStorageToken', {
enumerable: true,
get: function () {
return throttler_providers_1.getStorageToken;
},
});
__exportStar(require('./throttler.service'), exports);
//# sourceMappingURL=index.js.map
__exportStar(require("./throttler-module-options.interface"), exports);
__exportStar(require("./throttler-storage.interface"), exports);
__exportStar(require("./throttler.decorator"), exports);
__exportStar(require("./throttler.exception"), exports);
__exportStar(require("./throttler.guard"), exports);
__exportStar(require("./throttler.module"), exports);
var throttler_providers_1 = require("./throttler.providers");
Object.defineProperty(exports, "getOptionsToken", { enumerable: true, get: function () { return throttler_providers_1.getOptionsToken; } });
Object.defineProperty(exports, "getStorageToken", { enumerable: true, get: function () { return throttler_providers_1.getStorageToken; } });
__exportStar(require("./throttler.service"), exports);
//# sourceMappingURL=index.js.map

@@ -1,3 +0,3 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
//# sourceMappingURL=throttler-module-options.interface.js.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=throttler-module-options.interface.js.map

@@ -1,5 +0,5 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThrottlerStorage = void 0;
exports.ThrottlerStorage = Symbol('ThrottlerStorage');
//# sourceMappingURL=throttler-storage.interface.js.map
//# sourceMappingURL=throttler-storage.interface.js.map

@@ -1,8 +0,4 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.THROTTLER_SKIP =
exports.THROTTLER_OPTIONS =
exports.THROTTLER_TTL =
exports.THROTTLER_LIMIT =
void 0;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.THROTTLER_SKIP = exports.THROTTLER_OPTIONS = exports.THROTTLER_TTL = exports.THROTTLER_LIMIT = void 0;
exports.THROTTLER_LIMIT = 'THROTTLER:LIMIT';

@@ -12,2 +8,2 @@ exports.THROTTLER_TTL = 'THROTTLER:TTL';

exports.THROTTLER_SKIP = 'THROTTLER:SKIP';
//# sourceMappingURL=throttler.constants.js.map
//# sourceMappingURL=throttler.constants.js.map

@@ -1,41 +0,37 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.InjectThrottlerStorage =
exports.InjectThrottlerOptions =
exports.SkipThrottle =
exports.Throttle =
void 0;
const common_1 = require('@nestjs/common');
const throttler_constants_1 = require('./throttler.constants');
const throttler_providers_1 = require('./throttler.providers');
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.InjectThrottlerStorage = exports.InjectThrottlerOptions = exports.SkipThrottle = exports.Throttle = void 0;
const common_1 = require("@nestjs/common");
const throttler_constants_1 = require("./throttler.constants");
const throttler_providers_1 = require("./throttler.providers");
function setThrottlerMetadata(target, limit, ttl) {
Reflect.defineMetadata(throttler_constants_1.THROTTLER_TTL, ttl, target);
Reflect.defineMetadata(throttler_constants_1.THROTTLER_LIMIT, limit, target);
Reflect.defineMetadata(throttler_constants_1.THROTTLER_TTL, ttl, target);
Reflect.defineMetadata(throttler_constants_1.THROTTLER_LIMIT, limit, target);
}
const Throttle = (limit = 20, ttl = 60) => {
return (target, propertyKey, descriptor) => {
if (descriptor) {
setThrottlerMetadata(descriptor.value, limit, ttl);
return descriptor;
}
setThrottlerMetadata(target, limit, ttl);
return target;
};
return (target, propertyKey, descriptor) => {
if (descriptor) {
setThrottlerMetadata(descriptor.value, limit, ttl);
return descriptor;
}
setThrottlerMetadata(target, limit, ttl);
return target;
};
};
exports.Throttle = Throttle;
const SkipThrottle = (skip = true) => {
return (target, propertyKey, descriptor) => {
if (descriptor) {
Reflect.defineMetadata(throttler_constants_1.THROTTLER_SKIP, skip, descriptor.value);
return descriptor;
}
Reflect.defineMetadata(throttler_constants_1.THROTTLER_SKIP, skip, target);
return target;
};
return (target, propertyKey, descriptor) => {
if (descriptor) {
Reflect.defineMetadata(throttler_constants_1.THROTTLER_SKIP, skip, descriptor.value);
return descriptor;
}
Reflect.defineMetadata(throttler_constants_1.THROTTLER_SKIP, skip, target);
return target;
};
};
exports.SkipThrottle = SkipThrottle;
const InjectThrottlerOptions = () => common_1.Inject(throttler_providers_1.getOptionsToken());
const InjectThrottlerOptions = () => (0, common_1.Inject)((0, throttler_providers_1.getOptionsToken)());
exports.InjectThrottlerOptions = InjectThrottlerOptions;
const InjectThrottlerStorage = () => common_1.Inject(throttler_providers_1.getStorageToken());
const InjectThrottlerStorage = () => (0, common_1.Inject)((0, throttler_providers_1.getStorageToken)());
exports.InjectThrottlerStorage = InjectThrottlerStorage;
//# sourceMappingURL=throttler.decorator.js.map
//# sourceMappingURL=throttler.decorator.js.map

@@ -1,12 +0,12 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThrottlerException = exports.throttlerMessage = void 0;
const common_1 = require('@nestjs/common');
const common_1 = require("@nestjs/common");
exports.throttlerMessage = 'ThrottlerException: Too Many Requests';
class ThrottlerException extends common_1.HttpException {
constructor(message) {
super(`${message || exports.throttlerMessage}`, common_1.HttpStatus.TOO_MANY_REQUESTS);
}
constructor(message) {
super(`${message || exports.throttlerMessage}`, common_1.HttpStatus.TOO_MANY_REQUESTS);
}
}
exports.ThrottlerException = ThrottlerException;
//# sourceMappingURL=throttler.exception.js.map
//# sourceMappingURL=throttler.exception.js.map

@@ -1,119 +0,94 @@

'use strict';
var __decorate =
(this && this.__decorate) ||
function (decorators, target, key, desc) {
var c = arguments.length,
r =
c < 3
? target
: desc === null
? (desc = Object.getOwnPropertyDescriptor(target, key))
: desc,
d;
if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if ((d = decorators[i]))
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata =
(this && this.__metadata) ||
function (k, v) {
if (typeof Reflect === 'object' && typeof Reflect.metadata === 'function')
return Reflect.metadata(k, v);
};
var __param =
(this && this.__param) ||
function (paramIndex, decorator) {
return function (target, key) {
decorator(target, key, paramIndex);
};
};
Object.defineProperty(exports, '__esModule', { value: true });
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThrottlerGuard = void 0;
const common_1 = require('@nestjs/common');
const core_1 = require('@nestjs/core');
const md5 = require('md5');
const throttler_storage_interface_1 = require('./throttler-storage.interface');
const throttler_constants_1 = require('./throttler.constants');
const throttler_decorator_1 = require('./throttler.decorator');
const throttler_exception_1 = require('./throttler.exception');
const common_1 = require("@nestjs/common");
const core_1 = require("@nestjs/core");
const md5 = require("md5");
const throttler_storage_interface_1 = require("./throttler-storage.interface");
const throttler_constants_1 = require("./throttler.constants");
const throttler_decorator_1 = require("./throttler.decorator");
const throttler_exception_1 = require("./throttler.exception");
let ThrottlerGuard = class ThrottlerGuard {
constructor(options, storageService, reflector) {
this.options = options;
this.storageService = storageService;
this.reflector = reflector;
this.headerPrefix = 'X-RateLimit';
this.errorMessage = throttler_exception_1.throttlerMessage;
}
async canActivate(context) {
const handler = context.getHandler();
const classRef = context.getClass();
if (
this.reflector.getAllAndOverride(throttler_constants_1.THROTTLER_SKIP, [handler, classRef])
) {
return true;
constructor(options, storageService, reflector) {
this.options = options;
this.storageService = storageService;
this.reflector = reflector;
this.headerPrefix = 'X-RateLimit';
this.errorMessage = throttler_exception_1.throttlerMessage;
}
const routeOrClassLimit = this.reflector.getAllAndOverride(
throttler_constants_1.THROTTLER_LIMIT,
[handler, classRef],
);
const routeOrClassTtl = this.reflector.getAllAndOverride(throttler_constants_1.THROTTLER_TTL, [
handler,
classRef,
]);
const limit = routeOrClassLimit || this.options.limit;
const ttl = routeOrClassTtl || this.options.ttl;
return this.handleRequest(context, limit, ttl);
}
async handleRequest(context, limit, ttl) {
const { req, res } = this.getRequestResponse(context);
if (Array.isArray(this.options.ignoreUserAgents)) {
for (const pattern of this.options.ignoreUserAgents) {
if (pattern.test(req.headers['user-agent'])) {
return true;
async canActivate(context) {
const handler = context.getHandler();
const classRef = context.getClass();
if (this.reflector.getAllAndOverride(throttler_constants_1.THROTTLER_SKIP, [handler, classRef])) {
return true;
}
}
const routeOrClassLimit = this.reflector.getAllAndOverride(throttler_constants_1.THROTTLER_LIMIT, [
handler,
classRef,
]);
const routeOrClassTtl = this.reflector.getAllAndOverride(throttler_constants_1.THROTTLER_TTL, [
handler,
classRef,
]);
const limit = routeOrClassLimit || this.options.limit;
const ttl = routeOrClassTtl || this.options.ttl;
return this.handleRequest(context, limit, ttl);
}
const tracker = this.getTracker(req);
const key = this.generateKey(context, tracker);
const ttls = await this.storageService.getRecord(key);
const nearestExpiryTime = ttls.length > 0 ? Math.ceil((ttls[0] - Date.now()) / 1000) : 0;
if (ttls.length >= limit) {
res.header('Retry-After', nearestExpiryTime);
this.throwThrottlingException(context);
async handleRequest(context, limit, ttl) {
const { req, res } = this.getRequestResponse(context);
if (Array.isArray(this.options.ignoreUserAgents)) {
for (const pattern of this.options.ignoreUserAgents) {
if (pattern.test(req.headers['user-agent'])) {
return true;
}
}
}
const tracker = this.getTracker(req);
const key = this.generateKey(context, tracker);
const ttls = await this.storageService.getRecord(key);
const nearestExpiryTime = ttls.length > 0 ? Math.ceil((ttls[0] - Date.now()) / 1000) : 0;
if (ttls.length >= limit) {
res.header('Retry-After', nearestExpiryTime);
this.throwThrottlingException(context);
}
res.header(`${this.headerPrefix}-Limit`, limit);
res.header(`${this.headerPrefix}-Remaining`, Math.max(0, limit - (ttls.length + 1)));
res.header(`${this.headerPrefix}-Reset`, nearestExpiryTime);
await this.storageService.addRecord(key, ttl);
return true;
}
res.header(`${this.headerPrefix}-Limit`, limit);
res.header(`${this.headerPrefix}-Remaining`, Math.max(0, limit - (ttls.length + 1)));
res.header(`${this.headerPrefix}-Reset`, nearestExpiryTime);
await this.storageService.addRecord(key, ttl);
return true;
}
getTracker(req) {
return req.ip;
}
getRequestResponse(context) {
const http = context.switchToHttp();
return { req: http.getRequest(), res: http.getResponse() };
}
generateKey(context, suffix) {
const prefix = `${context.getClass().name}-${context.getHandler().name}`;
return md5(`${prefix}-${suffix}`);
}
throwThrottlingException(context) {
throw new throttler_exception_1.ThrottlerException(this.errorMessage);
}
getTracker(req) {
return req.ip;
}
getRequestResponse(context) {
const http = context.switchToHttp();
return { req: http.getRequest(), res: http.getResponse() };
}
generateKey(context, suffix) {
const prefix = `${context.getClass().name}-${context.getHandler().name}`;
return md5(`${prefix}-${suffix}`);
}
throwThrottlingException(context) {
throw new throttler_exception_1.ThrottlerException(this.errorMessage);
}
};
ThrottlerGuard = __decorate(
[
common_1.Injectable(),
__param(0, throttler_decorator_1.InjectThrottlerOptions()),
__param(1, throttler_decorator_1.InjectThrottlerStorage()),
__metadata('design:paramtypes', [Object, Object, core_1.Reflector]),
],
ThrottlerGuard,
);
ThrottlerGuard = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, throttler_decorator_1.InjectThrottlerOptions)()),
__param(1, (0, throttler_decorator_1.InjectThrottlerStorage)()),
__metadata("design:paramtypes", [Object, Object, core_1.Reflector])
], ThrottlerGuard);
exports.ThrottlerGuard = ThrottlerGuard;
//# sourceMappingURL=throttler.guard.js.map
//# sourceMappingURL=throttler.guard.js.map

@@ -1,83 +0,64 @@

'use strict';
var __decorate =
(this && this.__decorate) ||
function (decorators, target, key, desc) {
var c = arguments.length,
r =
c < 3
? target
: desc === null
? (desc = Object.getOwnPropertyDescriptor(target, key))
: desc,
d;
if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if ((d = decorators[i]))
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
};
var ThrottlerModule_1;
Object.defineProperty(exports, '__esModule', { value: true });
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThrottlerModule = void 0;
const common_1 = require('@nestjs/common');
const throttler_constants_1 = require('./throttler.constants');
const throttler_providers_1 = require('./throttler.providers');
let ThrottlerModule = (ThrottlerModule_1 = class ThrottlerModule {
static forRoot(options = {}) {
const providers = [
...throttler_providers_1.createThrottlerProviders(options),
throttler_providers_1.ThrottlerStorageProvider,
];
return {
module: ThrottlerModule_1,
providers,
exports: providers,
};
}
static forRootAsync(options) {
const providers = [
...this.createAsyncProviders(options),
throttler_providers_1.ThrottlerStorageProvider,
];
return {
module: ThrottlerModule_1,
imports: options.imports || [],
providers,
exports: providers,
};
}
static createAsyncProviders(options) {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProvider(options)];
const common_1 = require("@nestjs/common");
const throttler_constants_1 = require("./throttler.constants");
const throttler_providers_1 = require("./throttler.providers");
let ThrottlerModule = ThrottlerModule_1 = class ThrottlerModule {
static forRoot(options = {}) {
const providers = [...(0, throttler_providers_1.createThrottlerProviders)(options), throttler_providers_1.ThrottlerStorageProvider];
return {
module: ThrottlerModule_1,
providers,
exports: providers,
};
}
return [
this.createAsyncOptionsProvider(options),
{
provide: options.useClass,
useClass: options.useClass,
},
];
}
static createAsyncOptionsProvider(options) {
if (options.useFactory) {
return {
provide: throttler_constants_1.THROTTLER_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
static forRootAsync(options) {
const providers = [...this.createAsyncProviders(options), throttler_providers_1.ThrottlerStorageProvider];
return {
module: ThrottlerModule_1,
imports: options.imports || [],
providers,
exports: providers,
};
}
return {
provide: throttler_constants_1.THROTTLER_OPTIONS,
useFactory: async (optionsFactory) => await optionsFactory.createThrottlerOptions(),
inject: [options.useExisting || options.useClass],
};
}
});
ThrottlerModule = ThrottlerModule_1 = __decorate(
[common_1.Global(), common_1.Module({})],
ThrottlerModule,
);
static createAsyncProviders(options) {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProvider(options)];
}
return [
this.createAsyncOptionsProvider(options),
{
provide: options.useClass,
useClass: options.useClass,
},
];
}
static createAsyncOptionsProvider(options) {
if (options.useFactory) {
return {
provide: throttler_constants_1.THROTTLER_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
return {
provide: throttler_constants_1.THROTTLER_OPTIONS,
useFactory: async (optionsFactory) => await optionsFactory.createThrottlerOptions(),
inject: [options.useExisting || options.useClass],
};
}
};
ThrottlerModule = ThrottlerModule_1 = __decorate([
(0, common_1.Global)(),
(0, common_1.Module)({})
], ThrottlerModule);
exports.ThrottlerModule = ThrottlerModule;
//# sourceMappingURL=throttler.module.js.map
//# sourceMappingURL=throttler.module.js.map

@@ -1,26 +0,22 @@

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.getStorageToken =
exports.getOptionsToken =
exports.ThrottlerStorageProvider =
exports.createThrottlerProviders =
void 0;
const throttler_storage_interface_1 = require('./throttler-storage.interface');
const throttler_constants_1 = require('./throttler.constants');
const throttler_service_1 = require('./throttler.service');
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStorageToken = exports.getOptionsToken = exports.ThrottlerStorageProvider = exports.createThrottlerProviders = void 0;
const throttler_storage_interface_1 = require("./throttler-storage.interface");
const throttler_constants_1 = require("./throttler.constants");
const throttler_service_1 = require("./throttler.service");
function createThrottlerProviders(options) {
return [
{
provide: throttler_constants_1.THROTTLER_OPTIONS,
useValue: options,
},
];
return [
{
provide: throttler_constants_1.THROTTLER_OPTIONS,
useValue: options,
},
];
}
exports.createThrottlerProviders = createThrottlerProviders;
exports.ThrottlerStorageProvider = {
provide: throttler_storage_interface_1.ThrottlerStorage,
useFactory: (options) => {
return options.storage ? options.storage : new throttler_service_1.ThrottlerStorageService();
},
inject: [throttler_constants_1.THROTTLER_OPTIONS],
provide: throttler_storage_interface_1.ThrottlerStorage,
useFactory: (options) => {
return options.storage ? options.storage : new throttler_service_1.ThrottlerStorageService();
},
inject: [throttler_constants_1.THROTTLER_OPTIONS],
};

@@ -31,2 +27,2 @@ const getOptionsToken = () => throttler_constants_1.THROTTLER_OPTIONS;

exports.getStorageToken = getStorageToken;
//# sourceMappingURL=throttler.providers.js.map
//# sourceMappingURL=throttler.providers.js.map

@@ -1,53 +0,43 @@

'use strict';
var __decorate =
(this && this.__decorate) ||
function (decorators, target, key, desc) {
var c = arguments.length,
r =
c < 3
? target
: desc === null
? (desc = Object.getOwnPropertyDescriptor(target, key))
: desc,
d;
if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if ((d = decorators[i]))
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, '__esModule', { value: true });
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThrottlerStorageService = void 0;
const common_1 = require('@nestjs/common');
const common_1 = require("@nestjs/common");
let ThrottlerStorageService = class ThrottlerStorageService {
constructor() {
this._storage = {};
this.timeoutIds = [];
}
get storage() {
return this._storage;
}
async getRecord(key) {
return this.storage[key] || [];
}
async addRecord(key, ttl) {
const ttlMilliseconds = ttl * 1000;
if (!this.storage[key]) {
this.storage[key] = [];
constructor() {
this._storage = {};
this.timeoutIds = [];
}
this.storage[key].push(Date.now() + ttlMilliseconds);
const timeoutId = setTimeout(() => {
this.storage[key].shift();
clearTimeout(timeoutId);
}, ttlMilliseconds);
this.timeoutIds.push(timeoutId);
}
onApplicationShutdown() {
this.timeoutIds.forEach(clearTimeout);
}
get storage() {
return this._storage;
}
async getRecord(key) {
return this.storage[key] || [];
}
async addRecord(key, ttl) {
const ttlMilliseconds = ttl * 1000;
if (!this.storage[key]) {
this.storage[key] = [];
}
this.storage[key].push(Date.now() + ttlMilliseconds);
const timeoutId = setTimeout(() => {
this.storage[key].shift();
clearTimeout(timeoutId);
this.timeoutIds = this.timeoutIds.filter((id) => id != timeoutId);
}, ttlMilliseconds);
this.timeoutIds.push(timeoutId);
}
onApplicationShutdown() {
this.timeoutIds.forEach(clearTimeout);
}
};
ThrottlerStorageService = __decorate([common_1.Injectable()], ThrottlerStorageService);
ThrottlerStorageService = __decorate([
(0, common_1.Injectable)()
], ThrottlerStorageService);
exports.ThrottlerStorageService = ThrottlerStorageService;
//# sourceMappingURL=throttler.service.js.map
//# sourceMappingURL=throttler.service.js.map
{
"name": "@nestjs/throttler",
"version": "2.0.0",
"version": "2.0.1",
"description": "A Rate-Limiting module for NestJS to work on Express, Fastify, Websockets, Socket.IO, and GraphQL, all rolled up into a simple package.",

@@ -42,6 +42,6 @@ "author": "Jay McDoniel <me@jaymcdoniel.dev>",

"test:e2e:dev": "yarn test:e2e --watchAll",
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
"_postinstall": "husky install",
"postpublish": "pinst --enable",
"prepublishOnly": "pinst --disable"
"prepublishOnly": "pinst --disable",
"release": "changeset publish"
},

@@ -52,53 +52,53 @@ "dependencies": {

"devDependencies": {
"@commitlint/cli": "12.1.4",
"@commitlint/config-angular": "12.1.4",
"@nestjs/cli": "8.0.2",
"@nestjs/common": "8.0.1",
"@nestjs/core": "8.0.1",
"@nestjs/graphql": "8.0.2",
"@nestjs/platform-express": "8.0.1",
"@nestjs/platform-fastify": "8.0.1",
"@nestjs/platform-socket.io": "8.0.1",
"@nestjs/platform-ws": "8.0.1",
"@nestjs/schematics": "8.0.0",
"@nestjs/testing": "8.0.1",
"@nestjs/websockets": "8.0.1",
"@semantic-release/git": "9.0.0",
"@changesets/cli": "2.21.1",
"@commitlint/cli": "16.2.1",
"@commitlint/config-angular": "16.2.1",
"@nestjs/cli": "8.2.2",
"@nestjs/common": "8.4.0",
"@nestjs/core": "8.4.0",
"@nestjs/graphql": "10.0.6",
"@nestjs/platform-express": "8.4.0",
"@nestjs/platform-fastify": "8.4.0",
"@nestjs/platform-socket.io": "8.4.0",
"@nestjs/platform-ws": "8.4.0",
"@nestjs/schematics": "8.0.8",
"@nestjs/testing": "8.4.0",
"@nestjs/websockets": "8.4.0",
"@semantic-release/git": "10.0.1",
"@types/express": "4.17.13",
"@types/express-serve-static-core": "4.17.24",
"@types/jest": "26.0.24",
"@types/md5": "2.3.1",
"@types/node": "16.3.0",
"@types/express-serve-static-core": "4.17.28",
"@types/jest": "27.4.1",
"@types/md5": "2.3.2",
"@types/node": "16.11.26",
"@types/socket.io": "3.0.2",
"@types/socket.io-client": "3.0.0",
"@types/supertest": "2.0.11",
"@typescript-eslint/eslint-plugin": "4.28.2",
"@typescript-eslint/parser": "4.28.2",
"apollo-server-express": "2.25.2",
"apollo-server-fastify": "2.25.2",
"conventional-changelog-cli": "2.1.1",
"@typescript-eslint/eslint-plugin": "5.14.0",
"@typescript-eslint/parser": "5.14.0",
"apollo-server-express": "3.6.4",
"apollo-server-fastify": "3.6.4",
"conventional-changelog-cli": "2.2.2",
"cz-conventional-changelog": "3.3.0",
"eslint": "7.30.0",
"eslint-config-prettier": "8.3.0",
"eslint-plugin-import": "2.23.4",
"graphql": "15.5.1",
"graphql-tools": "7.0.5",
"husky": "7.0.1",
"jest": "27.0.6",
"lint-staged": "11.0.0",
"nodemon": "2.0.10",
"pinst": "2.1.6",
"prettier": "2.3.2",
"eslint": "8.10.0",
"eslint-config-prettier": "8.5.0",
"eslint-plugin-import": "2.25.4",
"graphql": "16.3.0",
"graphql-tools": "8.2.0",
"husky": "7.0.4",
"jest": "27.5.1",
"lint-staged": "12.3.5",
"nodemon": "2.0.15",
"pinst": "3.0.0",
"prettier": "2.5.1",
"reflect-metadata": "0.1.13",
"rimraf": "3.0.2",
"rxjs": "7.2.0",
"semantic-release": "17.4.4",
"socket.io": "4.1.2",
"supertest": "6.1.3",
"ts-jest": "27.0.3",
"ts-loader": "9.2.3",
"ts-node": "10.0.0",
"tsconfig-paths": "3.10.1",
"typescript": "4.3.5",
"ws": "7.5.2"
"rxjs": "7.5.5",
"socket.io": "4.4.1",
"supertest": "6.2.2",
"ts-jest": "27.1.3",
"ts-loader": "9.2.8",
"ts-node": "10.7.0",
"tsconfig-paths": "3.13.0",
"typescript": "4.6.2",
"ws": "8.5.0"
},

@@ -105,0 +105,0 @@ "peerDependencies": {

@@ -34,2 +34,9 @@ <p align="center">

## Installation
```bash
$ npm i --save @nestjs/throttler
```
## Versions

@@ -148,3 +155,3 @@

This decorator will set THROTTLER_LIMIT and THROTTLER_TTL metadatas on the
This decorator will set `THROTTLER_LIMIT` and `THROTTLER_TTL` metadatas on the
route, for retrieval from the `Reflector` class. Can be applied to controllers

@@ -223,4 +230,21 @@ and routes.

If you are working behind a proxy, check the specific HTTP adapter options ([express](http://expressjs.com/en/guide/behind-proxies.html) and [fastify](https://www.fastify.io/docs/latest/Server/#trustproxy)) for the `trust proxy` option and enable it. Doing so will allow you to get the original IP address from the `X-Forward-For` header, and you can override the `getTracker()` method to pull the value from the header rather than from `req.ip`
If you are working behind a proxy, check the specific HTTP adapter options ([express](http://expressjs.com/en/guide/behind-proxies.html) and [fastify](https://www.fastify.io/docs/latest/Server/#trustproxy)) for the `trust proxy` option and enable it. Doing so will allow you to get the original IP address from the `X-Forward-For` header, and you can override the `getTracker()` method to pull the value from the header rather than from `req.ip`. The following example works with both express and fastify:
```ts
// throttler-behind-proxy.guard.ts
import { ThrottlerGuard } from '@nestjs/throttler';
import { Injectable } from '@nestjs/common';
@Injectable()
export class ThrottlerBehindProxyGuard extends ThrottlerGuard {
protected getTracker(req: Record<string, any>): string {
return req.ips.length ? req.ips[0] : req.ip; // individualize IP extraction to meet your own needs
}
}
// app.controller.ts
import { ThrottlerBehindProxyGuard } from './throttler-behind-proxy.guard';
@UseGuards(ThrottlerBehindProxyGuard)
```
### Working with Websockets

@@ -275,3 +299,3 @@

const ctx = gqlCtx.getContext();
return { req, ctx.req, res: ctx.res }; // ctx.request and ctx.reply for fastify
return { req: ctx.req, res: ctx.res }; // ctx.request and ctx.reply for fastify
}

@@ -286,1 +310,5 @@ }

Feel free to submit a PR with your custom storage provider being added to this list.
## License
Nest is [MIT licensed](LICENSE).

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc