Skip to content

Commit 8ab3803

Browse files
jamesdanielsdavideast
authored andcommitted
fix(auth): Clean up the authentication module
1 parent bb43189 commit 8ab3803

File tree

2 files changed

+24
-40
lines changed

2 files changed

+24
-40
lines changed

src/auth/auth.ts

+21-40
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,47 @@ import * as firebase from 'firebase/app';
22
import 'firebase/auth';
33
import { Injectable, NgZone } from '@angular/core';
44
import { Observable } from 'rxjs/Observable';
5-
import { Observer } from 'rxjs/Observer';
65
import { observeOn } from 'rxjs/operator/observeOn';
76
import { 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()
1213
export 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+
}

tools/build.js

+3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ const GLOBALS = {
3737
'rxjs/add/operator/skipUntil': 'Rx.Observable.prototype',
3838
'rxjs/add/operator/skipWhile': 'Rx.Observable.prototype',
3939
'rxjs/add/operator/withLatestFrom': 'Rx.Observable.prototype',
40+
'rxjs/add/operator/switchMap': 'Rx.Observable.prototype',
4041
'rxjs/add/observable/merge': 'Rx.Observable',
42+
'rxjs/add/observable/of': 'Rx.Observable.prototype',
43+
'rxjs/add/observable/fromPromise': 'Rx.Observable.prototype',
4144
'rxjs/add/operator/delay': 'Rx.Observable',
4245
'rxjs/add/operator/debounce': 'Rx.Observable',
4346
'rxjs/observable/fromEvent': 'Rx.Observable',

0 commit comments

Comments
 (0)