UNPKG

nestjs-request-deduplication

Version:

[![npm version](https://badge.fury.io/js/nestjs-request-deduplication.svg)](https://www.npmjs.com/package/nestjs-request-deduplication) [![CI](https://github.com/daniyel/nestjs-request-deduplication/actions/workflows/pr-checks.yml/badge.svg)](https://gith

65 lines (64 loc) 3.21 kB
"use strict"; 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);