1
- import type { IncomingMessage } from 'node:http' ;
2
- import { Readable } from 'node:stream' ;
3
1
import type { APIHandlerInfo } from '@modern-js/bff-core' ;
4
2
import {
5
3
HttpMetadata ,
8
6
ValidationError ,
9
7
isWithMetaHandler ,
10
8
} from '@modern-js/bff-core' ;
11
- import formidable from 'formidable' ;
12
- import type { Context , Next } from 'hono' ;
9
+ import type { Context , Next } from '@modern-js/server-core' ;
13
10
import typeIs from 'type-is' ;
14
11
15
12
type Handler = APIHandlerInfo [ 'handler' ] ;
@@ -67,7 +64,7 @@ export const createHonoHandler = (handler: Handler) => {
67
64
if ( response ) {
68
65
return response ;
69
66
}
70
- if ( c . env ?. node ?. res ?. headersSent ) return ;
67
+ if ( c . finalized ) return ;
71
68
72
69
const result = await handler ( input ) ;
73
70
return result && typeof result === 'object'
@@ -87,7 +84,7 @@ export const createHonoHandler = (handler: Handler) => {
87
84
const args = Object . values ( input . params ) . concat ( input ) ;
88
85
try {
89
86
const body = await handler ( ...args ) ;
90
- if ( c . env ?. node ?. res ?. headersSent ) {
87
+ if ( c . finalized ) {
91
88
return await Promise . resolve ( ) ;
92
89
}
93
90
@@ -118,8 +115,7 @@ const getHonoInput = async (c: Context) => {
118
115
if ( typeIs . is ( contentType , [ 'application/json' ] ) ) {
119
116
draft . data = await c . req . json ( ) ;
120
117
} else if ( typeIs . is ( contentType , [ 'multipart/form-data' ] ) ) {
121
- const nodeStream = await webStreamToNodeStream ( c ) ;
122
- draft . formData = await resolveFormData ( nodeStream ) ;
118
+ draft . formData = await c . req . parseBody ( ) ;
123
119
} else if ( typeIs . is ( contentType , [ 'application/x-www-form-urlencoded' ] ) ) {
124
120
draft . formUrlencoded = await c . req . parseBody ( ) ;
125
121
} else {
@@ -131,51 +127,4 @@ const getHonoInput = async (c: Context) => {
131
127
return draft ;
132
128
} ;
133
129
134
- async function webStreamToNodeStream ( c : Context ) {
135
- const reader = ( c . req . raw . body as ReadableStream < Uint8Array > ) . getReader ( ) ;
136
- const nodeStream = new Readable ( {
137
- async read ( ) {
138
- try {
139
- const { done, value } = await reader . read ( ) ;
140
- if ( done ) {
141
- this . push ( null ) ;
142
- } else {
143
- this . push ( value ) ;
144
- }
145
- } catch ( err ) {
146
- this . destroy ( err as any ) ;
147
- }
148
- } ,
149
- destroy ( err , callback ) {
150
- reader . cancel ( err ) . finally ( ( ) => callback ( err ) ) ;
151
- } ,
152
- } ) as IncomingMessage ;
153
-
154
- const headers = {
155
- 'content-type' : c . req . header ( 'content-type' ) || 'multipart/form-data' ,
156
- 'content-length' : c . req . header ( 'content-length' ) || '0' ,
157
- } ;
158
-
159
- nodeStream . headers = headers ;
160
- return nodeStream ;
161
- }
162
-
163
- const resolveFormData = (
164
- request : IncomingMessage ,
165
- ) : Promise < Record < string , any > > => {
166
- const form = formidable ( { multiples : true } ) ;
167
- return new Promise ( ( resolve , reject ) => {
168
- form . parse ( request , ( err , fields , files ) => {
169
- if ( err ) {
170
- reject ( err ) ;
171
- }
172
-
173
- resolve ( {
174
- ...fields ,
175
- ...files ,
176
- } ) ;
177
- } ) ;
178
- } ) ;
179
- } ;
180
-
181
130
export default createHonoRoutes ;
0 commit comments