Skip to content

Commit 9642f58

Browse files
jamesdanielsdavideast
authored andcommitted
chore(sdk): Update to Firebase JS SDK 4.0 (breaking changes) (#996)
chore(sdk): Update to Firebase JS SDK 4.0 (breaking changes)
1 parent fdf213e commit 9642f58

File tree

5 files changed

+388
-1321
lines changed

5 files changed

+388
-1321
lines changed

docs/version-4-upgrade.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ constructor(db: AngularFireDatabase, afAuth: AngularFireAuth) {
3030

3131
### Simplified Authentication API
3232

33-
In 4.0 we've reduced the complexity of the auth module by providing only a [`firebase.User`](https://firebase.google.com/docs/reference/js/firebase.User) observer (`AngularFireAuth.authState`) and cutting the methods that were wrapping the Firebase SDK.
33+
In 4.0 we've reduced the complexity of the auth module by providing only [`firebase.User`](https://firebase.google.com/docs/reference/js/firebase.User) observers (`AngularFireAuth.authState`, `AngularFireAuth.idToken`) and cutting the methods that were wrapping the Firebase SDK.
34+
3435

3536
```typescript
3637
import { AngularFireAuth } from 'angularfire2/auth';
@@ -40,7 +41,7 @@ import * as firebase from 'firebase/app';
4041

4142
user: Observable<firebase.User>;
4243
constructor(afAuth: AngularFireAuth) {
43-
this.user = afAuth.authState;
44+
this.user = afAuth.authState; // only triggered on sign-in/out (for old behavior use .idToken)
4445
}
4546
```
4647

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"@angular/core": "^4.0.0",
4141
"@angular/platform-browser": "^4.0.0",
4242
"@angular/platform-browser-dynamic": "^4.0.0",
43-
"firebase": "^3.6.6",
43+
"firebase": "^4.0.0",
4444
"rxjs": "^5.0.1"
4545
},
4646
"devDependencies": {

src/auth/auth.spec.ts

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,9 @@ const firebaseUser = <firebase.User> {
2727

2828
describe('AngularFireAuth', () => {
2929
let app: firebase.app.App;
30-
let authData: any;
31-
let authCb: any;
3230
let afAuth: AngularFireAuth;
3331
let authSpy: jasmine.Spy;
3432
let mockAuthState: Subject<firebase.User>;
35-
let fbAuthObserver: Observer<firebase.User>;
36-
let windowLocation: any;
3733

3834
beforeEach(() => {
3935
TestBed.configureTestingModule({
@@ -45,13 +41,13 @@ describe('AngularFireAuth', () => {
4541
inject([FirebaseApp, AngularFireAuth], (app_: FirebaseApp, _auth: AngularFireAuth) => {
4642
app = app_;
4743
afAuth = _auth;
48-
authData = null;
49-
authCb = null;
5044
})();
5145

5246
mockAuthState = new Subject<firebase.User>();
5347
spyOn(afAuth, 'authState').and.returnValue(mockAuthState);
48+
spyOn(afAuth, 'idToken').and.returnValue(mockAuthState);
5449
afAuth.authState = mockAuthState;
50+
afAuth.idToken = mockAuthState;
5551
});
5652

5753
afterEach(done => {
@@ -65,12 +61,18 @@ describe('AngularFireAuth', () => {
6561
name: 'ngZone'
6662
});
6763
ngZone.run(() => {
68-
const subs = afAuth.authState.subscribe(user => {
69-
expect(Zone.current.name).toBe('ngZone');
70-
done();
71-
}, done.fail);
64+
const subs = [
65+
afAuth.authState.subscribe(user => {
66+
expect(Zone.current.name).toBe('ngZone');
67+
done();
68+
}, done.fail),
69+
afAuth.authState.subscribe(user => {
70+
expect(Zone.current.name).toBe('ngZone');
71+
done();
72+
}, done.fail)
73+
];
7274
mockAuthState.next(firebaseUser);
73-
subs.unsubscribe();
75+
subs.forEach(s => s.unsubscribe());
7476
});
7577
});
7678
});
@@ -88,6 +90,27 @@ describe('AngularFireAuth', () => {
8890

8991
// Check that the first value is null and second is the auth user
9092
const subs = afAuth.authState.subscribe(user => {
93+
console.log('What...', count, user);
94+
if (count === 0) {
95+
expect(user).toBe(null);
96+
count = count + 1;
97+
mockAuthState.next(firebaseUser);
98+
} else {
99+
expect(user).toEqual(firebaseUser);
100+
subs.unsubscribe();
101+
done();
102+
}
103+
}, done, done.fail);
104+
console.log('....!?');
105+
mockAuthState.next(null);
106+
});
107+
108+
it('should emit auth updates through idToken', (done: any) => {
109+
let count = 0;
110+
111+
// Check that the first value is null and second is the auth user
112+
const subs = afAuth.idToken.subscribe(user => {
113+
console.log("HI!....", count, user);
91114
if (count === 0) {
92115
expect(user).toBe(null);
93116
count = count + 1;

src/auth/auth.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,18 @@ export class AngularFireAuth {
1717
auth: firebase.auth.Auth;
1818

1919
/**
20-
* Observable of authentication state
20+
* Observable of authentication state; as of 4.0 this is only triggered via sign-in/out
2121
*/
2222
authState: Observable<firebase.User>;
2323

24+
/**
25+
* Observable of the signed-in user's ID token; which includes sign-in, sign-out, and token refresh events
26+
*/
27+
idToken: Observable<firebase.User>;
28+
2429
constructor(public app: FirebaseApp) {
2530
this.authState = FirebaseAuthStateObservable(app);
31+
this.idToken = FirebaseIdTokenObservable(app);
2632
this.auth = app.auth();
2733
}
2834

@@ -43,3 +49,19 @@ export function FirebaseAuthStateObservable(app: FirebaseApp): Observable<fireba
4349
});
4450
return observeOn.call(authState, new utils.ZoneScheduler(Zone.current));
4551
}
52+
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()
64+
)
65+
});
66+
return observeOn.call(idToken, new utils.ZoneScheduler(Zone.current));
67+
}

0 commit comments

Comments
 (0)