@o/better-auth-utils 0.16.19
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/LICENSE +21 -0
- package/README.md +105 -0
- package/dist/cjs/createAuthClient.cjs +251 -0
- package/dist/cjs/createAuthClient.native.js +279 -0
- package/dist/cjs/createAuthClient.native.js.map +1 -0
- package/dist/cjs/createAuthClient.test.cjs +88 -0
- package/dist/cjs/createAuthClient.test.native.js +105 -0
- package/dist/cjs/createAuthClient.test.native.js.map +1 -0
- package/dist/cjs/index.cjs +20 -0
- package/dist/cjs/index.native.js +23 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/server.cjs +106 -0
- package/dist/cjs/server.native.js +228 -0
- package/dist/cjs/server.native.js.map +1 -0
- package/dist/esm/createAuthClient.mjs +226 -0
- package/dist/esm/createAuthClient.mjs.map +1 -0
- package/dist/esm/createAuthClient.native.js +251 -0
- package/dist/esm/createAuthClient.native.js.map +1 -0
- package/dist/esm/createAuthClient.test.mjs +89 -0
- package/dist/esm/createAuthClient.test.mjs.map +1 -0
- package/dist/esm/createAuthClient.test.native.js +103 -0
- package/dist/esm/createAuthClient.test.native.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +2 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/server.mjs +77 -0
- package/dist/esm/server.mjs.map +1 -0
- package/dist/esm/server.native.js +196 -0
- package/dist/esm/server.native.js.map +1 -0
- package/package.json +66 -0
- package/src/createAuthClient.test.ts +86 -0
- package/src/createAuthClient.ts +373 -0
- package/src/index.ts +1 -0
- package/src/server.ts +150 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { createEmitter, createStorageValue, isEqualDeepLite, useEmitterValue } from "@o/helpers";
|
|
2
|
+
import { createAuthClient } from "better-auth/client";
|
|
3
|
+
function createBetterAuthClient(options) {
|
|
4
|
+
const {
|
|
5
|
+
onAuthStateChange,
|
|
6
|
+
onAuthError,
|
|
7
|
+
createUser,
|
|
8
|
+
storagePrefix = "auth",
|
|
9
|
+
retryDelay = 4e3,
|
|
10
|
+
useJWT = false,
|
|
11
|
+
authCookieNames = ["better-auth.jwt", "better-auth.session_token"],
|
|
12
|
+
...authClientOptions
|
|
13
|
+
} = options;
|
|
14
|
+
const empty = {
|
|
15
|
+
state: "logged-out",
|
|
16
|
+
session: null,
|
|
17
|
+
user: null,
|
|
18
|
+
token: null
|
|
19
|
+
};
|
|
20
|
+
const keysStorage = createStorageValue(`${storagePrefix}-keys`);
|
|
21
|
+
const stateStorage = createStorageValue(`${storagePrefix}-state`);
|
|
22
|
+
const createAuthClientWithSession = session => {
|
|
23
|
+
return createAuthClient({
|
|
24
|
+
...authClientOptions,
|
|
25
|
+
fetchOptions: {
|
|
26
|
+
credentials: "include",
|
|
27
|
+
headers: session ? {
|
|
28
|
+
Authorization: `Bearer ${session}`
|
|
29
|
+
} : void 0
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
let authClient = (() => {
|
|
34
|
+
const existingSession = keysStorage.get()?.session;
|
|
35
|
+
return existingSession ? createAuthClientWithSession(existingSession) : createAuthClient({
|
|
36
|
+
...authClientOptions,
|
|
37
|
+
fetchOptions: {
|
|
38
|
+
credentials: "include"
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
})();
|
|
42
|
+
const authState = createEmitter("authState", stateStorage.get() || empty, {
|
|
43
|
+
comparator: isEqualDeepLite
|
|
44
|
+
});
|
|
45
|
+
const authClientVersion = createEmitter("authClientVersion", 0);
|
|
46
|
+
const setState = update => {
|
|
47
|
+
const current = authState.value;
|
|
48
|
+
const next = {
|
|
49
|
+
...current,
|
|
50
|
+
...update
|
|
51
|
+
};
|
|
52
|
+
stateStorage.set(next);
|
|
53
|
+
authState.emit(next);
|
|
54
|
+
if (next.token && next.session) {
|
|
55
|
+
keysStorage.set({
|
|
56
|
+
token: next.token,
|
|
57
|
+
session: next.session.token
|
|
58
|
+
});
|
|
59
|
+
} else if (next.session) {
|
|
60
|
+
keysStorage.set({
|
|
61
|
+
token: "",
|
|
62
|
+
session: next.session.token
|
|
63
|
+
});
|
|
64
|
+
} else {
|
|
65
|
+
keysStorage.set({
|
|
66
|
+
token: "",
|
|
67
|
+
session: ""
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
onAuthStateChange?.(next);
|
|
71
|
+
};
|
|
72
|
+
const setAuthClientToken = async props => {
|
|
73
|
+
keysStorage.set(props);
|
|
74
|
+
updateAuthClient(props.session);
|
|
75
|
+
};
|
|
76
|
+
function updateAuthClient(session) {
|
|
77
|
+
authClient = createAuthClientWithSession(session);
|
|
78
|
+
authClientVersion.emit(Math.random());
|
|
79
|
+
subscribeToAuthEffect();
|
|
80
|
+
}
|
|
81
|
+
let dispose = null;
|
|
82
|
+
let retryTimer = null;
|
|
83
|
+
let consecutiveFailures = 0;
|
|
84
|
+
function subscribeToAuthEffect() {
|
|
85
|
+
dispose?.();
|
|
86
|
+
dispose = authClient.useSession.subscribe(async props => {
|
|
87
|
+
const {
|
|
88
|
+
data: dataGeneric,
|
|
89
|
+
isPending,
|
|
90
|
+
error
|
|
91
|
+
} = props;
|
|
92
|
+
if (error) {
|
|
93
|
+
onAuthError?.(error);
|
|
94
|
+
const hasPersistedSession2 = !!keysStorage.get()?.session;
|
|
95
|
+
if (!hasPersistedSession2) {
|
|
96
|
+
setState({
|
|
97
|
+
state: "logged-out",
|
|
98
|
+
session: null,
|
|
99
|
+
user: null
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
consecutiveFailures++;
|
|
103
|
+
scheduleAuthRetry(Math.min(retryDelay * 2 ** (consecutiveFailures - 1), 6e4));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
consecutiveFailures = 0;
|
|
107
|
+
const data = dataGeneric;
|
|
108
|
+
const hasPersistedSession = !!keysStorage.get()?.session;
|
|
109
|
+
const nextState = isPending ? "loading" : data?.session ? "logged-in" : hasPersistedSession && data === void 0 ? "loading" : "logged-out";
|
|
110
|
+
const sessionUpdate = nextState === "loading" ? {} : {
|
|
111
|
+
session: data?.session ?? null,
|
|
112
|
+
user: data?.user ? createUser ? createUser(data.user) : data.user : null
|
|
113
|
+
};
|
|
114
|
+
const previousSession = authState.value?.session;
|
|
115
|
+
const isNewSession = data?.session && (!previousSession || previousSession.id !== data.session.id || previousSession.userId !== data.session.userId);
|
|
116
|
+
setState({
|
|
117
|
+
state: nextState,
|
|
118
|
+
...sessionUpdate
|
|
119
|
+
});
|
|
120
|
+
if (useJWT && data?.session && (isNewSession || !authState.value.token)) {
|
|
121
|
+
if (isNewSession && authState.value.token) {
|
|
122
|
+
setState({
|
|
123
|
+
token: null
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
getValidToken().then(token => {
|
|
127
|
+
if (token) {
|
|
128
|
+
setState({
|
|
129
|
+
token
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function scheduleAuthRetry(delayMs) {
|
|
137
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
138
|
+
retryTimer = setTimeout(() => {
|
|
139
|
+
retryTimer = null;
|
|
140
|
+
subscribeToAuthEffect();
|
|
141
|
+
}, delayMs);
|
|
142
|
+
}
|
|
143
|
+
async function getValidToken() {
|
|
144
|
+
const res = await authClient.$fetch("/token");
|
|
145
|
+
if (res.error) {
|
|
146
|
+
console.error(`Error fetching token: ${res.error.statusText}`);
|
|
147
|
+
return void 0;
|
|
148
|
+
}
|
|
149
|
+
return res.data?.token;
|
|
150
|
+
}
|
|
151
|
+
const clearAuthClientToken = () => {
|
|
152
|
+
keysStorage.remove();
|
|
153
|
+
};
|
|
154
|
+
function clearAuthCookies() {
|
|
155
|
+
if (typeof document === "undefined") return;
|
|
156
|
+
for (const cookieName of authCookieNames) {
|
|
157
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
|
|
158
|
+
const domain = window.location.hostname;
|
|
159
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain}`;
|
|
160
|
+
if (domain.startsWith(".")) {
|
|
161
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain.slice(1)}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function clearAllAuth() {
|
|
166
|
+
clearAuthCookies();
|
|
167
|
+
clearState();
|
|
168
|
+
}
|
|
169
|
+
const getAuth = () => {
|
|
170
|
+
const state = authState?.value || empty;
|
|
171
|
+
return {
|
|
172
|
+
...state,
|
|
173
|
+
loggedIn: !!state.session
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
const useAuth = () => {
|
|
177
|
+
return useEmitterValue(authState) || empty;
|
|
178
|
+
};
|
|
179
|
+
function clearState() {
|
|
180
|
+
keysStorage.remove();
|
|
181
|
+
stateStorage.remove();
|
|
182
|
+
setState(empty);
|
|
183
|
+
}
|
|
184
|
+
subscribeToAuthEffect();
|
|
185
|
+
if (typeof window !== "undefined" && window.addEventListener) {
|
|
186
|
+
const cleanup = () => {
|
|
187
|
+
dispose?.();
|
|
188
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
189
|
+
};
|
|
190
|
+
window.addEventListener("beforeunload", cleanup);
|
|
191
|
+
}
|
|
192
|
+
const proxiedAuthClient = new Proxy(authClient, {
|
|
193
|
+
get(_target, key) {
|
|
194
|
+
if (key === "signOut") {
|
|
195
|
+
return async () => {
|
|
196
|
+
const result = await authClient.$fetch("/sign-out", {
|
|
197
|
+
method: "POST",
|
|
198
|
+
body: {}
|
|
199
|
+
});
|
|
200
|
+
if (result.error) throw result.error;
|
|
201
|
+
clearState();
|
|
202
|
+
if (typeof window !== "undefined") {
|
|
203
|
+
window.location?.reload?.();
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
return Reflect.get(authClient, key);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
authClientVersion,
|
|
213
|
+
clearState,
|
|
214
|
+
authState,
|
|
215
|
+
authClient: proxiedAuthClient,
|
|
216
|
+
setAuthClientToken,
|
|
217
|
+
clearAuthClientToken,
|
|
218
|
+
clearAllAuth,
|
|
219
|
+
useAuth,
|
|
220
|
+
getAuth,
|
|
221
|
+
getValidToken,
|
|
222
|
+
updateAuthClient
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
export { createBetterAuthClient };
|
|
226
|
+
//# sourceMappingURL=createAuthClient.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createEmitter","createStorageValue","isEqualDeepLite","useEmitterValue","createAuthClient","createBetterAuthClient","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","stateStorage","createAuthClientWithSession","fetchOptions","credentials","headers","Authorization","authClient","existingSession","get","authState","comparator","authClientVersion","setState","update","current","value","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","data","dataGeneric","isPending","error","hasPersistedSession","scheduleAuthRetry","min","nextState","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","cookieName","cookie","domain","window","location","hostname","startsWith","slice","clearAllAuth","clearState","getAuth","loggedIn","useAuth","addEventListener","cleanup","proxiedAuthClient","Proxy","_target","key","result","method","body","reload","Reflect"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { createEmitter, createStorageValue, isEqualDeepLite, useEmitterValue } from "@o/helpers";
|
|
2
|
+
import { createAuthClient } from "better-auth/client";
|
|
3
|
+
function createBetterAuthClient(options) {
|
|
4
|
+
var {
|
|
5
|
+
onAuthStateChange,
|
|
6
|
+
onAuthError,
|
|
7
|
+
createUser,
|
|
8
|
+
storagePrefix = "auth",
|
|
9
|
+
retryDelay = 4e3,
|
|
10
|
+
useJWT = false,
|
|
11
|
+
authCookieNames = ["better-auth.jwt", "better-auth.session_token"],
|
|
12
|
+
...authClientOptions
|
|
13
|
+
} = options;
|
|
14
|
+
var empty = {
|
|
15
|
+
state: "logged-out",
|
|
16
|
+
session: null,
|
|
17
|
+
user: null,
|
|
18
|
+
token: null
|
|
19
|
+
};
|
|
20
|
+
var keysStorage = createStorageValue(`${storagePrefix}-keys`);
|
|
21
|
+
var stateStorage = createStorageValue(`${storagePrefix}-state`);
|
|
22
|
+
var createAuthClientWithSession = function createAuthClientWithSession2(session) {
|
|
23
|
+
return createAuthClient({
|
|
24
|
+
...authClientOptions,
|
|
25
|
+
fetchOptions: {
|
|
26
|
+
credentials: "include",
|
|
27
|
+
headers: session ? {
|
|
28
|
+
Authorization: `Bearer ${session}`
|
|
29
|
+
} : void 0
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
var authClient = function () {
|
|
34
|
+
var _keysStorage_get;
|
|
35
|
+
var existingSession = (_keysStorage_get = keysStorage.get()) === null || _keysStorage_get === void 0 ? void 0 : _keysStorage_get.session;
|
|
36
|
+
return existingSession ? createAuthClientWithSession(existingSession) : createAuthClient({
|
|
37
|
+
...authClientOptions,
|
|
38
|
+
fetchOptions: {
|
|
39
|
+
credentials: "include"
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}();
|
|
43
|
+
var authState = createEmitter("authState", stateStorage.get() || empty, {
|
|
44
|
+
comparator: isEqualDeepLite
|
|
45
|
+
});
|
|
46
|
+
var authClientVersion = createEmitter("authClientVersion", 0);
|
|
47
|
+
var setState = function setState2(update) {
|
|
48
|
+
var current = authState.value;
|
|
49
|
+
var next = {
|
|
50
|
+
...current,
|
|
51
|
+
...update
|
|
52
|
+
};
|
|
53
|
+
stateStorage.set(next);
|
|
54
|
+
authState.emit(next);
|
|
55
|
+
if (next.token && next.session) {
|
|
56
|
+
keysStorage.set({
|
|
57
|
+
token: next.token,
|
|
58
|
+
session: next.session.token
|
|
59
|
+
});
|
|
60
|
+
} else if (next.session) {
|
|
61
|
+
keysStorage.set({
|
|
62
|
+
token: "",
|
|
63
|
+
session: next.session.token
|
|
64
|
+
});
|
|
65
|
+
} else {
|
|
66
|
+
keysStorage.set({
|
|
67
|
+
token: "",
|
|
68
|
+
session: ""
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
onAuthStateChange === null || onAuthStateChange === void 0 ? void 0 : onAuthStateChange(next);
|
|
72
|
+
};
|
|
73
|
+
var setAuthClientToken = async function setAuthClientToken2(props) {
|
|
74
|
+
keysStorage.set(props);
|
|
75
|
+
updateAuthClient(props.session);
|
|
76
|
+
};
|
|
77
|
+
function updateAuthClient(session) {
|
|
78
|
+
authClient = createAuthClientWithSession(session);
|
|
79
|
+
authClientVersion.emit(Math.random());
|
|
80
|
+
subscribeToAuthEffect();
|
|
81
|
+
}
|
|
82
|
+
var dispose = null;
|
|
83
|
+
var retryTimer = null;
|
|
84
|
+
var consecutiveFailures = 0;
|
|
85
|
+
function subscribeToAuthEffect() {
|
|
86
|
+
dispose === null || dispose === void 0 ? void 0 : dispose();
|
|
87
|
+
dispose = authClient.useSession.subscribe(async function (props) {
|
|
88
|
+
var _ref;
|
|
89
|
+
var _keysStorage_get, _authState_value;
|
|
90
|
+
var {
|
|
91
|
+
data: dataGeneric,
|
|
92
|
+
isPending,
|
|
93
|
+
error
|
|
94
|
+
} = props;
|
|
95
|
+
if (error) {
|
|
96
|
+
var _keysStorage_get1;
|
|
97
|
+
onAuthError === null || onAuthError === void 0 ? void 0 : onAuthError(error);
|
|
98
|
+
var hasPersistedSession = !!((_keysStorage_get1 = keysStorage.get()) === null || _keysStorage_get1 === void 0 ? void 0 : _keysStorage_get1.session);
|
|
99
|
+
if (!hasPersistedSession) {
|
|
100
|
+
setState({
|
|
101
|
+
state: "logged-out",
|
|
102
|
+
session: null,
|
|
103
|
+
user: null
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
consecutiveFailures++;
|
|
107
|
+
scheduleAuthRetry(Math.min(retryDelay * Math.pow(2, consecutiveFailures - 1), 6e4));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
consecutiveFailures = 0;
|
|
111
|
+
var data = dataGeneric;
|
|
112
|
+
var hasPersistedSession1 = !!((_keysStorage_get = keysStorage.get()) === null || _keysStorage_get === void 0 ? void 0 : _keysStorage_get.session);
|
|
113
|
+
var nextState = isPending ? "loading" : (data === null || data === void 0 ? void 0 : data.session) ? "logged-in" : hasPersistedSession1 && data === void 0 ? "loading" : "logged-out";
|
|
114
|
+
var sessionUpdate = nextState === "loading" ? {} : {
|
|
115
|
+
session: (_ref = data === null || data === void 0 ? void 0 : data.session) !== null && _ref !== void 0 ? _ref : null,
|
|
116
|
+
user: (data === null || data === void 0 ? void 0 : data.user) ? createUser ? createUser(data.user) : data.user : null
|
|
117
|
+
};
|
|
118
|
+
var previousSession = (_authState_value = authState.value) === null || _authState_value === void 0 ? void 0 : _authState_value.session;
|
|
119
|
+
var isNewSession = (data === null || data === void 0 ? void 0 : data.session) && (!previousSession || previousSession.id !== data.session.id || previousSession.userId !== data.session.userId);
|
|
120
|
+
setState({
|
|
121
|
+
state: nextState,
|
|
122
|
+
...sessionUpdate
|
|
123
|
+
});
|
|
124
|
+
if (useJWT && (data === null || data === void 0 ? void 0 : data.session) && (isNewSession || !authState.value.token)) {
|
|
125
|
+
if (isNewSession && authState.value.token) {
|
|
126
|
+
setState({
|
|
127
|
+
token: null
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
getValidToken().then(function (token) {
|
|
131
|
+
if (token) {
|
|
132
|
+
setState({
|
|
133
|
+
token
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function scheduleAuthRetry(delayMs) {
|
|
141
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
142
|
+
retryTimer = setTimeout(function () {
|
|
143
|
+
retryTimer = null;
|
|
144
|
+
subscribeToAuthEffect();
|
|
145
|
+
}, delayMs);
|
|
146
|
+
}
|
|
147
|
+
async function getValidToken() {
|
|
148
|
+
var _res_data;
|
|
149
|
+
var res = await authClient.$fetch("/token");
|
|
150
|
+
if (res.error) {
|
|
151
|
+
console.error(`Error fetching token: ${res.error.statusText}`);
|
|
152
|
+
return void 0;
|
|
153
|
+
}
|
|
154
|
+
return (_res_data = res.data) === null || _res_data === void 0 ? void 0 : _res_data.token;
|
|
155
|
+
}
|
|
156
|
+
var clearAuthClientToken = function clearAuthClientToken2() {
|
|
157
|
+
keysStorage.remove();
|
|
158
|
+
};
|
|
159
|
+
function clearAuthCookies() {
|
|
160
|
+
if (typeof document === "undefined") return;
|
|
161
|
+
var _iteratorNormalCompletion = true,
|
|
162
|
+
_didIteratorError = false,
|
|
163
|
+
_iteratorError = void 0;
|
|
164
|
+
try {
|
|
165
|
+
for (var _iterator = authCookieNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
166
|
+
var cookieName = _step.value;
|
|
167
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
|
|
168
|
+
var domain = window.location.hostname;
|
|
169
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain}`;
|
|
170
|
+
if (domain.startsWith(".")) {
|
|
171
|
+
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain.slice(1)}`;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} catch (err) {
|
|
175
|
+
_didIteratorError = true;
|
|
176
|
+
_iteratorError = err;
|
|
177
|
+
} finally {
|
|
178
|
+
try {
|
|
179
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
180
|
+
_iterator.return();
|
|
181
|
+
}
|
|
182
|
+
} finally {
|
|
183
|
+
if (_didIteratorError) {
|
|
184
|
+
throw _iteratorError;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function clearAllAuth() {
|
|
190
|
+
clearAuthCookies();
|
|
191
|
+
clearState();
|
|
192
|
+
}
|
|
193
|
+
var getAuth = function getAuth2() {
|
|
194
|
+
var state = (authState === null || authState === void 0 ? void 0 : authState.value) || empty;
|
|
195
|
+
return {
|
|
196
|
+
...state,
|
|
197
|
+
loggedIn: !!state.session
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
var useAuth = function useAuth2() {
|
|
201
|
+
return useEmitterValue(authState) || empty;
|
|
202
|
+
};
|
|
203
|
+
function clearState() {
|
|
204
|
+
keysStorage.remove();
|
|
205
|
+
stateStorage.remove();
|
|
206
|
+
setState(empty);
|
|
207
|
+
}
|
|
208
|
+
subscribeToAuthEffect();
|
|
209
|
+
if (typeof window !== "undefined" && window.addEventListener) {
|
|
210
|
+
var cleanup = function cleanup2() {
|
|
211
|
+
dispose === null || dispose === void 0 ? void 0 : dispose();
|
|
212
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
213
|
+
};
|
|
214
|
+
window.addEventListener("beforeunload", cleanup);
|
|
215
|
+
}
|
|
216
|
+
var proxiedAuthClient = new Proxy(authClient, {
|
|
217
|
+
get(_target, key) {
|
|
218
|
+
if (key === "signOut") {
|
|
219
|
+
return async function () {
|
|
220
|
+
var result = await authClient.$fetch("/sign-out", {
|
|
221
|
+
method: "POST",
|
|
222
|
+
body: {}
|
|
223
|
+
});
|
|
224
|
+
if (result.error) throw result.error;
|
|
225
|
+
clearState();
|
|
226
|
+
if (typeof window !== "undefined") {
|
|
227
|
+
var _window_location_reload, _window_location;
|
|
228
|
+
(_window_location = window.location) === null || _window_location === void 0 ? void 0 : (_window_location_reload = _window_location.reload) === null || _window_location_reload === void 0 ? void 0 : _window_location_reload.call(_window_location);
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return Reflect.get(authClient, key);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
authClientVersion,
|
|
238
|
+
clearState,
|
|
239
|
+
authState,
|
|
240
|
+
authClient: proxiedAuthClient,
|
|
241
|
+
setAuthClientToken,
|
|
242
|
+
clearAuthClientToken,
|
|
243
|
+
clearAllAuth,
|
|
244
|
+
useAuth,
|
|
245
|
+
getAuth,
|
|
246
|
+
getValidToken,
|
|
247
|
+
updateAuthClient
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
export { createBetterAuthClient };
|
|
251
|
+
//# sourceMappingURL=createAuthClient.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createEmitter","createStorageValue","isEqualDeepLite","useEmitterValue","createAuthClient","createBetterAuthClient","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","stateStorage","createAuthClientWithSession","createAuthClientWithSession2","fetchOptions","credentials","headers","Authorization","authClient","_keysStorage_get","existingSession","get","authState","comparator","authClientVersion","setState","setState2","update","current","value","next","set","emit","setAuthClientToken","setAuthClientToken2","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","_ref","_authState_value","data","dataGeneric","isPending","error","_keysStorage_get1","hasPersistedSession","scheduleAuthRetry","min","pow","hasPersistedSession1","nextState","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","_res_data","res","$fetch","console","statusText","clearAuthClientToken","clearAuthClientToken2","remove","clearAuthCookies","document","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","cookieName","cookie","domain","window","location","hostname","startsWith","slice","err","return","clearAllAuth","clearState","getAuth","getAuth2","loggedIn","useAuth","useAuth2","addEventListener","cleanup","cleanup2","proxiedAuthClient","Proxy","_target","key"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { createBetterAuthClient } from "./createAuthClient.mjs";
|
|
3
|
+
const mocks = vi.hoisted(() => ({
|
|
4
|
+
createAuthClient: vi.fn(),
|
|
5
|
+
request: vi.fn()
|
|
6
|
+
}));
|
|
7
|
+
vi.mock("better-auth/client", () => ({
|
|
8
|
+
createAuthClient: mocks.createAuthClient
|
|
9
|
+
}));
|
|
10
|
+
vi.mock("@o/helpers", () => ({
|
|
11
|
+
createEmitter: (_name, initialValue) => {
|
|
12
|
+
const emitter = {
|
|
13
|
+
value: initialValue,
|
|
14
|
+
emit(value) {
|
|
15
|
+
emitter.value = value;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
return emitter;
|
|
19
|
+
},
|
|
20
|
+
createStorageValue: () => ({
|
|
21
|
+
get: () => void 0,
|
|
22
|
+
set: vi.fn(),
|
|
23
|
+
remove: vi.fn()
|
|
24
|
+
}),
|
|
25
|
+
isEqualDeepLite: Object.is,
|
|
26
|
+
useEmitterValue: emitter => emitter.value
|
|
27
|
+
}));
|
|
28
|
+
describe("createBetterAuthClient signOut", () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
mocks.request.mockReset();
|
|
31
|
+
mocks.createAuthClient.mockReset();
|
|
32
|
+
mocks.createAuthClient.mockReturnValue({
|
|
33
|
+
$fetch: mocks.request,
|
|
34
|
+
useSession: {
|
|
35
|
+
subscribe: vi.fn(() => vi.fn())
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
test("sends JSON and clears local auth only after server revocation succeeds", async () => {
|
|
40
|
+
const deferred = Promise.withResolvers();
|
|
41
|
+
mocks.request.mockReturnValue(deferred.promise);
|
|
42
|
+
const onAuthStateChange = vi.fn();
|
|
43
|
+
const client = createBetterAuthClient({
|
|
44
|
+
baseURL: "https://auth.example.com",
|
|
45
|
+
onAuthStateChange
|
|
46
|
+
});
|
|
47
|
+
const pending = client.authClient.signOut();
|
|
48
|
+
expect(mocks.request).toHaveBeenCalledWith("/sign-out", {
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: {}
|
|
51
|
+
});
|
|
52
|
+
expect(onAuthStateChange).not.toHaveBeenCalled();
|
|
53
|
+
deferred.resolve({
|
|
54
|
+
data: {
|
|
55
|
+
success: true
|
|
56
|
+
},
|
|
57
|
+
error: null
|
|
58
|
+
});
|
|
59
|
+
await expect(pending).resolves.toEqual({
|
|
60
|
+
data: {
|
|
61
|
+
success: true
|
|
62
|
+
},
|
|
63
|
+
error: null
|
|
64
|
+
});
|
|
65
|
+
expect(onAuthStateChange).toHaveBeenCalledWith({
|
|
66
|
+
state: "logged-out",
|
|
67
|
+
session: null,
|
|
68
|
+
user: null,
|
|
69
|
+
token: null
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
test("keeps local auth when server revocation fails", async () => {
|
|
73
|
+
const error = {
|
|
74
|
+
message: "network unavailable"
|
|
75
|
+
};
|
|
76
|
+
mocks.request.mockResolvedValue({
|
|
77
|
+
data: null,
|
|
78
|
+
error
|
|
79
|
+
});
|
|
80
|
+
const onAuthStateChange = vi.fn();
|
|
81
|
+
const client = createBetterAuthClient({
|
|
82
|
+
baseURL: "https://auth.example.com",
|
|
83
|
+
onAuthStateChange
|
|
84
|
+
});
|
|
85
|
+
await expect(client.authClient.signOut()).rejects.toBe(error);
|
|
86
|
+
expect(onAuthStateChange).not.toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=createAuthClient.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","test","vi","createBetterAuthClient","mocks","hoisted","createAuthClient","fn","request","mock","createEmitter","_name","initialValue","emitter","value","emit","createStorageValue","get","set","remove","isEqualDeepLite","Object","is","useEmitterValue","mockReset","mockReturnValue","$fetch","useSession","subscribe","deferred","Promise","withResolvers","promise","onAuthStateChange","client","baseURL","pending","authClient","signOut","toHaveBeenCalledWith","method","body","not","toHaveBeenCalled","resolve","data","success","error","resolves","toEqual","state","session","user","token","message","mockResolvedValue","rejects","toBe"],"sources":["../../src/createAuthClient.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|