1. /**
  2. * Cleans and processes runtime environment data with rate limiting.
  3. *
  4. * @param {Array<Object>} data - Array of data objects to process.
  5. * @param {number} maxRequestsPerSecond - Maximum number of requests allowed per second.
  6. * @returns {Promise<Array<Object>>} - A promise that resolves to the cleaned and processed data.
  7. */
  8. async function processDataWithRateLimit(data, maxRequestsPerSecond) {
  9. const results = [];
  10. let requestQueue = [];
  11. let running = 0; // Number of currently running requests
  12. let lastExecutionTime = 0;
  13. async function processItem(item) {
  14. // Simulate data cleaning and processing
  15. await new Promise(resolve => setTimeout(resolve, Math.random() * 500)); // Simulate work
  16. const cleanedItem = {
  17. ...item,
  18. cleanedData: item.data.toUpperCase(), // Example cleaning
  19. };
  20. results.push(cleanedItem);
  21. }
  22. async function createRequest() {
  23. if (requestQueue.length > 0 && running >= maxRequestsPerSecond) {
  24. return; // Rate limit reached
  25. }
  26. if (requestQueue.length < maxRequestsPerSecond) {
  27. const item = requestQueue.shift();
  28. running++;
  29. try {
  30. await processItem(item);
  31. } catch (error) {
  32. console.error("Error processing item:", error);
  33. } finally {
  34. running--;
  35. // Schedule the next request if there are more in the queue
  36. if (requestQueue.length > 0) {
  37. createRequest();
  38. }
  39. }
  40. }
  41. }
  42. for (const item of data) {
  43. requestQueue.push(item);
  44. createRequest();
  45. }
  46. // Wait for all requests to complete
  47. while (running > 0) {
  48. await new Promise(resolve => setTimeout(resolve, 10)); // Check periodically
  49. }
  50. return results;
  51. }
  52. export default processDataWithRateLimit;

Add your comment