buildMiddlewareChain function

Handler buildMiddlewareChain(
  1. List<Middleware> middlewares,
  2. Handler finalHandler
)

Builds a handler chain from middlewares.

Example:

final chain = buildMiddlewareChain(
  [AuthMiddleware(), LoggerMiddleware()],
  (ctx) async {
    await ctx.res.json({'status': 'ok'});
  },
);

final ctx = TestContext.get('/');
await chain(ctx);
expect(ctx.response.statusCode, 200);

Implementation

Handler buildMiddlewareChain(
  List<Middleware> middlewares,
  Handler finalHandler,
) {
  Handler current = finalHandler;
  for (var i = middlewares.length - 1; i >= 0; i--) {
    final mw = middlewares[i];
    final next = current;
    current = (ctx) => mw.handle(ctx, () => next(ctx));
  }
  // Wrap to handle Response returns like Chase does
  return (ctx) async {
    final result = await current(ctx);
    if (result is Response) {
      await result.writeTo(ctx.res.$raw);
    }
    return result;
  };
}