LibreChat/api/server/middleware/limiters/code.js
Danny Avila 51edb2a660
🛫 feat: Enable Self-Service Code Worker Pairing (#15367)
* feat: add self-service code worker pairing

* fix: enforce code worker principal boundaries

* fix: separate pairing control planes from execution

* fix: preserve principal worker routing

* fix: pin artifact traffic to code workers

* fix: authenticate code worker selection

* test: mock worker-aware artifact headers

* fix: harden self-service code worker routing

* fix: fail closed for principal code pairing

* style: format code execution headers

* fix: close self-service pairing gaps

* fix: satisfy code environment type checks
2026-09-01 18:46:33 -04:00

41 lines
1.6 KiB
JavaScript

const rateLimit = require('express-rate-limit');
const { limiterCache } = require('@librechat/api');
let configuredCodeEnvironmentPairingLimiter;
function positiveInteger(value, fallback) {
const parsed = Number(value);
return Number.isSafeInteger(parsed) && parsed >= 1 ? parsed : fallback;
}
const codeEnvironmentPairingLimiter = (req, res, next) => {
if (configuredCodeEnvironmentPairingLimiter == null) {
const max = positiveInteger(process.env.CODE_ENVIRONMENT_PAIRING_USER_MAX, 5);
const windowInMinutes = positiveInteger(process.env.CODE_ENVIRONMENT_PAIRING_USER_WINDOW, 60);
configuredCodeEnvironmentPairingLimiter = rateLimit({
windowMs: windowInMinutes * 60 * 1000,
max,
handler: (limitedReq, limitedRes) => {
const resetAt = limitedReq.rateLimit?.resetTime?.getTime?.();
const retryAfterSeconds = Number.isFinite(resetAt)
? Math.max(1, Math.ceil((resetAt - Date.now()) / 1000))
: Math.max(1, Math.ceil(windowInMinutes * 60));
limitedRes.set('Retry-After', String(retryAfterSeconds));
return limitedRes.status(429).json({
error: {
code: 'code_environment_pairing_rate_limited',
message: 'Code environment pairing rate limit exceeded.',
type: 'rate_limit_error',
},
});
},
keyGenerator: (limitedReq) => String(limitedReq.user.id),
store: limiterCache('code_environment_pairing_user_limiter'),
});
}
return configuredCodeEnvironmentPairingLimiter(req, res, next);
};
module.exports = { codeEnvironmentPairingLimiter };