waterfall now only accepts RequestHandler

This commit is contained in:
Tobe O 2018-08-20 15:50:29 -04:00
parent b95f6b26e2
commit a814e3d1a7
2 changed files with 12 additions and 10 deletions

View file

@ -32,3 +32,5 @@ as well as `query`.
* Removed `Angel.injections` and `RequestContext.injections`. * Removed `Angel.injections` and `RequestContext.injections`.
* Removed `Angel.inject`. * Removed `Angel.inject`.
* Removed a dependency on `package:pool`, which also meant removing `AngelHttp.throttle`. * Removed a dependency on `package:pool`, which also meant removing `AngelHttp.throttle`.
* Remove the `RequestMiddleware` typedef; from now on, one should use `ResponseContext.end`
exclusively to close responses.

View file

@ -1,7 +1,9 @@
library angel_framework.http.routable; library angel_framework.http.routable;
import 'dart:async'; import 'dart:async';
import 'package:angel_route/angel_route.dart'; import 'package:angel_route/angel_route.dart';
import '../util.dart'; import '../util.dart';
import 'hooked_service.dart'; import 'hooked_service.dart';
import 'metadata.dart'; import 'metadata.dart';
@ -12,32 +14,29 @@ import 'service.dart';
final RegExp _straySlashes = new RegExp(r'(^/+)|(/+$)'); final RegExp _straySlashes = new RegExp(r'(^/+)|(/+$)');
/// A function that intercepts a request and determines whether handling of it should continue.
typedef Future<bool> RequestMiddleware(RequestContext req, ResponseContext res);
/// A function that receives an incoming [RequestContext] and responds to it. /// A function that receives an incoming [RequestContext] and responds to it.
typedef FutureOr RequestHandler(RequestContext req, ResponseContext res); typedef FutureOr RequestHandler(RequestContext req, ResponseContext res);
/// Sequentially runs a list of [handlers] of middleware, and returns early if any does not /// Sequentially runs a list of [handlers] of middleware, and returns early if any does not
/// return `true`. Works well with [Router].chain. /// return `true`. Works well with [Router].chain.
RequestMiddleware waterfall(List handlers) { RequestHandler waterfall(Iterable<RequestHandler> handlers) {
return (req, res) { return (req, res) {
Future<bool> Function() runPipeline; Future Function() runPipeline;
for (var handler in handlers) { for (var handler in handlers) {
if (handler == null) break; if (handler == null) break;
if (runPipeline == null) if (runPipeline == null)
runPipeline = () => req.app.executeHandler(handler, req, res); runPipeline = () => Future.sync(() => handler(req, res));
else { else {
var current = runPipeline; var current = runPipeline;
runPipeline = () => current().then((result) => !result runPipeline = () => current().then((result) => !res.isOpen
? new Future.value(result) ? new Future.value(result)
: req.app.executeHandler(handler, req, res)); : req.app.executeHandler(handler, req, res));
} }
} }
runPipeline ??= () => new Future.value(true); runPipeline ??= () => new Future.value();
return runPipeline(); return runPipeline();
}; };
} }
@ -58,7 +57,8 @@ class Routable extends Router {
/// Additional filters to be run on designated requests. /// Additional filters to be run on designated requests.
@override @override
final Map<String, RequestHandler> requestMiddleware = <String, RequestHandler>{}; final Map<String, RequestHandler> requestMiddleware =
<String, RequestHandler>{};
/// A set of [Service] objects that have been mapped into routes. /// A set of [Service] objects that have been mapped into routes.
Map<Pattern, Service> get services => _services; Map<Pattern, Service> get services => _services;