@@ -2,66 +2,47 @@ import * as firebase from 'firebase/app';
22import  'firebase/auth' ; 
33import  {  Injectable ,  NgZone  }  from  '@angular/core' ; 
44import  {  Observable  }  from  'rxjs/Observable' ; 
5- import  {  Observer  }  from  'rxjs/Observer' ; 
65import  {  observeOn  }  from  'rxjs/operator/observeOn' ; 
76import  {  FirebaseApp ,  ZoneScheduler  }  from  'angularfire2' ; 
87
9- export  type  Auth  =  firebase . auth . Auth ; 
8+ import  'rxjs/add/operator/switchMap' ; 
9+ import  'rxjs/add/observable/of' ; 
10+ import  'rxjs/add/observable/fromPromise' ; 
1011
1112@Injectable ( ) 
1213export  class  AngularFireAuth  { 
1314
1415  /** 
1516   * Firebase Auth instance 
1617   */ 
17-   auth : firebase . auth . Auth ; 
18+   public   readonly   auth : firebase . auth . Auth ; 
1819
1920  /** 
2021   * Observable of authentication state; as of 4.0 this is only triggered via sign-in/out 
2122   */ 
22-   authState : Observable < firebase . User > ; 
23+   public   readonly   authState : Observable < firebase . User | null > ; 
2324
2425  /** 
2526   * Observable of the signed-in user's ID token; which includes sign-in, sign-out, and token refresh events 
2627   */ 
27-   idToken : Observable < firebase . User > ; 
28+   public   readonly   idToken : Observable < string | null > ; 
2829
2930  constructor ( public  app : FirebaseApp )  { 
30-     this . authState  =  FirebaseAuthStateObservable ( app ) ; 
31-     this . idToken  =  FirebaseIdTokenObservable ( app ) ; 
3231    this . auth  =  app . auth ( ) ; 
33-   } 
34- 
35- } 
3632
37- /** 
38-  * Create an Observable of Firebase authentication state. Each event is called 
39-  * within the current zone. 
40-  * @param  app - Firebase App instance 
41-  */ 
42- export  function  FirebaseAuthStateObservable ( app : FirebaseApp ) : Observable < firebase . User >  { 
43-   const  authState  =  Observable . create ( ( observer : Observer < firebase . User > )  =>  { 
44-     app . auth ( ) . onAuthStateChanged ( 
45-       ( user : firebase . User )  =>  observer . next ( user ! ) , 
46-       ( error : firebase . auth . Error )  =>  observer . error ( error ) , 
47-       ( )  =>  {  observer . complete ( ) ;  return  undefined ;  } 
48-     ) ; 
49-   } ) ; 
50-   return  observeOn . call ( authState ,  new  ZoneScheduler ( Zone . current ) ) ; 
51- } 
33+     const  authState$  =  new  Observable ( subscriber  =>  { 
34+       const  unsubscribe  =  this . auth . onAuthStateChanged ( subscriber ) ; 
35+       return  {  unsubscribe } ; 
36+     } ) ; 
37+     this . authState  =  observeOn . call ( authState$ ,  new  ZoneScheduler ( Zone . current ) ) ; 
38+ 
39+     const  idToken$  =  new  Observable < firebase . User | null > ( subscriber  =>  { 
40+       const  unsubscribe  =  this . auth . onIdTokenChanged ( subscriber ) ; 
41+       return  {  unsubscribe } ; 
42+     } ) . switchMap ( user  =>  { 
43+       return  user  ? Observable . fromPromise ( user . getIdToken ( ) )  : Observable . of ( null ) 
44+     } ) ; 
45+     this . idToken  =  observeOn . call ( idToken$ ,  new  ZoneScheduler ( Zone . current ) ) ; 
46+   } 
5247
53- /** 
54-  * Create an Observable of Firebase ID token. Each event is called 
55-  * within the current zone. 
56-  * @param  app - Firebase App instance 
57-  */ 
58- export  function  FirebaseIdTokenObservable ( app : FirebaseApp ) : Observable < firebase . User >  { 
59-   const  idToken  =  Observable . create ( ( observer : Observer < firebase . User > )  =>  { 
60-     app . auth ( ) . onIdTokenChanged ( 
61-       ( user : firebase . User )  =>  observer . next ( user ! ) , 
62-       ( error : firebase . auth . Error )  =>  observer . error ( error ) , 
63-       ( )  =>  {  observer . complete ( ) ;  return  undefined ;  } 
64-     ) 
65-   } ) ; 
66-   return  observeOn . call ( idToken ,  new  ZoneScheduler ( Zone . current ) ) ; 
67- } 
48+ } 
0 commit comments