ratelimit

This commit is contained in:
Daniel Bulant 2021-05-20 18:07:05 +02:00
parent a9a5779e92
commit 47b22f8f7d
2 changed files with 49 additions and 4 deletions

View file

@ -1,15 +1,29 @@
<script>
import request from "../util/request";
import { params } from '@roxi/routify'
import request from "../util/request";
import ratelimit from "../util/ratelimit";
var name = $params.search;
$: {
const url = new URL(window.location.toString());
url.searchParams.set("search", name);
history.replaceState(history.state, "", url.toString());
}
var result = request("manga", "title=" + name + "&contentRating[]=safe&contentRating[]=suggestive");
$: result = request("manga", "title=" + name + "&contentRating[]=safe&contentRating[]=suggestive");
result.then(console.log);
/**
* Searches for results
* @param {string} title
* @returns {Promise<object>}
*/
function search(title) {
var query = "";
if(title) query += "title=" + encodeURIComponent(name) + "&";
query += "contentRating[]=safe&contentRating[]=suggestive";
return request("manga", query);
}
var result = search(name);
result.then(console.log);
$: result = ratelimit(search, name);
$: result.then(console.log);
</script>
<main>

31
src/util/ratelimit.js Normal file
View file

@ -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<typeof T>} params
* @template T
* @returns {Promise<ReturnType<T>>}
*/
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;