diff --git a/.changeset/fifty-parents-juggle.md b/.changeset/fifty-parents-juggle.md new file mode 100644 index 00000000000..8087d52e1a3 --- /dev/null +++ b/.changeset/fifty-parents-juggle.md @@ -0,0 +1,5 @@ +--- +'@clerk/remix': patch +--- + +Fix RequestInit.duplex which now is required if body is provided in undici diff --git a/packages/remix/src/ssr/authenticateRequest.ts b/packages/remix/src/ssr/authenticateRequest.ts index 18457746852..27c23da94e2 100644 --- a/packages/remix/src/ssr/authenticateRequest.ts +++ b/packages/remix/src/ssr/authenticateRequest.ts @@ -3,6 +3,7 @@ import type { AuthenticateRequestOptions, SignedInState, SignedOutState } from ' import { AuthStatus } from '@clerk/backend/internal'; import type { LoaderFunctionArgs } from './types'; +import { patchRequest } from './utils'; export async function authenticateRequest( args: LoaderFunctionArgs, @@ -23,7 +24,7 @@ export async function authenticateRequest( domain, publishableKey, userAgent: `${PACKAGE_NAME}@${PACKAGE_VERSION}`, - }).authenticateRequest(request, { + }).authenticateRequest(patchRequest(request), { audience, authorizedParties, signInUrl, diff --git a/packages/remix/src/ssr/loadOptions.ts b/packages/remix/src/ssr/loadOptions.ts index 4753006d7d4..ea582305ebd 100644 --- a/packages/remix/src/ssr/loadOptions.ts +++ b/packages/remix/src/ssr/loadOptions.ts @@ -8,10 +8,11 @@ import { isTruthy } from '@clerk/shared/underscore'; import { noSecretKeyError, satelliteAndMissingProxyUrlAndDomain, satelliteAndMissingSignInUrl } from '../utils/errors'; import { getEnvVariable } from '../utils/utils'; import type { LoaderFunctionArgs, RootAuthLoaderOptions } from './types'; +import { patchRequest } from './utils'; export const loadOptions = (args: LoaderFunctionArgs, overrides: RootAuthLoaderOptions = {}) => { const { request, context } = args; - const clerkRequest = createClerkRequest(request); + const clerkRequest = createClerkRequest(patchRequest(request)); // Fetch environment variables across Remix runtime. // 1. First check if the user passed the key in the getAuth function or the rootAuthLoader. diff --git a/packages/remix/src/ssr/utils.ts b/packages/remix/src/ssr/utils.ts index 5ac35891801..8ee504b4133 100644 --- a/packages/remix/src/ssr/utils.ts +++ b/packages/remix/src/ssr/utils.ts @@ -116,3 +116,18 @@ export function getResponseClerkState(requestState: RequestStateWithRedirectUrls export const wrapWithClerkState = (data: any) => { return { clerkState: { __internal_clerk_state: { ...data } } }; }; + +/** + * Patches request to avoid duplex issues with unidici + * For more information, see: + * https://github.com/nodejs/node/issues/46221 + * https://github.com/whatwg/fetch/pull/1457 + * @internal + */ +export const patchRequest = (request: Request) => { + const clonedRequest = request.clone(); + if (clonedRequest.method !== 'GET' && clonedRequest.body !== null) { + (clonedRequest as unknown as { duplex: 'half' }).duplex = 'half'; + } + return clonedRequest; +};