From af7485370c569de32a8a04064af46ba831011b6d Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Fri, 1 Aug 2025 17:11:34 +0200 Subject: [PATCH] Limit number of simultaneous requests to the API --- lib/www/client/source/package.json | 1 + lib/www/client/source/src/store/modules/api/actions.js | 6 +++++- lib/www/client/source/src/store/modules/api/state.js | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/www/client/source/package.json b/lib/www/client/source/package.json index 68ddfb0..93b333c 100644 --- a/lib/www/client/source/package.json +++ b/lib/www/client/source/package.json @@ -9,6 +9,7 @@ "dependencies": { "@deck.gl/aggregation-layers": "^9.1.13", "@deck.gl/geo-layers": "^9.1.13", + "@dougal/concurrency": "file:../../../modules/@dougal/concurrency", "@dougal/organisations": "file:../../../modules/@dougal/organisations", "@dougal/user": "file:../../../modules/@dougal/user", "@mdi/font": "^7.2.96", diff --git a/lib/www/client/source/src/store/modules/api/actions.js b/lib/www/client/source/src/store/modules/api/actions.js index afce7b8..c313948 100644 --- a/lib/www/client/source/src/store/modules/api/actions.js +++ b/lib/www/client/source/src/store/modules/api/actions.js @@ -1,3 +1,4 @@ +const ConcurrencyLimiter = require('@dougal/concurrency'); /** Make an API request * @@ -18,6 +19,9 @@ * to `true`). */ async function api ({state, getters, commit, dispatch}, [resource, init = {}, cb, opts = {}]) { + + const limiter = api.limiter || (api.limiter = new ConcurrencyLimiter(state.maxConcurrent)); + try { commit("queueRequest"); if (init && init.hasOwnProperty("body")) { @@ -63,7 +67,7 @@ async function api ({state, getters, commit, dispatch}, [resource, init = {}, cb } if (!res) { - res = await fetch(url, init); + res = await limiter.enqueue(async () => await fetch(url, init)); } if (cache && !isCached) { diff --git a/lib/www/client/source/src/store/modules/api/state.js b/lib/www/client/source/src/store/modules/api/state.js index e6a346f..ba5c8bc 100644 --- a/lib/www/client/source/src/store/modules/api/state.js +++ b/lib/www/client/source/src/store/modules/api/state.js @@ -1,6 +1,7 @@ const state = () => ({ apiUrl: "/api", - requestsCount: 0 + requestsCount: 0, + maxConcurrent: 15 }); export default state;