From 41d1e886a863aea9fa9a25da6018bc9985b1e805 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Mon, 26 Aug 2024 19:01:18 +0300 Subject: [PATCH] fix(tanstack-start): Fix a bug when using the function multiple times --- .changeset/purple-rockets-fetch.md | 5 ++++ .../src/server/authenticateRequest.ts | 3 ++- .../tanstack-start/src/server/loadOptions.ts | 3 ++- .../tanstack-start/src/server/utils/index.ts | 24 +++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 .changeset/purple-rockets-fetch.md diff --git a/.changeset/purple-rockets-fetch.md b/.changeset/purple-rockets-fetch.md new file mode 100644 index 00000000000..4788fd647f0 --- /dev/null +++ b/.changeset/purple-rockets-fetch.md @@ -0,0 +1,5 @@ +--- +"@clerk/tanstack-start": patch +--- + +Fix a bug when using the `getAuth` function multiple times diff --git a/packages/tanstack-start/src/server/authenticateRequest.ts b/packages/tanstack-start/src/server/authenticateRequest.ts index 4d17a629b0e..0ffbf680686 100644 --- a/packages/tanstack-start/src/server/authenticateRequest.ts +++ b/packages/tanstack-start/src/server/authenticateRequest.ts @@ -3,6 +3,7 @@ import type { AuthenticateRequestOptions, SignedInState, SignedOutState } from ' import { AuthStatus } from '@clerk/backend/internal'; import { errorThrower } from '../utils'; +import { patchRequest } from './utils'; export async function authenticateRequest( request: Request, @@ -22,7 +23,7 @@ export async function authenticateRequest( domain, publishableKey, userAgent: `${PACKAGE_NAME}@${PACKAGE_VERSION}`, - }).authenticateRequest(request, { + }).authenticateRequest(patchRequest(request), { audience, authorizedParties, signInUrl, diff --git a/packages/tanstack-start/src/server/loadOptions.ts b/packages/tanstack-start/src/server/loadOptions.ts index 707413b66c5..b2c07cc7dd4 100644 --- a/packages/tanstack-start/src/server/loadOptions.ts +++ b/packages/tanstack-start/src/server/loadOptions.ts @@ -8,9 +8,10 @@ import { isTruthy } from '@clerk/shared/underscore'; import { errorThrower } from '../utils'; import { getEnvVariable, getPublicEnvVariables } from '../utils/env'; import type { LoaderOptions } from './types'; +import { patchRequest } from './utils'; export const loadOptions = (request: Request, overrides: LoaderOptions = {}) => { - const clerkRequest = createClerkRequest(request); + const clerkRequest = createClerkRequest(patchRequest(request)); const secretKey = overrides.secretKey || overrides.secretKey || getEnvVariable('CLERK_SECRET_KEY'); const publishableKey = overrides.publishableKey || getPublicEnvVariables().publishableKey; diff --git a/packages/tanstack-start/src/server/utils/index.ts b/packages/tanstack-start/src/server/utils/index.ts index d5b7fd83944..ae52dff32a1 100644 --- a/packages/tanstack-start/src/server/utils/index.ts +++ b/packages/tanstack-start/src/server/utils/index.ts @@ -53,3 +53,27 @@ export function getResponseClerkState(requestState: RequestState, additionalStat headers: requestState.headers, }; } + +/** + * 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 = new Request(request.url, { + headers: request.headers, + method: request.method, + redirect: request.redirect, + cache: request.cache, + signal: request.signal, + }); + + // If duplex is not set, set it to 'half' to avoid duplex issues with unidici + if (clonedRequest.method !== 'GET' && clonedRequest.body !== null && !('duplex' in clonedRequest)) { + (clonedRequest as unknown as { duplex: 'half' }).duplex = 'half'; + } + + return clonedRequest; +};