11import type http from 'http'
22import { withoutTrailingSlash } from 'ufo'
33import { defineLazyHandler } from './handler'
4- import { toEventHandler , createEvent , isEventHandler } from './event'
4+ import { toEventHandler , createEvent , isEventHandler , defineEventHandler } from './event'
55import { createError , sendError } from './error'
66import { send , sendStream , isStream , MIMES } from './utils'
7- import type { Handler , LazyHandler , Middleware , PromisifiedHandler } from './types'
8- import type { EventHandler , CompatibilityEvent } from './event'
7+ import type { Handler , LazyHandler , Middleware } from './types'
8+ import type { EventHandler , CompatibilityEvent , CompatibilityEventHandler } from './event'
99
1010export interface Layer {
1111 route : string
@@ -30,19 +30,17 @@ export type InputStack = InputLayer[]
3030
3131export type Matcher = ( url : string , event ?: CompatibilityEvent ) => boolean
3232
33- export type RequestHandler = EventHandler | Handler | Middleware
34-
3533export interface AppUse {
36- ( route : string | string [ ] , handler : RequestHandler | RequestHandler [ ] , options ?: Partial < InputLayer > ) : App
37- ( handler : RequestHandler | Handler [ ] , options ?: Partial < InputLayer > ) : App
34+ ( route : string | string [ ] , handler : CompatibilityEventHandler | CompatibilityEventHandler [ ] , options ?: Partial < InputLayer > ) : App
35+ ( handler : CompatibilityEventHandler | CompatibilityEventHandler [ ] , options ?: Partial < InputLayer > ) : App
3836 ( options : InputLayer ) : App
3937}
4038
41- export type ApPromisifiedHandlerr = ( req : http . IncomingMessage , res : http . ServerResponse ) => Promise < any >
39+ export type NodeHandler = ( req : http . IncomingMessage , res : http . ServerResponse ) => void | Promise < void >
4240
43- export interface App extends ApPromisifiedHandlerr {
41+ export interface App extends NodeHandler {
4442 stack : Stack
45- _handler : PromisifiedHandler
43+ handler : EventHandler
4644 use : AppUse
4745}
4846
@@ -54,20 +52,23 @@ export interface AppOptions {
5452export function createApp ( options : AppOptions = { } ) : App {
5553 const stack : Stack = [ ]
5654
57- const _handler = createHandler ( stack , options )
55+ const handler = createAppEventHandler ( stack , options )
5856
59- const app : App = function ( req , res ) {
57+ const nodeHandler : NodeHandler = async function ( req , res ) {
6058 const event = createEvent ( req , res )
61- return _handler ( event ) . catch ( ( error : Error ) => {
59+ try {
60+ await handler ( event )
61+ } catch ( err ) {
6262 if ( options . onError ) {
63- return options . onError ( error , event )
63+ await options . onError ( err as Error , event )
6464 }
65- return sendError ( event , error , ! ! options . debug )
66- } )
67- } as App
65+ await sendError ( event , err as Error , ! ! options . debug )
66+ }
67+ }
6868
69+ const app = nodeHandler as App
6970 app . stack = stack
70- app . _handler = _handler
71+ app . handler = handler
7172
7273 // @ts -ignore
7374 app . use = ( arg1 , arg2 , arg3 ) => use ( app as App , arg1 , arg2 , arg3 )
@@ -95,11 +96,10 @@ export function use (
9596 return app
9697}
9798
98- export function createHandler ( stack : Stack , options : AppOptions ) {
99+ export function createAppEventHandler ( stack : Stack , options : AppOptions ) {
99100 const spacing = options . debug ? 2 : undefined
100- return async function handle ( event : CompatibilityEvent ) {
101+ return defineEventHandler ( async ( event ) => {
101102 event . req . originalUrl = event . req . originalUrl || event . req . url || '/'
102-
103103 const reqUrl = event . req . url || '/'
104104 for ( const layer of stack ) {
105105 if ( layer . route . length > 1 ) {
@@ -135,11 +135,16 @@ export function createHandler (stack: Stack, options: AppOptions) {
135135 if ( ! event . res . writableEnded ) {
136136 throw createError ( { statusCode : 404 , statusMessage : 'Not Found' } )
137137 }
138- }
138+ } )
139139}
140140
141141function normalizeLayer ( input : InputLayer ) {
142142 let handler = input . handler
143+ // @ts -ignore
144+ if ( handler . handler ) {
145+ // @ts -ignore
146+ handler = handler . handler
147+ }
143148 if ( ! isEventHandler ( handler ) ) {
144149 if ( input . lazy ) {
145150 handler = defineLazyHandler ( handler as LazyHandler )
0 commit comments