Skip to content

Commit f21d4db

Browse files
authored
chore: Rework req res hook (#138)
* rework request :onBefore and :onAfter hook * _ * _ * _ * _ * improvements to spanner * fix implementation for re-attaching nodes back into pharaoh tree * rework pharaoh exports * _
1 parent 0be851e commit f21d4db

File tree

30 files changed

+319
-381
lines changed

30 files changed

+319
-381
lines changed

packages/pharaoh/lib/pharaoh.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
library;
22

3-
export 'src/core.dart' hide $PharaohImpl;
43
export 'src/view/view.dart';
54
export 'src/http/cookie.dart';
65
export 'src/http/request.dart';
76
export 'src/http/response.dart';
7+
export 'src/http/router.dart';
8+
9+
export 'src/shelf_interop/adapter.dart';
10+
export 'src/shelf_interop/shelf.dart' show ShelfBody;
11+
812
export 'src/utils/utils.dart';
913
export 'src/utils/exceptions.dart';
10-
export 'src/router/router_handler.dart';
14+
1115
export 'src/middleware/session_mw.dart';
1216
export 'src/middleware/body_parser.dart';
1317
export 'src/middleware/cookie_parser.dart';
1418
export 'src/middleware/request_logger.dart';
1519

16-
// shelf
17-
export 'src/shelf_interop/adapter.dart';
18-
export 'src/shelf_interop/shelf.dart' show ShelfBody;
20+
export 'package:spanner/spanner.dart' show HTTPMethod;
Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
export 'src/_next/validation.dart';
2-
export 'src/_next/router.dart';
1+
export 'pharaoh.dart';
32
export 'src/_next/core.dart';
43
export 'src/_next/http.dart';
5-
export 'src/core.dart';
6-
7-
export 'src/http/response.dart';
8-
export 'src/http/request.dart';
9-
export 'src/router/router_handler.dart';
10-
export 'package:spanner/spanner.dart' show HTTPMethod;
4+
export 'src/_next/router.dart';
5+
export 'src/_next/validation.dart';

packages/pharaoh/lib/src/_next/_core/core_impl.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ class _PharaohNextImpl implements Application {
3838
int get port => config.port;
3939

4040
Pharaoh _createPharaohInstance({OnErrorCallback? onException}) {
41-
final pharaoh = Pharaoh()
42-
..useSpanner(_spanner)
43-
..viewEngine = _viewEngine;
41+
final pharaoh = Pharaoh()..useSpanner(_spanner);
42+
Pharaoh.viewEngine = _viewEngine;
43+
4444
if (onException != null) pharaoh.onError(onException);
4545
return pharaoh;
4646
}

packages/pharaoh/lib/src/_next/http.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'dart:io';
55
import '../http/request.dart';
66
import '../http/response.dart';
77
import '../middleware/session_mw.dart';
8-
import '../router/router_handler.dart';
8+
import '../http/router.dart';
99
import 'core.dart';
1010

1111
@inject

packages/pharaoh/lib/src/_next/router.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:grammer/grammer.dart';
99
import 'package:meta/meta.dart';
1010
import '../http/request.dart';
1111
import '../http/response.dart';
12-
import '../router/router_handler.dart';
12+
import '../http/router.dart';
1313
import 'validation.dart';
1414
import 'core.dart';
1515

packages/pharaoh/lib/src/core.dart

Lines changed: 0 additions & 55 deletions
This file was deleted.

packages/pharaoh/lib/src/http/request.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:io';
22

33
import 'package:http_parser/http_parser.dart';
44
import 'package:pharaoh/pharaoh.dart';
5-
import 'package:spanner/spanner.dart';
65

76
import 'message.dart';
87

@@ -15,8 +14,7 @@ class RequestContext {
1514
/// cookies & session
1615
static const String cookies = '$phar.cookies';
1716
static const String signedCookies = '$phar.signedcookies';
18-
static const String session = '$phar.session.cookie';
19-
static const String sessionId = '$phar.session.id';
17+
static const String session = '$phar.session';
2018
}
2119

2220
HTTPMethod getHttpMethod(HttpRequest req) => switch (req.method) {

packages/pharaoh/lib/src/http/request_impl.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class _$RequestImpl extends Request {
7171
Session? get session => _context[RequestContext.session];
7272

7373
@override
74-
String? get sessionId => _context[RequestContext.sessionId];
74+
String? get sessionId => session?.id;
7575

7676
@override
7777
Object? operator [](String name) => _context[name];
Lines changed: 75 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,70 @@
1-
part of 'core.dart';
1+
import 'dart:async';
2+
import 'dart:io';
23

3-
class $PharaohImpl extends RouterContract
4+
import 'package:collection/collection.dart';
5+
import 'package:http_parser/http_parser.dart';
6+
import 'package:meta/meta.dart';
7+
import 'package:spanner/spanner.dart';
8+
import 'package:spanner/src/tree/tree.dart' show BASE_PATH;
9+
10+
import '../middleware/body_parser.dart';
11+
import '../middleware/session_mw.dart';
12+
import '../shelf_interop/shelf.dart' as shelf;
13+
import '../utils/exceptions.dart';
14+
import '../view/view.dart';
15+
16+
import 'request.dart';
17+
import 'response.dart';
18+
19+
part 'router/router_contract.dart';
20+
part 'router/router_handler.dart';
21+
22+
typedef PharaohError = ({Object exception, StackTrace trace});
23+
24+
typedef OnErrorCallback = FutureOr<Response> Function(
25+
PharaohError error,
26+
Request req,
27+
Response res,
28+
);
29+
30+
abstract class Pharaoh implements RouterContract {
31+
static _$GroupRouter get router => _$GroupRouter();
32+
33+
factory Pharaoh() => _$PharaohImpl();
34+
35+
static ViewEngine? viewEngine;
36+
37+
void onError(OnErrorCallback onError);
38+
39+
void useSpanner(Spanner spanner);
40+
41+
void useRequestHook(RequestHook hook);
42+
43+
void group(String path, _$GroupRouter router);
44+
45+
Uri get uri;
46+
47+
Future<Pharaoh> listen({int port = 3000});
48+
49+
@visibleForTesting
50+
void handleRequest(HttpRequest httpReq);
51+
52+
Future<void> shutdown();
53+
}
54+
55+
class _$PharaohImpl extends RouterContract
456
with RouteDefinitionMixin
557
implements Pharaoh {
658
late final HttpServer _server;
759

860
OnErrorCallback? _onErrorCb;
961

10-
static ViewEngine? viewEngine_;
11-
12-
final List<ReqResHook> _preResponseHooks = [
62+
final List<RequestHook> _requestHooks = [
1363
sessionPreResponseHook,
1464
viewRenderHook,
1565
];
1666

17-
$PharaohImpl() {
67+
_$PharaohImpl() {
1868
useSpanner(Spanner());
1969
use(bodyParser);
2070
}
@@ -42,15 +92,6 @@ class $PharaohImpl extends RouterContract
4292
);
4393
}
4494

45-
@override
46-
Pharaoh group(final String path, final RouterContract router) {
47-
if (router is! GroupRouter) {
48-
throw PharaohException.value('Router is not an instance of GroupRouter');
49-
}
50-
router.commit(path, spanner);
51-
return this;
52-
}
53-
5495
@override
5596
Future<Pharaoh> listen({int port = 3000}) async {
5697
_server = await HttpServer.bind(InternetAddress.anyIPv4, port, shared: true)
@@ -114,21 +155,22 @@ class $PharaohImpl extends RouterContract
114155
req.params.addAll(routeResult.params);
115156
}
116157

117-
reqRes = await executeHandlers(resolvedHandlers, reqRes);
118-
119-
for (final job in _preResponseHooks) {
120-
reqRes = await Future.microtask(() => job(reqRes));
158+
for (final hook in _requestHooks.whereNot((e) => e.onBefore == null)) {
159+
reqRes = await hook.onBefore!.call(req, reqRes.res);
121160
}
122161

123-
if (!reqRes.res.ended) {
124-
return reqRes.merge(routeNotFound());
162+
reqRes = await executeHandlers(resolvedHandlers, reqRes);
163+
if (!reqRes.res.ended) reqRes = reqRes.merge(routeNotFound());
164+
165+
for (final hook in _requestHooks.whereNot((e) => e.onAfter == null)) {
166+
reqRes = await hook.onAfter!.call(reqRes.req, reqRes.res);
125167
}
126168

127169
return reqRes;
128170
}
129171

130172
Future<void> forward(HttpRequest request, Response res_) async {
131-
var coding = res_.headers['transfer-encoding'];
173+
var coding = res_.headers[HttpHeaders.transferEncodingHeader];
132174

133175
final statusCode = res_.statusCode;
134176
request.response.statusCode = statusCode;
@@ -187,14 +229,21 @@ class $PharaohImpl extends RouterContract
187229
Future<void> shutdown() async => _server.close();
188230

189231
@override
190-
ViewEngine? get viewEngine => viewEngine_;
232+
void onError(OnErrorCallback errorCb) => _onErrorCb = errorCb;
191233

192234
@override
193-
set viewEngine(ViewEngine? engine) => viewEngine_ = engine;
235+
void useRequestHook(RequestHook hook) => _requestHooks.add(hook);
194236

195237
@override
196-
void onError(OnErrorCallback errorCb) => _onErrorCb = errorCb;
238+
void group(String path, _$GroupRouter router) {
239+
spanner.attachNode(path, router.spanner.root);
240+
}
197241
}
198242

199-
// ignore: constant_identifier_names
200243
const _XPoweredByHeader = 'X-Powered-By';
244+
245+
class _$GroupRouter extends RouterContract with RouteDefinitionMixin {
246+
_$GroupRouter() {
247+
useSpanner(Spanner());
248+
}
249+
}

packages/pharaoh/lib/src/router/router_mixin.dart renamed to packages/pharaoh/lib/src/http/router/router_contract.dart

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
1-
import 'package:spanner/spanner.dart';
2-
import 'package:spanner/src/tree/tree.dart' show BASE_PATH;
1+
part of '../router.dart';
32

4-
import 'router_contract.dart';
5-
import 'router_handler.dart';
3+
sealed class RouterContract {
4+
void get(String path, RequestHandler hdler);
5+
6+
void post(String path, RequestHandler hdler);
7+
8+
void put(String path, RequestHandler hdler);
9+
10+
void delete(String path, RequestHandler hdler);
11+
12+
void head(String path, RequestHandler hdler);
13+
14+
void patch(String path, RequestHandler hdler);
15+
16+
void options(String path, RequestHandler hdler);
17+
18+
void trace(String path, RequestHandler hdler);
19+
20+
void use(Middleware middleware);
21+
22+
void on(String path, Middleware hdler, {HTTPMethod method = HTTPMethod.ALL});
23+
}
624

725
mixin RouteDefinitionMixin on RouterContract {
826
late Spanner spanner;

0 commit comments

Comments
 (0)