Skip to content

Commit

Permalink
Merge pull request #101 from nksaraf/49-bug-_server-request-gets-stuc…
Browse files Browse the repository at this point in the history
…k-with-async-code-inside-middleware-solidjssolid-start1165

fix: toWebRequest lazily creates readable stream for `body` access
  • Loading branch information
nksaraf committed Jan 6, 2024
2 parents ed8b02f + bb16563 commit a881707
Show file tree
Hide file tree
Showing 4 changed files with 267 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/good-garlics-rest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"vinxi": patch
---

fix: toWebRequest lazily creates readable stream for `body` access
2 changes: 1 addition & 1 deletion packages/vinxi/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
},
"./server": {
"import": "./runtime/server.js",
"types": "./dist/types/runtime/server.d.ts"
"types": "./runtime/server-types.d.ts"
},
"./party": {
"import": "./runtime/party.js",
Expand Down
28 changes: 28 additions & 0 deletions packages/vinxi/runtime/server-types.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { EventHandlerRequest, _RequestMiddleware } from "h3";

export * from "h3";

export function getContext(event: import("h3").H3Event, key: string): any;
export function setContext(
event: import("h3").H3Event,
key: string,
value: any,
): any;

export function defineMiddleware(options: {
onRequest?:
| import("h3")._RequestMiddleware
| import("h3")._RequestMiddleware[];
onBeforeResponse?:
| import("h3")._ResponseMiddleware
| import("h3")._ResponseMiddleware[];
}): {
onRequest?:
| import("h3")._RequestMiddleware
| import("h3")._RequestMiddleware[]
| undefined;
onBeforeResponse?:
| import("h3")._ResponseMiddleware
| import("h3")._ResponseMiddleware[]
| undefined;
};
234 changes: 233 additions & 1 deletion packages/vinxi/runtime/server.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,109 @@
export * from "h3";
import {
H3Error,
H3Event,
MIMES,
appendCorsHeaders,
appendCorsPreflightHeaders,
appendHeader,
appendHeaders,
appendResponseHeader,
appendResponseHeaders,
assertMethod,
callNodeListener,
clearResponseHeaders,
clearSession,
createApp,
createAppEventHandler,
createError,
createEvent,
createRouter,
defaultContentType,
defineEventHandler,
defineLazyEventHandler,
defineNodeListener,
defineNodeMiddleware,
defineRequestMiddleware,
defineResponseMiddleware,
deleteCookie,
dynamicEventHandler,
eventHandler,
fetchWithEvent,
fromNodeMiddleware,
fromPlainHandler,
fromWebHandler,
getCookie,
getHeader,
getHeaders,
getMethod,
getProxyRequestHeaders,
getQuery,
getRequestFingerprint,
getRequestHeader,
getRequestHeaders,
getRequestHost,
getRequestIP,
getRequestPath,
getRequestProtocol,
getRequestURL,
getRequestWebStream,
getResponseHeader,
getResponseHeaders,
getResponseStatus,
getResponseStatusText,
getRouterParam,
getRouterParams,
getSession,
getValidatedQuery,
getValidatedRouterParams,
handleCacheHeaders,
handleCors,
isCorsOriginAllowed,
isError,
isEvent,
isEventHandler,
isMethod,
isPreflightRequest,
isStream,
isWebResponse,
lazyEventHandler,
parseCookies,
promisifyNodeListener,
proxyRequest,
readBody,
readFormData,
readMultipartFormData,
readRawBody,
readValidatedBody,
removeResponseHeader,
sanitizeStatusCode,
sanitizeStatusMessage,
sealSession,
send,
sendError,
sendNoContent,
sendProxy,
sendRedirect,
sendStream,
sendWebResponse,
serveStatic,
setCookie,
setHeader,
setHeaders,
setResponseHeader,
setResponseHeaders,
setResponseStatus,
splitCookiesString,
toEventHandler,
toNodeListener,
toPlainHandler,
toWebHandler,
unsealSession,
updateSession,
use,
useBase,
useSession,
writeEarlyHints,
} from "h3";

/**
*
Expand Down Expand Up @@ -27,3 +132,130 @@ export function getContext(event, key) {
export function defineMiddleware(options) {
return options;
}

export function toWebRequest(/** @type {H3Event} */ event) {
/**
* @type {ReadableStream | undefined}
*/
let readableStream;
return new Request(getRequestURL(event), {
// @ts-ignore Undici option
duplex: "half",
method: event.method,
headers: event.headers,
get body() {

This comment has been minimized.

Copy link
@edivados

edivados Jan 6, 2024

Contributor

Unless I missing something this shouldn't work. The init process of Request triggers the getter.
Tried that too and Ryan tried it yesterday (Discord) (GitHub)

if (readableStream) {
return readableStream;
}
readableStream = getRequestWebStream(event);
return readableStream;
},
});
}

export {
H3Error,
H3Event,
MIMES,
appendCorsHeaders,
appendCorsPreflightHeaders,
appendHeader,
appendHeaders,
appendResponseHeader,
appendResponseHeaders,
assertMethod,
callNodeListener,
clearResponseHeaders,
clearSession,
createApp,
createAppEventHandler,
createError,
createEvent,
createRouter,
defaultContentType,
defineEventHandler,
defineLazyEventHandler,
defineNodeListener,
defineNodeMiddleware,
defineRequestMiddleware,
defineResponseMiddleware,
deleteCookie,
dynamicEventHandler,
eventHandler,
fetchWithEvent,
fromNodeMiddleware,
fromPlainHandler,
fromWebHandler,
getCookie,
getHeader,
getHeaders,
getMethod,
getProxyRequestHeaders,
getQuery,
getRequestFingerprint,
getRequestHeader,
getRequestHeaders,
getRequestHost,
getRequestIP,
getRequestPath,
getRequestProtocol,
getRequestURL,
getRequestWebStream,
getResponseHeader,
getResponseHeaders,
getResponseStatus,
getResponseStatusText,
getRouterParam,
getRouterParams,
getSession,
getValidatedQuery,
getValidatedRouterParams,
handleCacheHeaders,
handleCors,
isCorsOriginAllowed,
isError,
isEvent,
isEventHandler,
isMethod,
isPreflightRequest,
isStream,
isWebResponse,
lazyEventHandler,
parseCookies,
promisifyNodeListener,
proxyRequest,
readBody,
readFormData,
readMultipartFormData,
readRawBody,
readValidatedBody,
removeResponseHeader,
sanitizeStatusCode,
sanitizeStatusMessage,
sealSession,
send,
sendError,
sendNoContent,
sendProxy,
sendRedirect,
sendStream,
sendWebResponse,
serveStatic,
setCookie,
setHeader,
setHeaders,
setResponseHeader,
setResponseHeaders,
setResponseStatus,
splitCookiesString,
toEventHandler,
toNodeListener,
toPlainHandler,
toWebHandler,
unsealSession,
updateSession,
use,
useBase,
useSession,
writeEarlyHints,
};

0 comments on commit a881707

Please sign in to comment.