{"record":{"id":"a44c76141e988fbc","repo":"paperclipai/paperclip","slug":"rate-limited","errorCode":"rate_limited","errorMessage":"Too many file preview requests","messagePattern":"Too many file preview requests","errorType":"http","errorClass":"HttpError","httpStatus":429,"severity":"error","filePath":"server/src/routes/file-resources.ts","lineNumber":93,"sourceCode":"  const windowMs = opts.windowMs ?? 60_000;\n  const requestLimitMessage = opts.requestLimitMessage ?? \"Too many file preview requests\";\n  const concurrencyLimitMessage = opts.concurrencyLimitMessage ?? \"Too many concurrent file preview requests\";\n  const activeByKey = new Map<string, number>();\n  const windowsByKey = new Map<string, { startedAt: number; count: number }>();\n\n  return {\n    acquire(key: string) {\n      const now = Date.now();\n      for (const [windowKey, existing] of windowsByKey) {\n        if (now - existing.startedAt >= windowMs) windowsByKey.delete(windowKey);\n      }\n      const window = windowsByKey.get(key);\n      if (!window || now - window.startedAt >= windowMs) {\n        windowsByKey.set(key, { startedAt: now, count: 1 });\n      } else {\n        window.count += 1;\n        if (window.count > maxRequests) {\n          throw new HttpError(429, requestLimitMessage, { code: \"rate_limited\" });\n        }\n      }\n\n      const active = activeByKey.get(key) ?? 0;\n      if (active >= maxConcurrent) {\n        throw new HttpError(429, concurrencyLimitMessage, { code: \"concurrency_limited\" });\n      }\n      activeByKey.set(key, active + 1);\n      return () => {\n        const current = activeByKey.get(key) ?? 0;\n        if (current <= 1) activeByKey.delete(key);\n        else activeByKey.set(key, current - 1);\n      };\n    },\n  };\n}\n\nexport function createFileResourceListLimiter(opts: {","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/paperclipai/paperclip/blob/a7e689b3c35347b529cb9f54c9b9a8575a3dcab6/server/src/routes/file-resources.ts#L75-L111","documentation":"Rate-limit rejection from the file-preview limiter's acquire: the per-key sliding window (default 60s) already recorded more than maxRequests preview requests for this key. Thrown as HttpError 429 with code 'rate_limited' to protect file-resource endpoints from excessive preview traffic; the message is overridable via requestLimitMessage.","triggerScenarios":"Thrown at server/src/routes/file-resources.ts:93 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reduce the rate of file preview requests and retry after the rate limit window passes."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a7e689b3c35347b529cb9f54c9b9a8575a3dcab6","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}