Skip to content

Commit 426acc6

Browse files
committed
fix: replace event.node.req/res with H3 platform-agnostic APIs
event.node is undefined in Web-standard runtimes (Netlify Functions v2, Cloudflare Workers). Use H3's getRequestHeader, setResponseHeader, getMethod, and Web Response instead of accessing Node.js request/response objects directly. This makes all framework plugins work across all deployment targets.
1 parent f764844 commit 426acc6

3 files changed

Lines changed: 17 additions & 15 deletions

File tree

packages/core/src/resources/handlers.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
readBody,
44
getQuery,
55
getRouterParam,
6+
setResponseHeader,
67
setResponseStatus,
78
getMethod,
89
readMultipartFormData,
@@ -231,10 +232,9 @@ export async function handleGetResource(event: any) {
231232
? Buffer.from(resource.content, "utf-8")
232233
: Buffer.from(resource.content, "base64");
233234

234-
event.node.res.setHeader("Content-Type", resource.mimeType);
235-
event.node.res.setHeader("Content-Length", buf.length);
236-
event.node.res.end(buf);
237-
return;
235+
setResponseHeader(event, "Content-Type", resource.mimeType);
236+
setResponseHeader(event, "Content-Length", buf.length);
237+
return new Response(buf);
238238
}
239239

240240
// For binary resources (images, audio, video), omit the content field from

packages/core/src/server/auth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ export async function getSession(event: H3Event): Promise<AuthSession | null> {
328328
maxAge: sessionMaxAge,
329329
});
330330
// Prevent token from leaking via Referer headers
331-
event.node.res.setHeader("Referrer-Policy", "no-referrer");
331+
setResponseHeader(event, "Referrer-Policy", "no-referrer");
332332
return { email, token: qToken };
333333
}
334334
}

packages/core/src/server/create-server.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import {
22
createApp,
33
createRouter,
44
defineEventHandler,
5+
getMethod,
6+
getRequestHeader,
57
readBody,
8+
setResponseHeader,
69
setResponseStatus,
710
type H3Event,
811
} from "h3";
@@ -140,8 +143,7 @@ export function createServer(
140143

141144
app.use(
142145
defineEventHandler((event) => {
143-
const headers = event.node.res;
144-
const requestOrigin = event.node.req.headers.origin;
146+
const requestOrigin = getRequestHeader(event, "origin");
145147

146148
// If allowlist is configured, validate origin; otherwise allow all (dev)
147149
const origin =
@@ -150,23 +152,23 @@ export function createServer(
150152
? requestOrigin
151153
: allowedOrigins[0]
152154
: requestOrigin || "*";
153-
headers.setHeader("Access-Control-Allow-Origin", origin);
155+
setResponseHeader(event, "Access-Control-Allow-Origin", origin);
154156
if (origin !== "*") {
155-
headers.setHeader("Vary", "Origin");
157+
setResponseHeader(event, "Vary", "Origin");
156158
}
157-
headers.setHeader(
159+
setResponseHeader(
160+
event,
158161
"Access-Control-Allow-Methods",
159162
"GET,POST,PUT,PATCH,DELETE,OPTIONS",
160163
);
161-
headers.setHeader(
164+
setResponseHeader(
165+
event,
162166
"Access-Control-Allow-Headers",
163167
"Content-Type,Authorization,X-Requested-With",
164168
);
165169

166-
if (event.node.req.method === "OPTIONS") {
167-
headers.writeHead(204);
168-
headers.end();
169-
return null;
170+
if (getMethod(event) === "OPTIONS") {
171+
return new Response(null, { status: 204 });
170172
}
171173
}),
172174
);

0 commit comments

Comments
 (0)