Skip to content

Commit f1c99f1

Browse files
committed
Forward initial session status to signed out object
1 parent 01197f1 commit f1c99f1

File tree

10 files changed

+25
-17
lines changed

10 files changed

+25
-17
lines changed

.changeset/tender-brooms-look.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
---
2-
'@clerk/nextjs': patch
2+
'@clerk/nextjs': minor
33
---
44

5-
Introduce `treatPendingAsSignedOut` to `auth`, `getAuth` and server-side control components
5+
Introduce `treatPendingAsSignedOut` option to `getAuth` and `auth` from `clerkMiddleware`
6+
7+
By default, `treatPendingAsSignedOut` is set to `true`, which means pending sessions are treated as signed-out. You can set this option to `false` to treat pending sessions as authenticated.
68

79
```ts
810
const { userId } = auth({ treatPendingAsSignedOut: false })

packages/backend/src/tokens/authObjects.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
JwtPayload,
66
ServerGetToken,
77
ServerGetTokenOptions,
8+
SessionStatusClaim,
89
SharedSignedInAuthObjectProperties,
910
} from '@clerk/types';
1011

@@ -37,7 +38,7 @@ export type SignedInAuthObject = SharedSignedInAuthObjectProperties & {
3738
export type SignedOutAuthObject = {
3839
sessionClaims: null;
3940
sessionId: null;
40-
sessionStatus: null;
41+
sessionStatus: SessionStatusClaim | null;
4142
actor: null;
4243
userId: null;
4344
orgId: null;
@@ -113,11 +114,14 @@ export function signedInAuthObject(
113114
/**
114115
* @internal
115116
*/
116-
export function signedOutAuthObject(debugData?: AuthObjectDebugData): SignedOutAuthObject {
117+
export function signedOutAuthObject(
118+
debugData?: AuthObjectDebugData,
119+
initialSessionStatus?: SessionStatusClaim,
120+
): SignedOutAuthObject {
117121
return {
118122
sessionClaims: null,
119123
sessionId: null,
120-
sessionStatus: null,
124+
sessionStatus: initialSessionStatus ?? null,
121125
userId: null,
122126
actor: null,
123127
orgId: null,

packages/backend/src/tokens/authStatus.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ export type SignedInState = {
2727
afterSignInUrl: string;
2828
afterSignUpUrl: string;
2929
isSignedIn: true;
30-
toAuth: (opts?: PendingSessionOptions) => SignedInAuthObject;
30+
toAuth: <T extends PendingSessionOptions | undefined = undefined>(
31+
opts?: T,
32+
) => T extends undefined ? SignedInAuthObject : SignedInAuthObject | SignedOutAuthObject;
3133
headers: Headers;
3234
token: string;
3335
};
@@ -102,7 +104,7 @@ export function signedIn(
102104
// @ts-expect-error Dynamically return `SignedOutAuthObject` based on options
103105
toAuth: ({ treatPendingAsSignedOut = true } = {}) => {
104106
if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') {
105-
return signedOutAuthObject();
107+
return signedOutAuthObject(undefined, authObject.sessionStatus);
106108
}
107109

108110
return authObject;

packages/clerk-js/src/core/__tests__/clerk.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,7 +2284,7 @@ describe('Clerk singleton', () => {
22842284
await sut.load(mockedLoadOptions);
22852285

22862286
await sut.setActive({ session: mockResource as any as PendingSessionResource });
2287-
await sut.__experimental_nextTask();
2287+
await sut.__experimental_navigateToTask();
22882288

22892289
expect(mockNavigate.mock.calls[0][0]).toBe('/sign-in#/tasks/add-organization');
22902290
});
@@ -2328,7 +2328,7 @@ describe('Clerk singleton', () => {
23282328
await sut.setActive({ session: mockSession as any as ActiveSessionResource });
23292329

23302330
const redirectUrlComplete = '/welcome-to-app';
2331-
await sut.__experimental_nextTask({ redirectUrlComplete });
2331+
await sut.__experimental_navigateToTask({ redirectUrlComplete });
23322332

23332333
console.log(mockNavigate.mock.calls);
23342334

packages/clerk-js/src/core/clerk.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ export class Clerk implements ClerkInterface {
11991199
this.#emit();
12001200
};
12011201

1202-
public __experimental_nextTask = async ({ redirectUrlComplete }: NextTaskParams = {}): Promise<void> => {
1202+
public __experimental_navigateToTask = async ({ redirectUrlComplete }: NextTaskParams = {}): Promise<void> => {
12031203
const session = await this.session?.reload();
12041204
if (!session || !this.environment) {
12051205
return;

packages/clerk-js/src/ui/components/SessionTasks/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const SessionTasksStart = withCardStateProvider(() => {
2121
useEffect(() => {
2222
// Simulates additional latency to avoid a abrupt UI transition when navigating to the next task
2323
const timeoutId = setTimeout(() => {
24-
void clerk.__experimental_nextTask({ redirectUrlComplete });
24+
void clerk.__experimental_navigateToTask({ redirectUrlComplete });
2525
}, 500);
2626
return () => clearTimeout(timeoutId);
2727
}, [navigate, clerk, redirectUrlComplete]);
@@ -80,7 +80,7 @@ export function SessionTask(): JSX.Element {
8080
}, [clerk, navigate, redirectUrlComplete]);
8181

8282
const nextTask = useCallback(
83-
() => clerk.__experimental_nextTask({ redirectUrlComplete }),
83+
() => clerk.__experimental_navigateToTask({ redirectUrlComplete }),
8484
[clerk, redirectUrlComplete],
8585
);
8686

packages/nextjs/src/server/createGetAuth.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export const createAsyncGetAuth = ({
5353
/**
5454
* Previous known as `createGetAuth`. We needed to create a sync and async variant in order to allow for improvements
5555
* that required dynamic imports (using `require` would not work).
56-
* It powers the synchronous top-level api `getAuh()`.
56+
* It powers the synchronous top-level api `getAuth()`.
5757
*/
5858
export const createSyncGetAuth = ({
5959
debugLoggerName,

packages/nextjs/src/server/data/getAuthDataFromRequest.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export function getAuthDataFromRequest(
5959
}
6060

6161
if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') {
62-
authObject = signedOutAuthObject(options);
62+
authObject = signedOutAuthObject(options, authObject.sessionStatus);
6363
}
6464

6565
return authObject;

packages/react/src/isomorphicClerk.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,9 +702,9 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
702702
}
703703
};
704704

705-
__experimental_nextTask = async (params?: NextTaskParams): Promise<void> => {
705+
__experimental_navigateToTask = async (params?: NextTaskParams): Promise<void> => {
706706
if (this.clerkjs) {
707-
return this.clerkjs.__experimental_nextTask(params);
707+
return this.clerkjs.__experimental_navigateToTask(params);
708708
} else {
709709
return Promise.reject();
710710
}

packages/types/src/clerk.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ export interface Clerk {
715715
* If all tasks are complete, it navigates to the provided completion URL.
716716
* @experimental
717717
*/
718-
__experimental_nextTask: (params?: NextTaskParams) => Promise<void>;
718+
__experimental_navigateToTask: (params?: NextTaskParams) => Promise<void>;
719719

720720
/**
721721
* This is an optional function.

0 commit comments

Comments
 (0)