@sudobility/auth_lib 0.0.14 → 0.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/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useFirebaseAuthNetworkClient.d.ts +10 -0
- package/dist/hooks/useFirebaseAuthNetworkClient.d.ts.map +1 -1
- package/dist/hooks/useFirebaseAuthNetworkClient.js +9 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/network/FirebaseAuthNetworkService.d.ts +27 -0
- package/dist/network/FirebaseAuthNetworkService.d.ts.map +1 -0
- package/dist/network/FirebaseAuthNetworkService.js +89 -0
- package/dist/network/index.d.ts +5 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +4 -0
- package/package.json +2 -2
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Hooks exports
|
|
3
3
|
*/
|
|
4
|
-
export { useFirebaseAuthNetworkClient } from './useFirebaseAuthNetworkClient';
|
|
4
|
+
export { useFirebaseAuthNetworkClient, createFirebaseAuthNetworkClient, } from './useFirebaseAuthNetworkClient';
|
|
5
5
|
export { useSiteAdmin, siteAdminQueryKey, type UseSiteAdminOptions, type UseSiteAdminResult, type UserInfoResponse, } from './useSiteAdmin';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Hooks exports
|
|
3
3
|
*/
|
|
4
|
-
export { useFirebaseAuthNetworkClient } from './useFirebaseAuthNetworkClient';
|
|
4
|
+
export { useFirebaseAuthNetworkClient, createFirebaseAuthNetworkClient, } from './useFirebaseAuthNetworkClient';
|
|
5
5
|
export { useSiteAdmin, siteAdminQueryKey, } from './useSiteAdmin';
|
|
@@ -6,6 +6,16 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { NetworkClient } from '@sudobility/types';
|
|
8
8
|
import type { FirebaseAuthNetworkClientOptions } from '../config/types';
|
|
9
|
+
/**
|
|
10
|
+
* Create a network client adapter that wraps a platform network
|
|
11
|
+
* with 401 retry and 403 logout handling.
|
|
12
|
+
*
|
|
13
|
+
* @param platformNetwork - The underlying network service to wrap (optional, defaults to getNetworkService())
|
|
14
|
+
* @param options - Optional callbacks for logout and token refresh failure
|
|
15
|
+
*/
|
|
16
|
+
export declare function createFirebaseAuthNetworkClient(platformNetwork?: {
|
|
17
|
+
request: (url: string, options?: RequestInit) => Promise<Response>;
|
|
18
|
+
}, options?: FirebaseAuthNetworkClientOptions): NetworkClient;
|
|
9
19
|
/**
|
|
10
20
|
* Hook to get a Firebase Auth network client with automatic 401 retry and 403 logout.
|
|
11
21
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFirebaseAuthNetworkClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useFirebaseAuthNetworkClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"useFirebaseAuthNetworkClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useFirebaseAuthNetworkClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AAoCxE;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,CAAC,EAAE;IAChB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACpE,EACD,OAAO,CAAC,EAAE,gCAAgC,GACzC,aAAa,CA6If;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,gCAAgC,GACzC,aAAa,CAKf"}
|
|
@@ -41,11 +41,14 @@ async function logoutUser(onLogout) {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
44
|
-
* Create a network client adapter that wraps
|
|
44
|
+
* Create a network client adapter that wraps a platform network
|
|
45
45
|
* with 401 retry and 403 logout handling.
|
|
46
|
+
*
|
|
47
|
+
* @param platformNetwork - The underlying network service to wrap (optional, defaults to getNetworkService())
|
|
48
|
+
* @param options - Optional callbacks for logout and token refresh failure
|
|
46
49
|
*/
|
|
47
|
-
function createFirebaseAuthNetworkClient(options) {
|
|
48
|
-
const
|
|
50
|
+
export function createFirebaseAuthNetworkClient(platformNetwork, options) {
|
|
51
|
+
const network = platformNetwork ?? getNetworkService();
|
|
49
52
|
const parseResponse = async (response) => {
|
|
50
53
|
let data;
|
|
51
54
|
const contentType = response.headers.get('content-type');
|
|
@@ -77,7 +80,7 @@ function createFirebaseAuthNetworkClient(options) {
|
|
|
77
80
|
* - On 403: Log user out (no retry)
|
|
78
81
|
*/
|
|
79
82
|
const executeWithRetry = async (url, requestInit) => {
|
|
80
|
-
const response = await
|
|
83
|
+
const response = await network.request(url, requestInit);
|
|
81
84
|
// On 401, get fresh token and retry once
|
|
82
85
|
if (response.status === 401) {
|
|
83
86
|
const freshToken = await getAuthToken(true);
|
|
@@ -86,7 +89,7 @@ function createFirebaseAuthNetworkClient(options) {
|
|
|
86
89
|
...requestInit.headers,
|
|
87
90
|
Authorization: `Bearer ${freshToken}`,
|
|
88
91
|
};
|
|
89
|
-
const retryResponse = await
|
|
92
|
+
const retryResponse = await network.request(url, {
|
|
90
93
|
...requestInit,
|
|
91
94
|
headers: retryHeaders,
|
|
92
95
|
});
|
|
@@ -158,5 +161,5 @@ function createFirebaseAuthNetworkClient(options) {
|
|
|
158
161
|
* @returns NetworkClient instance
|
|
159
162
|
*/
|
|
160
163
|
export function useFirebaseAuthNetworkClient(options) {
|
|
161
|
-
return useMemo(() => createFirebaseAuthNetworkClient(options), [options]);
|
|
164
|
+
return useMemo(() => createFirebaseAuthNetworkClient(undefined, options), [options]);
|
|
162
165
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,5 +11,6 @@ export type { FirebaseConfig, FirebaseInitOptions, FirebaseInitResult, FirebaseA
|
|
|
11
11
|
export { useFirebaseAuthNetworkClient } from './hooks';
|
|
12
12
|
export { useSiteAdmin, siteAdminQueryKey, type UseSiteAdminOptions, type UseSiteAdminResult, type UserInfoResponse, } from './hooks';
|
|
13
13
|
export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, isFirebaseAuthError, } from './utils';
|
|
14
|
+
export { FirebaseAuthNetworkService, type FirebaseAuthNetworkServiceOptions, } from './network';
|
|
14
15
|
export { parseAdminEmails, isAdminEmail, createAdminChecker } from './admin';
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,GACvC,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,5 +13,7 @@ export { useFirebaseAuthNetworkClient } from './hooks';
|
|
|
13
13
|
export { useSiteAdmin, siteAdminQueryKey, } from './hooks';
|
|
14
14
|
// Utils
|
|
15
15
|
export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, isFirebaseAuthError, } from './utils';
|
|
16
|
+
// Network
|
|
17
|
+
export { FirebaseAuthNetworkService, } from './network';
|
|
16
18
|
// Admin
|
|
17
19
|
export { parseAdminEmails, isAdminEmail, createAdminChecker } from './admin';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Firebase-aware network service with automatic token refresh and logout handling.
|
|
3
|
+
*
|
|
4
|
+
* Extends WebNetworkService to add:
|
|
5
|
+
* - On 401 (Unauthorized): Force refresh Firebase token and retry once
|
|
6
|
+
* - On 403 (Forbidden): Log the user out
|
|
7
|
+
*/
|
|
8
|
+
import { WebNetworkService } from '@sudobility/di';
|
|
9
|
+
export interface FirebaseAuthNetworkServiceOptions {
|
|
10
|
+
/** Called when user is logged out due to 403 */
|
|
11
|
+
onLogout?: () => void;
|
|
12
|
+
/** Called when token refresh fails */
|
|
13
|
+
onTokenRefreshFailed?: (error: Error) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Network service with Firebase authentication support.
|
|
17
|
+
* Automatically refreshes token on 401 and logs out on 403.
|
|
18
|
+
*/
|
|
19
|
+
export declare class FirebaseAuthNetworkService extends WebNetworkService {
|
|
20
|
+
private options?;
|
|
21
|
+
constructor(options?: FirebaseAuthNetworkServiceOptions);
|
|
22
|
+
/**
|
|
23
|
+
* Override request to add 401 retry and 403 logout handling.
|
|
24
|
+
*/
|
|
25
|
+
request(url: string, options?: RequestInit): Promise<Response>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=FirebaseAuthNetworkService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirebaseAuthNetworkService.d.ts","sourceRoot":"","sources":["../../src/network/FirebaseAuthNetworkService.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,iCAAiC;IAChD,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,sCAAsC;IACtC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC/C;AAiCD;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,iBAAiB;IAC/D,OAAO,CAAC,OAAO,CAAC,CAAoC;gBAExC,OAAO,CAAC,EAAE,iCAAiC;IAKvD;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAkCzE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Firebase-aware network service with automatic token refresh and logout handling.
|
|
3
|
+
*
|
|
4
|
+
* Extends WebNetworkService to add:
|
|
5
|
+
* - On 401 (Unauthorized): Force refresh Firebase token and retry once
|
|
6
|
+
* - On 403 (Forbidden): Log the user out
|
|
7
|
+
*/
|
|
8
|
+
import { WebNetworkService } from '@sudobility/di';
|
|
9
|
+
import { signOut } from 'firebase/auth';
|
|
10
|
+
import { getFirebaseAuth } from '../config/firebase-init';
|
|
11
|
+
/**
|
|
12
|
+
* Get a fresh Firebase ID token with force refresh.
|
|
13
|
+
* Returns empty string if not authenticated.
|
|
14
|
+
*/
|
|
15
|
+
async function getAuthToken(forceRefresh = false) {
|
|
16
|
+
const auth = getFirebaseAuth();
|
|
17
|
+
const user = auth?.currentUser;
|
|
18
|
+
if (!user)
|
|
19
|
+
return '';
|
|
20
|
+
try {
|
|
21
|
+
return await user.getIdToken(forceRefresh);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error('[FirebaseAuthNetworkService] Failed to get ID token:', err);
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Log the user out via Firebase.
|
|
30
|
+
*/
|
|
31
|
+
async function logoutUser(onLogout) {
|
|
32
|
+
const auth = getFirebaseAuth();
|
|
33
|
+
if (!auth)
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
await signOut(auth);
|
|
37
|
+
onLogout?.();
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error('[FirebaseAuthNetworkService] Failed to sign out:', err);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Network service with Firebase authentication support.
|
|
45
|
+
* Automatically refreshes token on 401 and logs out on 403.
|
|
46
|
+
*/
|
|
47
|
+
export class FirebaseAuthNetworkService extends WebNetworkService {
|
|
48
|
+
constructor(options) {
|
|
49
|
+
super();
|
|
50
|
+
Object.defineProperty(this, "options", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
configurable: true,
|
|
53
|
+
writable: true,
|
|
54
|
+
value: void 0
|
|
55
|
+
});
|
|
56
|
+
this.options = options;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Override request to add 401 retry and 403 logout handling.
|
|
60
|
+
*/
|
|
61
|
+
async request(url, options = {}) {
|
|
62
|
+
const response = await super.request(url, options);
|
|
63
|
+
// On 401, get fresh token and retry once
|
|
64
|
+
if (response.status === 401) {
|
|
65
|
+
const freshToken = await getAuthToken(true);
|
|
66
|
+
if (freshToken) {
|
|
67
|
+
const retryHeaders = {
|
|
68
|
+
...options.headers,
|
|
69
|
+
Authorization: `Bearer ${freshToken}`,
|
|
70
|
+
};
|
|
71
|
+
return super.request(url, {
|
|
72
|
+
...options,
|
|
73
|
+
headers: retryHeaders,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Token refresh failed
|
|
78
|
+
this.options?.onTokenRefreshFailed?.(new Error('Failed to refresh token'));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// On 403, log the user out
|
|
82
|
+
if (response.status === 403) {
|
|
83
|
+
console.warn('[FirebaseAuthNetworkService] 403 Forbidden - logging user out');
|
|
84
|
+
await logoutUser(this.options?.onLogout);
|
|
85
|
+
// Return the original response so the UI can handle it
|
|
86
|
+
}
|
|
87
|
+
return response;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,GACvC,MAAM,8BAA8B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/auth_lib",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "Firebase authentication utilities with token refresh handling",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"react": "^19.2.3",
|
|
33
33
|
"firebase": "^12.7.0",
|
|
34
|
-
"@sudobility/di": "^1.5.
|
|
34
|
+
"@sudobility/di": "^1.5.22",
|
|
35
35
|
"@sudobility/types": "^1.9.48",
|
|
36
36
|
"@tanstack/react-query": "^5.0.0"
|
|
37
37
|
},
|