Skip to content

Commit cd2bee0

Browse files
authored
Merge branch 'main' into feat/auto-generate-docs
2 parents 0bfe053 + fd75d39 commit cd2bee0

File tree

31 files changed

+325
-397
lines changed

31 files changed

+325
-397
lines changed

README.md

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,30 +29,20 @@ dependencies:
2929
```dart
3030
import 'package:pharaoh/pharaoh.dart';
3131

32-
final app = Pharaoh();
33-
3432
void main() async {
3533

36-
app.use((req, res, next) {
37-
38-
/// do something here
39-
40-
next();
41-
42-
});
43-
44-
app.get('/foo', (req, res) => res.ok("bar"));
45-
46-
final guestRouter = app.router()
34+
final guestRouter = Pharaoh.router
4735
..get('/user', (req, res) => res.ok("Hello World"))
4836
..post('/post', (req, res) => res.json({"mee": "moo"}))
4937
..put('/put', (req, res) => res.json({"pookey": "reyrey"}));
5038

51-
app.group('/guest', guestRouter);
39+
final app = Pharaoh()
40+
..use((req, res, next) => next());
41+
..get('/foo', (req, res) => res.ok("bar"))
42+
..group('/guest', guestRouter);
5243

53-
await app.listen(); // port => 3000
44+
await app.listen();
5445
}
55-
5646
```
5747

5848
See the [Pharaoh Examples](./pharaoh_examples/lib/) directory for more practical use-cases.

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
@@ -62,9 +62,9 @@ class _PharaohNextImpl implements Application {
6262
int get port => config.port;
6363

6464
Pharaoh _createPharaohInstance({OnErrorCallback? onException}) {
65-
final pharaoh = Pharaoh()
66-
..useSpanner(_spanner)
67-
..viewEngine = _viewEngine;
65+
final pharaoh = Pharaoh()..useSpanner(_spanner);
66+
Pharaoh.viewEngine = _viewEngine;
67+
6868
if (onException != null) pharaoh.onError(onException);
6969
return pharaoh;
7070
}

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+
}

0 commit comments

Comments
 (0)