Skip to content

Commit

Permalink
feat: defineRequestMidleware, defineResponseMiddleware and rename…
Browse files Browse the repository at this point in the history
… object synctax hooks (#507)
  • Loading branch information
pi0 authored Aug 14, 2023
1 parent 8079fa9 commit a3303e6
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 13 deletions.
45 changes: 38 additions & 7 deletions src/event/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@ import type {
EventHandlerRequest,
EventHandlerResponse,
EventHandlerObject,
_RequestMiddleware,
_ResponseMiddleware,
} from "../types";
import type { H3Event } from "./event";

type _EventHandlerHooks = {
onRequest?: _RequestMiddleware[];
beforeResponse?: _ResponseMiddleware[];
};

export function defineEventHandler<
Request extends EventHandlerRequest = EventHandlerRequest,
Response = EventHandlerResponse,
Expand Down Expand Up @@ -42,25 +49,37 @@ export function defineEventHandler<
return Object.assign(handler, { __is_handler__: true });
}
// Object Syntax
const _hooks: _EventHandlerHooks = {
onRequest: _normalizeArray(handler.onRequest),
beforeResponse: _normalizeArray(handler.beforeResponse),
};
const _handler: EventHandler<Request, any> = (event) => {
return _callHandler(event, handler);
return _callHandler(event, handler.handler, _hooks);
};
return Object.assign(_handler, { __is_handler__: true });
}

async function _callHandler(event: H3Event, handler: EventHandlerObject) {
if (handler.before) {
for (const hook of handler.before) {
function _normalizeArray<T>(input?: T | T[]): T[] | undefined {
return input ? (Array.isArray(input) ? input : [input]) : undefined;
}

async function _callHandler(
event: H3Event,
handler: EventHandler,
hooks: _EventHandlerHooks,
) {
if (hooks.onRequest) {
for (const hook of hooks.onRequest) {
await hook(event);
if (event.handled) {
return;
}
}
}
const body = await handler.handler(event);
const body = await handler(event);
const response = { body };
if (handler.after) {
for (const hook of handler.after) {
if (hooks.beforeResponse) {
for (const hook of hooks.beforeResponse) {
await hook(event, response);
}
}
Expand All @@ -69,6 +88,18 @@ async function _callHandler(event: H3Event, handler: EventHandlerObject) {

export const eventHandler = defineEventHandler;

export function defineRequestMiddleware<
Request extends EventHandlerRequest = EventHandlerRequest,
>(fn: _RequestMiddleware<Request>): _RequestMiddleware<Request> {
return fn;
}

export function defineResponseMiddleware<
Request extends EventHandlerRequest = EventHandlerRequest,
>(fn: _ResponseMiddleware<Request>): _ResponseMiddleware<Request> {
return fn;
}

export function isEventHandler(input: any): input is EventHandler {
return "__is_handler__" in input;
}
Expand Down
21 changes: 16 additions & 5 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,27 @@ export interface EventHandler<
(event: H3Event<Request>): Response;
}

export type _RequestMiddleware<
Request extends EventHandlerRequest = EventHandlerRequest,
> = (event: H3Event<Request>) => void | Promise<void>;

export type _ResponseMiddleware<
Request extends EventHandlerRequest = EventHandlerRequest,
Response extends EventHandlerResponse = EventHandlerResponse,
> = (
event: H3Event<Request>,
response: { body?: Awaited<Response> },
) => void | Promise<void>;

export type EventHandlerObject<
Request extends EventHandlerRequest = EventHandlerRequest,
Response extends EventHandlerResponse = EventHandlerResponse,
> = {
onRequest?: _RequestMiddleware<Request> | _RequestMiddleware<Request>[];
beforeResponse?:
| _ResponseMiddleware<Request, Response>
| _ResponseMiddleware<Request, Response>[];
handler: EventHandler<Request, Response>;
before?: ((event: H3Event<Request>) => void | Promise<void>)[];
after?: ((
event: H3Event<Request>,
response: { body?: Response },
) => void | Promise<void>)[];
};

export type LazyEventHandler = () => EventHandler | Promise<EventHandler>;
Expand Down
2 changes: 1 addition & 1 deletion test/types.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ describe("types", () => {
describe("eventHandler", () => {
it("object syntax definitions", async () => {
const handler = eventHandler({
before: [
onRequest: [
(event) => {
expectTypeOf(event).toEqualTypeOf<H3Event>();
},
Expand Down

0 comments on commit a3303e6

Please sign in to comment.