1- import { createServer } from 'http'
1+ import { createServer , STATUS_CODES } from 'http'
22import rg from 'regexparam'
33import {
44 Request ,
@@ -10,16 +10,22 @@ import {
1010 getRangeFromHeader ,
1111 checkIfXMLHttpRequest ,
1212 getHostname
13- } from './classes/ request'
14- import { Response , send , json , status } from './classes /response'
13+ } from './request'
14+ import { Response , send , json , status , setCookie , clearCookie , setHeader } from './response'
1515import { notFound } from './notFound'
1616
1717export const METHODS = [ 'GET' , 'POST' , 'PUT' , 'PATCH' , 'HEAD' ]
1818
19- export type Handler = ( req : Request , res : Response ) => void | Promise < void >
19+ export type Handler = ( req : Request , res : Response , next ?: ( ) => void ) => void | Promise < void >
2020
2121export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'HEAD' | string
2222
23+ export const onError = ( err : any , _req : Request , res : Response , _next : ( ) => void ) => {
24+ let code = ( res . statusCode = err . code || err . status || 500 )
25+ if ( typeof err === 'string' || Buffer . isBuffer ( err ) ) res . end ( err )
26+ else res . end ( err . message || STATUS_CODES [ code ] )
27+ }
28+
2329export interface Middleware {
2430 method ?: Method
2531 handler : Handler
@@ -46,9 +52,11 @@ const createHandler = ({
4652export class App {
4753 routes : Middleware [ ]
4854 middleware : Middleware [ ]
49- constructor ( ) {
55+ noMatchHandler : Handler
56+ constructor ( noMatchHandler : Handler = notFound ( ) ) {
5057 this . routes = [ ]
5158 this . middleware = [ ]
59+ this . noMatchHandler = noMatchHandler
5260 }
5361
5462 get ( url : string | Handler , handler ?: Handler ) {
@@ -83,68 +91,86 @@ export class App {
8391 } )
8492 return this
8593 }
94+ handle ( req : Request , res : Response ) {
95+ /// Define extensions
8696
87- listen (
88- port ?: number ,
89- cb = ( ) => console . log ( `Started on http://${ host } :${ port } ` ) ,
90- host : string = 'localhost' ,
91- backlog ?: number
92- ) {
93- // @ts -ignore
94- const server = createServer ( ( req : Request , res : Response ) => {
95- /// Define extensions
97+ /*
98+ Request extensions
99+ */
100+
101+ req . app = this
102+
103+ const proto = getProtocol ( req )
104+ const secure = proto === 'https'
105+
106+ req . protocol = proto
107+ req . secure = secure
108+ req . connection = Object . assign ( req . socket , {
109+ encrypted : secure
110+ } )
111+
112+ req . query = getQueryParams ( req . url )
96113
97- /*
98- Request extensions
99- */
100- const proto = getProtocol ( req )
101- const secure = proto === 'https'
102- req . protocol = proto
103- req . secure = secure
104- req . connection = Object . assign ( req . socket , {
105- encrypted : secure
106- } )
114+ req . get = getHeader ( req )
115+ req . range = getRangeFromHeader ( req )
107116
108- req . query = getQueryParams ( req . url )
117+ req . xhr = checkIfXMLHttpRequest ( req )
109118
110- req . get = getHeader ( req )
111- req . range = getRangeFromHeader ( req )
119+ req . hostname = getHostname ( req )
112120
113- req . xhr = checkIfXMLHttpRequest ( req )
121+ /*
122+ Response extensions
123+ */
124+ res . app = this
125+ res . header = res . set = setHeader ( req , res )
126+ res . send = send ( req , res )
127+ res . json = json ( req , res )
128+ res . status = status ( req , res )
114129
115- req . hostname = getHostname ( req )
130+ res . cookie = setCookie ( req , res )
131+ res . clearCookie = clearCookie ( req , res )
116132
117- /*
118- Response extensions
119- */
120- res . send = send ( req , res )
121- res . json = json ( req , res )
122- res . status = status ( req , res )
133+ for ( const route of this . routes ) {
134+ const { url, method, handler } = route
123135
124- this . routes . map ( ( { url, method, handler } ) => {
136+ if ( res . writableEnded ) {
137+ continue
138+ } else {
125139 if ( req . method === method ) {
126140 if ( url && req . url && rg ( url ) . pattern . test ( req . url ) ) {
127141 req . params = getURLParams ( req . url , url )
128142 req . route = getRouteFromApp ( this , handler )
129- if ( ! res . writableEnded ) {
130- res . statusCode = 200
131- handler ( req , res )
132- }
143+
144+ res . statusCode = 200
145+
146+ handler ( req , res )
133147 }
134148 }
135- } )
149+ }
150+ }
136151
137- let middleware : Middleware [ ] = this . middleware . filter ( m => m . handler . name !== 'logger' )
152+ let middleware : Middleware [ ] = this . middleware . filter ( m => m . handler . name !== 'logger' )
138153
139- middleware . push ( { handler : notFound ( ) } )
154+ middleware . push ( { handler : this . noMatchHandler } )
140155
141- const logger = this . middleware . find ( m => m . handler . name === 'logger' )
156+ const logger = this . middleware . find ( m => m . handler . name === 'logger' )
142157
143- if ( logger ) middleware . push ( logger )
158+ if ( logger ) middleware . push ( logger )
144159
145- middleware . map ( ( { handler } ) => {
146- handler ( req , res )
147- } )
160+ middleware . map ( ( { handler } ) => {
161+ handler ( req , res )
162+ } )
163+ }
164+
165+ listen (
166+ port ?: number ,
167+ cb = ( ) => console . log ( `Started on http://${ host } :${ port } ` ) ,
168+ host : string = 'localhost' ,
169+ backlog ?: number
170+ ) {
171+ // @ts -ignore
172+ const server = createServer ( ( req : Request , res : Response ) => {
173+ this . handle ( req , res )
148174 } )
149175
150176 return server . listen ( port , host , backlog , cb )
0 commit comments