Skip to content

Commit e776335

Browse files
committed
Fix
1 parent 9a3207a commit e776335

File tree

3 files changed

+54
-77
lines changed

3 files changed

+54
-77
lines changed

packages/server/src/utils.ts

Lines changed: 14 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -286,34 +286,10 @@ function sendAsyncIterable(serverResponse: NodeResponse, asyncIterable: AsyncIte
286286
if (closed || done) {
287287
return;
288288
}
289-
return new Promise(resolve => {
290-
if (
291-
!serverResponse
292-
// @ts-expect-error http and http2 writes are actually compatible
293-
.write(value, err => {
294-
if (err) {
295-
resolve(true);
296-
}
297-
})
298-
) {
299-
if (closed) {
300-
resolve(true);
301-
return;
302-
}
303-
serverResponse.once('drain', () => {
304-
resolve(false);
305-
});
306-
}
307-
})
308-
.then(shouldBreak => {
309-
if (shouldBreak) {
310-
return;
311-
}
312-
return pump();
313-
})
314-
.then(() => {
315-
endResponse(serverResponse);
316-
});
289+
return handleMaybePromise(
290+
() => safeWrite(value, serverResponse),
291+
() => (closed ? endResponse(serverResponse) : pump()),
292+
);
317293
});
318294
return pump();
319295
}
@@ -407,7 +383,7 @@ export function sendNodeResponse(
407383
}
408384
}
409385

410-
async function sendReadableStream(
386+
function sendReadableStream(
411387
nodeRequest: NodeRequest,
412388
serverResponse: NodeResponse,
413389
readableStream: ReadableStream<Uint8Array>,
@@ -416,20 +392,16 @@ async function sendReadableStream(
416392
nodeRequest?.once?.('error', err => {
417393
reader.cancel(err);
418394
});
419-
while (true) {
420-
const { done, value } = await reader.read();
421-
if (done) {
422-
break;
423-
}
424-
if (
425-
!serverResponse
426-
// @ts-expect-error http and http2 writes are actually compatible
427-
.write(value)
428-
) {
429-
await new Promise(resolve => serverResponse.once('drain', resolve));
430-
}
395+
function pump(): Promise<void> {
396+
return reader
397+
.read()
398+
.then(({ done, value }) =>
399+
done
400+
? endResponse(serverResponse)
401+
: handleMaybePromise(() => safeWrite(value, serverResponse), pump),
402+
);
431403
}
432-
endResponse(serverResponse);
404+
return pump();
433405
}
434406

435407
export function isRequestInit(val: unknown): val is RequestInit {

packages/server/test/reproductions.spec.ts

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -81,41 +81,47 @@ if (!globalThis.Bun && !globalThis.Deno) {
8181
});
8282
}
8383

84-
it('express + compression library', async () => {
85-
const app = express();
86-
87-
app.use(compression());
88-
89-
const echoAdapter = createServerAdapter(req =>
90-
req.json().then(body =>
91-
Response.json({
92-
body,
93-
url: req.url,
94-
}),
95-
),
96-
);
84+
const bodies = [
85+
'hello world', // 11 bytes
86+
'hello world'.repeat(1024 * 1024), // 1MB
87+
'hello world'.repeat(1024 * 1024 * 5), // 5MB
88+
];
89+
90+
for (const largeBody of bodies) {
91+
it(`express + compression (${largeBody.length} bytes)`, async () => {
92+
const app = express();
93+
94+
app.use(compression());
95+
96+
const echoAdapter = createServerAdapter(req =>
97+
req.json().then(body =>
98+
Response.json({
99+
body,
100+
url: req.url,
101+
}),
102+
),
103+
);
97104

98-
app.use('/my-path', echoAdapter);
105+
app.use('/my-path', echoAdapter);
99106

100-
server = await new Promise<Server>((resolve, reject) => {
101-
const server = app.listen(0, err => (err ? reject(err) : resolve(server)));
102-
});
103-
104-
const port = (server.address() as AddressInfo).port;
107+
server = await new Promise<Server>((resolve, reject) => {
108+
const server = app.listen(0, err => (err ? reject(err) : resolve(server)));
109+
});
105110

106-
const largeBody = 'a'.repeat(1024 * 1024); // 1MB
111+
const port = (server.address() as AddressInfo).port;
107112

108-
const response = await fetch(`http://localhost:${port}/my-path`, {
109-
method: 'POST',
110-
headers: {
111-
'Content-Type': 'application/json',
112-
},
113-
body: JSON.stringify({ largeBody }),
114-
});
113+
const response = await fetch(`http://localhost:${port}/my-path`, {
114+
method: 'POST',
115+
headers: {
116+
'Content-Type': 'application/json',
117+
},
118+
body: JSON.stringify({ largeBody }),
119+
});
115120

116-
const bodyJson = await response.json();
117-
expect(bodyJson).toEqual({
118-
body: { largeBody },
119-
url: `http://localhost:${port}/my-path`,
121+
const bodyJson = await response.json();
122+
expect(bodyJson).toEqual({
123+
body: { largeBody },
124+
url: `http://localhost:${port}/my-path`,
125+
});
120126
});
121-
});
127+
}

packages/server/test/test-server.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,8 @@ if (!globalThis.Deno) {
209209

210210
fastifyApp.addContentTypeParser(/(.*)/, {}, (_req, _payload, done) => done(null));
211211

212-
let url = await fastifyApp.listen({ port: 0, host: '::1' });
213-
url = url.replace('127.0.0.1', 'localhost');
214-
url = url.replace('[::1]', 'localhost');
212+
await fastifyApp.listen({ port: 0, host: '::' });
213+
const url = `http://localhost:${(fastifyApp.server.address() as AddressInfo).port}`;
215214
return {
216215
name: 'fastify',
217216
url,

0 commit comments

Comments
 (0)