(userId: string)
| 27 | } |
| 28 | |
| 29 | export async function getUserLimits(userId: string): Promise<UserLimits> { |
| 30 | const [userSubscription, usageCheck, effectiveCost, rateLimiter] = await Promise.all([ |
| 31 | getHighestPrioritySubscription(userId), |
| 32 | checkServerSideUsageLimits(userId), |
| 33 | getEffectiveCurrentPeriodCost(userId), |
| 34 | Promise.resolve(new RateLimiter()), |
| 35 | ]) |
| 36 | |
| 37 | const [syncStatus, asyncStatus] = await Promise.all([ |
| 38 | rateLimiter.getRateLimitStatusWithSubscription(userId, userSubscription, 'api', false), |
| 39 | rateLimiter.getRateLimitStatusWithSubscription(userId, userSubscription, 'api', true), |
| 40 | ]) |
| 41 | |
| 42 | return { |
| 43 | workflowExecutionRateLimit: { |
| 44 | sync: { |
| 45 | requestsPerMinute: syncStatus.requestsPerMinute, |
| 46 | maxBurst: syncStatus.maxBurst, |
| 47 | remaining: syncStatus.remaining, |
| 48 | resetAt: syncStatus.resetAt.toISOString(), |
| 49 | }, |
| 50 | async: { |
| 51 | requestsPerMinute: asyncStatus.requestsPerMinute, |
| 52 | maxBurst: asyncStatus.maxBurst, |
| 53 | remaining: asyncStatus.remaining, |
| 54 | resetAt: asyncStatus.resetAt.toISOString(), |
| 55 | }, |
| 56 | }, |
| 57 | usage: { |
| 58 | currentPeriodCost: effectiveCost, |
| 59 | limit: usageCheck.limit, |
| 60 | plan: userSubscription?.plan || 'free', |
| 61 | isExceeded: usageCheck.isExceeded, |
| 62 | }, |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | export function createApiResponse<T>( |
| 67 | data: T, |
no test coverage detected