aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-12-24 00:59:14 -0800
committerFuwn <[email protected]>2023-12-24 00:59:14 -0800
commit31ea88d915e27d15efd7c110f8189130338c759b (patch)
treedf6fce79682d33890505857084adf52d13d60063 /src
parentfix(subtiteld): lessen subtitled match (diff)
downloaddue.moe-31ea88d915e27d15efd7c110f8189130338c759b.tar.xz
due.moe-31ea88d915e27d15efd7c110f8189130338c759b.zip
feat(mangadex): server-side rate-limit 5/s
Diffstat (limited to 'src')
-rw-r--r--src/lib/rateLimit.ts12
-rw-r--r--src/routes/api/mangadex/chapter/+server.ts9
-rw-r--r--src/routes/api/mangadex/feed/+server.ts10
-rw-r--r--src/routes/api/mangadex/manga/+server.ts9
4 files changed, 36 insertions, 4 deletions
diff --git a/src/lib/rateLimit.ts b/src/lib/rateLimit.ts
new file mode 100644
index 00000000..98e726a2
--- /dev/null
+++ b/src/lib/rateLimit.ts
@@ -0,0 +1,12 @@
+import type { RequestEvent } from '@sveltejs/kit';
+import { RateLimiter } from 'sveltekit-rate-limiter/server';
+
+export const checkRateLimit = async (event: RequestEvent) => {
+ const limiter = new RateLimiter({ rates: { IP: [5, 's'] } });
+
+ await limiter.cookieLimiter?.preflight(event);
+
+ if (await limiter.isLimited(event)) return new Response('rate-limited');
+
+ return null;
+};
diff --git a/src/routes/api/mangadex/chapter/+server.ts b/src/routes/api/mangadex/chapter/+server.ts
index 68e125bd..ad291e42 100644
--- a/src/routes/api/mangadex/chapter/+server.ts
+++ b/src/routes/api/mangadex/chapter/+server.ts
@@ -1,4 +1,11 @@
-export const GET = async ({ url }) => {
+import { checkRateLimit } from '$lib/rateLimit.js';
+
+export const GET = async (event) => {
+ const limit = await checkRateLimit(event);
+ const { url } = event;
+
+ if (limit) return limit;
+
try {
return Response.json(
await (
diff --git a/src/routes/api/mangadex/feed/+server.ts b/src/routes/api/mangadex/feed/+server.ts
index ebfdd094..458d3914 100644
--- a/src/routes/api/mangadex/feed/+server.ts
+++ b/src/routes/api/mangadex/feed/+server.ts
@@ -1,9 +1,15 @@
-export const GET = async ({ url }) => {
+import { checkRateLimit } from '$lib/rateLimit.js';
+
+export const GET = async (event) => {
+ const limit = await checkRateLimit(event);
+
+ if (limit) return limit;
+
try {
return Response.json(
await (
await fetch(
- `https://api.mangadex.org/manga/${url.searchParams.get(
+ `https://api.mangadex.org/manga/${event.url.searchParams.get(
'id'
)}/feed?order[chapter]=desc&translatedLanguage[]=en&limit=1&contentRating[]=safe&contentRating[]=suggestive&contentRating[]=erotica&contentRating[]=pornographic`
)
diff --git a/src/routes/api/mangadex/manga/+server.ts b/src/routes/api/mangadex/manga/+server.ts
index 521bde6c..73c15481 100644
--- a/src/routes/api/mangadex/manga/+server.ts
+++ b/src/routes/api/mangadex/manga/+server.ts
@@ -1,4 +1,11 @@
-export const GET = async ({ url }) => {
+import { checkRateLimit } from '$lib/rateLimit.js';
+
+export const GET = async (event) => {
+ const limit = await checkRateLimit(event);
+ const { url } = event;
+
+ if (limit) return limit;
+
let status = '';
let error = false;