@multiplatform.one/keycloak 5.0.11 → 5.0.16
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/cjs/index.js +2 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +4 -4
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/keycloak/base.js +1 -1
- package/dist/cjs/keycloak/base.js.map +1 -1
- package/dist/cjs/keycloak/base.native.js +1 -1
- package/dist/cjs/keycloak/base.native.js.map +1 -1
- package/dist/cjs/keycloak/index.electron.cjs +27 -3
- package/dist/cjs/keycloak/index.electron.js +17 -2
- package/dist/cjs/keycloak/index.electron.js.map +1 -1
- package/dist/cjs/keycloak/index.electron.native.js +52 -3
- package/dist/cjs/keycloak/index.electron.native.js.map +2 -2
- package/dist/cjs/keycloak/index.js +1 -1
- package/dist/cjs/keycloak/index.js.map +1 -1
- package/dist/cjs/keycloak/index.webext.cjs +54 -0
- package/dist/cjs/keycloak/index.webext.js +40 -0
- package/dist/cjs/keycloak/index.webext.js.map +6 -0
- package/dist/cjs/keycloak/index.webext.native.js +137 -0
- package/dist/cjs/keycloak/index.webext.native.js.map +6 -0
- package/dist/cjs/provider/AuthProvider/index.cjs +6 -6
- package/dist/cjs/provider/AuthProvider/index.electron.cjs +3 -3
- package/dist/cjs/provider/AuthProvider/index.electron.js +4 -3
- package/dist/cjs/provider/AuthProvider/index.electron.js.map +1 -1
- package/dist/cjs/provider/AuthProvider/index.electron.native.js +4 -5
- package/dist/cjs/provider/AuthProvider/index.electron.native.js.map +1 -1
- package/dist/cjs/provider/AuthProvider/index.js +7 -6
- package/dist/cjs/provider/AuthProvider/index.js.map +1 -1
- package/dist/cjs/provider/AuthProvider/index.native.js +9 -8
- package/dist/cjs/provider/AuthProvider/index.native.js.map +1 -1
- package/dist/cjs/provider/AuthProvider/index.webext.cjs +223 -0
- package/dist/cjs/provider/AuthProvider/index.webext.js +244 -0
- package/dist/cjs/provider/AuthProvider/index.webext.js.map +6 -0
- package/dist/cjs/provider/AuthProvider/index.webext.native.js +299 -0
- package/dist/cjs/provider/AuthProvider/index.webext.native.js.map +6 -0
- package/dist/cjs/session/index.electron.cjs +32 -0
- package/dist/cjs/session/index.electron.js +27 -0
- package/dist/cjs/session/index.electron.js.map +6 -0
- package/dist/cjs/session/index.electron.native.js +33 -0
- package/dist/cjs/session/index.electron.native.js.map +6 -0
- package/dist/cjs/session/index.webext.cjs +32 -0
- package/dist/cjs/session/index.webext.js +27 -0
- package/dist/cjs/session/index.webext.js.map +6 -0
- package/dist/cjs/session/index.webext.native.js +33 -0
- package/dist/cjs/session/index.webext.native.js.map +6 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -2
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/keycloak/base.js +1 -1
- package/dist/esm/keycloak/base.mjs +1 -1
- package/dist/esm/keycloak/base.native.js +1 -1
- package/dist/esm/keycloak/index.electron.js +23 -2
- package/dist/esm/keycloak/index.electron.js.map +1 -1
- package/dist/esm/keycloak/index.electron.mjs +25 -2
- package/dist/esm/keycloak/index.electron.mjs.map +1 -1
- package/dist/esm/keycloak/index.electron.native.js +54 -2
- package/dist/esm/keycloak/index.electron.native.js.map +2 -2
- package/dist/esm/keycloak/index.js +2 -2
- package/dist/esm/keycloak/index.mjs +2 -2
- package/dist/esm/keycloak/index.webext.js +30 -0
- package/dist/esm/keycloak/index.webext.js.map +6 -0
- package/dist/esm/keycloak/index.webext.mjs +29 -0
- package/dist/esm/keycloak/index.webext.mjs.map +1 -0
- package/dist/esm/keycloak/index.webext.native.js +117 -0
- package/dist/esm/keycloak/index.webext.native.js.map +6 -0
- package/dist/esm/provider/AuthProvider/index.electron.js +4 -3
- package/dist/esm/provider/AuthProvider/index.electron.js.map +1 -1
- package/dist/esm/provider/AuthProvider/index.electron.mjs +3 -3
- package/dist/esm/provider/AuthProvider/index.electron.mjs.map +1 -1
- package/dist/esm/provider/AuthProvider/index.electron.native.js +4 -5
- package/dist/esm/provider/AuthProvider/index.electron.native.js.map +1 -1
- package/dist/esm/provider/AuthProvider/index.js +7 -6
- package/dist/esm/provider/AuthProvider/index.js.map +1 -1
- package/dist/esm/provider/AuthProvider/index.mjs +6 -6
- package/dist/esm/provider/AuthProvider/index.mjs.map +1 -1
- package/dist/esm/provider/AuthProvider/index.native.js +9 -8
- package/dist/esm/provider/AuthProvider/index.native.js.map +1 -1
- package/dist/esm/provider/AuthProvider/index.webext.js +231 -0
- package/dist/esm/provider/AuthProvider/index.webext.js.map +6 -0
- package/dist/esm/provider/AuthProvider/index.webext.mjs +189 -0
- package/dist/esm/provider/AuthProvider/index.webext.mjs.map +1 -0
- package/dist/esm/provider/AuthProvider/index.webext.native.js +281 -0
- package/dist/esm/provider/AuthProvider/index.webext.native.js.map +6 -0
- package/dist/esm/session/index.electron.js +11 -0
- package/dist/esm/session/index.electron.js.map +6 -0
- package/dist/esm/session/index.electron.mjs +8 -0
- package/dist/esm/session/index.electron.mjs.map +1 -0
- package/dist/esm/session/index.electron.native.js +11 -0
- package/dist/esm/session/index.electron.native.js.map +6 -0
- package/dist/esm/session/index.webext.js +11 -0
- package/dist/esm/session/index.webext.js.map +6 -0
- package/dist/esm/session/index.webext.mjs +8 -0
- package/dist/esm/session/index.webext.mjs.map +1 -0
- package/dist/esm/session/index.webext.native.js +11 -0
- package/dist/esm/session/index.webext.native.js.map +6 -0
- package/dist/jsx/index.js +2 -2
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -2
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +2 -2
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/keycloak/base.js +1 -1
- package/dist/jsx/keycloak/base.mjs +1 -1
- package/dist/jsx/keycloak/base.native.js +1 -1
- package/dist/jsx/keycloak/index.electron.js +23 -2
- package/dist/jsx/keycloak/index.electron.js.map +1 -1
- package/dist/jsx/keycloak/index.electron.mjs +25 -2
- package/dist/jsx/keycloak/index.electron.mjs.map +1 -1
- package/dist/jsx/keycloak/index.electron.native.js +54 -2
- package/dist/jsx/keycloak/index.electron.native.js.map +2 -2
- package/dist/jsx/keycloak/index.js +2 -2
- package/dist/jsx/keycloak/index.mjs +2 -2
- package/dist/jsx/keycloak/index.webext.js +30 -0
- package/dist/jsx/keycloak/index.webext.js.map +6 -0
- package/dist/jsx/keycloak/index.webext.mjs +29 -0
- package/dist/jsx/keycloak/index.webext.mjs.map +1 -0
- package/dist/jsx/keycloak/index.webext.native.js +117 -0
- package/dist/jsx/keycloak/index.webext.native.js.map +6 -0
- package/dist/jsx/provider/AuthProvider/index.electron.js +4 -3
- package/dist/jsx/provider/AuthProvider/index.electron.js.map +1 -1
- package/dist/jsx/provider/AuthProvider/index.electron.mjs +3 -3
- package/dist/jsx/provider/AuthProvider/index.electron.mjs.map +1 -1
- package/dist/jsx/provider/AuthProvider/index.electron.native.js +4 -5
- package/dist/jsx/provider/AuthProvider/index.electron.native.js.map +1 -1
- package/dist/jsx/provider/AuthProvider/index.js +7 -6
- package/dist/jsx/provider/AuthProvider/index.js.map +1 -1
- package/dist/jsx/provider/AuthProvider/index.mjs +6 -6
- package/dist/jsx/provider/AuthProvider/index.mjs.map +1 -1
- package/dist/jsx/provider/AuthProvider/index.native.js +9 -8
- package/dist/jsx/provider/AuthProvider/index.native.js.map +1 -1
- package/dist/jsx/provider/AuthProvider/index.webext.js +231 -0
- package/dist/jsx/provider/AuthProvider/index.webext.js.map +6 -0
- package/dist/jsx/provider/AuthProvider/index.webext.mjs +189 -0
- package/dist/jsx/provider/AuthProvider/index.webext.mjs.map +1 -0
- package/dist/jsx/provider/AuthProvider/index.webext.native.js +281 -0
- package/dist/jsx/provider/AuthProvider/index.webext.native.js.map +6 -0
- package/dist/jsx/session/index.electron.js +11 -0
- package/dist/jsx/session/index.electron.js.map +6 -0
- package/dist/jsx/session/index.electron.mjs +8 -0
- package/dist/jsx/session/index.electron.mjs.map +1 -0
- package/dist/jsx/session/index.electron.native.js +11 -0
- package/dist/jsx/session/index.electron.native.js.map +6 -0
- package/dist/jsx/session/index.webext.js +11 -0
- package/dist/jsx/session/index.webext.js.map +6 -0
- package/dist/jsx/session/index.webext.mjs +8 -0
- package/dist/jsx/session/index.webext.mjs.map +1 -0
- package/dist/jsx/session/index.webext.native.js +11 -0
- package/dist/jsx/session/index.webext.native.js.map +6 -0
- package/package.json +10 -12
- package/src/index.ts +23 -2
- package/src/keycloak/base.ts +2 -2
- package/src/keycloak/index.electron.ts +50 -5
- package/src/keycloak/index.ts +3 -3
- package/src/keycloak/index.webext.ts +72 -0
- package/src/one.ts +3 -3
- package/src/provider/AuthProvider/index.electron.tsx +13 -4
- package/src/provider/AuthProvider/index.native.tsx +18 -8
- package/src/provider/AuthProvider/index.tsx +14 -5
- package/src/provider/AuthProvider/index.webext.tsx +419 -0
- package/src/session/index.electron.ts +33 -0
- package/src/session/index.webext.ts +33 -0
- package/types/Authenticated.d.ts +29 -0
- package/types/Authenticated.d.ts.map +1 -0
- package/types/Loading.d.ts +26 -0
- package/types/Loading.d.ts.map +1 -0
- package/types/authConfig.d.ts +11 -0
- package/types/authConfig.d.ts.map +1 -0
- package/types/hooks/index.d.ts +24 -0
- package/types/hooks/index.d.ts.map +1 -0
- package/types/hooks/useAuthConfig.d.ts +2 -0
- package/types/hooks/useAuthConfig.d.ts.map +1 -0
- package/types/hooks/useTokensFromQuery/index.d.ts +2 -0
- package/types/hooks/useTokensFromQuery/index.d.ts.map +1 -0
- package/types/hooks/useTokensFromQuery/index.native.d.ts +2 -0
- package/types/hooks/useTokensFromQuery/index.native.d.ts.map +1 -0
- package/types/hooks/useTokensFromState.d.ts +2 -0
- package/types/hooks/useTokensFromState.d.ts.map +1 -0
- package/types/index.d.ts +28 -0
- package/types/index.d.ts.map +1 -0
- package/types/keycloak/base.d.ts +51 -0
- package/types/keycloak/base.d.ts.map +1 -0
- package/types/keycloak/config.d.ts +8 -0
- package/types/keycloak/config.d.ts.map +1 -0
- package/types/keycloak/context.d.ts +4 -0
- package/types/keycloak/context.d.ts.map +1 -0
- package/types/keycloak/index.d.ts +15 -0
- package/types/keycloak/index.d.ts.map +1 -0
- package/types/keycloak/index.electron.d.ts +12 -0
- package/types/keycloak/index.electron.d.ts.map +1 -0
- package/types/keycloak/index.native.d.ts +27 -0
- package/types/keycloak/index.native.d.ts.map +1 -0
- package/types/keycloak/index.webext.d.ts +12 -0
- package/types/keycloak/index.webext.d.ts.map +1 -0
- package/types/one.d.ts +27 -0
- package/types/one.d.ts.map +1 -0
- package/types/provider/AfterAuth.d.ts +26 -0
- package/types/provider/AfterAuth.d.ts.map +1 -0
- package/types/provider/AuthProvider/index.d.ts +23 -0
- package/types/provider/AuthProvider/index.d.ts.map +1 -0
- package/types/provider/AuthProvider/index.electron.d.ts +23 -0
- package/types/provider/AuthProvider/index.electron.d.ts.map +1 -0
- package/types/provider/AuthProvider/index.native.d.ts +23 -0
- package/types/provider/AuthProvider/index.native.d.ts.map +1 -0
- package/types/provider/AuthProvider/index.webext.d.ts +23 -0
- package/types/provider/AuthProvider/index.webext.d.ts.map +1 -0
- package/types/provider/AuthProvider/shared.d.ts +53 -0
- package/types/provider/AuthProvider/shared.d.ts.map +1 -0
- package/types/provider/KeycloakProvider.d.ts +30 -0
- package/types/provider/KeycloakProvider.d.ts.map +1 -0
- package/types/provider/index.d.ts +24 -0
- package/types/provider/index.d.ts.map +1 -0
- package/types/session/index.d.ts +16 -0
- package/types/session/index.d.ts.map +1 -0
- package/types/session/index.electron.d.ts +5 -0
- package/types/session/index.electron.d.ts.map +1 -0
- package/types/session/index.native.d.ts +5 -0
- package/types/session/index.native.d.ts.map +1 -0
- package/types/session/index.webext.d.ts +5 -0
- package/types/session/index.webext.d.ts.map +1 -0
- package/types/state.d.ts +9 -0
- package/types/state.d.ts.map +1 -0
- package/types/token.d.ts +16 -0
- package/types/token.d.ts.map +1 -0
- package/types/types.d.ts +19 -0
- package/types/types.d.ts.map +1 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* File: /src/keycloak/index.electron.ts
|
|
3
|
+
* Project: @multiplatform.one/keycloak
|
|
4
|
+
* File Created: 10-01-2025 21:02:36
|
|
5
|
+
* Author: Clay Risser
|
|
6
|
+
* -----
|
|
7
|
+
* BitSpur (c) Copyright 2021 - 2025
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type KeycloakClient from "keycloak-js";
|
|
23
|
+
import { useContext } from "react";
|
|
24
|
+
import { useAuthConfig } from "../hooks";
|
|
25
|
+
import type { KeycloakMock } from "../types";
|
|
26
|
+
import {
|
|
27
|
+
BaseKeycloak,
|
|
28
|
+
type KeycloakLoginOptions,
|
|
29
|
+
type KeycloakLogoutOptions,
|
|
30
|
+
} from "./base";
|
|
31
|
+
import { KeycloakConfigContext } from "./config";
|
|
32
|
+
import { KeycloakContext } from "./context";
|
|
33
|
+
|
|
34
|
+
export class Keycloak extends BaseKeycloak {
|
|
35
|
+
protected _handleInputObject(input: KeycloakClient | KeycloakMock) {
|
|
36
|
+
if (typeof (input as KeycloakClient).init === "function") {
|
|
37
|
+
this._keycloakClient = input as KeycloakClient;
|
|
38
|
+
} else {
|
|
39
|
+
this._mock = input as KeycloakMock;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async login(options: KeycloakLoginOptions = {}) {
|
|
44
|
+
this._clear();
|
|
45
|
+
if (this._keycloakClient) {
|
|
46
|
+
await this._keycloakClient.login(options);
|
|
47
|
+
} else {
|
|
48
|
+
await this._login?.(options);
|
|
49
|
+
}
|
|
50
|
+
this._sync();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async logout(options: KeycloakLogoutOptions = {}) {
|
|
54
|
+
if (this._keycloakClient) {
|
|
55
|
+
await this._keycloakClient.logout(options);
|
|
56
|
+
} else {
|
|
57
|
+
await this._logout?.(options);
|
|
58
|
+
}
|
|
59
|
+
this._clear();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function useKeycloak() {
|
|
64
|
+
const keycloak = useContext(KeycloakContext);
|
|
65
|
+
const keycloakConfig = useContext(KeycloakConfigContext);
|
|
66
|
+
const { disabled } = useAuthConfig();
|
|
67
|
+
if (disabled) return null;
|
|
68
|
+
if (keycloak) return keycloak;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export * from "./base";
|
|
72
|
+
export * from "./config";
|
package/src/one.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* File: /src/one.ts
|
|
3
3
|
* Project: @multiplatform.one/keycloak
|
|
4
|
-
* File Created:
|
|
4
|
+
* File Created: 10-01-2025 21:02:36
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* BitSpur (c) Copyright 2021 -
|
|
7
|
+
* BitSpur (c) Copyright 2021 - 2025
|
|
8
8
|
*
|
|
9
9
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
10
|
* you may not use this file except in compliance with the License.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* File: /src/provider/AuthProvider/index.electron.tsx
|
|
3
3
|
* Project: @multiplatform.one/keycloak
|
|
4
|
-
* File Created: 23-
|
|
4
|
+
* File Created: 23-01-2025 16:57:16
|
|
5
5
|
* Author: Clay Risser
|
|
6
6
|
* -----
|
|
7
|
-
* BitSpur (c) Copyright 2021 -
|
|
7
|
+
* BitSpur (c) Copyright 2021 - 2025
|
|
8
8
|
*
|
|
9
9
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
10
|
* you may not use this file except in compliance with the License.
|
|
@@ -134,16 +134,25 @@ export function AuthProvider({
|
|
|
134
134
|
]);
|
|
135
135
|
|
|
136
136
|
useEffect(() => {
|
|
137
|
-
if (
|
|
137
|
+
if (
|
|
138
|
+
!persist ||
|
|
139
|
+
authStore === undefined ||
|
|
140
|
+
tokens.idToken ||
|
|
141
|
+
tokens.refreshToken ||
|
|
142
|
+
tokens.token
|
|
143
|
+
) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
138
146
|
const refreshToken = validOrRefreshableToken(authStore.refreshToken);
|
|
139
147
|
const idToken = validOrRefreshableToken(authStore.idToken, refreshToken);
|
|
140
148
|
const token = validOrRefreshableToken(authStore.token, refreshToken);
|
|
149
|
+
if (!idToken && !refreshToken && !token) return;
|
|
141
150
|
setTokens({
|
|
142
151
|
idToken: idToken,
|
|
143
152
|
refreshToken: refreshToken,
|
|
144
153
|
token: token,
|
|
145
154
|
});
|
|
146
|
-
}, [authStore
|
|
155
|
+
}, [authStore, persist]);
|
|
147
156
|
|
|
148
157
|
useEffect(() => {
|
|
149
158
|
if (
|
|
@@ -111,16 +111,26 @@ export function AuthProvider({
|
|
|
111
111
|
);
|
|
112
112
|
|
|
113
113
|
useEffect(() => {
|
|
114
|
-
if (
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
114
|
+
if (
|
|
115
|
+
!persist ||
|
|
116
|
+
authStore === undefined ||
|
|
117
|
+
response?.type === "success" ||
|
|
118
|
+
tokens.idToken ||
|
|
119
|
+
tokens.refreshToken ||
|
|
120
|
+
tokens.token
|
|
121
|
+
) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const refreshToken = validOrRefreshableToken(authStore.refreshToken);
|
|
125
|
+
const idToken = validOrRefreshableToken(authStore.idToken, refreshToken);
|
|
126
|
+
const token = validOrRefreshableToken(authStore.token, refreshToken);
|
|
127
|
+
if (!idToken && !refreshToken && !token) return;
|
|
118
128
|
setTokens({
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
129
|
+
idToken,
|
|
130
|
+
refreshToken,
|
|
131
|
+
token,
|
|
122
132
|
});
|
|
123
|
-
}, [authStore, persist
|
|
133
|
+
}, [authStore, persist]);
|
|
124
134
|
|
|
125
135
|
useEffect(() => {
|
|
126
136
|
if (
|
|
@@ -138,16 +138,25 @@ export function AuthProvider({
|
|
|
138
138
|
]);
|
|
139
139
|
|
|
140
140
|
useEffect(() => {
|
|
141
|
-
if (
|
|
141
|
+
if (
|
|
142
|
+
!persist ||
|
|
143
|
+
authStore === undefined ||
|
|
144
|
+
tokens.idToken ||
|
|
145
|
+
tokens.refreshToken ||
|
|
146
|
+
tokens.token
|
|
147
|
+
) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
142
150
|
const refreshToken = validOrRefreshableToken(authStore.refreshToken);
|
|
143
151
|
const idToken = validOrRefreshableToken(authStore.idToken, refreshToken);
|
|
144
152
|
const token = validOrRefreshableToken(authStore.token, refreshToken);
|
|
153
|
+
if (!idToken && !refreshToken && !token) return;
|
|
145
154
|
setTokens({
|
|
146
|
-
idToken
|
|
147
|
-
refreshToken
|
|
148
|
-
token
|
|
155
|
+
idToken,
|
|
156
|
+
refreshToken,
|
|
157
|
+
token,
|
|
149
158
|
});
|
|
150
|
-
}, [authStore
|
|
159
|
+
}, [authStore, persist]);
|
|
151
160
|
|
|
152
161
|
useEffect(() => {
|
|
153
162
|
if (
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File: /src/provider/AuthProvider/index.electron.tsx
|
|
3
|
+
* Project: @multiplatform.one/keycloak
|
|
4
|
+
* File Created: 23-01-2025 16:57:16
|
|
5
|
+
* Author: Clay Risser
|
|
6
|
+
* -----
|
|
7
|
+
* BitSpur (c) Copyright 2021 - 2025
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import KeycloakClient from "keycloak-js";
|
|
23
|
+
import type { KeycloakInitOptions } from "keycloak-js";
|
|
24
|
+
import { isIframe, isWindowDefined, logger } from "multiplatform.one";
|
|
25
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
26
|
+
import { Loading } from "../../Loading";
|
|
27
|
+
import { useAuthConfig } from "../../hooks";
|
|
28
|
+
import { KeycloakContext } from "../../keycloak/context";
|
|
29
|
+
import { Keycloak, KeycloakConfigContext } from "../../keycloak/index";
|
|
30
|
+
import { persist, useAuthStore } from "../../state";
|
|
31
|
+
import { validOrRefreshableToken } from "../../token";
|
|
32
|
+
import { AfterAuth } from "../AfterAuth";
|
|
33
|
+
import type { AuthProviderProps, MessageSchema, Tokens } from "./shared";
|
|
34
|
+
import { AuthSource, AuthStrategy, defaultKeycloakInitOptions } from "./shared";
|
|
35
|
+
|
|
36
|
+
export function AuthProvider({
|
|
37
|
+
children,
|
|
38
|
+
disabled,
|
|
39
|
+
keycloakConfig,
|
|
40
|
+
keycloakInitOptions,
|
|
41
|
+
loadingComponent,
|
|
42
|
+
}: AuthProviderProps) {
|
|
43
|
+
const { debug, messageHandlerKeys, iframeSso } = useAuthConfig();
|
|
44
|
+
const query = new URLSearchParams(
|
|
45
|
+
isWindowDefined ? window?.location?.search || "" : "",
|
|
46
|
+
);
|
|
47
|
+
const authStore = useAuthStore();
|
|
48
|
+
const [keycloak, setKeycloak] = useState<Keycloak>();
|
|
49
|
+
const idTokenQuery = query.get("idToken");
|
|
50
|
+
const refreshTokenQuery = query.get("refreshToken");
|
|
51
|
+
const tokenQuery = query.get("token");
|
|
52
|
+
const [listeningRefreshToken, setListeningRefreshToken] = useState(false);
|
|
53
|
+
const [listeningToken, setListeningToken] = useState(false);
|
|
54
|
+
const [listeningIdToken, setListeningIdToken] = useState(false);
|
|
55
|
+
const [loadedMessagePosted, setLoadedMessagePosted] = useState(false);
|
|
56
|
+
const initialRefreshTokenQuery = useMemo(
|
|
57
|
+
() =>
|
|
58
|
+
validOrRefreshableToken(
|
|
59
|
+
((!iframeSso && isIframe) ||
|
|
60
|
+
(typeof refreshTokenQuery === "string"
|
|
61
|
+
? refreshTokenQuery || true
|
|
62
|
+
: undefined)) as string | boolean,
|
|
63
|
+
),
|
|
64
|
+
[refreshTokenQuery, iframeSso],
|
|
65
|
+
);
|
|
66
|
+
const initialIdTokenQuery = useMemo(
|
|
67
|
+
() =>
|
|
68
|
+
validOrRefreshableToken(
|
|
69
|
+
((!iframeSso && isIframe) ||
|
|
70
|
+
(typeof idTokenQuery === "string"
|
|
71
|
+
? idTokenQuery || true
|
|
72
|
+
: undefined)) as string | boolean,
|
|
73
|
+
initialRefreshTokenQuery,
|
|
74
|
+
),
|
|
75
|
+
[idTokenQuery, initialRefreshTokenQuery, iframeSso],
|
|
76
|
+
);
|
|
77
|
+
const initialTokenQuery = useMemo(
|
|
78
|
+
() =>
|
|
79
|
+
validOrRefreshableToken(
|
|
80
|
+
((!iframeSso && isIframe) ||
|
|
81
|
+
(typeof tokenQuery === "string" ? tokenQuery || true : undefined)) as
|
|
82
|
+
| string
|
|
83
|
+
| boolean,
|
|
84
|
+
initialRefreshTokenQuery,
|
|
85
|
+
),
|
|
86
|
+
[tokenQuery, initialRefreshTokenQuery, iframeSso],
|
|
87
|
+
);
|
|
88
|
+
const [tokens, setTokens] = useState<Tokens>({
|
|
89
|
+
refreshToken: initialRefreshTokenQuery,
|
|
90
|
+
token: initialTokenQuery,
|
|
91
|
+
idToken: initialIdTokenQuery,
|
|
92
|
+
});
|
|
93
|
+
const authSource = useMemo(() => {
|
|
94
|
+
if (!iframeSso && isIframe && initialTokenQuery) return AuthSource.Query;
|
|
95
|
+
return AuthSource.Store;
|
|
96
|
+
}, [initialTokenQuery, iframeSso]);
|
|
97
|
+
const authStrategy = useMemo(() => {
|
|
98
|
+
if (authSource === AuthSource.Query) {
|
|
99
|
+
return AuthStrategy.KeycloakClientImplicit;
|
|
100
|
+
}
|
|
101
|
+
if (!persist) return AuthStrategy.KeycloakClientStandard;
|
|
102
|
+
if (typeof authStore === "undefined") return;
|
|
103
|
+
if (authStore.token) {
|
|
104
|
+
if (typeof tokens.token === "undefined") return;
|
|
105
|
+
if (tokens.token) return AuthStrategy.KeycloakClientImplicit;
|
|
106
|
+
}
|
|
107
|
+
return AuthStrategy.KeycloakClientStandard;
|
|
108
|
+
}, [authSource, authStore?.token, tokens.token]);
|
|
109
|
+
const isLoading = useMemo(() => {
|
|
110
|
+
if (!authStrategy) return true;
|
|
111
|
+
if (authStrategy === AuthStrategy.KeycloakClientImplicit) {
|
|
112
|
+
if (
|
|
113
|
+
authSource === AuthSource.Query &&
|
|
114
|
+
(initialRefreshTokenQuery === true ||
|
|
115
|
+
initialTokenQuery === true ||
|
|
116
|
+
initialIdTokenQuery === true)
|
|
117
|
+
) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (authSource === AuthSource.Store && typeof authStore === "undefined") {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}, [
|
|
126
|
+
authSource,
|
|
127
|
+
authStore?.idToken,
|
|
128
|
+
authStore?.refreshToken,
|
|
129
|
+
authStore?.token,
|
|
130
|
+
authStrategy,
|
|
131
|
+
initialIdTokenQuery,
|
|
132
|
+
initialRefreshTokenQuery,
|
|
133
|
+
initialTokenQuery,
|
|
134
|
+
]);
|
|
135
|
+
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
if (
|
|
138
|
+
!persist ||
|
|
139
|
+
authStore === undefined ||
|
|
140
|
+
tokens.idToken ||
|
|
141
|
+
tokens.refreshToken ||
|
|
142
|
+
tokens.token
|
|
143
|
+
) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const refreshToken = validOrRefreshableToken(authStore.refreshToken);
|
|
147
|
+
const idToken = validOrRefreshableToken(authStore.idToken, refreshToken);
|
|
148
|
+
const token = validOrRefreshableToken(authStore.token, refreshToken);
|
|
149
|
+
if (!idToken && !refreshToken && !token) return;
|
|
150
|
+
setTokens({
|
|
151
|
+
idToken: idToken,
|
|
152
|
+
refreshToken: refreshToken,
|
|
153
|
+
token: token,
|
|
154
|
+
});
|
|
155
|
+
}, [authStore, persist]);
|
|
156
|
+
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
if (
|
|
159
|
+
disabled ||
|
|
160
|
+
authSource !== AuthSource.Query ||
|
|
161
|
+
tokens.token === true ||
|
|
162
|
+
tokens.refreshToken === true ||
|
|
163
|
+
tokens.idToken === true ||
|
|
164
|
+
loadedMessagePosted
|
|
165
|
+
) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (debug) logger.debug("post message", JSON.stringify({ type: "LOADED" }));
|
|
169
|
+
(messageHandlerKeys || []).forEach((key: string) => {
|
|
170
|
+
window?.webkit?.messageHandlers?.[key]?.postMessage(
|
|
171
|
+
JSON.stringify({ type: "LOADED" }),
|
|
172
|
+
);
|
|
173
|
+
});
|
|
174
|
+
window?.ReactNativeWebView?.postMessage(JSON.stringify({ type: "LOADED" }));
|
|
175
|
+
window?.parent?.postMessage(JSON.stringify({ type: "LOADED" }));
|
|
176
|
+
setLoadedMessagePosted(true);
|
|
177
|
+
}, [disabled, authSource, tokens.token, tokens.refreshToken, tokens.idToken]);
|
|
178
|
+
|
|
179
|
+
useEffect(() => {
|
|
180
|
+
if (disabled || tokens.refreshToken !== true || listeningRefreshToken) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
setListeningRefreshToken(true);
|
|
184
|
+
function messageCallback(e: MessageEvent<any>) {
|
|
185
|
+
let data = e?.data || null;
|
|
186
|
+
if (typeof data === "string") {
|
|
187
|
+
try {
|
|
188
|
+
data = JSON.parse(data);
|
|
189
|
+
} catch (err) {}
|
|
190
|
+
}
|
|
191
|
+
if (debug) logger.debug("received message", JSON.stringify(data));
|
|
192
|
+
const message: MessageSchema = data;
|
|
193
|
+
if (!message.type) return;
|
|
194
|
+
if (message.type.toUpperCase() === "REFRESH_TOKEN" && message.payload) {
|
|
195
|
+
if (debug) logger.debug("setting refresh token", message.payload);
|
|
196
|
+
setTokens((tokens) => ({
|
|
197
|
+
...tokens,
|
|
198
|
+
refreshToken: validOrRefreshableToken(message.payload),
|
|
199
|
+
}));
|
|
200
|
+
window.removeEventListener("message", messageCallback);
|
|
201
|
+
setListeningRefreshToken(false);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (debug) {
|
|
205
|
+
logger.debug(
|
|
206
|
+
"listening for message",
|
|
207
|
+
JSON.stringify({
|
|
208
|
+
type: "REFRESH_TOKEN",
|
|
209
|
+
payload: "<some_refresh_token>",
|
|
210
|
+
}),
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
window.addEventListener("message", messageCallback);
|
|
214
|
+
return () => {
|
|
215
|
+
window.removeEventListener("message", messageCallback);
|
|
216
|
+
};
|
|
217
|
+
}, [disabled, tokens.refreshToken, listeningRefreshToken]);
|
|
218
|
+
|
|
219
|
+
useEffect(() => {
|
|
220
|
+
if (disabled || tokens.token !== true || listeningToken) return;
|
|
221
|
+
setListeningToken(true);
|
|
222
|
+
function messageCallback(e: MessageEvent<any>) {
|
|
223
|
+
let data = e?.data || null;
|
|
224
|
+
if (typeof data === "string") {
|
|
225
|
+
try {
|
|
226
|
+
data = JSON.parse(data);
|
|
227
|
+
} catch (err) {}
|
|
228
|
+
}
|
|
229
|
+
if (debug) logger.debug("received message", JSON.stringify(data));
|
|
230
|
+
const message: MessageSchema = data;
|
|
231
|
+
if (!message.type) return;
|
|
232
|
+
if (message.type.toUpperCase() === "TOKEN" && message.payload) {
|
|
233
|
+
if (debug) logger.debug("setting token", message.payload);
|
|
234
|
+
setTokens((tokens) => ({
|
|
235
|
+
...tokens,
|
|
236
|
+
token: validOrRefreshableToken(message.payload, tokens.refreshToken),
|
|
237
|
+
}));
|
|
238
|
+
window.removeEventListener("message", messageCallback);
|
|
239
|
+
setListeningToken(false);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (debug) {
|
|
243
|
+
logger.debug(
|
|
244
|
+
"listening for message",
|
|
245
|
+
JSON.stringify({
|
|
246
|
+
type: "TOKEN",
|
|
247
|
+
payload: "<some_token>",
|
|
248
|
+
}),
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
window.addEventListener("message", messageCallback);
|
|
252
|
+
return () => {
|
|
253
|
+
window.removeEventListener("message", messageCallback);
|
|
254
|
+
};
|
|
255
|
+
}, [disabled, tokens.token, listeningToken]);
|
|
256
|
+
|
|
257
|
+
useEffect(() => {
|
|
258
|
+
if (disabled || tokens.idToken !== true || listeningIdToken) return;
|
|
259
|
+
setListeningIdToken(true);
|
|
260
|
+
function messageCallback(e: MessageEvent<any>) {
|
|
261
|
+
let data = e?.data || null;
|
|
262
|
+
if (typeof data === "string") {
|
|
263
|
+
try {
|
|
264
|
+
data = JSON.parse(data);
|
|
265
|
+
} catch (err) {}
|
|
266
|
+
}
|
|
267
|
+
if (debug) logger.debug("received message", JSON.stringify(data));
|
|
268
|
+
const message: MessageSchema = data;
|
|
269
|
+
if (!message.type) return;
|
|
270
|
+
if (message.type.toUpperCase() === "ID_TOKEN" && message.payload) {
|
|
271
|
+
if (debug) logger.debug("setting id token", message.payload);
|
|
272
|
+
setTokens((tokens) => ({
|
|
273
|
+
...tokens,
|
|
274
|
+
idToken: validOrRefreshableToken(
|
|
275
|
+
message.payload,
|
|
276
|
+
tokens.refreshToken,
|
|
277
|
+
),
|
|
278
|
+
}));
|
|
279
|
+
window.removeEventListener("message", messageCallback);
|
|
280
|
+
setListeningIdToken(false);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (debug) {
|
|
284
|
+
logger.debug(
|
|
285
|
+
"listening for message",
|
|
286
|
+
JSON.stringify({
|
|
287
|
+
type: "ID_TOKEN",
|
|
288
|
+
payload: "<some_id_token>",
|
|
289
|
+
}),
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
window.addEventListener("message", messageCallback);
|
|
293
|
+
return () => {
|
|
294
|
+
window.removeEventListener("message", messageCallback);
|
|
295
|
+
};
|
|
296
|
+
}, [disabled, tokens.idToken, listeningIdToken]);
|
|
297
|
+
|
|
298
|
+
const keycloakClient = useMemo(
|
|
299
|
+
() =>
|
|
300
|
+
!disabled &&
|
|
301
|
+
!isLoading &&
|
|
302
|
+
(authStrategy === AuthStrategy.KeycloakClientStandard ||
|
|
303
|
+
authStrategy === AuthStrategy.KeycloakClientImplicit) &&
|
|
304
|
+
keycloakConfig
|
|
305
|
+
? new KeycloakClient({
|
|
306
|
+
clientId: keycloakConfig.publicClientId || keycloakConfig.clientId,
|
|
307
|
+
realm: keycloakConfig.realm,
|
|
308
|
+
url: keycloakConfig.url,
|
|
309
|
+
})
|
|
310
|
+
: undefined,
|
|
311
|
+
[
|
|
312
|
+
authStrategy,
|
|
313
|
+
disabled,
|
|
314
|
+
isLoading,
|
|
315
|
+
keycloakConfig,
|
|
316
|
+
keycloakInitOptions,
|
|
317
|
+
tokens.idToken,
|
|
318
|
+
tokens.refreshToken,
|
|
319
|
+
tokens.token,
|
|
320
|
+
],
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
const initOptions = useMemo(() => {
|
|
324
|
+
if (!keycloakClient) return;
|
|
325
|
+
const initOptions: KeycloakInitOptions = {
|
|
326
|
+
...defaultKeycloakInitOptions,
|
|
327
|
+
...keycloakInitOptions,
|
|
328
|
+
scope: [
|
|
329
|
+
...new Set([
|
|
330
|
+
"email",
|
|
331
|
+
"openid",
|
|
332
|
+
"profile",
|
|
333
|
+
...(defaultKeycloakInitOptions.scope?.split(" ") || []),
|
|
334
|
+
...(keycloakInitOptions?.scope?.split(" ") || []),
|
|
335
|
+
...(keycloakConfig.scopes || []),
|
|
336
|
+
]),
|
|
337
|
+
].join(" "),
|
|
338
|
+
};
|
|
339
|
+
if (debug) initOptions.enableLogging = true;
|
|
340
|
+
if (tokens.token && typeof tokens.token === "string") {
|
|
341
|
+
initOptions.token = tokens.token;
|
|
342
|
+
initOptions.timeSkew = 0;
|
|
343
|
+
if (tokens.idToken && typeof tokens.idToken === "string") {
|
|
344
|
+
initOptions.idToken = tokens.idToken;
|
|
345
|
+
}
|
|
346
|
+
if (tokens.refreshToken && typeof tokens.refreshToken === "string") {
|
|
347
|
+
initOptions.refreshToken = tokens.refreshToken;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if ((!iframeSso && isIframe) || (tokens.token && !tokens.refreshToken)) {
|
|
351
|
+
initOptions.checkLoginIframe = false;
|
|
352
|
+
initOptions.flow = "implicit";
|
|
353
|
+
initOptions.onLoad = undefined;
|
|
354
|
+
}
|
|
355
|
+
return initOptions;
|
|
356
|
+
}, [
|
|
357
|
+
keycloakClient,
|
|
358
|
+
keycloakInitOptions,
|
|
359
|
+
keycloakConfig.scopes,
|
|
360
|
+
debug,
|
|
361
|
+
tokens.token,
|
|
362
|
+
tokens.idToken,
|
|
363
|
+
tokens.refreshToken,
|
|
364
|
+
iframeSso,
|
|
365
|
+
]);
|
|
366
|
+
|
|
367
|
+
useEffect(() => {
|
|
368
|
+
if (
|
|
369
|
+
!keycloakClient ||
|
|
370
|
+
!initOptions ||
|
|
371
|
+
(authStrategy === AuthStrategy.KeycloakClientImplicit &&
|
|
372
|
+
(typeof tokens.token !== "string" || !tokens.token))
|
|
373
|
+
) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
function onError() {
|
|
377
|
+
if (keycloakClient && initOptions) {
|
|
378
|
+
setKeycloak(new Keycloak(keycloakConfig, keycloakClient));
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
function onUpdate() {
|
|
382
|
+
if (keycloakClient && initOptions) {
|
|
383
|
+
setKeycloak(new Keycloak(keycloakConfig, keycloakClient));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
(async () => {
|
|
387
|
+
keycloakClient.onAuthError = onError;
|
|
388
|
+
keycloakClient.onAuthLogout = onUpdate;
|
|
389
|
+
keycloakClient.onAuthRefreshError = onError;
|
|
390
|
+
keycloakClient.onAuthRefreshSuccess = onUpdate;
|
|
391
|
+
keycloakClient.onAuthSuccess = onUpdate;
|
|
392
|
+
keycloakClient.onReady = onUpdate;
|
|
393
|
+
keycloakClient.onTokenExpired = async () => {
|
|
394
|
+
try {
|
|
395
|
+
await keycloakClient.updateToken(5);
|
|
396
|
+
} catch (err) {
|
|
397
|
+
logger.warn(err);
|
|
398
|
+
setKeycloak(new Keycloak(keycloakConfig, keycloakClient));
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
await keycloakClient.init(initOptions);
|
|
402
|
+
setKeycloak(new Keycloak(keycloakConfig, keycloakClient));
|
|
403
|
+
})();
|
|
404
|
+
}, [keycloakClient, initOptions, authStrategy, tokens.token]);
|
|
405
|
+
|
|
406
|
+
const render = useCallback(
|
|
407
|
+
() => (
|
|
408
|
+
<KeycloakConfigContext.Provider value={keycloakConfig}>
|
|
409
|
+
<KeycloakContext.Provider value={keycloak}>
|
|
410
|
+
<AfterAuth loadingComponent={loadingComponent}>{children}</AfterAuth>
|
|
411
|
+
</KeycloakContext.Provider>
|
|
412
|
+
</KeycloakConfigContext.Provider>
|
|
413
|
+
),
|
|
414
|
+
[children, keycloak, keycloakConfig],
|
|
415
|
+
);
|
|
416
|
+
if (disabled) return <>{children}</>;
|
|
417
|
+
if (isLoading) return <Loading loadingComponent={loadingComponent} />;
|
|
418
|
+
return render();
|
|
419
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* File: /src/session/index.native.ts
|
|
3
|
+
* Project: @multiplatform.one/keycloak
|
|
4
|
+
* File Created: 04-04-2024 15:50:39
|
|
5
|
+
* Author: Clay Risser
|
|
6
|
+
* -----
|
|
7
|
+
* BitSpur (c) Copyright 2021 - 2024
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { UseSessionOptions } from "next-auth/react";
|
|
23
|
+
import type { SessionContextValue } from "./index";
|
|
24
|
+
|
|
25
|
+
export async function getSession() {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function useSession<R extends boolean>(
|
|
30
|
+
_options?: UseSessionOptions<R>,
|
|
31
|
+
): SessionContextValue<R> {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* File: /src/session/index.native.ts
|
|
3
|
+
* Project: @multiplatform.one/keycloak
|
|
4
|
+
* File Created: 04-04-2024 15:50:39
|
|
5
|
+
* Author: Clay Risser
|
|
6
|
+
* -----
|
|
7
|
+
* BitSpur (c) Copyright 2021 - 2024
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { UseSessionOptions } from "next-auth/react";
|
|
23
|
+
import type { SessionContextValue } from "./index";
|
|
24
|
+
|
|
25
|
+
export async function getSession() {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function useSession<R extends boolean>(
|
|
30
|
+
_options?: UseSessionOptions<R>,
|
|
31
|
+
): SessionContextValue<R> {
|
|
32
|
+
return {};
|
|
33
|
+
}
|