nestjs-request-deduplication
Version:
[](https://www.npmjs.com/package/nestjs-request-deduplication) [](https://gith
65 lines (64 loc) • 3.21 kB
JavaScript
;
var RequestDeduplicationInterceptor_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RequestDeduplicationInterceptor = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const services_1 = require("../services");
const crypto = tslib_1.__importStar(require("crypto"));
const core_1 = require("@nestjs/core");
const constants_1 = require("../constants");
let RequestDeduplicationInterceptor = RequestDeduplicationInterceptor_1 = class RequestDeduplicationInterceptor {
constructor(requestDeduplicationService, options, reflector) {
this.requestDeduplicationService = requestDeduplicationService;
this.options = options;
this.reflector = reflector;
this.logger = new common_1.Logger(RequestDeduplicationInterceptor_1.name);
this.logger.log('RequestDeduplicationInterceptor initialized');
}
intercept(context, next) {
const skipDeduplicateRequest = this.reflector.get(constants_1.SKIP_DEDUPLICATE_REQUEST_KEY, context.getHandler());
if (skipDeduplicateRequest) {
return next.handle();
}
const request = context.switchToHttp().getRequest();
const key = this.generateKey(request);
const value = 'request_exists';
if (request.skipRequestDeduplication) {
this.logger.log('Skipping request deduplication');
return next.handle();
}
return (0, rxjs_1.from)(this.requestDeduplicationService.processRequest(key, value, this.options.ttl)).pipe((0, operators_1.switchMap)((isProcessed) => {
if (!isProcessed) {
this.logger.log(`Duplicate request detected for key: ${key}`);
throw new common_1.HttpException({
status: common_1.HttpStatus.CONFLICT,
error: 'Duplicate request',
}, common_1.HttpStatus.CONFLICT);
}
return next.handle().pipe((0, operators_1.switchMap)((data) => tslib_1.__awaiter(this, void 0, void 0, function* () {
return data;
})));
}));
}
generateKey(request) {
var _a, _b;
return (crypto
.createHash('sha256')
.update(request.method)
.update(request.originalUrl)
.update(JSON.stringify((_a = request.headers) !== null && _a !== void 0 ? _a : {}))
// .update(JSON.stringify(request.query ?? {}))
.update(JSON.stringify((_b = request.body) !== null && _b !== void 0 ? _b : {}))
.digest('hex'));
}
};
exports.RequestDeduplicationInterceptor = RequestDeduplicationInterceptor;
exports.RequestDeduplicationInterceptor = RequestDeduplicationInterceptor = RequestDeduplicationInterceptor_1 = tslib_1.__decorate([
(0, common_1.Injectable)(),
tslib_1.__param(0, (0, common_1.Inject)(services_1.RequestDeduplicationService)),
tslib_1.__param(1, (0, common_1.Inject)(constants_1.REQUEST_DEDUPLICATION_MODULE_OPTIONS)),
tslib_1.__param(2, (0, common_1.Inject)(core_1.Reflector))
], RequestDeduplicationInterceptor);