@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.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/dist/cjs/createAuthClient.cjs +251 -0
  4. package/dist/cjs/createAuthClient.native.js +279 -0
  5. package/dist/cjs/createAuthClient.native.js.map +1 -0
  6. package/dist/cjs/createAuthClient.test.cjs +88 -0
  7. package/dist/cjs/createAuthClient.test.native.js +105 -0
  8. package/dist/cjs/createAuthClient.test.native.js.map +1 -0
  9. package/dist/cjs/index.cjs +20 -0
  10. package/dist/cjs/index.native.js +23 -0
  11. package/dist/cjs/index.native.js.map +1 -0
  12. package/dist/cjs/server.cjs +106 -0
  13. package/dist/cjs/server.native.js +228 -0
  14. package/dist/cjs/server.native.js.map +1 -0
  15. package/dist/esm/createAuthClient.mjs +226 -0
  16. package/dist/esm/createAuthClient.mjs.map +1 -0
  17. package/dist/esm/createAuthClient.native.js +251 -0
  18. package/dist/esm/createAuthClient.native.js.map +1 -0
  19. package/dist/esm/createAuthClient.test.mjs +89 -0
  20. package/dist/esm/createAuthClient.test.mjs.map +1 -0
  21. package/dist/esm/createAuthClient.test.native.js +103 -0
  22. package/dist/esm/createAuthClient.test.native.js.map +1 -0
  23. package/dist/esm/index.js +2 -0
  24. package/dist/esm/index.js.map +1 -0
  25. package/dist/esm/index.mjs +2 -0
  26. package/dist/esm/index.mjs.map +1 -0
  27. package/dist/esm/index.native.js +2 -0
  28. package/dist/esm/index.native.js.map +1 -0
  29. package/dist/esm/server.mjs +77 -0
  30. package/dist/esm/server.mjs.map +1 -0
  31. package/dist/esm/server.native.js +196 -0
  32. package/dist/esm/server.native.js.map +1 -0
  33. package/package.json +66 -0
  34. package/src/createAuthClient.test.ts +86 -0
  35. package/src/createAuthClient.ts +373 -0
  36. package/src/index.ts +1 -0
  37. 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":"AAUA,SAAAA,aAAA,EAAAC,kBAAA,EAAAC,eAAA,EAAAC,eAAA;AAAA,SACEC,gBAAA;AAAA,SACAC,uBAAAC,OAAA;EAEA;IAAAC,iBAAA;IAAAC,WAAA;IAAAC,UAAA;IAAAC,aAAA;IAAAC,UAAA;IAAAC,MAAA;IAAAC,eAAA,IACA,8CACK,CACP;IAAA,GAAAC;EAAuC,IAAAR,OAAwB;EAmFxD,IAAAS,KAAS;IAIdC,KAAM;IACJC,OAAA;IACAC,IAAA;IACAC,KAAA;EAAA;EACgB,IAChBC,WAAa,GAAAnB,kBAAA,IAAAS,aAAA;EAAA,IACbW,YAAS,GAAApB,kBAAA,IAAAS,aAAA;EAAA,IACTY,2BAAmB,YAAmBC,4BAA2BA,CAAAN,OAAA;IACjE,OAAGb,gBAAA;MACD,GAAAU,iBAAA;MAEJU,YAAgC;QAC9BC,WAAO;QACPC,OAAS,EAAAT,OAAA;UACHU,aAAA,YAAAV,OAAA;QACN,IAAO;MACT;IAEA;EACA;EAEA,IAAAW,UAAM;IACJ,IAAAC,gBAAO;IAAiB,IACtBC,eAAG,IAAAD,gBAAA,GAAAT,WAAA,CAAAW,GAAA,gBAAAF,gBAAA,uBAAAA,gBAAA,CAAAZ,OAAA;IAAA,OACHa,eAAc,GAAAR,2BAAA,CAAAQ,eAAA,IAAA1B,gBAAA;MAAA,GACZU,iBAAa;MAAAU,YACJ;QACXC,WAAA;MACD;IACH;EAEA,GAAI;EACF,IAAAO,SAAM,GAAAhC,aAAkB,YAAY,EAAIqB,YAAG,CAAAU,GAAA,MAAAhB,KAAA;IAC3CkB,UAAO,EAAA/B;EAEc;EACZ,IACHgC,iBAAgB,GAAAlC,aAAa,oBAAU;EAAA,IAChCmC,QAAA,YAAAC,UAAAC,MAAA;IACf,IAAGC,OAAA,GAAAN,SAAA,CAAAO,KAAA;IAEH,IAAMC,IAAA;MACJ,GAAAF,OAAA;MACA,GAAAD;IACA;IACFhB,YAAA,CAAAoB,GAAA,CAAAD,IAAA;IAEAR,SAAM,CAAAU,IAAA,CAAAF,IAAA;IAEN,IAAMA,IAAA,CAAArB,KAAA,IAAYqB,IAAA,CAAAvB,OAAsC;MACtDG,WAAM,CAAAqB,GAAU;QAChBtB,KAAM,EAAAqB,IAAS,CAAArB,KAAG;QAClBF,OAAA,EAAauB,IAAI,CAAAvB,OAAI,CAAAE;MACrB;IAGA,OAAI,IAAKqB,IAAA,CAAAvB,OAAc;MACrBG,WAAA,CAAYqB,GAAA,CAAI;QACdtB,KAAA,EAAO;QACPF,OAAA,EAASuB,IAAA,CAAKvB,OAAA,CAAQE;MACxB,CAAC;IACH;MACEC,WAAA,CAAYqB,GAAA,CAAI;QACdtB,KAAA,EAAO;QACPF,OAAA,EAAS;MACX,CAAC;IACH;IACEV,iBAAY,KAAM,QAAOA,iBAAiB,uBAAAA,iBAAA,CAAAiC,IAAA;EAAA;EAG5C,IAAAG,kBAAoB,kBAAIC,oBAAAC,KAAA;IAC1BzB,WAAA,CAAAqB,GAAA,CAAAI,KAAA;IAEAC,gBAAM,CAAAD,KAAA,CAAA5B,OAAqB;EACzB;EACA,SAAA6B,gBAAuBA,CAAA7B,OAAO;IAChCW,UAAA,GAAAN,2BAAA,CAAAL,OAAA;IAEAiB,iBAAS,CAAAQ,IAAA,CAAAK,IAAiB,CAAAC,MAAiB;IACzCC,qBAAa;EACb;EACA,IAAAC,OAAA;EACF,IAAAC,UAAA;EAEA,IAAIC,mBAA2B;EAC/B,SAAIH,qBAAmDA,CAAA;IAOvDC,OAAI,aAAAA,OAAsB,uBAAAA,OAAA;IAE1BA,OAAS,GAAAtB,UAAA,CAAAyB,UAAwB,CAAAC,SAAA,iBAAAT,KAAA;MAC/B,IAAAU,IAAU;MAEV,IAAA1B,gBAAqB,EAAA2B,gBAAW;MAC9B;QAAMC,IAAE,EAAAC,WAAM;QAAAC,SAAa;QAAAC;MAAW,IAAMf,KAAI;MAEhD,IAAIe,KAAA,EAAO;QACT,IAAAC,iBAAmB;QAEnBrD,WAAM,aAAAA,WAAwB,UAAY,IAAI,KAAG,IAAAA,WAAA,CAAAoD,KAAA;QACjD,IAAIE,mBAAC,IAAqB,GAAAD,iBAAA,GAAAzC,WAAA,CAAAW,GAAA,gBAAA8B,iBAAA,uBAAAA,iBAAA,CAAA5C,OAAA;QACxB,KAAA6C,mBAAkB;UACpB3B,QAAA;YACAnB,KAAA;YACAC,OAAA;YACAC,IAAA;UACF;QAEA;QAEAkC,mBAAa;QAQbW,iBAAM,CAAAhB,IAAA,CAAAiB,GAAsB,CAACrD,UAAC,GAAYoC,IAAI,CAAAkB,GAAG,IAAAb,mBAAA;QACjD;MASA;MAGMA,mBACiB;MAAW,IAC1BK,IAAM,GAAAC,WAAc;MACtB,IAAAQ,oBAAA,OAAArC,gBAAA,GAAAT,WAAA,CAAAW,GAAA,gBAAAF,gBAAA,uBAAAA,gBAAA,CAAAZ,OAAA;MAGN,IAAAkD,SAAM,GAAAR,SAAkB,YAAU,IAAOF,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAxC,OAAA,kBAAAiD,oBAAA,IAAAT,IAAA;MACzC,IAAAW,aAAM,GAAAD,SACE,cACJ;QAIJlD,OAAS,GAAAsC,IAAA,GAAAE,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAxC,OAAA,cAAAsC,IAAA,cAAAA,IAAA;QACPrC,IAAA,GAAOuC,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAvC,IAAA,IAAAT,UAAA,GAAAA,UAAA,CAAAgD,IAAA,CAAAvC,IAAA,IAAAuC,IAAA,CAAAvC,IAAA;MAAA;MAET,IAACmD,eAAA,IAAAb,gBAAA,GAAAxB,SAAA,CAAAO,KAAA,cAAAiB,gBAAA,uBAAAA,gBAAA,CAAAvC,OAAA;MAGD,IAAIqD,YAAU,IAAMb,IAAA,SAAY,IAAAA,IAAA,UAAiB,SAAU,IAAAA,IAAM,CAAAxC,OAAQ,OAAAoD,eAAA,IAAAA,eAAA,CAAAE,EAAA,KAAAd,IAAA,CAAAxC,OAAA,CAAAsD,EAAA,IAAAF,eAAA,CAAAG,MAAA,KAAAf,IAAA,CAAAxC,OAAA,CAAAuD,MAAA;MACvErC,QAAI;QACFnB,KAAA,EAAAmD,SAAW;QACb,GAAAC;MAEA;MACE,IAAAxD,MAAI,KAAO6C,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAxC,OAAA,MAAAqD,YAAA,KAAAtC,SAAA,CAAAO,KAAA,CAAApB,KAAA;QACT,IAAAmD,YAAW,IAAAtC,SAAO,CAAAO,KAAA,CAAApB,KAAA;UACpBgB,QAAA;YACDhB,KAAA;UACH;QACD;QACHsD,aAAA,GAAAC,IAAA,WAAAvD,KAAA;UAEA,IAASA,KAAA;YACHgB,QAAY;cAChBhB;YACE;UACA;QACC;MACL;IAEA;EACE;EACA,SAAI4C,iBAAWA,CAAAY,OAAA;IACb,IAAAxB,UAAQ,EAAMyB,YAAA,CAAAzB,UAAA;IACdA,UAAO,GAAA0B,UAAA;MACT1B,UAAA;MACAF,qBAA0B;IAC5B,GAAA0B,OAAA;EAEA;EACE,eAAYF,aAAOA,CAAA;IACrB,IAAAK,SAAA;IAEA,IAAAC,GAAS,SAAAnD,UAAmB,CAAAoD,MAAA;IAC1B,IAAID,GAAA,CAAAnB,KAAO;MAEXqB,OAAA,CAAArB,KAAW,0BAAcmB,GAAiB,CAAAnB,KAAA,CAAAsB,UAAA;MACxC,YAAS;IACT;IACA,QAAAJ,SAAS,GAASC,GAAG,CAAAtB,IAAA,MAAU,QAAAqB,SAAA,uBAAAA,SAAA,CAAA3D,KAAA;EAC/B;EACE,IAAAgE,oBAAkB,GAAG,SAAAC,qBAAUA,CAAA;IAA2EhE,WAC5G,CAAAiE,MAAA;EAAA;EAEJ,SAAAC,iBAAA;IAEA,WAASC,QAAA,KAAe;IACtB,IAAAC,yBAAiB;MAAAC,iBAAA;MAAAC,cAAA;IACjB;MACF,SAAAC,SAAA,GAAA9E,eAAA,CAAA+E,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAN,yBAAA,IAAAM,KAAA,GAAAH,SAAA,CAAAnD,IAAA,IAAAuD,IAAA,GAAAP,yBAAA;QAEM,IAAAQ,UAAU,GAAMF,KAAA,CAAAvD,KAAA;QACpBgD,QAAM,CAAAU,MAAQ,MAAWD,UAAS;QAClC,IAAOE,MAAK,GAAAC,MAAO,CAAAC,QAAY,CAAAC,QAAM;QACvCd,QAAA,CAAAU,MAAA,MAAAD,UAAA,4DAAAE,MAAA;QAEM,IAAAA,MAAU,CAAAI,UAAM;UACpBf,QAAO,CAAAU,MAAA,GAAgB,GAAAD,UAAc,4DAAAE,MAAA,CAAAK,KAAA;QACvC;MAEA;IACE,SAAAC,GAAY;MACZf,iBAAa,GAAO;MACpBC,cAAc,GAAAc,GAAA;IAChB;MAEA;QAEI,KAAOhB,yBAAW,IAAeG,SAAO,CAAAc,MAAA,QAAkB;UACtDd,SAAA,CAAUc,MAAM;QACpB;MACA,UAAI;QACN,IAAAhB,iBAAA;UACA,MAAOC,cAAiB;QAC1B;MAEA;IACE;EACE;EACE,SAAAgB,YAAOA,CAAA;IAGLpB,gBAAM;IAA8CqB,UAClD;EAAQ;EACD,IAAAC,OACR,YAAAC,SAAA;IACD,IAAA7F,KAAA,GAAI,CAAAgB,SAAO,KAAO,IAAM,IAAAA,SAAO,uBAAAA,SAAA,CAAAO,KAAA,KAAAxB,KAAA;IAE/B;MACA,GAAAC,KAAI;MACF8F,QAAA,IAAA9F,KAAO,CAAAC;IAAmB;EAE5B;EAAO,IAAA8F,OACT,YAAAC,SAAA;IAAA,OACF7G,eAAA,CAAA6B,SAAA,KAAAjB,KAAA;EACA;EAAkC,SACpC4F,WAAA;IACDvF,WAAA,CAAAiE,MAAA;IAEDhE,YAAO,CAAAgE,MAAA;IACLlD,QAAA,CAAApB,KAAA;EAAA;EACAkC,qBACA;EAAA,IACA,OAAAkD,MAAY,oBAAAA,MAAA,CAAAc,gBAAA;IACZ,IAAAC,OAAA,YAAAC,SAAA;MACAjE,OAAA,aAAAA,OAAA,uBAAAA,OAAA;MACA,IAAAC,UAAA,EAAAyB,YAAA,CAAAzB,UAAA;IACA;IACAgD,MAAA,CAAAc,gBAAA,iBAAAC,OAAA;EAAA;EACA,IACAE,iBAAA,OAAAC,KAAA,CAAAzF,UAAA;IACFG,IAAAuF,OAAA,EAAAC,GAAA;MACF,IAAAA,GAAA","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":[]}