From 21ed8d19430222ad8eb57553d4b97463672524c8 Mon Sep 17 00:00:00 2001 From: pooya parsa Date: Tue, 1 Aug 2023 21:37:41 +0200 Subject: [PATCH] refactor(event): use `sendWebResponse` for `event.respondWith` (#481) --- src/event/event.ts | 54 +++------------------------ src/event/index.ts | 6 ++- src/event/{ => polyfills}/headers.ts | 4 ++ src/event/{ => polyfills}/response.ts | 6 ++- src/utils/response.ts | 8 +++- 5 files changed, 24 insertions(+), 54 deletions(-) rename src/event/{ => polyfills}/headers.ts (93%) rename src/event/{ => polyfills}/response.ts (89%) diff --git a/src/event/event.ts b/src/event/event.ts index 8d1d7445..e2ae4a37 100644 --- a/src/event/event.ts +++ b/src/event/event.ts @@ -1,13 +1,7 @@ import type { IncomingHttpHeaders } from "node:http"; import type { H3EventContext, HTTPMethod, EventHandlerRequest } from "../types"; import type { NodeIncomingMessage, NodeServerResponse } from "../node"; -import { - MIMES, - getRequestURL, - sanitizeStatusCode, - sanitizeStatusMessage, -} from "../utils"; -import { H3Response } from "./response"; +import { getRequestURL, sendWebResponse } from "../utils"; // TODO: Dedup from body.ts const PayloadMethods: Set = new Set([ @@ -135,48 +129,10 @@ export class H3Event< return this._request; } - // Implementation of FetchEvent - respondWith(r: H3Response | PromiseLike): void { - Promise.resolve(r).then((_response) => { - if (this.handled) { - return; - } - - const response = - _response instanceof H3Response ? _response : new H3Response(_response); - - for (const [key, value] of response.headers.entries()) { - this.node.res.setHeader(key, value); - } - if (response.status) { - this.node.res.statusCode = sanitizeStatusCode( - response.status, - this.node.res.statusCode - ); - } - if (response.statusText) { - this.node.res.statusMessage = sanitizeStatusMessage( - response.statusText - ); - } - if (response.redirected) { - this.node.res.setHeader("location", response.url); - } - if (!response._body) { - return this.node.res.end(); - } - if ( - typeof response._body === "string" || - "buffer" in response._body || - "byteLength" in response._body - ) { - return this.node.res.end(response._body); - } - if (!response.headers.has("content-type")) { - response.headers.set("content-type", MIMES.json); - } - this.node.res.end(JSON.stringify(response._body)); - }); + respondWith(response: Response | PromiseLike): Promise { + return Promise.resolve(response).then((_response) => + sendWebResponse(this, _response) + ); } } diff --git a/src/event/index.ts b/src/event/index.ts index 5d9765dd..798f32de 100644 --- a/src/event/index.ts +++ b/src/event/index.ts @@ -1,4 +1,6 @@ export * from "./event"; -export * from "./headers"; -export * from "./response"; export * from "./utils"; + +// TODO: Drop in next major version +export * from "./polyfills/headers"; +export * from "./polyfills/response"; diff --git a/src/event/headers.ts b/src/event/polyfills/headers.ts similarity index 93% rename from src/event/headers.ts rename to src/event/polyfills/headers.ts index 5538570f..d7cd3967 100644 --- a/src/event/headers.ts +++ b/src/event/polyfills/headers.ts @@ -1,3 +1,7 @@ +/** + * @deprecated Please use native web Headers + * https://developer.mozilla.org/en-US/docs/Web/API/Headers + */ export class H3Headers implements Headers { _headers: Record; diff --git a/src/event/response.ts b/src/event/polyfills/response.ts similarity index 89% rename from src/event/response.ts rename to src/event/polyfills/response.ts index 4fa9e362..a638c5f2 100644 --- a/src/event/response.ts +++ b/src/event/polyfills/response.ts @@ -1,6 +1,10 @@ -import type { EventHandlerResponse } from "../types"; +import type { EventHandlerResponse } from "../../types"; import { H3Headers } from "./headers"; +/** + * @deprecated Please use native web Response + * https://developer.mozilla.org/en-US/docs/Web/API/Response + */ export class H3Response implements Response { readonly headers: H3Headers; readonly status: number; diff --git a/src/utils/response.ts b/src/utils/response.ts index fb3063a6..adb13044 100644 --- a/src/utils/response.ts +++ b/src/utils/response.ts @@ -300,7 +300,10 @@ export function writeEarlyHints( } } -export function sendWebResponse(event: H3Event, response: Response) { +export function sendWebResponse( + event: H3Event, + response: Response +): void | Promise { for (const [key, value] of response.headers) { if (key === "set-cookie") { event.node.res.appendHeader(key, splitCookiesString(value)); @@ -322,7 +325,8 @@ export function sendWebResponse(event: H3Event, response: Response) { event.node.res.setHeader("location", response.url); } if (!response.body) { - return event.node.res.end(); + event.node.res.end(); + return; } return sendStream(event, response.body); }