diff --git a/packages/server/src/adapters/node/body-limit-plugin.ts b/packages/server/src/adapters/node/body-limit-plugin.ts index 5deb2ad5e..c9940fe7a 100644 --- a/packages/server/src/adapters/node/body-limit-plugin.ts +++ b/packages/server/src/adapters/node/body-limit-plugin.ts @@ -2,6 +2,7 @@ import type { Context } from '../../context' import type { NodeHttpHandlerOptions } from './handler' import type { NodeHttpHandlerPlugin } from './plugin' import { ORPCError } from '@orpc/client' +import { once } from '@orpc/shared' export interface BodyLimitPluginOptions { /** @@ -26,17 +27,13 @@ export class BodyLimitPlugin implements NodeHttpHandlerPlugin options.adapterInterceptors ??= [] options.adapterInterceptors.push(async (options) => { - let isHeaderChecked = false - - const checkHeader = () => { - if (!isHeaderChecked && Number(options.request.headers['content-length']) > this.maxBodySize) { + const checkHeader = once(() => { + if (Number(options.request.headers['content-length']) > this.maxBodySize) { throw new ORPCError('PAYLOAD_TOO_LARGE') } + }) - isHeaderChecked = true - } - - const originalEmit = options.request.emit.bind(options.request) + const originalEmit = options.request.emit let currentBodySize = 0 @@ -51,10 +48,15 @@ export class BodyLimitPlugin implements NodeHttpHandlerPlugin } } - return originalEmit(event, ...args) + return originalEmit.call(options.request, event, ...args) } - return options.next() + try { + return await options.next(options) + } + finally { + options.request.emit = originalEmit + } }) } }