1515 * limitations under the License.
1616 */
1717
18- import { _assert , AuthErrorCode , Auth } from '@firebase/auth-exp/internal' ;
18+ import { AuthInternal } from '@firebase/auth-exp/dist/esm5/src/model/auth' ;
19+ import * as exp from '@firebase/auth-exp/internal' ;
1920import { isIndexedDBAvailable , isNode , isReactNative } from '@firebase/util' ;
2021import { _isWebStorageSupported , _isWorker } from './platform' ;
2122
@@ -25,26 +26,30 @@ export const Persistence = {
2526 SESSION : 'SESSION'
2627} ;
2728
29+ const _assert : typeof exp . _assert = exp . _assert ;
30+
31+ const PERSISTENCE_KEY = 'persistence' ;
32+
2833/**
2934 * Validates that an argument is a valid persistence value. If an invalid type
3035 * is specified, an error is thrown synchronously.
3136 */
3237export function _validatePersistenceArgument (
33- auth : Auth ,
38+ auth : exp . Auth ,
3439 persistence : string
3540) : void {
3641 _assert (
3742 Object . values ( Persistence ) . includes ( persistence ) ,
3843 auth ,
39- AuthErrorCode . INVALID_PERSISTENCE
44+ exp . AuthErrorCode . INVALID_PERSISTENCE
4045 ) ;
4146 // Validate if the specified type is supported in the current environment.
4247 if ( isReactNative ( ) ) {
4348 // This is only supported in a browser.
4449 _assert (
4550 persistence !== Persistence . SESSION ,
4651 auth ,
47- AuthErrorCode . UNSUPPORTED_PERSISTENCE
52+ exp . AuthErrorCode . UNSUPPORTED_PERSISTENCE
4853 ) ;
4954 return ;
5055 }
@@ -53,7 +58,7 @@ export function _validatePersistenceArgument(
5358 _assert (
5459 persistence === Persistence . NONE ,
5560 auth ,
56- AuthErrorCode . UNSUPPORTED_PERSISTENCE
61+ exp . AuthErrorCode . UNSUPPORTED_PERSISTENCE
5762 ) ;
5863 return ;
5964 }
@@ -64,14 +69,63 @@ export function _validatePersistenceArgument(
6469 persistence === Persistence . NONE ||
6570 ( persistence === Persistence . LOCAL && isIndexedDBAvailable ( ) ) ,
6671 auth ,
67- AuthErrorCode . UNSUPPORTED_PERSISTENCE
72+ exp . AuthErrorCode . UNSUPPORTED_PERSISTENCE
6873 ) ;
6974 return ;
7075 }
7176 // This is restricted by what the browser supports.
7277 _assert (
7378 persistence === Persistence . NONE || _isWebStorageSupported ( ) ,
7479 auth ,
75- AuthErrorCode . UNSUPPORTED_PERSISTENCE
80+ exp . AuthErrorCode . UNSUPPORTED_PERSISTENCE
81+ ) ;
82+ }
83+
84+ export async function _savePersistenceForRedirect (
85+ auth : AuthInternal
86+ ) : Promise < void > {
87+ await auth . _initializationPromise ;
88+
89+ const win = getSelfWindow ( ) ;
90+ const key = exp . _persistenceKeyName (
91+ PERSISTENCE_KEY ,
92+ auth . config . apiKey ,
93+ auth . name
94+ ) ;
95+ if ( win ?. sessionStorage ) {
96+ win . sessionStorage . setItem ( key , auth . _getPersistence ( ) ) ;
97+ }
98+ }
99+
100+ export function _getPersistenceFromRedirect (
101+ auth : AuthInternal
102+ ) : exp . Persistence | null {
103+ const win = getSelfWindow ( ) ;
104+ if ( ! win ?. sessionStorage ) {
105+ return null ;
106+ }
107+
108+ const key = exp . _persistenceKeyName (
109+ PERSISTENCE_KEY ,
110+ auth . config . apiKey ,
111+ auth . name
76112 ) ;
113+ const persistence = win . sessionStorage . getItem ( key ) ;
114+
115+ switch ( persistence ) {
116+ case exp . inMemoryPersistence . type :
117+ return exp . inMemoryPersistence ;
118+ case exp . indexedDBLocalPersistence . type :
119+ return exp . indexedDBLocalPersistence ;
120+ case exp . browserSessionPersistence . type :
121+ return exp . browserSessionPersistence ;
122+ case exp . browserLocalPersistence . type :
123+ return exp . browserLocalPersistence ;
124+ default :
125+ return null ;
126+ }
127+ }
128+
129+ function getSelfWindow ( ) : Window | null {
130+ return typeof window !== 'undefined' ? window : null ;
77131}
0 commit comments