( state: TranscriptRateLimitState, bucket: TranscriptRateBucketName, now = Date.now(), )
| 27 | qa: { max: 10, windowMs: 60_000 }, |
| 28 | session: { max: 8, windowMs: 60_000 }, |
| 29 | }; |
| 30 | |
| 31 | export const takeTranscriptRateLimit = ( |
| 32 | state: TranscriptRateLimitState, |
| 33 | bucket: TranscriptRateBucketName, |
| 34 | now = Date.now(), |
| 35 | ): boolean => { |
| 36 | const limit = limits[bucket]; |
| 37 | const current = state[bucket]; |
| 38 | if (!current || current.resetAt <= now) { |
| 39 | state[bucket] = { |
| 40 | count: 1, |
| 41 | resetAt: now + limit.windowMs, |
| 42 | }; |
| 43 | return true; |
| 44 | } |
| 45 | |
| 46 | if (current.count >= limit.max) return false; |
| 47 | current.count += 1; |
| 48 | return true; |
| 49 | }; |
no test coverage detected