@artatol-acp/auth-nextjs 0.3.5 → 0.3.7
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/README.md +4 -4
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.jsx +53 -21
- package/dist/client/index.jsx.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -575,10 +575,10 @@ The Next.js SDK includes automatic token refresh functionality on the client sid
|
|
|
575
575
|
### How It Works
|
|
576
576
|
|
|
577
577
|
1. When you use `ACPAuthProvider`, the SDK automatically manages access tokens
|
|
578
|
-
2. After successful login,
|
|
579
|
-
3.
|
|
580
|
-
4. If
|
|
581
|
-
5.
|
|
578
|
+
2. After successful login, a background interval starts
|
|
579
|
+
3. **Every 4 minutes**, the token is automatically refreshed (tokens expire after 5 minutes)
|
|
580
|
+
4. If refresh fails, the user is automatically logged out
|
|
581
|
+
5. The interval stops when the user logs out or the component unmounts
|
|
582
582
|
|
|
583
583
|
### Client-Side Usage
|
|
584
584
|
|
package/dist/client/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type ACPAuthContextValue = {
|
|
|
5
5
|
isLoading: boolean;
|
|
6
6
|
login: (email: string, password: string) => Promise<void>;
|
|
7
7
|
logout: () => Promise<void>;
|
|
8
|
-
refresh: () => Promise<
|
|
8
|
+
refresh: () => Promise<boolean>;
|
|
9
9
|
resendVerification: (email: string) => Promise<void>;
|
|
10
10
|
};
|
|
11
11
|
export type ACPAuthProviderProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAuE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5G,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAIF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,oBAAoB,2CAuF1E;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
|
package/dist/client/index.jsx
CHANGED
|
@@ -1,48 +1,80 @@
|
|
|
1
1
|
/** @jsxImportSource react */
|
|
2
2
|
'use client';
|
|
3
3
|
import { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
4
|
-
import { createContext, useContext, useState, useEffect } from 'react';
|
|
4
|
+
import { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';
|
|
5
5
|
const ACPAuthContext = createContext(null);
|
|
6
6
|
export function ACPAuthProvider({ children, baseUrl }) {
|
|
7
7
|
const [user, setUser] = useState(null);
|
|
8
8
|
const [isLoading, setIsLoading] = useState(true);
|
|
9
|
-
const
|
|
9
|
+
const clientRef = useRef(new ACPAuthClient({
|
|
10
10
|
baseUrl,
|
|
11
11
|
apiKey: '',
|
|
12
12
|
autoRefresh: true,
|
|
13
13
|
refreshThresholdSeconds: 60
|
|
14
14
|
}));
|
|
15
|
-
const
|
|
15
|
+
const intervalRef = useRef(null);
|
|
16
|
+
const clearRefreshInterval = useCallback(() => {
|
|
17
|
+
if (intervalRef.current) {
|
|
18
|
+
clearInterval(intervalRef.current);
|
|
19
|
+
intervalRef.current = null;
|
|
20
|
+
}
|
|
21
|
+
}, []);
|
|
22
|
+
const refresh = useCallback(async () => {
|
|
16
23
|
try {
|
|
17
|
-
await
|
|
18
|
-
|
|
19
|
-
const userData = await client.me();
|
|
24
|
+
await clientRef.current.refresh();
|
|
25
|
+
const userData = await clientRef.current.me();
|
|
20
26
|
setUser(userData);
|
|
27
|
+
return true;
|
|
21
28
|
}
|
|
22
|
-
catch
|
|
23
|
-
|
|
24
|
-
client.setAccessToken(null);
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
25
31
|
}
|
|
26
|
-
};
|
|
27
|
-
const login = async (email, password) => {
|
|
28
|
-
const result = await
|
|
32
|
+
}, []);
|
|
33
|
+
const login = useCallback(async (email, password) => {
|
|
34
|
+
const result = await clientRef.current.login({ email, password });
|
|
29
35
|
if ('requiresTwoFactor' in result) {
|
|
30
36
|
throw new Error('2FA_REQUIRED');
|
|
31
37
|
}
|
|
32
38
|
// User logged in successfully, token is automatically set in client
|
|
33
39
|
setUser(result.user);
|
|
34
|
-
};
|
|
35
|
-
const logout = async () => {
|
|
36
|
-
|
|
40
|
+
}, []);
|
|
41
|
+
const logout = useCallback(async () => {
|
|
42
|
+
// First clear the interval to prevent race conditions
|
|
43
|
+
clearRefreshInterval();
|
|
44
|
+
// Then clear user state
|
|
37
45
|
setUser(null);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
// Finally call logout API
|
|
47
|
+
try {
|
|
48
|
+
await clientRef.current.logout();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore logout errors, user is already logged out locally
|
|
52
|
+
}
|
|
53
|
+
}, [clearRefreshInterval]);
|
|
54
|
+
const resendVerification = useCallback(async (email) => {
|
|
55
|
+
await clientRef.current.resendVerificationEmail({ email });
|
|
56
|
+
}, []);
|
|
57
|
+
// Initial session restore
|
|
42
58
|
useEffect(() => {
|
|
43
|
-
// Try to restore session on mount
|
|
44
59
|
refresh().finally(() => setIsLoading(false));
|
|
45
|
-
}, []);
|
|
60
|
+
}, [refresh]);
|
|
61
|
+
// Auto-refresh interval
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (!user) {
|
|
64
|
+
clearRefreshInterval();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const REFRESH_INTERVAL = 4 * 60 * 1000; // 4 minutes
|
|
68
|
+
intervalRef.current = setInterval(() => {
|
|
69
|
+
refresh().then(success => {
|
|
70
|
+
if (!success) {
|
|
71
|
+
clearRefreshInterval();
|
|
72
|
+
setUser(null);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}, REFRESH_INTERVAL);
|
|
76
|
+
return clearRefreshInterval;
|
|
77
|
+
}, [user, refresh, clearRefreshInterval]);
|
|
46
78
|
return (<ACPAuthContext.Provider value={{ user, isLoading, login, logout, refresh, resendVerification }}>
|
|
47
79
|
{children}
|
|
48
80
|
</ACPAuthContext.Provider>);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAa,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artatol-acp/auth-nextjs",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "Next.js SDK for Artatol Cloud Platform Authentication with support for App Router, Server Actions, and Middleware",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"react": "^18.0.0 || ^19.0.0"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@artatol-acp/auth-js": "^0.3.
|
|
44
|
+
"@artatol-acp/auth-js": "^0.3.6",
|
|
45
45
|
"jose": "^5.9.6"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|