| // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'handler.dart'; |
| import 'middleware.dart'; |
| |
| /// A helper that makes it easy to compose a set of [Middleware] and a |
| /// [Handler]. |
| /// |
| /// ```dart |
| /// var handler = const Pipeline() |
| /// .addMiddleware(loggingMiddleware) |
| /// .addMiddleware(cachingMiddleware) |
| /// .addHandler(application); |
| /// ``` |
| /// |
| /// Note: this package also provides `addMiddleware` and `addHandler` extensions |
| /// members on [Middleware], which may be easier to use. |
| class Pipeline { |
| const Pipeline(); |
| |
| /// Returns a new [Pipeline] with [middleware] added to the existing set of |
| /// [Middleware]. |
| /// |
| /// [middleware] will be the last [Middleware] to process a request and |
| /// the first to process a response. |
| Pipeline addMiddleware(Middleware middleware) => |
| _Pipeline(middleware, addHandler); |
| |
| /// Returns a new [Handler] with [handler] as the final processor of a |
| /// [Request] if all of the middleware in the pipeline have passed the request |
| /// through. |
| Handler addHandler(Handler handler) => handler; |
| |
| /// Exposes this pipeline of [Middleware] as a single middleware instance. |
| Middleware get middleware => addHandler; |
| } |
| |
| class _Pipeline extends Pipeline { |
| final Middleware _middleware; |
| final Middleware _parent; |
| |
| _Pipeline(this._middleware, this._parent); |
| |
| @override |
| Handler addHandler(Handler handler) => _parent(_middleware(handler)); |
| } |