diff --git a/src/app.ts b/src/app.ts index 7d77c6b3..0c21ecf0 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,10 +1,9 @@ import { Context, Env as HonoEnv, Handler, Hono, Input as HonoInput, MiddlewareHandler } from '@hono/hono'; import { cors } from '@hono/hono/cors'; -import { getConnInfo, serveStatic } from '@hono/hono/deno'; +import { serveStatic } from '@hono/hono/deno'; import { logger } from '@hono/hono/logger'; import { NostrEvent, NostrSigner, NStore, NUploader } from '@nostrify/nostrify'; import Debug from '@soapbox/stickynotes/debug'; -import { rateLimiter } from 'hono-rate-limiter'; import { Conf } from '@/config.ts'; import { cron } from '@/cron.ts'; @@ -16,6 +15,7 @@ import { accountLookupController, accountSearchController, accountStatusesController, + blockController, createAccountController, familiarFollowersController, favouritesController, @@ -24,6 +24,7 @@ import { followingController, muteController, relationshipsController, + unblockController, unfollowController, unmuteController, updateCredentialsController, @@ -112,11 +113,10 @@ import { nodeInfoController, nodeInfoSchemaController } from '@/controllers/well import { nostrController } from '@/controllers/well-known/nostr.ts'; import { auth98Middleware, requireProof, requireRole } from '@/middleware/auth98Middleware.ts'; import { cspMiddleware } from '@/middleware/cspMiddleware.ts'; +import { rateLimitMiddleware } from '@/middleware/rateLimitMiddleware.ts'; import { requireSigner } from '@/middleware/requireSigner.ts'; import { signerMiddleware } from '@/middleware/signerMiddleware.ts'; import { storeMiddleware } from '@/middleware/storeMiddleware.ts'; -import { blockController } from '@/controllers/api/accounts.ts'; -import { unblockController } from '@/controllers/api/accounts.ts'; import { uploaderMiddleware } from '@/middleware/uploaderMiddleware.ts'; interface AppEnv extends HonoEnv { @@ -147,15 +147,7 @@ if (Conf.cronEnabled) { cron(); } -// @ts-ignore Mismatched Hono versions. -const limiter: MiddlewareHandler = rateLimiter({ - limit: 300, - windowMs: Time.minutes(5), - // @ts-ignore Mismatched Hono versions. - keyGenerator: (c) => getConnInfo(c).remote.address!, -}); - -app.use('*', limiter); +app.use('*', rateLimitMiddleware(300, Time.minutes(5))); app.use('/api/*', logger(debug)); app.use('/.well-known/*', logger(debug)); diff --git a/src/middleware/rateLimitMiddleware.ts b/src/middleware/rateLimitMiddleware.ts new file mode 100644 index 00000000..9aeef34b --- /dev/null +++ b/src/middleware/rateLimitMiddleware.ts @@ -0,0 +1,12 @@ +import { MiddlewareHandler } from '@hono/hono'; +import { rateLimiter } from 'hono-rate-limiter'; + +/** Rate limit middleware for Hono. */ +export function rateLimitMiddleware(limit: number, windowMs: number): MiddlewareHandler { + return rateLimiter({ + limit, + windowMs, + skip: (c) => !c.req.header('x-real-ip'), + keyGenerator: (c) => c.req.header('x-real-ip')!, + }); +}