1. class RequestThrottler {
  2. constructor(maxRequestsPerInterval, intervalMs) {
  3. this.maxRequestsPerInterval = maxRequestsPerInterval;
  4. this.intervalMs = intervalMs;
  5. this.requests = [];
  6. this.nextRun = Date.now() + intervalMs;
  7. }
  8. /**
  9. * Schedules a request to be made.
  10. * @param {function} requestFunc - The function to execute for the request. Should return a Promise.
  11. * @returns {Promise} - A promise that resolves when the request is completed.
  12. */
  13. scheduleRequest(requestFunc) {
  14. return new Promise((resolve, reject) => {
  15. this.requests.push({ func: requestFunc, resolve, reject });
  16. this.processRequests();
  17. });
  18. }
  19. /**
  20. * Processes the pending requests.
  21. */
  22. processRequests() {
  23. const now = Date.now();
  24. if (now >= this.nextRun) {
  25. this.nextRun = now + this.intervalMs;
  26. while (this.requests.length > 0) {
  27. const request = this.requests.shift();
  28. try {
  29. const result = request.func();
  30. request.resolve(result);
  31. } catch (error) {
  32. request.reject(error);
  33. }
  34. }
  35. }
  36. }
  37. }
  38. // Example usage:
  39. // const throttler = new RequestThrottler(2, 1000); // Allow 2 requests per second
  40. // const request1 = () => {
  41. // return new Promise(resolve => setTimeout(() => {resolve("Response 1");}, 500));
  42. // };
  43. // const request2 = () => {
  44. // return new Promise(resolve => setTimeout(() => {resolve("Response 2");}, 800));
  45. // };
  46. // const request3 = () => {
  47. // return new Promise(resolve => setTimeout(() => {resolve("Response 3");}, 300));
  48. // };
  49. // throttler.scheduleRequest(request1)
  50. // .then(result => console.log("Request 1:", result))
  51. // .catch(error => console.error("Request 1 error:", error));
  52. // throttler.scheduleRequest(request2)
  53. // .then(result => console.log("Request 2:", result))
  54. // .catch(error => console.error("Request 2 error:", error));
  55. // throttler.scheduleRequest(request3)
  56. // .then(result => console.log("Request 3:", result))
  57. // .catch(error => console.error("Request 3 error:", error));

Add your comment