Skip to content

Commit 7ec5b1c

Browse files
octoperanagstef
andauthored
fix(remix): RequestInit.duplex now is required if body is provided in undici (#3495)
Co-authored-by: Stefanos Anagnostou <[email protected]>
1 parent b8acf30 commit 7ec5b1c

File tree

4 files changed

+24
-2
lines changed

4 files changed

+24
-2
lines changed

.changeset/fifty-parents-juggle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/remix': patch
3+
---
4+
5+
Fix RequestInit.duplex which now is required if body is provided in undici

packages/remix/src/ssr/authenticateRequest.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { AuthenticateRequestOptions, SignedInState, SignedOutState } from '
33
import { AuthStatus } from '@clerk/backend/internal';
44

55
import type { LoaderFunctionArgs } from './types';
6+
import { patchRequest } from './utils';
67

78
export async function authenticateRequest(
89
args: LoaderFunctionArgs,
@@ -23,7 +24,7 @@ export async function authenticateRequest(
2324
domain,
2425
publishableKey,
2526
userAgent: `${PACKAGE_NAME}@${PACKAGE_VERSION}`,
26-
}).authenticateRequest(request, {
27+
}).authenticateRequest(patchRequest(request), {
2728
audience,
2829
authorizedParties,
2930
signInUrl,

packages/remix/src/ssr/loadOptions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import { isTruthy } from '@clerk/shared/underscore';
88
import { noSecretKeyError, satelliteAndMissingProxyUrlAndDomain, satelliteAndMissingSignInUrl } from '../utils/errors';
99
import { getEnvVariable } from '../utils/utils';
1010
import type { LoaderFunctionArgs, RootAuthLoaderOptions } from './types';
11+
import { patchRequest } from './utils';
1112

1213
export const loadOptions = (args: LoaderFunctionArgs, overrides: RootAuthLoaderOptions = {}) => {
1314
const { request, context } = args;
14-
const clerkRequest = createClerkRequest(request);
15+
const clerkRequest = createClerkRequest(patchRequest(request));
1516

1617
// Fetch environment variables across Remix runtime.
1718
// 1. First check if the user passed the key in the getAuth function or the rootAuthLoader.

packages/remix/src/ssr/utils.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,18 @@ export function getResponseClerkState(requestState: RequestStateWithRedirectUrls
116116
export const wrapWithClerkState = (data: any) => {
117117
return { clerkState: { __internal_clerk_state: { ...data } } };
118118
};
119+
120+
/**
121+
* Patches request to avoid duplex issues with unidici
122+
* For more information, see:
123+
* https://github.com/nodejs/node/issues/46221
124+
* https://github.com/whatwg/fetch/pull/1457
125+
* @internal
126+
*/
127+
export const patchRequest = (request: Request) => {
128+
const clonedRequest = request.clone();
129+
if (clonedRequest.method !== 'GET' && clonedRequest.body !== null) {
130+
(clonedRequest as unknown as { duplex: 'half' }).duplex = 'half';
131+
}
132+
return clonedRequest;
133+
};

0 commit comments

Comments
 (0)