Skip to content

Commit a9143d3

Browse files
committed
Plug pending session into main Client resource
1 parent 671e69a commit a9143d3

File tree

19 files changed

+79
-65
lines changed

19 files changed

+79
-65
lines changed

integration/testUtils/handshake.ts

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ export function generateConfig({ mode, matchedKeys = true }: { mode: 'test' | 'l
108108
state,
109109
extraClaims,
110110
}: {
111+
// todo -> add tests for pending
111112
state: 'active' | 'expired' | 'early';
112113
extraClaims?: Map<string, any>;
113114
}) => {

packages/astro/src/stores/internal.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {
2-
ActiveSessionResource,
2+
AuthenticatedSessionResource,
33
Clerk,
44
ClientResource,
55
InitialState,
@@ -12,7 +12,7 @@ export const $csrState = map<{
1212
isLoaded: boolean;
1313
client: ClientResource | undefined | null;
1414
user: UserResource | undefined | null;
15-
session: ActiveSessionResource | undefined | null;
15+
session: AuthenticatedSessionResource | undefined | null;
1616
organization: OrganizationResource | undefined | null;
1717
}>({
1818
isLoaded: false,

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

+2
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ describe('Clerk singleton', () => {
148148
});
149149
});
150150

151+
// todo -> add tests for pending
151152
describe('.setActive', () => {
152153
const mockSession = {
153154
id: '1',
@@ -455,6 +456,7 @@ describe('Clerk singleton', () => {
455456
});
456457
});
457458

459+
// todo -> add tests for pending
458460
describe('.load()', () => {
459461
const mockSession = {
460462
id: '1',

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

+14-14
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { addClerkPrefix, isAbsoluteUrl, stripScheme } from '@clerk/shared/url';
1010
import { handleValueOrFn, noop } from '@clerk/shared/utils';
1111
import type {
1212
__internal_UserVerificationModalProps,
13-
ActiveSessionResource,
13+
AuthenticatedSessionResource,
1414
AuthenticateWithCoinbaseWalletParams,
1515
AuthenticateWithGoogleOneTapParams,
1616
AuthenticateWithMetamaskParams,
@@ -164,7 +164,7 @@ export class Clerk implements ClerkInterface {
164164
};
165165

166166
public client: ClientResource | undefined;
167-
public session: ActiveSessionResource | null | undefined;
167+
public session: AuthenticatedSessionResource | null | undefined;
168168
public organization: OrganizationResource | null | undefined;
169169
public user: UserResource | null | undefined;
170170
public __internal_country?: string | null;
@@ -385,7 +385,7 @@ export class Clerk implements ClerkInterface {
385385
});
386386
};
387387

388-
if (!opts.sessionId || this.client.activeSessions.length === 1) {
388+
if (!opts.sessionId || this.client.authenticatedSessions.length === 1) {
389389
if (this.#options.experimental?.persistClient ?? true) {
390390
await this.client.removeSessions();
391391
} else {
@@ -395,7 +395,7 @@ export class Clerk implements ClerkInterface {
395395
return handleSetActive();
396396
}
397397

398-
const session = this.client.activeSessions.find(s => s.id === opts.sessionId);
398+
const session = this.client.authenticatedSessions.find(s => s.id === opts.sessionId);
399399
const shouldSignOutCurrent = session?.id && this.session?.id === session.id;
400400
await session?.remove();
401401
if (shouldSignOutCurrent) {
@@ -846,12 +846,12 @@ export class Clerk implements ClerkInterface {
846846
: noop;
847847

848848
if (typeof session === 'string') {
849-
session = (this.client.sessions.find(x => x.id === session) as ActiveSessionResource) || null;
849+
session = (this.client.sessions.find(x => x.id === session) as AuthenticatedSessionResource) || null;
850850
}
851851

852852
let newSession = session === undefined ? this.session : session;
853853

854-
// At this point, the `session` variable should contain either an `ActiveSessionResource`
854+
// At this point, the `session` variable should contain either an `AuthenticatedSessionResource`
855855
// ,`null` or `undefined`.
856856
// We now want to set the last active organization id on that session (if it exists).
857857
// However, if the `organization` parameter is not given (i.e. `undefined`), we want
@@ -889,7 +889,7 @@ export class Clerk implements ClerkInterface {
889889
// Note that this will also update the session's active organization
890890
// id.
891891
if (inActiveBrowserTab() || !this.#options.standardBrowser) {
892-
await this.#touchLastActiveSession(newSession);
892+
await this.#touchCurrentSession(newSession);
893893
// reload session from updated client
894894
newSession = this.#getSessionFromClient(newSession?.id);
895895
}
@@ -1983,14 +1983,14 @@ export class Clerk implements ClerkInterface {
19831983
this.#emit();
19841984
};
19851985

1986-
#defaultSession = (client: ClientResource): ActiveSessionResource | null => {
1986+
#defaultSession = (client: ClientResource): AuthenticatedSessionResource | null => {
19871987
if (client.lastActiveSessionId) {
19881988
const lastActiveSession = client.activeSessions.find(s => s.id === client.lastActiveSessionId);
19891989
if (lastActiveSession) {
19901990
return lastActiveSession;
19911991
}
19921992
}
1993-
const session = client.activeSessions[0];
1993+
const session = client.authenticatedSessions[0];
19941994
return session || null;
19951995
};
19961996

@@ -2006,7 +2006,7 @@ export class Clerk implements ClerkInterface {
20062006
}
20072007
this.#touchThrottledUntil = Date.now() + 5_000;
20082008

2009-
void this.#touchLastActiveSession(this.session);
2009+
void this.#touchCurrentSession(this.session);
20102010
}
20112011
});
20122012

@@ -2018,7 +2018,7 @@ export class Clerk implements ClerkInterface {
20182018
};
20192019

20202020
// TODO: Be more conservative about touches. Throttle, don't touch when only one user, etc
2021-
#touchLastActiveSession = async (session?: ActiveSessionResource | null): Promise<void> => {
2021+
#touchCurrentSession = async (session?: AuthenticatedSessionResource | null): Promise<void> => {
20222022
if (!session || !this.#options.touchSession) {
20232023
return Promise.resolve();
20242024
}
@@ -2068,14 +2068,14 @@ export class Clerk implements ClerkInterface {
20682068
);
20692069
};
20702070

2071-
#setAccessors = (session?: ActiveSessionResource | null) => {
2071+
#setAccessors = (session?: AuthenticatedSessionResource | null) => {
20722072
this.session = session || null;
20732073
this.organization = this.#getLastActiveOrganizationFromSession();
20742074
this.#aliasUser();
20752075
};
20762076

2077-
#getSessionFromClient = (sessionId: string | undefined): ActiveSessionResource | null => {
2078-
return this.client?.activeSessions.find(x => x.id === sessionId) || null;
2077+
#getSessionFromClient = (sessionId: string | undefined): AuthenticatedSessionResource | null => {
2078+
return this.client?.authenticatedSessions.find(x => x.id === sessionId) || null;
20792079
};
20802080

20812081
#aliasUser = () => {

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

+13-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import type {
2-
ActiveSessionResource,
3-
ClientJSON,
4-
ClientJSONSnapshot,
5-
ClientResource,
6-
SignInResource,
7-
SignUpResource,
1+
import {
2+
type ActiveSessionResource,
3+
type AuthenticatedSessionResource,
4+
type ClientJSON,
5+
type ClientJSONSnapshot,
6+
type ClientResource,
7+
type SignInResource,
8+
type SignUpResource,
89
} from '@clerk/types';
910

1011
import { unixEpochToDate } from '../../utils/date';
@@ -53,10 +54,15 @@ export class Client extends BaseResource implements ClientResource {
5354
return this.signIn;
5455
}
5556

57+
// todo -> maybe deprecate it? unless we want to explicitly point to active sessions somewhere
5658
get activeSessions(): ActiveSessionResource[] {
5759
return this.sessions.filter(s => s.status === 'active') as ActiveSessionResource[];
5860
}
5961

62+
get authenticatedSessions(): AuthenticatedSessionResource[] {
63+
return this.sessions.filter(s => s.status === 'active' || s.status === 'pending') as AuthenticatedSessionResource[];
64+
}
65+
6066
create(): Promise<this> {
6167
return this._basePut();
6268
}

packages/clerk-js/src/ui/components/ImpersonationFab/ImpersonationFab.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useClerk, useSession, useUser } from '@clerk/shared/react';
2-
import type { ActiveSessionResource } from '@clerk/types';
2+
import type { AuthenticatedSessionResource } from '@clerk/types';
33
import type { PointerEventHandler } from 'react';
44
import React, { useEffect, useRef } from 'react';
55

@@ -66,7 +66,7 @@ const FabContent = ({ title, signOutText }: FabContentProps) => {
6666
const { otherSessions } = useMultipleSessions({ user });
6767
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();
6868

69-
const handleSignOutSessionClicked = (session: ActiveSessionResource) => () => {
69+
const handleSignOutSessionClicked = (session: AuthenticatedSessionResource) => () => {
7070
if (otherSessions.length === 0) {
7171
return signOut(navigateAfterSignOut);
7272
}

packages/clerk-js/src/ui/components/UserButton/SessionActions.tsx

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ActiveSessionResource } from '@clerk/types';
1+
import type { AuthenticatedSessionResource } from '@clerk/types';
22

33
import type { ElementDescriptor, ElementId } from '../../../ui/customizables/elementDescriptors';
44
import { useRouter } from '../../../ui/router';
@@ -13,9 +13,9 @@ import type { DefaultItemIds, MenuItem } from '../../utils/createCustomMenuItems
1313

1414
type SingleSessionActionsProps = {
1515
handleManageAccountClicked: () => Promise<unknown> | void;
16-
handleSignOutSessionClicked: (session: ActiveSessionResource) => () => Promise<unknown> | void;
16+
handleSignOutSessionClicked: (session: AuthenticatedSessionResource) => () => Promise<unknown> | void;
1717
handleUserProfileActionClicked: (startPath?: string) => Promise<unknown> | void;
18-
session: ActiveSessionResource;
18+
session: AuthenticatedSessionResource;
1919
completedCallback: () => void;
2020
};
2121

@@ -113,12 +113,12 @@ export const SingleSessionActions = (props: SingleSessionActionsProps) => {
113113

114114
type MultiSessionActionsProps = {
115115
handleManageAccountClicked: () => Promise<unknown> | void;
116-
handleSignOutSessionClicked: (session: ActiveSessionResource) => () => Promise<unknown> | void;
117-
handleSessionClicked: (session: ActiveSessionResource) => () => Promise<unknown> | void;
116+
handleSignOutSessionClicked: (session: AuthenticatedSessionResource) => () => Promise<unknown> | void;
117+
handleSessionClicked: (session: AuthenticatedSessionResource) => () => Promise<unknown> | void;
118118
handleAddAccountClicked: () => Promise<unknown> | void;
119119
handleUserProfileActionClicked: (startPath?: string) => Promise<unknown> | void;
120-
session: ActiveSessionResource;
121-
otherSessions: ActiveSessionResource[];
120+
session: AuthenticatedSessionResource;
121+
otherSessions: AuthenticatedSessionResource[];
122122
completedCallback: () => void;
123123
};
124124

packages/clerk-js/src/ui/components/UserButton/UserButtonPopover.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useSession, useUser } from '@clerk/shared/react';
2-
import type { ActiveSessionResource } from '@clerk/types';
2+
import type { AuthenticatedSessionResource } from '@clerk/types';
33
import React from 'react';
44

55
import { useEnvironment, useUserButtonContext } from '../../contexts';
@@ -14,7 +14,7 @@ type UserButtonPopoverProps = { close?: (open: boolean) => void } & PropsOfCompo
1414
export const UserButtonPopover = React.forwardRef<HTMLDivElement, UserButtonPopoverProps>((props, ref) => {
1515
const { close: unsafeClose, ...rest } = props;
1616
const close = () => unsafeClose?.(false);
17-
const { session } = useSession() as { session: ActiveSessionResource };
17+
const { session } = useSession() as { session: AuthenticatedSessionResource };
1818
const userButtonContext = useUserButtonContext();
1919
const { __experimental_asStandalone } = userButtonContext;
2020
const { authConfig } = useEnvironment();

packages/clerk-js/src/ui/components/UserButton/useMultisessionActions.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useClerk } from '@clerk/shared/react';
2-
import type { ActiveSessionResource, UserButtonProps, UserResource } from '@clerk/types';
2+
import type { AuthenticatedSessionResource, UserButtonProps, UserResource } from '@clerk/types';
33

44
import { windowNavigate } from '../../../utils/windowNavigate';
55
import { useCardState } from '../../elements';
@@ -20,10 +20,10 @@ type UseMultisessionActionsParams = {
2020
export const useMultisessionActions = (opts: UseMultisessionActionsParams) => {
2121
const { setActive, signOut, openUserProfile } = useClerk();
2222
const card = useCardState();
23-
const { activeSessions, otherSessions } = useMultipleSessions({ user: opts.user });
23+
const { authenticatedSessions, otherSessions } = useMultipleSessions({ user: opts.user });
2424
const { navigate } = useRouter();
2525

26-
const handleSignOutSessionClicked = (session: ActiveSessionResource) => () => {
26+
const handleSignOutSessionClicked = (session: AuthenticatedSessionResource) => () => {
2727
if (otherSessions.length === 0) {
2828
return signOut(opts.navigateAfterSignOut);
2929
}
@@ -66,7 +66,7 @@ export const useMultisessionActions = (opts: UseMultisessionActionsParams) => {
6666
return signOut(opts.navigateAfterSignOut);
6767
};
6868

69-
const handleSessionClicked = (session: ActiveSessionResource) => async () => {
69+
const handleSessionClicked = (session: AuthenticatedSessionResource) => async () => {
7070
card.setLoading();
7171
return setActive({ session, redirectUrl: opts.afterSwitchSessionUrl }).finally(() => {
7272
card.setIdle();
@@ -87,6 +87,6 @@ export const useMultisessionActions = (opts: UseMultisessionActionsParams) => {
8787
handleSessionClicked,
8888
handleAddAccountClicked,
8989
otherSessions,
90-
activeSessions,
90+
authenticatedSessions,
9191
};
9292
};

packages/clerk-js/src/ui/hooks/useMultipleSessions.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
import { useSessionList } from '@clerk/shared/react';
1+
import { useClerk, useSessionList } from '@clerk/shared/react';
22
import type { ActiveSessionResource, UserResource } from '@clerk/types';
33

44
type UseMultipleSessionsParam = {
55
user: UserResource | null | undefined;
66
};
77

88
const useMultipleSessions = (params: UseMultipleSessionsParam) => {
9+
const clerk = useClerk();
910
const { sessions } = useSessionList();
10-
const activeSessions = sessions?.filter(s => s.status === 'active') as ActiveSessionResource[];
11-
const otherSessions = activeSessions.filter(s => s.user?.id !== params.user?.id);
11+
12+
const authenticatedSessions = sessions?.filter(
13+
s => s.status === 'active' || s.status === 'pending',
14+
) as ActiveSessionResource[];
15+
const otherSessions = authenticatedSessions.filter(s => s.user?.id !== params.user?.id);
1216

1317
return {
14-
activeSessions,
18+
authenticatedSessions: clerk.client.authenticatedSessions,
1519
otherSessions,
1620
};
1721
};

packages/elements/src/react/sign-in/choose-session/choose-session.hooks.ts

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as React from 'react';
44
import { useActiveTags } from '../../hooks';
55
import { SignInRouterCtx } from '../context';
66

7+
// todo -> handle pending
78
export type SignInActiveSessionListItem = Pick<ActiveSessionResource, 'id'> & PublicUserData;
89

910
export const SignInActiveSessionContext = React.createContext<SignInActiveSessionListItem | null>(null);

packages/react/src/isomorphicClerk.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { handleValueOrFn } from '@clerk/shared/utils';
55
import type {
66
__internal_UserVerificationModalProps,
77
__internal_UserVerificationProps,
8-
ActiveSessionResource,
8+
AuthenticatedSessionResource,
99
AuthenticateWithCoinbaseWalletParams,
1010
AuthenticateWithGoogleOneTapParams,
1111
AuthenticateWithMetamaskParams,
@@ -615,7 +615,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
615615
}
616616
}
617617

618-
get session(): ActiveSessionResource | undefined | null {
618+
get session(): AuthenticatedSessionResource | undefined | null {
619619
if (this.clerkjs) {
620620
return this.clerkjs.session;
621621
} else {

packages/shared/src/deriveState.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {
2-
ActiveSessionResource,
2+
AuthenticatedSessionResource,
33
InitialState,
44
OrganizationCustomPermissionKey,
55
OrganizationCustomRoleKey,
@@ -22,7 +22,7 @@ const deriveFromSsrInitialState = (initialState: InitialState) => {
2222
const userId = initialState.userId;
2323
const user = initialState.user as UserResource;
2424
const sessionId = initialState.sessionId;
25-
const session = initialState.session as ActiveSessionResource;
25+
const session = initialState.session as AuthenticatedSessionResource;
2626
const organization = initialState.organization as OrganizationResource;
2727
const orgId = initialState.orgId;
2828
const orgRole = initialState.orgRole as OrganizationCustomRoleKey;

packages/shared/src/react/contexts.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use client';
22

33
import type {
4-
ActiveSessionResource,
4+
AuthenticatedSessionResource,
55
ClerkOptions,
66
ClientResource,
77
LoadedClerk,
@@ -17,7 +17,7 @@ import { createContextAndHook } from './hooks/createContextAndHook';
1717
const [ClerkInstanceContext, useClerkInstanceContext] = createContextAndHook<LoadedClerk>('ClerkInstanceContext');
1818
const [UserContext, useUserContext] = createContextAndHook<UserResource | null | undefined>('UserContext');
1919
const [ClientContext, useClientContext] = createContextAndHook<ClientResource | null | undefined>('ClientContext');
20-
const [SessionContext, useSessionContext] = createContextAndHook<ActiveSessionResource | null | undefined>(
20+
const [SessionContext, useSessionContext] = createContextAndHook<AuthenticatedSessionResource | null | undefined>(
2121
'SessionContext',
2222
);
2323

0 commit comments

Comments
 (0)