Skip to content

Commit 9b4d92c

Browse files
committed
Try
1 parent f753682 commit 9b4d92c

File tree

5 files changed

+51
-15
lines changed

5 files changed

+51
-15
lines changed

packages/node-fetch/src/FormData.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export function getStreamFromFormData(
9696
): PonyfillReadableStream<Uint8Array> {
9797
let entriesIterator: FormDataIterator<[string, FormDataEntryValue]>;
9898
let sentInitialHeader = false;
99-
let currentAsyncIterator: AsyncIterator<[string, FormDataEntryValue]> | undefined;
99+
let currentAsyncIterator: AsyncIterator<Uint8Array> | undefined;
100100
let hasBefore = false;
101101
function handleNextEntry(controller: ReadableStreamController<Buffer>) {
102102
const { done, value } = entriesIterator.next();
@@ -123,7 +123,8 @@ export function getStreamFromFormData(
123123
controller.enqueue(
124124
Buffer.from(`Content-Type: ${blobOrString.type || 'application/octet-stream'}\r\n\r\n`),
125125
);
126-
const entryStream: any = blobOrString.stream();
126+
const entryStream = blobOrString.stream();
127+
// @ts-expect-error - ReadableStream is async iterable
127128
currentAsyncIterator = entryStream[Symbol.asyncIterator]();
128129
}
129130
hasBefore = true;

packages/promise-helpers/src/index.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,36 @@ export function handleMaybePromise<TInput, TOutput>(
3232
outputErrorFactory?: (err: any) => MaybePromiseLike<TOutput>,
3333
finallyFactory?: () => MaybePromiseLike<void>,
3434
): MaybePromiseLike<TOutput> {
35-
let result$ = fakePromise().then(inputFactory).then(outputSuccessFactory, outputErrorFactory);
36-
3735
if (finallyFactory) {
38-
result$ = result$.finally(finallyFactory);
36+
return unfakePromise(
37+
fakePromise()
38+
.then(inputFactory)
39+
.then(outputSuccessFactory, outputErrorFactory)
40+
.finally(finallyFactory),
41+
);
42+
}
43+
// Faster impl without finallyFactory
44+
function _handleMaybePromise() {
45+
const input$ = inputFactory();
46+
if (isFakePromise<TInput>(input$)) {
47+
return outputSuccessFactory(input$.__fakePromiseValue);
48+
}
49+
if (isFakeRejectPromise(input$)) {
50+
throw input$.__fakeRejectError;
51+
}
52+
if (isPromise(input$)) {
53+
return input$.then(outputSuccessFactory, outputErrorFactory);
54+
}
55+
return outputSuccessFactory(input$);
56+
}
57+
if (!outputErrorFactory) {
58+
return _handleMaybePromise();
59+
}
60+
try {
61+
return _handleMaybePromise();
62+
} catch (err) {
63+
return outputErrorFactory(err);
3964
}
40-
41-
return unfakePromise(result$);
4265
}
4366

4467
export function fakePromise<T>(value: MaybePromise<T>): Promise<T>;

packages/server/src/createServerAdapter.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
isServerResponse,
3131
iterateAsyncVoid,
3232
NodeRequest,
33-
nodeRequestResponseMap,
3433
NodeResponse,
3534
normalizeNodeRequest,
3635
sendNodeResponse,
@@ -278,8 +277,13 @@ function createServerAdapter<
278277
) {
279278
const nodeResponse: NodeResponse =
280279
(nodeResponseOrContainer as any).raw || nodeResponseOrContainer;
281-
nodeRequestResponseMap.set(nodeRequest, nodeResponse);
282-
return handleNodeRequest(nodeRequest, ...ctx);
280+
const serverContext = ctx.length > 1 ? completeAssign(...ctx) : ctx[0] || {};
281+
// Ensure `waitUntil` is available in the server context
282+
if (!serverContext.waitUntil) {
283+
serverContext.waitUntil = waitUntil;
284+
}
285+
const request = normalizeNodeRequest(nodeRequest, fetchAPI, nodeResponse);
286+
return handleRequest(request, serverContext);
283287
}
284288

285289
function requestListener(

packages/server/src/utils.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ function isRequestBody(body: any): body is BodyInit {
9191
return false;
9292
}
9393

94-
export const nodeRequestResponseMap = new WeakMap<NodeRequest, NodeResponse>();
95-
96-
export function normalizeNodeRequest(nodeRequest: NodeRequest, fetchAPI: FetchAPI): Request {
94+
export function normalizeNodeRequest(
95+
nodeRequest: NodeRequest,
96+
fetchAPI: FetchAPI,
97+
nodeResponse?: NodeResponse,
98+
): Request {
9799
const rawRequest = nodeRequest.raw || nodeRequest.req || nodeRequest;
98100
let fullUrl = buildFullUrl(rawRequest);
99101
if (nodeRequest.query) {
@@ -104,8 +106,6 @@ export function normalizeNodeRequest(nodeRequest: NodeRequest, fetchAPI: FetchAP
104106
fullUrl = url.toString();
105107
}
106108

107-
const nodeResponse = nodeRequestResponseMap.get(nodeRequest);
108-
nodeRequestResponseMap.delete(nodeRequest);
109109
let normalizedHeaders: Record<string, string> = nodeRequest.headers;
110110
if (nodeRequest.headers?.[':method']) {
111111
normalizedHeaders = {};

test.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { createServer } from 'node:http';
2+
import { Response } from '@whatwg-node/fetch';
3+
import { createServerAdapter } from '@whatwg-node/server';
4+
5+
createServer(createServerAdapter(() => Response.json({ hello: 'world' }))).listen(3000, () => {
6+
console.log('Server is running at http://localhost:3000');
7+
console.log('Press Ctrl+C to stop the server.');
8+
});

0 commit comments

Comments
 (0)