Skip to content

Commit c722091

Browse files
committed
feat(app): use node handler signuture
1 parent 9bdc57a commit c722091

File tree

4 files changed

+35
-28
lines changed

4 files changed

+35
-28
lines changed

src/app.ts

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import type http from 'http'
22
import { withoutTrailingSlash } from 'ufo'
33
import { defineLazyHandler } from './handler'
4-
import { toEventHandler, createEvent, isEventHandler } from './event'
4+
import { toEventHandler, createEvent, isEventHandler, defineEventHandler } from './event'
55
import { createError, sendError } from './error'
66
import { 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

1010
export interface Layer {
1111
route: string
@@ -30,19 +30,17 @@ export type InputStack = InputLayer[]
3030

3131
export type Matcher = (url: string, event?: CompatibilityEvent) => boolean
3232

33-
export type RequestHandler = EventHandler | Handler | Middleware
34-
3533
export 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 {
5452
export 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

141141
function 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)

src/event.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ export function isEventHandler (input: any): input is EventHandler {
5454
return '__is_handler__' in input
5555
}
5656

57-
export function toEventHandler (handler: EventHandler | Handler | Middleware): EventHandler {
57+
export type CompatibilityEventHandler = EventHandler | Handler | Middleware
58+
59+
export function toEventHandler (handler: CompatibilityEventHandler): EventHandler {
5860
if (isEventHandler(handler)) {
5961
return handler
6062
}

src/router.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import { createRouter as _createRouter } from 'radix3'
22
import type { HTTPMethod } from './types'
33
import { createError } from './error'
44
import { defineEventHandler, EventHandler, toEventHandler } from './event'
5-
import type { RequestHandler } from './app'
5+
import type { CompatibilityEventHandler } from './event'
66

77
export type RouterMethod = Lowercase<HTTPMethod>
88
const RouterMethods: Lowercase<RouterMethod>[] = ['connect', 'delete', 'get', 'head', 'options', 'post', 'put', 'trace']
99

10-
export type AddWithMethod = (path: string, handler: RequestHandler) => Router
10+
export type AddWithMethod = (path: string, handler: CompatibilityEventHandler) => Router
1111
export type AddRouteShortcuts = Record<Lowercase<HTTPMethod>, AddWithMethod>
1212

1313
export interface Router extends AddRouteShortcuts {
14-
add: (path: string, handler: RequestHandler, method?: RouterMethod | 'all') => Router
15-
handler: RequestHandler
14+
add: (path: string, handler: CompatibilityEventHandler, method?: RouterMethod | 'all') => Router
15+
handler: EventHandler
1616
}
1717

1818
interface RouteNode {

src/utils/response.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export function isStream (data: any) {
4747
return data && typeof data === 'object' && typeof data.pipe === 'function' && typeof data.on === 'function'
4848
}
4949

50-
export function sendStream (event: CompatibilityEvent, data: any) {
50+
export function sendStream (event: CompatibilityEvent, data: any): Promise<void> {
5151
return new Promise((resolve, reject) => {
5252
data.pipe(event.res)
5353
data.on('end', () => resolve(undefined))

0 commit comments

Comments
 (0)