From 47b22f8f7ddc9db08fffa2d0d3ddf7e4b0dbf4f3 Mon Sep 17 00:00:00 2001 From: Daniel Bulant Date: Thu, 20 May 2021 18:07:05 +0200 Subject: [PATCH] ratelimit --- src/pages/index.svelte | 22 ++++++++++++++++++---- src/util/ratelimit.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/util/ratelimit.js diff --git a/src/pages/index.svelte b/src/pages/index.svelte index a41e1af..599a589 100644 --- a/src/pages/index.svelte +++ b/src/pages/index.svelte @@ -1,15 +1,29 @@
diff --git a/src/util/ratelimit.js b/src/util/ratelimit.js new file mode 100644 index 0000000..1dfcbf2 --- /dev/null +++ b/src/util/ratelimit.js @@ -0,0 +1,31 @@ +const ratelimits = new Map(); + +function callback(func) { + const params = ratelimits.get(func); + func(...params.params).then(params.result.resolve).catch(params.result.reject); + ratelimits.delete(func); +} + +/** + * + * @param {T} func + * @param {...Parameters} params + * @template T + * @returns {Promise>} + */ +function ratelimit(func, ...params) { + const data = ratelimits.get(func) || { + timeout: setTimeout(callback, 200, func), + params, + result: {} + }; + if(!data.promise) data.promise = new Promise((resolve, reject) => { + data.result.resolve = resolve; + data.result.reject = reject; + }); + + ratelimits.set(func, data); + return data.promise; +} + +export default ratelimit; \ No newline at end of file