Skip to content

Commit

Permalink
ref: extra rate limiters
Browse files Browse the repository at this point in the history
  • Loading branch information
Sv443 committed Mar 4, 2024
1 parent c1ac0b5 commit e907210
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 23 deletions.
1 change: 1 addition & 0 deletions data/jokes
Submodule jokes added at 6dbd28
1 change: 1 addition & 0 deletions data/jokes-bak
Submodule jokes-bak added at 6dbd28
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import k from "kleur";

import * as lists from "./lists.js";
import * as auth from "./auth.js";
import * as server from "./server.js";
import * as server from "./server/index.js";
import * as meter from "./meter.js";

import { settings } from "./settings.js";
Expand Down
10 changes: 10 additions & 0 deletions src/rateLimiters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { RateLimiterMemory } from "rate-limiter-flexible";
import { settings } from "./settings.js";

// TODO: fine tune & implement rate limiters for different tiers

/** Generic rate limiter applied everywhere for coarse rate limiting */
export const genericRateLimit = new RateLimiterMemory({
points: settings.server.rateLimit.generic.points,
duration: settings.server.rateLimit.generic.duration,
});
32 changes: 14 additions & 18 deletions src/server.ts → src/server/index.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,26 @@
import express, { type NextFunction, type Request, type Response } from "express";
import express, { type NextFunction, type Request, type Response, type Router } from "express";
import compression from "compression";
import cors from "cors";
import helmet from "helmet";
import { RateLimiterMemory, RateLimiterRes } from "rate-limiter-flexible";
import { RateLimiterRes } from "rate-limiter-flexible";
import { check as portUsed } from "tcp-port-used";
import js2xml from "js2xmlparser";
import { getClientIp } from "request-ip";

import { settings } from "./settings.js";
import { initFuncs as routeInitFuncs } from "./routes/index.js";
import { error } from "./error.js";
import { validToken } from "./auth.js";
import { createHash } from "node:crypto";

import type { JSONCompatible } from "svcorelib";
import type { ResponseFormat } from "./types";

export const name = "server";
import { settings } from "../settings.js";
import { initFuncs as routeInitFuncs } from "../routes/index.js";
import { error } from "../error.js";
import { validToken } from "../auth.js";
import { genericRateLimit } from "../rateLimiters.js";

const app = createApp();
import type { ResponseFormat } from "../types/index.js";

export const name = "server";

// TODO: fine tune & implement rate limiters for different tiers
const rateLimiter = new RateLimiterMemory({
points: settings.server.rateLimit.points,
duration: settings.server.rateLimit.duration,
});
export const app = createApp();
export let router: Router;

export async function init() {
if(await portUsed(settings.server.port))
Expand Down Expand Up @@ -63,7 +59,7 @@ export async function init() {
const ip = clientIp ? hashIp(clientIp) : null;

if(ip) {
rateLimiter.consume(ip)
genericRateLimit.consume(ip)
.catch((err) => {
if(err instanceof RateLimiterRes) {
addRateLimitHeaders(res, err);
Expand Down Expand Up @@ -111,7 +107,7 @@ function createApp() {

/** Registers all endpoints */
function registerEndpoints() {
const router = express.Router();
router = express.Router();

router.get("/", (_req, res) => {
// TODO: Redirect to docs
Expand Down
8 changes: 5 additions & 3 deletions src/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ export const settings = {
/** port for HTTP requests */
port: getEnvVar("HTTP_PORT", "numberNoEmpty") ?? 8060,
rateLimit: {
points: 300,
duration: 60 * 30,
generic: {
points: 300,
duration: 60 * 30,
},
},
},
};
} as const;
12 changes: 11 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,17 @@
"removeComments": true,
"sourceMap": true,
"useDefineForClassFields": true,
"noImplicitThis": false
"noImplicitThis": false,
"paths": {
"src/*": ["src/*"],
"@src/*": ["src/*"],
"server/*": ["src/server/*"],
"@server/*": ["src/server/*"],
"db/*": ["src/database/*"],
"@db/*": ["src/database/*"],
"types/*": ["src/types/*"],
"@types/*": ["src/types/*"],
},
},
"ts-node": {
"esm": true,
Expand Down

0 comments on commit e907210

Please sign in to comment.