Files
url_tracker_tool/apps/api/package.json
Andrei c34de838f4 feat(phase-7): Advanced rate limiting with Redis and header redaction
- Implement tier-based rate limiting with rate-limiter-flexible
- Add Redis-backed rate limiters for different user tiers (free/pro/enterprise)
- Create comprehensive header redaction service for security
- Implement burst protection with per-minute limits
- Add organization and project-based rate limiting keys
- Create rate limiting middleware with proper error handling
- Integrate rate limits with tracking, bulk, and export endpoints
- Add header redaction to redirect tracking service
- Implement request logging with redacted sensitive headers
- Add comprehensive rate limit headers (limit, remaining, reset, tier)
- Support for anonymous vs authenticated rate limits
- Legacy endpoint rate limiting preserved for backward compatibility
- Admin functions for rate limit management and statistics
- Comprehensive test suite for all rate limiting scenarios

Security improvements:
- Sensitive header redaction (auth tokens, cookies, secrets)
- Partial redaction for debugging (admin mode)
- URL parameter redaction for sensitive data
- Request/response body redaction
- Configurable redaction levels

Backward compatibility: Maintained 100/hr rate limit for legacy endpoints
2025-08-18 14:40:31 +00:00

69 lines
1.8 KiB
JSON

{
"name": "@redirect-intelligence/api",
"version": "2.0.0",
"private": true,
"scripts": {
"dev": "tsx watch --clear-screen=false src/index.ts",
"build": "tsc",
"start": "node dist/index.js",
"test": "jest",
"test:watch": "jest --watch",
"lint": "eslint src --ext .ts,.tsx",
"lint:fix": "eslint src --ext .ts,.tsx --fix",
"clean": "rm -rf dist"
},
"dependencies": {
"express": "^4.18.2",
"cors": "^2.8.5",
"cookie-parser": "^1.4.6",
"express-rate-limit": "^7.1.5",
"rate-limiter-flexible": "^5.0.3",
"axios": "^1.6.7",
"undici": "^6.2.1",
"zod": "^3.22.4",
"@prisma/client": "*",
"argon2": "^0.31.2",
"jsonwebtoken": "^9.0.2",
"bullmq": "^4.15.4",
"ioredis": "^5.3.2",
"helmet": "^7.1.0",
"compression": "^1.7.4",
"dotenv": "^16.3.1",
"jsdom": "^23.0.1",
"winston": "^3.11.0",
"puppeteer": "^21.9.0",
"handlebars": "^4.7.8",
"mermaid": "^10.6.1",
"markdown-it": "^14.0.0",
"file-type": "^19.0.0",
"mime-types": "^2.1.35",
"csv-parser": "^3.0.0",
"csv-writer": "^1.6.0",
"multer": "^1.4.5-lts.1",
"rate-limiter-flexible": "^5.0.3",
"ioredis": "^5.3.2"
},
"devDependencies": {
"@types/express": "^4.17.21",
"@types/cors": "^2.8.17",
"@types/cookie-parser": "^1.4.6",
"@types/jsonwebtoken": "^9.0.5",
"@types/compression": "^1.7.5",
"@types/jsdom": "^21.1.6",
"@types/node": "^20.10.0",
"tsx": "^4.6.2",
"typescript": "^5.3.0",
"jest": "^29.7.0",
"@types/jest": "^29.5.8",
"ts-jest": "^29.1.1",
"supertest": "^6.3.3",
"@types/supertest": "^2.0.16",
"@types/puppeteer": "^7.0.4",
"@types/markdown-it": "^13.0.7",
"@types/mime-types": "^2.1.4",
"@types/multer": "^1.4.11",
"@types/csv-parser": "^3.0.0",
"@types/ioredis": "^5.0.0"
}
}