@asgardeo/nextjs 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AsgardeoNextClient.js +8 -1
- package/dist/AsgardeoNextClient.js.map +1 -1
- package/dist/cjs/index.js +19 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/asgardeoMiddleware.d.ts +50 -13
- package/dist/middleware/asgardeoMiddleware.js +116 -63
- package/dist/middleware/asgardeoMiddleware.js.map +1 -1
- package/dist/middleware/createRouteMatcher.d.ts +39 -0
- package/dist/middleware/createRouteMatcher.js +52 -0
- package/dist/middleware/createRouteMatcher.js.map +1 -0
- package/dist/server/AsgardeoProvider.js +38 -13
- package/dist/server/AsgardeoProvider.js.map +1 -1
- package/dist/server/actions/getMyOrganizations.js +22 -1
- package/dist/server/actions/getMyOrganizations.js.map +1 -1
- package/dist/server/actions/getSessionId.d.ts +6 -0
- package/dist/server/actions/getSessionId.js +18 -2
- package/dist/server/actions/getSessionId.js.map +1 -1
- package/dist/server/actions/getSessionPayload.d.ts +26 -0
- package/dist/server/actions/getSessionPayload.js +41 -0
- package/dist/server/actions/getSessionPayload.js.map +1 -0
- package/dist/server/actions/handleOAuthCallbackAction.js +32 -12
- package/dist/server/actions/handleOAuthCallbackAction.js.map +1 -1
- package/dist/server/actions/isSignedIn.d.ts +8 -1
- package/dist/server/actions/isSignedIn.js +40 -3
- package/dist/server/actions/isSignedIn.js.map +1 -1
- package/dist/server/actions/signInAction.js +51 -18
- package/dist/server/actions/signInAction.js.map +1 -1
- package/dist/server/actions/signOutAction.d.ts +6 -0
- package/dist/server/actions/signOutAction.js +18 -3
- package/dist/server/actions/signOutAction.js.map +1 -1
- package/dist/utils/SessionManager.d.ts +95 -0
- package/dist/utils/SessionManager.js +143 -0
- package/dist/utils/SessionManager.js.map +1 -0
- package/dist/utils/createRouteMatcher.d.ts +38 -0
- package/dist/utils/createRouteMatcher.js +51 -0
- package/dist/utils/createRouteMatcher.js.map +1 -0
- package/dist/utils/sessionUtils.d.ts +59 -0
- package/dist/utils/sessionUtils.js +112 -0
- package/dist/utils/sessionUtils.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRouteMatcher.js","sourceRoot":"","sources":["../../src/middleware/createRouteMatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,kBAAkB,GAAG,CAAC,QAAkB,EAAE,EAAE;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC3C,sCAAsC;QACtC,MAAM,YAAY,GAAG,OAAO;aACzB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAE,cAAc;aACrC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAG,kBAAkB;aACzC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,gCAAgC;QAEjE,OAAO,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAgB,EAAW,EAAE;QACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -24,6 +24,7 @@ import getBrandingPreference from './actions/getBrandingPreference';
|
|
|
24
24
|
import getCurrentOrganizationAction from './actions/getCurrentOrganizationAction';
|
|
25
25
|
import getMyOrganizations from './actions/getMyOrganizations';
|
|
26
26
|
import getSessionId from './actions/getSessionId';
|
|
27
|
+
import getSessionPayload from './actions/getSessionPayload';
|
|
27
28
|
import getUserAction from './actions/getUserAction';
|
|
28
29
|
import getUserProfileAction from './actions/getUserProfileAction';
|
|
29
30
|
import handleOAuthCallbackAction from './actions/handleOAuthCallbackAction';
|
|
@@ -64,8 +65,10 @@ const AsgardeoServerProvider = async ({ children, afterSignInUrl, afterSignOutUr
|
|
|
64
65
|
if (!asgardeoClient.isInitialized) {
|
|
65
66
|
return _jsx(_Fragment, {});
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
const
|
|
68
|
+
// Try to get session information from JWT first, then fall back to legacy
|
|
69
|
+
const sessionPayload = await getSessionPayload();
|
|
70
|
+
const sessionId = sessionPayload?.sessionId || (await getSessionId()) || '';
|
|
71
|
+
const _isSignedIn = sessionPayload ? true : await isSignedIn(sessionId);
|
|
69
72
|
let user = {};
|
|
70
73
|
let userProfile = {
|
|
71
74
|
schemas: [],
|
|
@@ -80,21 +83,43 @@ const AsgardeoServerProvider = async ({ children, afterSignInUrl, afterSignOutUr
|
|
|
80
83
|
let myOrganizations = [];
|
|
81
84
|
let brandingPreference = null;
|
|
82
85
|
if (_isSignedIn) {
|
|
83
|
-
// Check if there's a `user_org` claim in the ID token to determine if this is an organization login
|
|
84
|
-
const idToken = await asgardeoClient.getDecodedIdToken(sessionId);
|
|
85
86
|
let updatedBaseUrl = config?.baseUrl;
|
|
86
|
-
if (
|
|
87
|
-
// Treat this login as an organization login and modify the base URL
|
|
87
|
+
if (sessionPayload?.organizationId) {
|
|
88
88
|
updatedBaseUrl = `${config?.baseUrl}/o`;
|
|
89
89
|
config = { ...config, baseUrl: updatedBaseUrl };
|
|
90
90
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
else if (sessionId) {
|
|
92
|
+
try {
|
|
93
|
+
const idToken = await asgardeoClient.getDecodedIdToken(sessionId);
|
|
94
|
+
if (idToken?.['user_org']) {
|
|
95
|
+
updatedBaseUrl = `${config?.baseUrl}/o`;
|
|
96
|
+
config = { ...config, baseUrl: updatedBaseUrl };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Continue without organization info
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const userResponse = await getUserAction(sessionId);
|
|
105
|
+
const userProfileResponse = await getUserProfileAction(sessionId);
|
|
106
|
+
const currentOrganizationResponse = await getCurrentOrganizationAction(sessionId);
|
|
107
|
+
if (sessionId) {
|
|
108
|
+
myOrganizations = await getMyOrganizations({}, sessionId);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.warn('[AsgardeoServerProvider] No session ID available, skipping organization fetch');
|
|
112
|
+
}
|
|
113
|
+
user = userResponse.data?.user || {};
|
|
114
|
+
userProfile = userProfileResponse.data?.userProfile;
|
|
115
|
+
currentOrganization = currentOrganizationResponse?.data?.organization;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
user = {};
|
|
119
|
+
userProfile = { schemas: [], profile: {}, flattenedProfile: {} };
|
|
120
|
+
currentOrganization = { id: '', name: '', orgHandle: '' };
|
|
121
|
+
myOrganizations = [];
|
|
122
|
+
}
|
|
98
123
|
}
|
|
99
124
|
// Fetch branding preference if branding is enabled in config
|
|
100
125
|
if (config?.preferences?.theme?.inheritFromBranding !== false) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsgardeoProvider.js","sourceRoot":"","sources":["../../src/server/AsgardeoProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;;AAEb,OAAO,EAAqB,oBAAoB,EAAkC,MAAM,gBAAgB,CAAC;AAGzG,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAC9D,OAAO,mBAAmB,MAAM,+BAA+B,CAAC;AAChE,OAAO,qBAAqB,MAAM,iCAAiC,CAAC;AACpE,OAAO,4BAA4B,MAAM,wCAAwC,CAAC;AAClF,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAC9D,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAClD,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,oBAAoB,MAAM,gCAAgC,CAAC;AAClE,OAAO,yBAAyB,MAAM,qCAAqC,CAAC;AAC5E,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAC9C,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAClD,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAClD,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAC9D,OAAO,uBAAuB,MAAM,mCAAmC,CAAC;AACxE,OAAO,kBAAkB,MAAM,uBAAuB,CAAC;AACvD,OAAO,sBAAsB,MAAM,8CAA8C,CAAC;AAUlF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,sBAAsB,GAAuD,KAAK,EAAE,EACxF,QAAQ,EACR,cAAc,EACd,eAAe,EACf,GAAG,OAAO,EACqC,EAAyB,EAAE;IAC1E,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,MAAM,GAAgC,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,UAAU,CAAC,OAA6B,CAAC,CAAC;QAC/D,MAAM,GAAG,MAAM,cAAc,CAAC,gBAAgB,EAAE,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAC5B,yCAAyC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAC5D,6BAA6B,EAC7B,MAAM,EACN,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;QAClC,OAAO,mBAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAW,CAAC,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"AsgardeoProvider.js","sourceRoot":"","sources":["../../src/server/AsgardeoProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,28 @@ import AsgardeoNextClient from '../../AsgardeoNextClient';
|
|
|
24
24
|
const getMyOrganizations = async (options, sessionId) => {
|
|
25
25
|
try {
|
|
26
26
|
const client = AsgardeoNextClient.getInstance();
|
|
27
|
-
|
|
27
|
+
// Get session ID if not provided
|
|
28
|
+
let resolvedSessionId = sessionId;
|
|
29
|
+
if (!resolvedSessionId) {
|
|
30
|
+
// Import getSessionId locally to avoid circular dependencies
|
|
31
|
+
const { default: getSessionId } = await import('./getSessionId');
|
|
32
|
+
resolvedSessionId = await getSessionId();
|
|
33
|
+
}
|
|
34
|
+
if (!resolvedSessionId) {
|
|
35
|
+
throw new AsgardeoAPIError('No session ID available for fetching organizations', 'getMyOrganizations-SessionError-001', 'nextjs', 401);
|
|
36
|
+
}
|
|
37
|
+
// Check if user is signed in by trying to get access token
|
|
38
|
+
try {
|
|
39
|
+
const accessToken = await client.getAccessToken(resolvedSessionId);
|
|
40
|
+
if (!accessToken) {
|
|
41
|
+
throw new AsgardeoAPIError('No access token available - user is not signed in', 'getMyOrganizations-NoAccessToken-001', 'nextjs', 401);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('[getMyOrganizations] Failed to get access token:', error);
|
|
46
|
+
throw new AsgardeoAPIError('User is not signed in - access token retrieval failed', 'getMyOrganizations-NotSignedIn-001', 'nextjs', 401);
|
|
47
|
+
}
|
|
48
|
+
return await client.getMyOrganizations(options, resolvedSessionId);
|
|
28
49
|
}
|
|
29
50
|
catch (error) {
|
|
30
51
|
throw new AsgardeoAPIError(`Failed to get the organizations for the user: ${error instanceof Error ? error.message : String(error)}`, 'getMyOrganizations-ServerActionError-001', 'nextjs', error instanceof AsgardeoAPIError ? error.statusCode : undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMyOrganizations.js","sourceRoot":"","sources":["../../../src/server/actions/getMyOrganizations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAC,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAC9D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAAE,OAAa,EAAE,SAA8B,EAA2B,EAAE;IAC1G,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"getMyOrganizations.js","sourceRoot":"","sources":["../../../src/server/actions/getMyOrganizations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAC,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAC9D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAAE,OAAa,EAAE,SAA8B,EAA2B,EAAE;IAC1G,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAEhD,iCAAiC;QACjC,IAAI,iBAAiB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,6DAA6D;YAC7D,MAAM,EAAC,OAAO,EAAE,YAAY,EAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC/D,iBAAiB,GAAG,MAAM,YAAY,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,gBAAgB,CACxB,oDAAoD,EACpD,qCAAqC,EACrC,QAAQ,EACR,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAEnE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,gBAAgB,CACxB,mDAAmD,EACnD,sCAAsC,EACtC,QAAQ,EACR,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACzE,MAAM,IAAI,gBAAgB,CACxB,uDAAuD,EACvD,oCAAoC,EACpC,QAAQ,EACR,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,gBAAgB,CACxB,iDAAiD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACzG,0CAA0C,EAC1C,QAAQ,EACR,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CACjE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -15,5 +15,11 @@
|
|
|
15
15
|
* specific language governing permissions and limitations
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
|
+
/**
|
|
19
|
+
* Get the session ID from cookies.
|
|
20
|
+
* Tries JWT session first, then falls back to legacy session ID.
|
|
21
|
+
*
|
|
22
|
+
* @returns The session ID if it exists, undefined otherwise
|
|
23
|
+
*/
|
|
18
24
|
declare const getSessionId: () => Promise<string | undefined>;
|
|
19
25
|
export default getSessionId;
|
|
@@ -16,11 +16,27 @@
|
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
18
|
'use server';
|
|
19
|
-
import { CookieConfig } from '@asgardeo/node';
|
|
20
19
|
import { cookies } from 'next/headers';
|
|
20
|
+
import SessionManager from '../../utils/SessionManager';
|
|
21
|
+
/**
|
|
22
|
+
* Get the session ID from cookies.
|
|
23
|
+
* Tries JWT session first, then falls back to legacy session ID.
|
|
24
|
+
*
|
|
25
|
+
* @returns The session ID if it exists, undefined otherwise
|
|
26
|
+
*/
|
|
21
27
|
const getSessionId = async () => {
|
|
22
28
|
const cookieStore = await cookies();
|
|
23
|
-
|
|
29
|
+
const sessionToken = cookieStore.get(SessionManager.getSessionCookieName())?.value;
|
|
30
|
+
if (sessionToken) {
|
|
31
|
+
try {
|
|
32
|
+
const sessionPayload = await SessionManager.verifySessionToken(sessionToken);
|
|
33
|
+
return sessionPayload.sessionId;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
24
40
|
};
|
|
25
41
|
export default getSessionId;
|
|
26
42
|
//# sourceMappingURL=getSessionId.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSessionId.js","sourceRoot":"","sources":["../../../src/server/actions/getSessionId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"getSessionId.js","sourceRoot":"","sources":["../../../src/server/actions/getSessionId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAIb,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AACrC,OAAO,cAAc,MAAM,4BAA4B,CAAC;AAExD;;;;;GAKG;AACH,MAAM,YAAY,GAAG,KAAK,IAAiC,EAAE;IAC3D,MAAM,WAAW,GAA2B,MAAM,OAAO,EAAE,CAAC;IAE5D,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,EAAE,KAAK,CAAC;IAEnF,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAE7E,OAAO,cAAc,CAAC,SAAS,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
|
|
3
|
+
*
|
|
4
|
+
* WSO2 LLC. licenses this file to you under the Apache License,
|
|
5
|
+
* Version 2.0 (the "License"); you may not use this file except
|
|
6
|
+
* in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing,
|
|
12
|
+
* software distributed under the License is distributed on an
|
|
13
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
* KIND, either express or implied. See the License for the
|
|
15
|
+
* specific language governing permissions and limitations
|
|
16
|
+
* under the License.
|
|
17
|
+
*/
|
|
18
|
+
import { SessionTokenPayload } from '../../utils/SessionManager';
|
|
19
|
+
/**
|
|
20
|
+
* Get the session payload from JWT session cookie.
|
|
21
|
+
* This includes user ID, session ID, scopes, and organization ID.
|
|
22
|
+
*
|
|
23
|
+
* @returns The session payload if valid JWT session exists, undefined otherwise
|
|
24
|
+
*/
|
|
25
|
+
declare const getSessionPayload: () => Promise<SessionTokenPayload | undefined>;
|
|
26
|
+
export default getSessionPayload;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
|
|
3
|
+
*
|
|
4
|
+
* WSO2 LLC. licenses this file to you under the Apache License,
|
|
5
|
+
* Version 2.0 (the "License"); you may not use this file except
|
|
6
|
+
* in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing,
|
|
12
|
+
* software distributed under the License is distributed on an
|
|
13
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
* KIND, either express or implied. See the License for the
|
|
15
|
+
* specific language governing permissions and limitations
|
|
16
|
+
* under the License.
|
|
17
|
+
*/
|
|
18
|
+
'use server';
|
|
19
|
+
import { cookies } from 'next/headers';
|
|
20
|
+
import SessionManager from '../../utils/SessionManager';
|
|
21
|
+
/**
|
|
22
|
+
* Get the session payload from JWT session cookie.
|
|
23
|
+
* This includes user ID, session ID, scopes, and organization ID.
|
|
24
|
+
*
|
|
25
|
+
* @returns The session payload if valid JWT session exists, undefined otherwise
|
|
26
|
+
*/
|
|
27
|
+
const getSessionPayload = async () => {
|
|
28
|
+
const cookieStore = await cookies();
|
|
29
|
+
const sessionToken = cookieStore.get(SessionManager.getSessionCookieName())?.value;
|
|
30
|
+
if (!sessionToken) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return await SessionManager.verifySessionToken(sessionToken);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export default getSessionPayload;
|
|
41
|
+
//# sourceMappingURL=getSessionPayload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSessionPayload.js","sourceRoot":"","sources":["../../../src/server/actions/getSessionPayload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAGb,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AACrC,OAAO,cAAqC,MAAM,4BAA4B,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,KAAK,IAA8C,EAAE;IAC7E,MAAM,WAAW,GAA2B,MAAM,OAAO,EAAE,CAAC;IAE5D,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,EAAE,KAAK,CAAC;IACnF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
*/
|
|
18
18
|
'use server';
|
|
19
19
|
import { cookies } from 'next/headers';
|
|
20
|
-
import { CookieConfig } from '@asgardeo/node';
|
|
21
20
|
import AsgardeoNextClient from '../../AsgardeoNextClient';
|
|
21
|
+
import SessionManager from '../../utils/SessionManager';
|
|
22
22
|
/**
|
|
23
23
|
* Server action to handle OAuth callback with authorization code.
|
|
24
24
|
* This action processes the authorization code received from the OAuth provider
|
|
@@ -34,45 +34,65 @@ const handleOAuthCallbackAction = async (code, state, sessionState) => {
|
|
|
34
34
|
if (!code || !state) {
|
|
35
35
|
return {
|
|
36
36
|
success: false,
|
|
37
|
-
error: 'Missing required OAuth parameters: code and state are required'
|
|
37
|
+
error: 'Missing required OAuth parameters: code and state are required',
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
-
// Get the Asgardeo client instance
|
|
41
40
|
const asgardeoClient = AsgardeoNextClient.getInstance();
|
|
42
41
|
if (!asgardeoClient.isInitialized) {
|
|
43
42
|
return {
|
|
44
43
|
success: false,
|
|
45
|
-
error: 'Asgardeo client is not initialized'
|
|
44
|
+
error: 'Asgardeo client is not initialized',
|
|
46
45
|
};
|
|
47
46
|
}
|
|
48
|
-
// Get the session ID from cookies
|
|
49
47
|
const cookieStore = await cookies();
|
|
50
|
-
|
|
48
|
+
let sessionId;
|
|
49
|
+
const tempSessionToken = cookieStore.get(SessionManager.getTempSessionCookieName())?.value;
|
|
50
|
+
if (tempSessionToken) {
|
|
51
|
+
try {
|
|
52
|
+
const tempSession = await SessionManager.verifyTempSession(tempSessionToken);
|
|
53
|
+
sessionId = tempSession.sessionId;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// TODO: Invalid temp session, throw error.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
51
59
|
if (!sessionId) {
|
|
52
60
|
return {
|
|
53
61
|
success: false,
|
|
54
|
-
error: 'No session found. Please start the authentication flow again.'
|
|
62
|
+
error: 'No session found. Please start the authentication flow again.',
|
|
55
63
|
};
|
|
56
64
|
}
|
|
57
65
|
// Exchange the authorization code for tokens
|
|
58
|
-
await asgardeoClient.signIn({
|
|
66
|
+
const signInResult = await asgardeoClient.signIn({
|
|
59
67
|
code,
|
|
60
68
|
session_state: sessionState,
|
|
61
69
|
state,
|
|
62
70
|
}, {}, sessionId);
|
|
63
|
-
|
|
71
|
+
if (signInResult) {
|
|
72
|
+
try {
|
|
73
|
+
const idToken = await asgardeoClient.getDecodedIdToken(sessionId);
|
|
74
|
+
const userIdFromToken = idToken.sub || signInResult['sub'] || sessionId;
|
|
75
|
+
const scopes = idToken['scope'] ? idToken['scope'].split(' ') : [];
|
|
76
|
+
const organizationId = idToken['user_org'] || idToken['organization_id'];
|
|
77
|
+
const sessionToken = await SessionManager.createSessionToken(userIdFromToken, sessionId, scopes, organizationId);
|
|
78
|
+
cookieStore.set(SessionManager.getSessionCookieName(), sessionToken, SessionManager.getSessionCookieOptions());
|
|
79
|
+
cookieStore.delete(SessionManager.getTempSessionCookieName());
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
console.warn('[handleOAuthCallbackAction] Failed to create JWT session, continuing with legacy session:', error);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
64
85
|
const config = await asgardeoClient.getConfiguration();
|
|
65
86
|
const afterSignInUrl = config.afterSignInUrl || '/';
|
|
66
87
|
return {
|
|
67
88
|
success: true,
|
|
68
|
-
redirectUrl: afterSignInUrl
|
|
89
|
+
redirectUrl: afterSignInUrl,
|
|
69
90
|
};
|
|
70
91
|
}
|
|
71
92
|
catch (error) {
|
|
72
|
-
console.error('[handleOAuthCallbackAction] OAuth callback error:', error);
|
|
73
93
|
return {
|
|
74
94
|
success: false,
|
|
75
|
-
error: error instanceof Error ? error.message : 'Authentication failed'
|
|
95
|
+
error: error instanceof Error ? error.message : 'Authentication failed',
|
|
76
96
|
};
|
|
77
97
|
}
|
|
78
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleOAuthCallbackAction.js","sourceRoot":"","sources":["../../../src/server/actions/handleOAuthCallbackAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,
|
|
1
|
+
{"version":3,"file":"handleOAuthCallbackAction.js","sourceRoot":"","sources":["../../../src/server/actions/handleOAuthCallbackAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,5 +15,12 @@
|
|
|
15
15
|
* specific language governing permissions and limitations
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Check if the user is currently signed in.
|
|
20
|
+
* First tries JWT session validation, then falls back to legacy session check.
|
|
21
|
+
*
|
|
22
|
+
* @param sessionId - Optional session ID to check (if not provided, gets from cookies)
|
|
23
|
+
* @returns True if user is signed in, false otherwise
|
|
24
|
+
*/
|
|
25
|
+
declare const isSignedIn: (sessionId?: string) => Promise<boolean>;
|
|
19
26
|
export default isSignedIn;
|
|
@@ -17,10 +17,47 @@
|
|
|
17
17
|
*/
|
|
18
18
|
'use server';
|
|
19
19
|
import AsgardeoNextClient from '../../AsgardeoNextClient';
|
|
20
|
+
import getSessionId from './getSessionId';
|
|
21
|
+
import getSessionPayload from './getSessionPayload';
|
|
22
|
+
/**
|
|
23
|
+
* Check if the user is currently signed in.
|
|
24
|
+
* First tries JWT session validation, then falls back to legacy session check.
|
|
25
|
+
*
|
|
26
|
+
* @param sessionId - Optional session ID to check (if not provided, gets from cookies)
|
|
27
|
+
* @returns True if user is signed in, false otherwise
|
|
28
|
+
*/
|
|
20
29
|
const isSignedIn = async (sessionId) => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
try {
|
|
31
|
+
const sessionPayload = await getSessionPayload();
|
|
32
|
+
if (sessionPayload) {
|
|
33
|
+
const resolvedSessionId = sessionPayload.sessionId;
|
|
34
|
+
if (resolvedSessionId) {
|
|
35
|
+
const client = AsgardeoNextClient.getInstance();
|
|
36
|
+
try {
|
|
37
|
+
const accessToken = await client.getAccessToken(resolvedSessionId);
|
|
38
|
+
return !!accessToken;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const resolvedSessionId = sessionId || (await getSessionId());
|
|
46
|
+
if (!resolvedSessionId) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const client = AsgardeoNextClient.getInstance();
|
|
50
|
+
try {
|
|
51
|
+
const accessToken = await client.getAccessToken(resolvedSessionId);
|
|
52
|
+
return !!accessToken;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
24
61
|
};
|
|
25
62
|
export default isSignedIn;
|
|
26
63
|
//# sourceMappingURL=isSignedIn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isSignedIn.js","sourceRoot":"","sources":["../../../src/server/actions/isSignedIn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"isSignedIn.js","sourceRoot":"","sources":["../../../src/server/actions/isSignedIn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,KAAK,EAAE,SAAkB,EAAoB,EAAE;IAChE,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEjD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,iBAAiB,GAAG,cAAc,CAAC,SAAS,CAAC;YAEnD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;oBACnE,OAAO,CAAC,CAAC,WAAW,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAG,SAAS,IAAI,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC;QAE9D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAEnE,OAAO,CAAC,CAAC,WAAW,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import { cookies } from 'next/headers';
|
|
20
20
|
import { CookieConfig, generateSessionId, EmbeddedSignInFlowStatus, } from '@asgardeo/node';
|
|
21
21
|
import AsgardeoNextClient from '../../AsgardeoNextClient';
|
|
22
|
+
import SessionManager from '../../utils/SessionManager';
|
|
22
23
|
/**
|
|
23
24
|
* Server action for signing in a user.
|
|
24
25
|
* Handles the embedded sign-in flow and manages session cookies.
|
|
@@ -31,10 +32,36 @@ const signInAction = async (payload, request) => {
|
|
|
31
32
|
try {
|
|
32
33
|
const client = AsgardeoNextClient.getInstance();
|
|
33
34
|
const cookieStore = await cookies();
|
|
34
|
-
let
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
let sessionId;
|
|
36
|
+
let userId;
|
|
37
|
+
const existingSessionToken = cookieStore.get(SessionManager.getSessionCookieName())?.value;
|
|
38
|
+
if (existingSessionToken) {
|
|
39
|
+
try {
|
|
40
|
+
const sessionPayload = await SessionManager.verifySessionToken(existingSessionToken);
|
|
41
|
+
sessionId = sessionPayload.sessionId;
|
|
42
|
+
userId = sessionPayload.sub;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Invalid session token, will create new temp session
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!sessionId) {
|
|
49
|
+
const tempSessionToken = cookieStore.get(SessionManager.getTempSessionCookieName())?.value;
|
|
50
|
+
if (tempSessionToken) {
|
|
51
|
+
try {
|
|
52
|
+
const tempSession = await SessionManager.verifyTempSession(tempSessionToken);
|
|
53
|
+
sessionId = tempSession.sessionId;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Invalid temp session, will create new one
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!sessionId) {
|
|
61
|
+
sessionId = generateSessionId();
|
|
62
|
+
const tempSessionToken = await SessionManager.createTempSession(sessionId);
|
|
63
|
+
cookieStore.set(SessionManager.getTempSessionCookieName(), tempSessionToken, SessionManager.getTempSessionCookieOptions());
|
|
64
|
+
cookieStore.set(CookieConfig.SESSION_COOKIE_NAME, sessionId, {
|
|
38
65
|
httpOnly: CookieConfig.DEFAULT_HTTP_ONLY,
|
|
39
66
|
maxAge: CookieConfig.DEFAULT_MAX_AGE,
|
|
40
67
|
sameSite: CookieConfig.DEFAULT_SAME_SITE,
|
|
@@ -42,25 +69,31 @@ const signInAction = async (payload, request) => {
|
|
|
42
69
|
});
|
|
43
70
|
}
|
|
44
71
|
// If no payload provided, redirect to sign-in URL for redirect-based sign-in.
|
|
45
|
-
// If there's a payload, handle the embedded sign-in flow.
|
|
46
72
|
if (!payload) {
|
|
47
|
-
const defaultSignInUrl = await client.getAuthorizeRequestUrl({},
|
|
73
|
+
const defaultSignInUrl = await client.getAuthorizeRequestUrl({}, sessionId);
|
|
48
74
|
return { success: true, data: { signInUrl: String(defaultSignInUrl) } };
|
|
49
75
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
76
|
+
// Handle embedded sign-in flow
|
|
77
|
+
const response = await client.signIn(payload, request, sessionId);
|
|
78
|
+
if (response.flowStatus === EmbeddedSignInFlowStatus.SuccessCompleted) {
|
|
79
|
+
const signInResult = await client.signIn({
|
|
80
|
+
code: response?.authData?.code,
|
|
81
|
+
session_state: response?.authData?.session_state,
|
|
82
|
+
state: response?.authData?.state,
|
|
83
|
+
}, {}, sessionId);
|
|
84
|
+
if (signInResult) {
|
|
85
|
+
const idToken = await client.getDecodedIdToken(sessionId);
|
|
86
|
+
const userIdFromToken = idToken['sub'] || signInResult['sub'] || sessionId;
|
|
87
|
+
const scopes = idToken['scope'] ? idToken['scope'].split(' ') : [];
|
|
88
|
+
const organizationId = idToken['user_org'] || idToken['organization_id'];
|
|
89
|
+
const sessionToken = await SessionManager.createSessionToken(userIdFromToken, sessionId, scopes, organizationId);
|
|
90
|
+
cookieStore.set(SessionManager.getSessionCookieName(), sessionToken, SessionManager.getSessionCookieOptions());
|
|
91
|
+
cookieStore.delete(SessionManager.getTempSessionCookieName());
|
|
61
92
|
}
|
|
62
|
-
|
|
93
|
+
const afterSignInUrl = await (await client.getStorageManager()).getConfigDataParameter('afterSignInUrl');
|
|
94
|
+
return { success: true, data: { afterSignInUrl: String(afterSignInUrl) } };
|
|
63
95
|
}
|
|
96
|
+
return { success: true, data: response };
|
|
64
97
|
}
|
|
65
98
|
catch (error) {
|
|
66
99
|
console.error('[signInAction] Error during sign-in:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signInAction.js","sourceRoot":"","sources":["../../../src/server/actions/signInAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,GAIzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"signInAction.js","sourceRoot":"","sources":["../../../src/server/actions/signInAction.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,12 @@
|
|
|
15
15
|
* specific language governing permissions and limitations
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
|
+
/**
|
|
19
|
+
* Server action for signing out a user.
|
|
20
|
+
* Clears both JWT and legacy session cookies.
|
|
21
|
+
*
|
|
22
|
+
* @returns Promise that resolves with success status and optional after sign-out URL
|
|
23
|
+
*/
|
|
18
24
|
declare const signOutAction: () => Promise<{
|
|
19
25
|
success: boolean;
|
|
20
26
|
data?: {
|
|
@@ -16,13 +16,28 @@
|
|
|
16
16
|
* under the License.
|
|
17
17
|
*/
|
|
18
18
|
'use server';
|
|
19
|
+
import { cookies } from 'next/headers';
|
|
19
20
|
import AsgardeoNextClient from '../../AsgardeoNextClient';
|
|
20
|
-
import
|
|
21
|
+
import SessionManager from '../../utils/SessionManager';
|
|
22
|
+
import getSessionId from './getSessionId';
|
|
23
|
+
/**
|
|
24
|
+
* Server action for signing out a user.
|
|
25
|
+
* Clears both JWT and legacy session cookies.
|
|
26
|
+
*
|
|
27
|
+
* @returns Promise that resolves with success status and optional after sign-out URL
|
|
28
|
+
*/
|
|
21
29
|
const signOutAction = async () => {
|
|
22
30
|
try {
|
|
23
31
|
const client = AsgardeoNextClient.getInstance();
|
|
24
|
-
const
|
|
25
|
-
|
|
32
|
+
const sessionId = await getSessionId();
|
|
33
|
+
let afterSignOutUrl = '/';
|
|
34
|
+
if (sessionId) {
|
|
35
|
+
afterSignOutUrl = await client.signOut({}, sessionId);
|
|
36
|
+
}
|
|
37
|
+
const cookieStore = await cookies();
|
|
38
|
+
cookieStore.delete(SessionManager.getSessionCookieName());
|
|
39
|
+
cookieStore.delete(SessionManager.getTempSessionCookieName());
|
|
40
|
+
await import('./deleteSessionId').then(module => module.default());
|
|
26
41
|
return { success: true, data: { afterSignOutUrl } };
|
|
27
42
|
}
|
|
28
43
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signOutAction.js","sourceRoot":"","sources":["../../../src/server/actions/signOutAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"signOutAction.js","sourceRoot":"","sources":["../../../src/server/actions/signOutAction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AACrC,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,cAAc,MAAM,4BAA4B,CAAC;AACxD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,aAAa,GAAG,KAAK,IAAqF,EAAE;IAChH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;QAEvC,IAAI,eAAe,GAAW,GAAG,CAAC;QAElC,IAAI,SAAS,EAAE,CAAC;YACd,eAAe,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAC;QAEpC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAE1D,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,wBAAwB,EAAE,CAAC,CAAC;QAE9D,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAEnE,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAC,eAAe,EAAC,EAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|