@@ -9,11 +9,10 @@ import { getFetchEvent, mergeResponseHeaders } from "./fetchEvent.ts";
99import { createPageEvent } from "./handler.ts" ;
1010import {
1111 deserializeFromJSONString ,
12- deserializeJSONStream ,
1312 serializeToJSONStream ,
1413 serializeToJSStream ,
1514} from "./serialization.ts" ;
16- import { BODY_FORMAL_FILE , BODY_FORMAT_KEY , BodyFormat } from "./server-functions-shared.ts" ;
15+ import { BODY_FORMAT_KEY , BodyFormat , extractBody , getHeadersAndBody } from "./server-functions-shared.ts" ;
1716import type { FetchEvent , PageEvent } from "./types.ts" ;
1817import { getExpectedRedirectStatus } from "./util.ts" ;
1918
@@ -54,40 +53,7 @@ export async function handleServerFunction(h3Event: H3Event) {
5453 }
5554 }
5655 if ( request . method === "POST" ) {
57- const contentType = request . headers . get ( "content-type" ) ;
58- const startType = request . headers . get ( BODY_FORMAT_KEY ) ;
59- const clone = request . clone ( ) ;
60-
61- switch ( true ) {
62- case startType === BodyFormat . Seroval :
63- parsed = ( await deserializeJSONStream ( clone ) ) as any [ ] ;
64- break ;
65- case startType === BodyFormat . String :
66- parsed . push ( await clone . text ( ) ) ;
67- break ;
68- case startType === BodyFormat . File : {
69- const formData = await clone . formData ( ) ;
70- parsed . push ( formData . get ( BODY_FORMAL_FILE ) ) ;
71- break ;
72- }
73- case startType === BodyFormat . FormData :
74- case contentType ?. startsWith ( "multipart/form-data" ) :
75- parsed . push ( await clone . formData ( ) ) ;
76- break ;
77- case startType === BodyFormat . URLSearchParams :
78- case contentType ?. startsWith ( "application/x-www-form-urlencoded" ) :
79- parsed . push ( new URLSearchParams ( await clone . text ( ) ) ) ;
80- break ;
81- case startType === BodyFormat . Blob :
82- parsed . push ( await clone . blob ( ) ) ;
83- break ;
84- case startType === BodyFormat . ArrayBuffer :
85- parsed . push ( await clone . arrayBuffer ( ) ) ;
86- break ;
87- case startType === BodyFormat . Uint8Array :
88- parsed . push ( await clone . bytes ( ) ) ;
89- break ;
90- }
56+ parsed . push ( await extractBody ( '' , false , request . clone ( ) ) ) ;
9157 }
9258 try {
9359 let result = await provideRequestEvent ( event , async ( ) => {
@@ -121,12 +87,18 @@ export async function handleServerFunction(h3Event: H3Event) {
12187 // handle no JS success case
12288 if ( ! instance ) return handleNoJS ( result , request , parsed ) ;
12389
124- h3Event . res . headers . set ( BODY_FORMAT_KEY , "true" ) ;
125- if ( import . meta. env . SEROVAL_MODE === "js" ) {
126- h3Event . res . headers . set ( "content-type" , "text/javascript" ) ;
127- return serializeToJSStream ( instance , result ) ;
128- }
129- return serializeToJSONStream ( result ) ;
90+ const body = getHeadersAndBody ( result ) ;
91+ if ( body ) {
92+ return new Response ( body . body , {
93+ headers : body . headers ,
94+ } ) ;
95+ }
96+ h3Event . res . headers . set ( BODY_FORMAT_KEY , BodyFormat . Seroval ) ;
97+ if ( import . meta. env . SEROVAL_MODE === "js" ) {
98+ h3Event . res . headers . set ( "content-type" , "text/javascript" ) ;
99+ return serializeToJSStream ( instance , result ) ;
100+ }
101+ return serializeToJSONStream ( result ) ;
130102 } catch ( x ) {
131103 if ( x instanceof Response ) {
132104 if ( singleFlight && instance ) {
@@ -153,7 +125,13 @@ export async function handleServerFunction(h3Event: H3Event) {
153125 x = handleNoJS ( x , request , parsed , true ) ;
154126 }
155127 if ( instance ) {
156- h3Event . res . headers . set ( BODY_FORMAT_KEY , "true" ) ;
128+ const body = getHeadersAndBody ( x ) ;
129+ if ( body ) {
130+ return new Response ( body . body , {
131+ headers : body . headers ,
132+ } ) ;
133+ }
134+ h3Event . res . headers . set ( BODY_FORMAT_KEY , BodyFormat . Seroval ) ;
157135 if ( import . meta. env . SEROVAL_MODE === "js" ) {
158136 h3Event . res . headers . set ( "content-type" , "text/javascript" ) ;
159137 return serializeToJSStream ( instance , x ) ;
0 commit comments