@@ -2,66 +2,47 @@ import * as firebase from 'firebase/app';
2
2
import 'firebase/auth' ;
3
3
import { Injectable , NgZone } from '@angular/core' ;
4
4
import { Observable } from 'rxjs/Observable' ;
5
- import { Observer } from 'rxjs/Observer' ;
6
5
import { observeOn } from 'rxjs/operator/observeOn' ;
7
6
import { FirebaseApp , ZoneScheduler } from 'angularfire2' ;
8
7
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' ;
10
11
11
12
@Injectable ( )
12
13
export class AngularFireAuth {
13
14
14
15
/**
15
16
* Firebase Auth instance
16
17
*/
17
- auth : firebase . auth . Auth ;
18
+ public readonly auth : firebase . auth . Auth ;
18
19
19
20
/**
20
21
* Observable of authentication state; as of 4.0 this is only triggered via sign-in/out
21
22
*/
22
- authState : Observable < firebase . User > ;
23
+ public readonly authState : Observable < firebase . User | null > ;
23
24
24
25
/**
25
26
* Observable of the signed-in user's ID token; which includes sign-in, sign-out, and token refresh events
26
27
*/
27
- idToken : Observable < firebase . User > ;
28
+ public readonly idToken : Observable < string | null > ;
28
29
29
30
constructor ( public app : FirebaseApp ) {
30
- this . authState = FirebaseAuthStateObservable ( app ) ;
31
- this . idToken = FirebaseIdTokenObservable ( app ) ;
32
31
this . auth = app . auth ( ) ;
33
- }
34
-
35
- }
36
32
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
+ }
52
47
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