diff --git a/packages/event-handler/src/rest/utils.ts b/packages/event-handler/src/rest/utils.ts index 652b41b17c..1fb3d5df96 100644 --- a/packages/event-handler/src/rest/utils.ts +++ b/packages/event-handler/src/rest/utils.ts @@ -172,9 +172,22 @@ export const composeMiddleware = (middleware: Middleware[]): Middleware => { } const middlewareFn = middleware[i]; - const middlewareResult = await middlewareFn(params, reqCtx, () => - dispatch(i + 1) - ); + let nextPromise: Promise | null = null; + let nextAwaited = false; + const nextFn = async () => { + nextPromise = dispatch(i + 1); + const result = await nextPromise; + nextAwaited = true; + return result; + }; + + const middlewareResult = await middlewareFn(params, reqCtx, nextFn); + + if (nextPromise && !nextAwaited && i < middleware.length - 1) { + throw new Error( + 'Middleware called next() without awaiting. This may lead to unexpected behavior.' + ); + } if (middlewareResult !== undefined) { result = middlewareResult; diff --git a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts index 6c239c80d6..9561e1eb18 100644 --- a/packages/event-handler/tests/unit/rest/Router/middleware.test.ts +++ b/packages/event-handler/tests/unit/rest/Router/middleware.test.ts @@ -180,6 +180,32 @@ describe('Class: Router - Middleware', () => { expect(body.message).toContain('next() called multiple times'); }); + it('should throw error if middleware does not await next()', async () => { + // Prepare + vi.stubEnv('POWERTOOLS_DEV', 'true'); + const app = new Router(); + + app.use(async (_params, _reqCtx, next) => { + await next(); + }); + + app.use(async (_params, _reqCtx, next) => { + next(); + }); + + // Act + const result = await app.resolve( + createTestEvent('/test', 'OPTIONS'), + context + ); + + // Assess + const body = JSON.parse(result.body); + expect(body.message).toEqual( + 'Middleware called next() without awaiting. This may lead to unexpected behavior.' + ); + }); + it('handles errors thrown in middleware before next()', async () => { // Prepare const app = new Router();