blob: d931a3090e0e06bc1ab0b9977b88cc2bc47d774b [file] [log] [blame]
// 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));
}