/ scripts / rate-limits.mjs
rate-limits.mjs
 1  #!/usr/bin/env node
 2  /**
 3   * Rate Limit Status CLI
 4   *
 5   * Usage:
 6   *   npm run rate-limits          # Show active rate limits
 7   *   npm run rate-limits:clear    # Clear all active rate limits (manual override)
 8   *   node scripts/rate-limits.mjs --clear zenrows   # Clear a specific API
 9   */
10  import {
11    getRateLimitStatus,
12    clearRateLimit,
13    getSkipStages,
14    API_STAGE_MAP,
15  } from '../src/utils/rate-limit-scheduler.js';
16  
17  const args = process.argv.slice(2);
18  const clearMode = args.includes('--clear');
19  const clearTarget = args.find(a => !a.startsWith('--'));
20  
21  if (clearMode) {
22    if (clearTarget) {
23      if (!API_STAGE_MAP[clearTarget]) {
24        console.error(`Unknown API: ${clearTarget}`);
25        console.error(`Known APIs: ${Object.keys(API_STAGE_MAP).join(', ')}`);
26        process.exit(1);
27      }
28      clearRateLimit(clearTarget);
29      console.log(`✅ Cleared rate limit for: ${clearTarget}`);
30    } else {
31      // Clear all
32      const active = getRateLimitStatus();
33      if (active.length === 0) {
34        console.log('No active rate limits to clear.');
35      } else {
36        for (const limit of active) {
37          clearRateLimit(limit.api);
38          console.log(`✅ Cleared rate limit for: ${limit.api} (was: ${limit.reason})`);
39        }
40      }
41    }
42    process.exit(0);
43  }
44  
45  // Status mode
46  const active = getRateLimitStatus();
47  const skipped = getSkipStages();
48  
49  if (active.length === 0) {
50    console.log('✅ No active rate limits. All pipeline stages running normally.\n');
51  } else {
52    console.log(`⏸️  ${active.length} active rate limit(s):\n`);
53    for (const limit of active) {
54      console.log(`  API:     ${limit.api}`);
55      console.log(`  Stages:  ${limit.stages.join(', ')}`);
56      console.log(`  Reason:  ${limit.reason}`);
57      console.log(`  Resets:  ${limit.resetAt} (~${limit.waitMinutes} min)`);
58      console.log('');
59    }
60  }
61  
62  if (skipped.size > 0) {
63    console.log(`Dynamically skipped stages: ${Array.from(skipped).join(', ')}`);
64    console.log('');
65  }
66  
67  console.log('To clear all rate limits: npm run rate-limits:clear');
68  console.log('To clear a specific API:  node scripts/rate-limits.mjs --clear <api>');