delta-auth-next 0.1.79 → 0.1.82
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/DeltaProvider.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { DeltaAuthConfig } from './context';
|
|
3
|
-
|
|
3
|
+
export declare function DeltaAuthProvider({ config, children, }: {
|
|
4
4
|
config: DeltaAuthConfig;
|
|
5
5
|
children: React.ReactNode;
|
|
6
|
-
}
|
|
7
|
-
export declare function DeltaAuthProvider({ config, children }: Props): import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export {};
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
7
|
//# sourceMappingURL=DeltaProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeltaProvider.d.ts","sourceRoot":"","sources":["../src/DeltaProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"DeltaProvider.d.ts","sourceRoot":"","sources":["../src/DeltaProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAe,eAAe,EAAE,MAAM,WAAW,CAAC;AAKzD,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAiIA"}
|
package/dist/DeltaProvider.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx,
|
|
3
|
-
import { useState, useEffect, useCallback, useMemo } from 'react';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect, useCallback, useMemo, useRef, } from 'react';
|
|
4
4
|
import { AuthContext } from './context';
|
|
5
5
|
import { createAuthClient } from './client/authClient';
|
|
6
6
|
import { useSimpleToast } from './alert';
|
|
7
|
-
export function DeltaAuthProvider({ config, children }) {
|
|
7
|
+
export function DeltaAuthProvider({ config, children, }) {
|
|
8
8
|
const [deltaUser, setDeltaUser] = useState(null);
|
|
9
9
|
const [app, setApp] = useState(null);
|
|
10
10
|
const [loading, setLoading] = useState(true);
|
|
11
|
-
const [enabled, setEnabled] = useState(true);
|
|
12
11
|
const [accessToken, setAccessToken] = useState(null);
|
|
13
12
|
const [expiresAt, setExpiresAt] = useState(null);
|
|
13
|
+
// 1. CRITICAL: These refs prevent the "Feedback Loop"
|
|
14
|
+
const isRefreshing = useRef(false);
|
|
15
|
+
const lastRefreshTime = useRef(0);
|
|
14
16
|
const { Toast } = useSimpleToast();
|
|
15
17
|
const client = useMemo(() => {
|
|
16
18
|
return createAuthClient({
|
|
@@ -19,25 +21,21 @@ export function DeltaAuthProvider({ config, children }) {
|
|
|
19
21
|
authDomain: config.authDomain,
|
|
20
22
|
appType: config.appType,
|
|
21
23
|
});
|
|
22
|
-
}, [
|
|
23
|
-
config.backendUrl,
|
|
24
|
-
config.publishableKey,
|
|
25
|
-
config.authDomain,
|
|
26
|
-
config.appType,
|
|
27
|
-
]);
|
|
28
|
-
/* ---------------------------------- */
|
|
29
|
-
/* 1. Logic: The Silent Refresh */
|
|
30
|
-
/* ---------------------------------- */
|
|
24
|
+
}, [config]);
|
|
31
25
|
const fetchUser = useCallback(async () => {
|
|
32
|
-
if
|
|
26
|
+
// 2. Stop if already in flight OR if we just refreshed < 5 seconds ago
|
|
27
|
+
if (isRefreshing.current || Date.now() - lastRefreshTime.current < 5000)
|
|
33
28
|
return null;
|
|
29
|
+
isRefreshing.current = true;
|
|
34
30
|
try {
|
|
35
31
|
const res = await client.getCurrentUser();
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
if (res.user) {
|
|
33
|
+
setDeltaUser(res.user);
|
|
34
|
+
setAccessToken(res.accessToken);
|
|
35
|
+
if (res.user.session_expires_at) {
|
|
36
|
+
setExpiresAt(new Date(res.user.session_expires_at).getTime());
|
|
37
|
+
}
|
|
38
|
+
lastRefreshTime.current = Date.now(); // Mark successful refresh
|
|
41
39
|
}
|
|
42
40
|
if (res.application)
|
|
43
41
|
setApp(res.application);
|
|
@@ -45,90 +43,73 @@ export function DeltaAuthProvider({ config, children }) {
|
|
|
45
43
|
}
|
|
46
44
|
catch (err) {
|
|
47
45
|
console.warn('DeltaAuth refresh failed:', err);
|
|
48
|
-
setDeltaUser(null);
|
|
49
|
-
setAccessToken(null);
|
|
50
|
-
setExpiresAt(null);
|
|
51
46
|
return null;
|
|
52
47
|
}
|
|
53
48
|
finally {
|
|
49
|
+
isRefreshing.current = false;
|
|
54
50
|
setLoading(false);
|
|
55
51
|
}
|
|
56
|
-
}, [client
|
|
57
|
-
/*
|
|
58
|
-
/* 2. Bootstrap (Initial Load) */
|
|
59
|
-
/* ---------------------------------- */
|
|
52
|
+
}, [client]);
|
|
53
|
+
/* --- Bootstrap (Runs once on mount) --- */
|
|
60
54
|
useEffect(() => {
|
|
61
55
|
let isMounted = true;
|
|
62
|
-
setLoading(true);
|
|
63
56
|
const bootstrap = async () => {
|
|
64
57
|
try {
|
|
65
58
|
const res = await fetch(`${config.backendUrl}/auth/app-info?client_id=${config.publishableKey}`, { credentials: 'include' });
|
|
66
|
-
if (!res.ok)
|
|
67
|
-
throw new Error('Failed to fetch app metadata');
|
|
68
59
|
const data = await res.json();
|
|
69
|
-
if (isMounted) {
|
|
70
|
-
setApp(data.app
|
|
71
|
-
setDeltaUser(data.user
|
|
60
|
+
if (isMounted && data.user) {
|
|
61
|
+
setApp(data.app);
|
|
62
|
+
setDeltaUser(data.user);
|
|
72
63
|
setAccessToken(data.accessToken);
|
|
73
|
-
if (data.user
|
|
64
|
+
if (data.user.session_expires_at) {
|
|
74
65
|
setExpiresAt(new Date(data.user.session_expires_at).getTime());
|
|
75
66
|
}
|
|
76
67
|
}
|
|
77
68
|
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
console.warn('DeltaAuth bootstrap failed:', err);
|
|
80
|
-
}
|
|
81
69
|
finally {
|
|
82
70
|
if (isMounted)
|
|
83
71
|
setLoading(false);
|
|
84
72
|
}
|
|
85
73
|
};
|
|
86
|
-
|
|
87
|
-
bootstrap();
|
|
74
|
+
bootstrap();
|
|
88
75
|
return () => {
|
|
89
76
|
isMounted = false;
|
|
90
77
|
};
|
|
91
78
|
}, [config.publishableKey, config.backendUrl]);
|
|
92
|
-
/*
|
|
93
|
-
/* 3. Proactive Scheduling */
|
|
94
|
-
/* ---------------------------------- */
|
|
79
|
+
/* --- 3. THE FIXED SCHEDULER --- */
|
|
95
80
|
useEffect(() => {
|
|
96
|
-
if
|
|
81
|
+
// Only schedule if we have a user and an expiry that isn't currently being refreshed
|
|
82
|
+
if (!deltaUser || !expiresAt || isRefreshing.current)
|
|
97
83
|
return;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// If
|
|
101
|
-
const delay = expiresAt - Date.now();
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
const delay = expiresAt - now;
|
|
86
|
+
// If already expired, trigger a single refresh
|
|
102
87
|
if (delay <= 0) {
|
|
103
88
|
fetchUser();
|
|
104
89
|
return;
|
|
105
90
|
}
|
|
91
|
+
// Otherwise, set a timer for the exact moment of death
|
|
106
92
|
const timer = setTimeout(() => {
|
|
107
93
|
fetchUser();
|
|
108
94
|
}, delay);
|
|
109
95
|
return () => clearTimeout(timer);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
/* ---------------------------------- */
|
|
96
|
+
// 4. IMPORTANT: We remove deltaUser from dependencies to prevent the loop
|
|
97
|
+
// We only care if the 'expiresAt' timestamp actually changes.
|
|
98
|
+
}, [expiresAt, fetchUser]);
|
|
114
99
|
const getAccessToken = useCallback(async () => {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (accessToken && !isExpired) {
|
|
100
|
+
const isExpired = !expiresAt || Date.now() + 2000 >= expiresAt;
|
|
101
|
+
if (accessToken && !isExpired)
|
|
118
102
|
return accessToken;
|
|
119
|
-
}
|
|
120
103
|
const res = await fetchUser();
|
|
121
104
|
return res?.accessToken ?? null;
|
|
122
105
|
}, [accessToken, expiresAt, fetchUser]);
|
|
123
|
-
if (!enabled)
|
|
124
|
-
return (_jsxs(_Fragment, { children: [children, _jsx(Toast, {})] }));
|
|
125
106
|
return (_jsxs(AuthContext.Provider, { value: {
|
|
126
107
|
deltaUser,
|
|
127
108
|
setDeltaUser,
|
|
128
109
|
app,
|
|
129
110
|
setApp,
|
|
130
111
|
loading,
|
|
131
|
-
isAuthenticated:
|
|
112
|
+
isAuthenticated: !!deltaUser,
|
|
132
113
|
client,
|
|
133
114
|
fetchUser,
|
|
134
115
|
getAccessToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeltaProvider.js","sourceRoot":"","sources":["../src/DeltaProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,
|
|
1
|
+
{"version":3,"file":"DeltaProvider.js","sourceRoot":"","sources":["../src/DeltaProvider.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "delta-auth-next",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.82",
|
|
4
4
|
"description": "A lightweight authentication system for Next.js that provides React context providers and Edge-safe middleware utilities for handling sign-in redirects and session management.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Samuel Onwodi",
|