onService, onController
This commit is contained in:
parent
76d26ea9c5
commit
4c9db6f932
5 changed files with 39 additions and 11 deletions
|
@ -1,12 +1,14 @@
|
||||||
part of angel_framework.http;
|
part of angel_framework.http;
|
||||||
|
|
||||||
class Controller {
|
class Controller {
|
||||||
|
Angel app;
|
||||||
List middleware = [];
|
List middleware = [];
|
||||||
List<Route> routes = [];
|
List<Route> routes = [];
|
||||||
Map<String, Route> _mappings = {};
|
Map<String, Route> _mappings = {};
|
||||||
Expose exposeDecl;
|
Expose exposeDecl;
|
||||||
|
|
||||||
Future call(Angel app) async {
|
Future call(Angel app) async {
|
||||||
|
this.app = app;
|
||||||
Routable routable = new Routable()
|
Routable routable = new Routable()
|
||||||
..routes.addAll(routes);
|
..routes.addAll(routes);
|
||||||
app.use(exposeDecl.path, routable);
|
app.use(exposeDecl.path, routable);
|
||||||
|
|
|
@ -40,6 +40,13 @@ class Routable extends Extensible {
|
||||||
/// A set of [Controller] objects that have been loaded into the application.
|
/// A set of [Controller] objects that have been loaded into the application.
|
||||||
Map<String, Controller> controllers = {};
|
Map<String, Controller> controllers = {};
|
||||||
|
|
||||||
|
StreamController<Service> _onService = new StreamController<Service>.broadcast();
|
||||||
|
|
||||||
|
/// Fired whenever a service is added to this instance.
|
||||||
|
///
|
||||||
|
/// **NOTE**: This is a broadcast stream.
|
||||||
|
Stream<Service> get onService => _onService.stream;
|
||||||
|
|
||||||
/// Assigns a middleware to a name for convenience.
|
/// Assigns a middleware to a name for convenience.
|
||||||
registerMiddleware(String name, RequestMiddleware middleware) {
|
registerMiddleware(String name, RequestMiddleware middleware) {
|
||||||
this.requestMiddleware[name] = middleware;
|
this.requestMiddleware[name] = middleware;
|
||||||
|
@ -61,7 +68,7 @@ class Routable extends Extensible {
|
||||||
/// For example, if the [Routable] has a middleware 'y', and the `middlewareNamespace`
|
/// For example, if the [Routable] has a middleware 'y', and the `middlewareNamespace`
|
||||||
/// is 'x', then that middleware will be available as 'x.y' in the main application.
|
/// is 'x', then that middleware will be available as 'x.y' in the main application.
|
||||||
/// These namespaces can be nested.
|
/// These namespaces can be nested.
|
||||||
use(Pattern path, Routable routable,
|
void use(Pattern path, Routable routable,
|
||||||
{bool hooked: true, String middlewareNamespace: null}) {
|
{bool hooked: true, String middlewareNamespace: null}) {
|
||||||
Routable _routable = routable;
|
Routable _routable = routable;
|
||||||
|
|
||||||
|
@ -115,6 +122,9 @@ class Routable extends Extensible {
|
||||||
new RegExp(r'(^\/+)|(\/+$)'), '') + '/$servicePath';
|
new RegExp(r'(^\/+)|(\/+$)'), '') + '/$servicePath';
|
||||||
services[newServicePath] = _routable.services[servicePath];
|
services[newServicePath] = _routable.services[servicePath];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (routable is Service)
|
||||||
|
_onService.add(routable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds a route that responds to the given path
|
/// Adds a route that responds to the given path
|
||||||
|
|
|
@ -4,8 +4,8 @@ part of angel_framework.http;
|
||||||
typedef Future<HttpServer> ServerGenerator(InternetAddress address, int port);
|
typedef Future<HttpServer> ServerGenerator(InternetAddress address, int port);
|
||||||
|
|
||||||
/// Handles an [AngelHttpException].
|
/// Handles an [AngelHttpException].
|
||||||
typedef Future AngelErrorHandler(
|
typedef Future AngelErrorHandler(AngelHttpException err, RequestContext req,
|
||||||
AngelHttpException err, RequestContext req, ResponseContext res);
|
ResponseContext res);
|
||||||
|
|
||||||
/// A function that configures an [Angel] server in some way.
|
/// A function that configures an [Angel] server in some way.
|
||||||
typedef Future AngelConfigurer(Angel app);
|
typedef Future AngelConfigurer(Angel app);
|
||||||
|
@ -14,15 +14,25 @@ typedef Future AngelConfigurer(Angel app);
|
||||||
class Angel extends Routable {
|
class Angel extends Routable {
|
||||||
var _beforeProcessed = new StreamController<HttpRequest>();
|
var _beforeProcessed = new StreamController<HttpRequest>();
|
||||||
var _afterProcessed = new StreamController<HttpRequest>();
|
var _afterProcessed = new StreamController<HttpRequest>();
|
||||||
|
var _onController = new StreamController<Controller>.broadcast();
|
||||||
|
|
||||||
|
/// Fired before a request is processed. Always runs.
|
||||||
Stream<HttpRequest> get beforeProcessed => _beforeProcessed.stream;
|
Stream<HttpRequest> get beforeProcessed => _beforeProcessed.stream;
|
||||||
|
|
||||||
|
/// Fired after a request is processed. Always runs.
|
||||||
Stream<HttpRequest> get afterProcessed => _afterProcessed.stream;
|
Stream<HttpRequest> get afterProcessed => _afterProcessed.stream;
|
||||||
|
|
||||||
|
/// Fired whenever a controller is added to this instance.
|
||||||
|
///
|
||||||
|
/// **NOTE**: This is a broadcast stream.
|
||||||
|
Stream<Controller> get onController => _onController.stream;
|
||||||
|
|
||||||
ServerGenerator _serverGenerator =
|
ServerGenerator _serverGenerator =
|
||||||
(address, port) async => await HttpServer.bind(address, port);
|
(address, port) async => await HttpServer.bind(address, port);
|
||||||
|
|
||||||
/// Default error handler, show HTML error page
|
/// Default error handler, show HTML error page
|
||||||
AngelErrorHandler _errorHandler = (AngelHttpException e, req, ResponseContext res) {
|
AngelErrorHandler _errorHandler = (AngelHttpException e, req,
|
||||||
|
ResponseContext res) {
|
||||||
res.header(HttpHeaders.CONTENT_TYPE, ContentType.HTML.toString());
|
res.header(HttpHeaders.CONTENT_TYPE, ContentType.HTML.toString());
|
||||||
res.status(e.statusCode);
|
res.status(e.statusCode);
|
||||||
res.write("<!DOCTYPE html><html><head><title>${e.message}</title>");
|
res.write("<!DOCTYPE html><html><head><title>${e.message}</title>");
|
||||||
|
@ -37,7 +47,8 @@ class Angel extends Routable {
|
||||||
/// A function that renders views.
|
/// A function that renders views.
|
||||||
///
|
///
|
||||||
/// Called by [ResponseContext]@`render`.
|
/// Called by [ResponseContext]@`render`.
|
||||||
ViewGenerator viewGenerator = (String view, [Map data]) async => "No view engine has been configured yet.";
|
ViewGenerator viewGenerator = (String view,
|
||||||
|
[Map data]) async => "No view engine has been configured yet.";
|
||||||
|
|
||||||
/// [RequestMiddleware] to be run before all requests.
|
/// [RequestMiddleware] to be run before all requests.
|
||||||
List before = [];
|
List before = [];
|
||||||
|
@ -64,7 +75,8 @@ class Angel extends Routable {
|
||||||
Future handleRequest(HttpRequest request) async {
|
Future handleRequest(HttpRequest request) async {
|
||||||
_beforeProcessed.add(request);
|
_beforeProcessed.add(request);
|
||||||
String req_url =
|
String req_url =
|
||||||
request.uri.toString().replaceAll("?" + request.uri.query, "").replaceAll(new RegExp(r'\/+$'), '');
|
request.uri.toString().replaceAll("?" + request.uri.query, "").replaceAll(
|
||||||
|
new RegExp(r'\/+$'), '');
|
||||||
if (req_url.isEmpty) req_url = '/';
|
if (req_url.isEmpty) req_url = '/';
|
||||||
RequestContext req = await RequestContext.from(request, {}, this, null);
|
RequestContext req = await RequestContext.from(request, {}, this, null);
|
||||||
ResponseContext res = await ResponseContext.from(request.response, this);
|
ResponseContext res = await ResponseContext.from(request.response, this);
|
||||||
|
@ -122,8 +134,8 @@ class Angel extends Routable {
|
||||||
_finalizeResponse(request, res);
|
_finalizeResponse(request, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _applyHandler(
|
Future<bool> _applyHandler(handler, RequestContext req,
|
||||||
handler, RequestContext req, ResponseContext res) async {
|
ResponseContext res) async {
|
||||||
if (handler is RequestMiddleware) {
|
if (handler is RequestMiddleware) {
|
||||||
var result = await handler(req, res);
|
var result = await handler(req, res);
|
||||||
if (result is bool)
|
if (result is bool)
|
||||||
|
@ -190,6 +202,9 @@ class Angel extends Routable {
|
||||||
/// Applies an [AngelConfigurer] to this instance.
|
/// Applies an [AngelConfigurer] to this instance.
|
||||||
Future configure(AngelConfigurer configurer) async {
|
Future configure(AngelConfigurer configurer) async {
|
||||||
await configurer(this);
|
await configurer(this);
|
||||||
|
|
||||||
|
if (configurer is Controller)
|
||||||
|
_onController.add(configurer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Starts the server.
|
/// Starts the server.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel_framework
|
name: angel_framework
|
||||||
version: 1.0.0-dev.13
|
version: 1.0.0-dev.14
|
||||||
description: Core libraries for the Angel framework.
|
description: Core libraries for the Angel framework.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/angel_framework
|
homepage: https://github.com/angel-dart/angel_framework
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:angel_framework/defs.dart';
|
||||||
import 'package:angel_framework/angel_framework.dart';
|
import 'package:angel_framework/angel_framework.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:json_god/json_god.dart' as god;
|
import 'package:json_god/json_god.dart' as god;
|
||||||
|
|
Loading…
Reference in a new issue