@@ -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