1- import type { Handler } from '../types'
1+ import type { Handler , Layer , Next } from '../types'
22
33import { status } from '../res'
44import { handle } from './handle'
55import { Router } from './router'
66
77export class App {
88 fallback : Handler = status ( 404 )
9+ layers : Layer [ ] = [ ]
910 routes : Map < string , Handler > = new Map ( )
1011
1112 get fetch ( ) : ( req : Request ) => Promise < Response > {
1213 const router = new Router < Handler > ( )
1314 this . routes . forEach ( ( handler , path ) => router . insert ( path , handler ) )
1415
15- return async ( req ) => {
16- const result = router . find ( new URL ( req . url ) . pathname )
17-
18- return handle (
19- result ?. value ?? this . fallback ,
20- req ,
21- result ?. params ,
22- )
23- }
16+ return async req => this . handle ( req , router )
2417 }
2518
2619 constructor ( fallback ?: Handler ) {
@@ -29,8 +22,34 @@ export class App {
2922 this . fallback = fallback
3023 }
3124
25+ public async handle ( req : Request , router : Router < Handler > ) {
26+ const result = router . find ( new URL ( req . url ) . pathname )
27+
28+ const next = async ( ) => handle (
29+ result ?. value ?? this . fallback ,
30+ req ,
31+ result ?. params ,
32+ )
33+
34+ return (
35+ this . layers . length > 0
36+ ? this . layers . reduceRight < Next > (
37+ ( next , layer ) => async ( ) => layer ( req , next ) ,
38+ next ,
39+ )
40+ : next
41+ ) ( )
42+ }
43+
44+ public layer ( ...layers : Layer [ ] ) : this {
45+ this . layers . push ( ...layers )
46+
47+ return this
48+ }
49+
3250 public merge ( app : App ) : this {
3351 app . routes . forEach ( ( handler , path ) => this . routes . set ( path , handler ) )
52+ app . layers . forEach ( layer => this . layers . push ( layer ) )
3453
3554 // TODO: merge fallback
3655
0 commit comments