1- import type { AuthObject } from '@clerk/backend' ;
21import type { InitialState , Without } from '@clerk/types' ;
32import { headers } from 'next/headers' ;
43import React from 'react' ;
@@ -27,21 +26,33 @@ export async function ClerkProvider(
2726 props : Without < NextClerkProviderProps , '__unstable_invokeMiddlewareOnAuthStateChange' > ,
2827) {
2928 const { children, dynamic, ...rest } = props ;
30- let statePromise : Promise < null | AuthObject > = Promise . resolve ( null ) ;
31- let nonce = Promise . resolve ( '' ) ;
3229
33- if ( dynamic ) {
30+ async function generateStatePromise ( ) {
31+ if ( ! dynamic ) {
32+ return Promise . resolve ( null ) ;
33+ }
34+ if ( isNext13 ) {
35+ /**
36+ * For some reason, Next 13 requires that functions which call `headers()` are awaited where they are invoked.
37+ * Without the await here, Next will throw a DynamicServerError during build.
38+ */
39+ return Promise . resolve ( await getDynamicClerkState ( ) ) ;
40+ }
41+ return getDynamicClerkState ( ) ;
42+ }
43+
44+ async function generateNonce ( ) {
45+ if ( ! dynamic ) {
46+ return Promise . resolve ( '' ) ;
47+ }
3448 if ( isNext13 ) {
3549 /**
3650 * For some reason, Next 13 requires that functions which call `headers()` are awaited where they are invoked.
3751 * Without the await here, Next will throw a DynamicServerError during build.
3852 */
39- statePromise = Promise . resolve ( await getDynamicClerkState ( ) ) ;
40- nonce = Promise . resolve ( await getNonceFromCSPHeader ( ) ) ;
41- } else {
42- statePromise = getDynamicClerkState ( ) ;
43- nonce = getNonceFromCSPHeader ( ) ;
53+ return Promise . resolve ( await getNonceFromCSPHeader ( ) ) ;
4454 }
55+ return getNonceFromCSPHeader ( ) ;
4556 }
4657
4758 const propsWithEnvs = mergeNextClerkPropsWithEnv ( {
@@ -51,8 +62,8 @@ export async function ClerkProvider(
5162 let output = (
5263 < ClientClerkProvider
5364 { ...mergeNextClerkPropsWithEnv ( rest ) }
54- nonce = { await nonce }
55- initialState = { await statePromise }
65+ nonce = { await generateNonce ( ) }
66+ initialState = { await generateStatePromise ( ) }
5667 >
5768 { children }
5869 </ ClientClerkProvider >
@@ -75,8 +86,8 @@ export async function ClerkProvider(
7586 __internal_claimKeylessApplicationUrl : newOrReadKeys . claimUrl ,
7687 __internal_copyInstanceKeysUrl : newOrReadKeys . apiKeysUrl ,
7788 } ) }
78- nonce = { await nonce }
79- initialState = { await statePromise }
89+ nonce = { await generateNonce ( ) }
90+ initialState = { await generateStatePromise ( ) }
8091 >
8192 { children }
8293 </ ClientClerkProvider >
@@ -88,7 +99,7 @@ export async function ClerkProvider(
8899 if ( dynamic ) {
89100 return (
90101 // TODO: fix types so AuthObject is compatible with InitialState
91- < PromisifiedAuthProvider authPromise = { statePromise as unknown as Promise < InitialState > } >
102+ < PromisifiedAuthProvider authPromise = { generateStatePromise ( ) as unknown as Promise < InitialState > } >
92103 { output }
93104 </ PromisifiedAuthProvider >
94105 ) ;
0 commit comments