Skip to content

Commit

Permalink
feat: support lazy event handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
pi0 committed Mar 29, 2022
1 parent 1ba6019 commit 333a4ca
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 10 deletions.
15 changes: 7 additions & 8 deletions src/app.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import type http from 'http'
import { withoutTrailingSlash } from 'ufo'
import { defineLazyHandler } from './handler'
import { toEventHandler, createEvent, isEventHandler, defineEventHandler } from './event'
import { defineLazyEventHandler, toEventHandler, createEvent, isEventHandler, defineEventHandler } from './event'
import { createError, sendError } from './error'
import { send, sendStream, isStream, MIMES } from './utils'
import type { Handler, LazyHandler, Middleware } from './types'
import type { EventHandler, CompatibilityEvent, CompatibilityEventHandler } from './event'
import type { EventHandler, CompatibilityEvent, CompatibilityEventHandler, LazyEventHandler } from './event'

export interface Layer {
route: string
Expand All @@ -18,7 +17,7 @@ export type Stack = Layer[]
export interface InputLayer {
route?: string
match?: Matcher
handler: Handler | LazyHandler
handler: Handler | LazyHandler | EventHandler | LazyEventHandler
lazy?: boolean
/** @deprecated */
handle?: Handler
Expand Down Expand Up @@ -147,10 +146,10 @@ function normalizeLayer (input: InputLayer) {
// @ts-ignore
handler = handler.handler
}
if (!isEventHandler(handler)) {
if (input.lazy) {
handler = defineLazyHandler(handler as LazyHandler)
}

if (input.lazy) {
handler = defineLazyEventHandler(handler as LazyEventHandler)
} else if (!isEventHandler(handler)) {
handler = toEventHandler(handler)
}

Expand Down
5 changes: 3 additions & 2 deletions src/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,15 @@ export function defineEventHandler (handler: EventHandler) {
return handler
}

export function defineLazyEventHandler (factory: () => EventHandler | Promise<EventHandler>): EventHandler {
export type LazyEventHandler = () => EventHandler | Promise<EventHandler>
export function defineLazyEventHandler (factory: LazyEventHandler): EventHandler {
let _promise: Promise<EventHandler>
let _resolved: EventHandler
const resolveHandler = () => {
if (_resolved) { return Promise.resolve(_resolved) }
if (!_promise) {
_promise = Promise.resolve(factory()).then((r: any) => {
_resolved = r.default || r
_resolved = toEventHandler(r.default || r)
return _resolved
})
}
Expand Down

0 comments on commit 333a4ca

Please sign in to comment.