@sudobility/auth_lib 0.0.91 → 0.0.92
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 +22 -7
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.rn.d.ts +1 -1
- package/dist/index.rn.d.ts.map +1 -1
- package/dist/index.rn.js +1 -1
- package/dist/index.rn.js.map +1 -1
- package/dist/network/FirebaseAuthNetworkService.rn.d.ts +5 -3
- package/dist/network/FirebaseAuthNetworkService.rn.d.ts.map +1 -1
- package/dist/network/FirebaseAuthNetworkService.rn.js +41 -21
- package/dist/network/FirebaseAuthNetworkService.rn.js.map +1 -1
- package/package.json +1 -1
- package/dist/hooks/useFirebaseAuthNetworkClient.d.ts +0 -8
- package/dist/hooks/useFirebaseAuthNetworkClient.d.ts.map +0 -1
- package/dist/hooks/useFirebaseAuthNetworkClient.js +0 -171
- package/dist/hooks/useFirebaseAuthNetworkClient.js.map +0 -1
package/README.md
CHANGED
|
@@ -16,12 +16,30 @@ bun add react firebase @sudobility/di @sudobility/types @tanstack/react-query
|
|
|
16
16
|
bun add @react-native-firebase/app @react-native-firebase/auth
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
## The network client
|
|
20
|
+
|
|
21
|
+
Use **`FirebaseAuthNetworkService`**. It implements `NetworkClient`, injects the
|
|
22
|
+
Firebase ID token, sets `Content-Type: application/json` on request bodies, and
|
|
23
|
+
has a `.rn` variant for React Native.
|
|
24
|
+
|
|
25
|
+
Its session policy:
|
|
26
|
+
|
|
27
|
+
| Response | Behavior |
|
|
28
|
+
|----------|----------|
|
|
29
|
+
| 401, refresh succeeds | retry once with the fresh token |
|
|
30
|
+
| 401, unrecoverable | sign the user out -- the session is dead |
|
|
31
|
+
| 403 | return the response untouched; the caller is authenticated but lacks permission |
|
|
32
|
+
|
|
33
|
+
A 403 never ends the session. APIs in this workspace use 403 for role and
|
|
34
|
+
permission denials, so signing out there would log a user out for clicking
|
|
35
|
+
something they merely lack access to.
|
|
36
|
+
|
|
19
37
|
## Usage
|
|
20
38
|
|
|
21
39
|
```typescript
|
|
22
40
|
import {
|
|
23
41
|
initializeFirebaseAuth,
|
|
24
|
-
|
|
42
|
+
FirebaseAuthNetworkService,
|
|
25
43
|
useSiteAdmin,
|
|
26
44
|
getFirebaseErrorMessage,
|
|
27
45
|
} from '@sudobility/auth_lib';
|
|
@@ -29,10 +47,8 @@ import {
|
|
|
29
47
|
// Initialize Firebase Auth (after Firebase app is initialized)
|
|
30
48
|
const { app, auth } = initializeFirebaseAuth();
|
|
31
49
|
|
|
32
|
-
//
|
|
33
|
-
const networkClient =
|
|
34
|
-
onLogout: () => navigate('/login'),
|
|
35
|
-
});
|
|
50
|
+
// Auth-aware network client: 401 refreshes the token and retries once
|
|
51
|
+
const networkClient = new FirebaseAuthNetworkService();
|
|
36
52
|
|
|
37
53
|
// Check if user is a site admin
|
|
38
54
|
const { isSiteAdmin, isLoading } = useSiteAdmin({
|
|
@@ -58,7 +74,6 @@ const { isSiteAdmin, isLoading } = useSiteAdmin({
|
|
|
58
74
|
|
|
59
75
|
| Export | Description |
|
|
60
76
|
|---|---|
|
|
61
|
-
| `useFirebaseAuthNetworkClient(options?)` | Auth-aware NetworkClient with 401 retry and 403 logout |
|
|
62
77
|
| `createFirebaseAuthNetworkClient(platformNetwork?, options?)` | Non-hook factory version |
|
|
63
78
|
| `useSiteAdmin(options)` | Check site admin status via TanStack Query |
|
|
64
79
|
|
|
@@ -66,7 +81,7 @@ const { isSiteAdmin, isLoading } = useSiteAdmin({
|
|
|
66
81
|
|
|
67
82
|
| Export | Description |
|
|
68
83
|
|---|---|
|
|
69
|
-
| `FirebaseAuthNetworkService` | Auth-aware network service (web and RN variants) |
|
|
84
|
+
| `FirebaseAuthNetworkService` | Auth-aware network service (web and RN variants). 401 refresh-and-retry, logout only when unrecoverable; 403 left to the caller |
|
|
70
85
|
|
|
71
86
|
### Utils (`utils/`)
|
|
72
87
|
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { useFirebaseAuthNetworkClient, createFirebaseAuthNetworkClient, invalidateTokenCache, } from './useFirebaseAuthNetworkClient';
|
|
2
1
|
export { useProxyFilteredAuthProviders } from './useProxyFilteredAuthProviders';
|
|
3
2
|
export { useSiteAdmin, siteAdminQueryKey, type UseSiteAdminOptions, type UseSiteAdminResult, type UserInfoResponse, } from './useSiteAdmin';
|
|
4
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,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,4 +1,3 @@
|
|
|
1
|
-
export { useFirebaseAuthNetworkClient, createFirebaseAuthNetworkClient, invalidateTokenCache, } from './useFirebaseAuthNetworkClient';
|
|
2
1
|
export { useProxyFilteredAuthProviders } from './useProxyFilteredAuthProviders';
|
|
3
2
|
export { useSiteAdmin, siteAdminQueryKey, } from './useSiteAdmin';
|
|
4
3
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EACL,YAAY,EACZ,iBAAiB,GAIlB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { initializeFirebaseAuth, getFirebaseApp, getFirebaseAuth, isFirebaseConf
|
|
|
3
3
|
export { installFirebaseProxy, forceFirebaseProxy, disableFirebaseProxy, autoConfigureFirebaseProxy, isFirebaseReachable, isLikelyChinaRegion, rewriteFirebaseProxyUrl, getFirebaseProxyOrigin, DEFAULT_FIREBASE_PROXY_ORIGIN, type AutoConfigureFirebaseProxyOptions, } from './config';
|
|
4
4
|
export { filterAuthProvidersForProxy } from './config';
|
|
5
5
|
export type { FirebaseInitResult, FirebaseAuthNetworkClientOptions, } from './config';
|
|
6
|
-
export {
|
|
6
|
+
export { useProxyFilteredAuthProviders } from './hooks';
|
|
7
7
|
export { useSiteAdmin, siteAdminQueryKey, type UseSiteAdminOptions, type UseSiteAdminResult, type UserInfoResponse, } from './hooks';
|
|
8
8
|
export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, isFirebaseAuthError, } from './utils';
|
|
9
9
|
export { FirebaseAuthNetworkService, type FirebaseAuthNetworkServiceOptions, } from './network';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,8BAA8B,CAAC;AAGtC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iCAAiC,GACvC,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEvD,YAAY,EACV,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,UAAU,CAAC;AAGlB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,8BAA8B,CAAC;AAGtC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iCAAiC,GACvC,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAEvD,YAAY,EACV,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAExD,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,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import './config/firebase-proxy-auto';
|
|
|
2
2
|
export { initializeFirebaseAuth, getFirebaseApp, getFirebaseAuth, isFirebaseConfigured, } from './config';
|
|
3
3
|
export { installFirebaseProxy, forceFirebaseProxy, disableFirebaseProxy, autoConfigureFirebaseProxy, isFirebaseReachable, isLikelyChinaRegion, rewriteFirebaseProxyUrl, getFirebaseProxyOrigin, DEFAULT_FIREBASE_PROXY_ORIGIN, } from './config';
|
|
4
4
|
export { filterAuthProvidersForProxy } from './config';
|
|
5
|
-
export {
|
|
5
|
+
export { useProxyFilteredAuthProviders } from './hooks';
|
|
6
6
|
export { useSiteAdmin, siteAdminQueryKey, } from './hooks';
|
|
7
7
|
export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, isFirebaseAuthError, } from './utils';
|
|
8
8
|
export { FirebaseAuthNetworkService, } from './network';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,8BAA8B,CAAC;AAGtC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,GAE9B,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAQvD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,8BAA8B,CAAC;AAGtC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,GAE9B,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAQvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EACL,YAAY,EACZ,iBAAiB,GAIlB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,0BAA0B,GAE3B,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAA6B,MAAM,WAAW,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.rn.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { installFirebaseProxy, forceFirebaseProxy, disableFirebaseProxy, autoCon
|
|
|
3
3
|
export { filterAuthProvidersForProxy } from './config/firebase-proxy-providers.js';
|
|
4
4
|
export { initializeFirebaseAuth, getFirebaseApp, getFirebaseAuth, isFirebaseConfigured, } from './config/firebase-init.native.js';
|
|
5
5
|
export type { FirebaseInitResult, FirebaseAuthNetworkClientOptions, } from './config/types.js';
|
|
6
|
-
export {
|
|
6
|
+
export { useProxyFilteredAuthProviders } from './hooks/index.js';
|
|
7
7
|
export { useSiteAdmin, siteAdminQueryKey, type UseSiteAdminOptions, type UseSiteAdminResult, type UserInfoResponse, } from './hooks/index.js';
|
|
8
8
|
export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, isFirebaseAuthError, } from './utils/index.js';
|
|
9
9
|
export { FirebaseAuthNetworkService, type FirebaseAuthNetworkServiceOptions, } from './network/FirebaseAuthNetworkService.rn.js';
|
package/dist/index.rn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.rn.d.ts","sourceRoot":"","sources":["../src/index.rn.ts"],"names":[],"mappings":"AAUA,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iCAAiC,GACvC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGnF,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.rn.d.ts","sourceRoot":"","sources":["../src/index.rn.ts"],"names":[],"mappings":"AAUA,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iCAAiC,GACvC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGnF,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,GACvC,MAAM,4CAA4C,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GACnB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.rn.js
CHANGED
|
@@ -2,7 +2,7 @@ import './config/firebase-proxy-auto.native.js';
|
|
|
2
2
|
export { installFirebaseProxy, forceFirebaseProxy, disableFirebaseProxy, autoConfigureFirebaseProxy, isFirebaseReachable, isLikelyChinaRegion, rewriteFirebaseProxyUrl, getFirebaseProxyOrigin, DEFAULT_FIREBASE_PROXY_ORIGIN, } from './config/firebase-proxy.js';
|
|
3
3
|
export { filterAuthProvidersForProxy } from './config/firebase-proxy-providers.js';
|
|
4
4
|
export { initializeFirebaseAuth, getFirebaseApp, getFirebaseAuth, isFirebaseConfigured, } from './config/firebase-init.native.js';
|
|
5
|
-
export {
|
|
5
|
+
export { useProxyFilteredAuthProviders } from './hooks/index.js';
|
|
6
6
|
export { useSiteAdmin, siteAdminQueryKey, } from './hooks/index.js';
|
|
7
7
|
export { getFirebaseErrorMessage, getFirebaseErrorCode, formatFirebaseError, isFirebaseAuthError, } from './utils/index.js';
|
|
8
8
|
export { FirebaseAuthNetworkService, } from './network/FirebaseAuthNetworkService.rn.js';
|
package/dist/index.rn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.rn.js","sourceRoot":"","sources":["../src/index.rn.ts"],"names":[],"mappings":"AAUA,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,GAE9B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGnF,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.rn.js","sourceRoot":"","sources":["../src/index.rn.ts"],"names":[],"mappings":"AAUA,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,GAE9B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAGnF,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAQ1C,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EACL,YAAY,EACZ,iBAAiB,GAIlB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,0BAA0B,GAE3B,MAAM,4CAA4C,CAAC;AAGpD,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAG9E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GACnB,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RNNetworkClient } from '@sudobility/di/rn';
|
|
2
|
+
import type { NetworkRequestOptions, NetworkResponse } from '@sudobility/types';
|
|
2
3
|
export interface FirebaseAuthNetworkServiceOptions {
|
|
3
4
|
onLogout?: () => void;
|
|
4
5
|
onTokenRefreshFailed?: (error: Error) => void;
|
|
6
|
+
defaultTimeoutMs?: number;
|
|
5
7
|
}
|
|
6
|
-
export declare class FirebaseAuthNetworkService extends
|
|
8
|
+
export declare class FirebaseAuthNetworkService extends RNNetworkClient {
|
|
7
9
|
private serviceOptions;
|
|
8
10
|
constructor(options?: FirebaseAuthNetworkServiceOptions);
|
|
9
|
-
request(url: string, options?:
|
|
11
|
+
request<T = unknown>(url: string, options?: NetworkRequestOptions): Promise<NetworkResponse<T>>;
|
|
10
12
|
}
|
|
11
13
|
//# sourceMappingURL=FirebaseAuthNetworkService.rn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirebaseAuthNetworkService.rn.d.ts","sourceRoot":"","sources":["../../src/network/FirebaseAuthNetworkService.rn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FirebaseAuthNetworkService.rn.d.ts","sourceRoot":"","sources":["../../src/network/FirebaseAuthNetworkService.rn.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGhF,MAAM,WAAW,iCAAiC;IAEhD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAE9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAqCD,qBAAa,0BAA2B,SAAQ,eAAe;IAC7D,OAAO,CAAC,cAAc,CAAgD;gBAE1D,OAAO,CAAC,EAAE,iCAAiC;IAYxC,OAAO,CAAC,CAAC,GAAG,OAAO,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAoD/B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RNNetworkClient } from '@sudobility/di/rn';
|
|
2
2
|
import { getFirebaseAuth } from '../config/firebase-init.native.js';
|
|
3
3
|
async function getAuthToken(forceRefresh = false) {
|
|
4
4
|
const auth = getFirebaseAuth();
|
|
@@ -23,33 +23,53 @@ async function logoutUser(onLogout) {
|
|
|
23
23
|
catch {
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
export class FirebaseAuthNetworkService extends
|
|
26
|
+
export class FirebaseAuthNetworkService extends RNNetworkClient {
|
|
27
27
|
constructor(options) {
|
|
28
|
-
super();
|
|
28
|
+
super(options?.defaultTimeoutMs);
|
|
29
29
|
this.serviceOptions = options;
|
|
30
30
|
}
|
|
31
31
|
async request(url, options = {}) {
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
...options.headers,
|
|
38
|
-
Authorization: `Bearer ${freshToken}`,
|
|
39
|
-
};
|
|
40
|
-
return super.request(url, {
|
|
41
|
-
...options,
|
|
42
|
-
headers: retryHeaders,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
this.serviceOptions?.onTokenRefreshFailed?.(new Error('Failed to refresh token'));
|
|
32
|
+
const headers = { ...options.headers };
|
|
33
|
+
if (!headers['Authorization']) {
|
|
34
|
+
const token = await getAuthToken(false);
|
|
35
|
+
if (token) {
|
|
36
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
47
37
|
}
|
|
48
38
|
}
|
|
49
|
-
|
|
50
|
-
await
|
|
39
|
+
try {
|
|
40
|
+
return await super.request(url, { ...options, headers });
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error && typeof error === 'object' && 'status' in error) {
|
|
44
|
+
const networkError = error;
|
|
45
|
+
if (networkError.status === 401) {
|
|
46
|
+
const freshToken = await getAuthToken(true);
|
|
47
|
+
if (freshToken) {
|
|
48
|
+
try {
|
|
49
|
+
return await super.request(url, {
|
|
50
|
+
...options,
|
|
51
|
+
headers: {
|
|
52
|
+
...options.headers,
|
|
53
|
+
Authorization: `Bearer ${freshToken}`,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (retryError) {
|
|
58
|
+
if (retryError &&
|
|
59
|
+
typeof retryError === 'object' &&
|
|
60
|
+
'status' in retryError &&
|
|
61
|
+
retryError.status === 401) {
|
|
62
|
+
await logoutUser(this.serviceOptions?.onLogout);
|
|
63
|
+
}
|
|
64
|
+
throw retryError;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
this.serviceOptions?.onTokenRefreshFailed?.(new Error('Failed to refresh token'));
|
|
68
|
+
await logoutUser(this.serviceOptions?.onLogout);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
51
72
|
}
|
|
52
|
-
return response;
|
|
53
73
|
}
|
|
54
74
|
}
|
|
55
75
|
//# sourceMappingURL=FirebaseAuthNetworkService.rn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirebaseAuthNetworkService.rn.js","sourceRoot":"","sources":["../../src/network/FirebaseAuthNetworkService.rn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FirebaseAuthNetworkService.rn.js","sourceRoot":"","sources":["../../src/network/FirebaseAuthNetworkService.rn.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { NetworkClient } from '@sudobility/types';
|
|
2
|
-
import type { FirebaseAuthNetworkClientOptions } from '../config/types';
|
|
3
|
-
export declare function invalidateTokenCache(): void;
|
|
4
|
-
export declare function createFirebaseAuthNetworkClient(platformNetwork?: {
|
|
5
|
-
request: (url: string, options?: RequestInit) => Promise<Response>;
|
|
6
|
-
}, options?: FirebaseAuthNetworkClientOptions): NetworkClient;
|
|
7
|
-
export declare function useFirebaseAuthNetworkClient(options?: FirebaseAuthNetworkClientOptions): NetworkClient;
|
|
8
|
-
//# sourceMappingURL=useFirebaseAuthNetworkClient.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFirebaseAuthNetworkClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useFirebaseAuthNetworkClient.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,aAAa,EAId,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iBAAiB,CAAC;AAYxE,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAqDD,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,CAkKf;AAQD,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,gCAAgC,GACzC,aAAa,CAKf"}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
2
|
-
import { getNetworkService } from '@sudobility/di';
|
|
3
|
-
import { firebaseSignOut, getFirebaseAuth } from '../config/firebase-init';
|
|
4
|
-
const TOKEN_CACHE_TTL = 5 * 60 * 1000;
|
|
5
|
-
let cachedToken = null;
|
|
6
|
-
let cacheExpiry = 0;
|
|
7
|
-
export function invalidateTokenCache() {
|
|
8
|
-
cachedToken = null;
|
|
9
|
-
cacheExpiry = 0;
|
|
10
|
-
}
|
|
11
|
-
async function getAuthToken(forceRefresh = false) {
|
|
12
|
-
const auth = getFirebaseAuth();
|
|
13
|
-
const user = auth?.currentUser;
|
|
14
|
-
if (!user)
|
|
15
|
-
return '';
|
|
16
|
-
if (!forceRefresh && cachedToken && Date.now() < cacheExpiry) {
|
|
17
|
-
return cachedToken;
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
const token = await user.getIdToken(forceRefresh);
|
|
21
|
-
cachedToken = token;
|
|
22
|
-
cacheExpiry = Date.now() + TOKEN_CACHE_TTL;
|
|
23
|
-
return token;
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
console.error('[useFirebaseAuthNetworkClient] Failed to get ID token:', err);
|
|
27
|
-
invalidateTokenCache();
|
|
28
|
-
return '';
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
async function logoutUser(onLogout) {
|
|
32
|
-
const auth = getFirebaseAuth();
|
|
33
|
-
if (!auth)
|
|
34
|
-
return;
|
|
35
|
-
try {
|
|
36
|
-
await firebaseSignOut(auth);
|
|
37
|
-
onLogout?.();
|
|
38
|
-
}
|
|
39
|
-
catch (err) {
|
|
40
|
-
console.error('[useFirebaseAuthNetworkClient] Failed to sign out:', err);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export function createFirebaseAuthNetworkClient(platformNetwork, options) {
|
|
44
|
-
const network = platformNetwork ?? getNetworkService();
|
|
45
|
-
const parseResponse = async (response) => {
|
|
46
|
-
let data;
|
|
47
|
-
const contentType = response.headers.get('content-type');
|
|
48
|
-
if (contentType?.includes('application/json')) {
|
|
49
|
-
try {
|
|
50
|
-
data = (await response.json());
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const headers = {};
|
|
56
|
-
response.headers.forEach((value, key) => {
|
|
57
|
-
headers[key] = value;
|
|
58
|
-
});
|
|
59
|
-
return {
|
|
60
|
-
ok: response.ok,
|
|
61
|
-
status: response.status,
|
|
62
|
-
statusText: response.statusText,
|
|
63
|
-
headers,
|
|
64
|
-
data,
|
|
65
|
-
success: response.ok,
|
|
66
|
-
timestamp: new Date().toISOString(),
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
const injectAuthToken = async (requestInit) => {
|
|
70
|
-
const headers = requestInit.headers ?? {};
|
|
71
|
-
if (!headers['Authorization']) {
|
|
72
|
-
const token = await getAuthToken(false);
|
|
73
|
-
if (token) {
|
|
74
|
-
return {
|
|
75
|
-
...requestInit,
|
|
76
|
-
headers: { ...headers, Authorization: `Bearer ${token}` },
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return requestInit;
|
|
81
|
-
};
|
|
82
|
-
const executeWithRetry = async (url, requestInit) => {
|
|
83
|
-
const authedInit = await injectAuthToken(requestInit);
|
|
84
|
-
const response = await network.request(url, authedInit);
|
|
85
|
-
if (response.status === 401) {
|
|
86
|
-
invalidateTokenCache();
|
|
87
|
-
const freshToken = await getAuthToken(true);
|
|
88
|
-
if (freshToken) {
|
|
89
|
-
const retryHeaders = {
|
|
90
|
-
...requestInit.headers,
|
|
91
|
-
Authorization: `Bearer ${freshToken}`,
|
|
92
|
-
};
|
|
93
|
-
const retryResponse = await network.request(url, {
|
|
94
|
-
...requestInit,
|
|
95
|
-
headers: retryHeaders,
|
|
96
|
-
});
|
|
97
|
-
return parseResponse(retryResponse);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
options?.onTokenRefreshFailed?.(new Error('Failed to refresh token'));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
if (response.status === 403) {
|
|
104
|
-
console.warn('[useFirebaseAuthNetworkClient] 403 Forbidden - logging user out');
|
|
105
|
-
await logoutUser(options?.onLogout);
|
|
106
|
-
}
|
|
107
|
-
return parseResponse(response);
|
|
108
|
-
};
|
|
109
|
-
return {
|
|
110
|
-
async request(url, reqOptions) {
|
|
111
|
-
const requestInit = {
|
|
112
|
-
method: reqOptions?.method ?? 'GET',
|
|
113
|
-
};
|
|
114
|
-
if (reqOptions?.headers)
|
|
115
|
-
requestInit.headers = reqOptions.headers;
|
|
116
|
-
if (reqOptions?.body)
|
|
117
|
-
requestInit.body = reqOptions.body;
|
|
118
|
-
if (reqOptions?.signal)
|
|
119
|
-
requestInit.signal = reqOptions.signal;
|
|
120
|
-
return executeWithRetry(url, requestInit);
|
|
121
|
-
},
|
|
122
|
-
async get(url, reqOptions) {
|
|
123
|
-
const requestInit = {
|
|
124
|
-
method: 'GET',
|
|
125
|
-
};
|
|
126
|
-
if (reqOptions?.headers)
|
|
127
|
-
requestInit.headers = reqOptions.headers;
|
|
128
|
-
if (reqOptions?.signal)
|
|
129
|
-
requestInit.signal = reqOptions.signal;
|
|
130
|
-
return executeWithRetry(url, requestInit);
|
|
131
|
-
},
|
|
132
|
-
async post(url, body, reqOptions) {
|
|
133
|
-
const requestInit = {
|
|
134
|
-
method: 'POST',
|
|
135
|
-
};
|
|
136
|
-
if (reqOptions?.headers)
|
|
137
|
-
requestInit.headers = reqOptions.headers;
|
|
138
|
-
if (body)
|
|
139
|
-
requestInit.body = JSON.stringify(body);
|
|
140
|
-
if (reqOptions?.signal)
|
|
141
|
-
requestInit.signal = reqOptions.signal;
|
|
142
|
-
return executeWithRetry(url, requestInit);
|
|
143
|
-
},
|
|
144
|
-
async put(url, body, reqOptions) {
|
|
145
|
-
const requestInit = {
|
|
146
|
-
method: 'PUT',
|
|
147
|
-
};
|
|
148
|
-
if (reqOptions?.headers)
|
|
149
|
-
requestInit.headers = reqOptions.headers;
|
|
150
|
-
if (body)
|
|
151
|
-
requestInit.body = JSON.stringify(body);
|
|
152
|
-
if (reqOptions?.signal)
|
|
153
|
-
requestInit.signal = reqOptions.signal;
|
|
154
|
-
return executeWithRetry(url, requestInit);
|
|
155
|
-
},
|
|
156
|
-
async delete(url, reqOptions) {
|
|
157
|
-
const requestInit = {
|
|
158
|
-
method: 'DELETE',
|
|
159
|
-
};
|
|
160
|
-
if (reqOptions?.headers)
|
|
161
|
-
requestInit.headers = reqOptions.headers;
|
|
162
|
-
if (reqOptions?.signal)
|
|
163
|
-
requestInit.signal = reqOptions.signal;
|
|
164
|
-
return executeWithRetry(url, requestInit);
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
export function useFirebaseAuthNetworkClient(options) {
|
|
169
|
-
return useMemo(() => createFirebaseAuthNetworkClient(undefined, options), [options]);
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=useFirebaseAuthNetworkClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFirebaseAuthNetworkClient.js","sourceRoot":"","sources":["../../src/hooks/useFirebaseAuthNetworkClient.ts"],"names":[],"mappings":"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"}
|