Skip to content

Commit 70591cc

Browse files
committed
Migrating to pendingUntilEvent
1 parent 3609a4b commit 70591cc

File tree

18 files changed

+64
-189
lines changed

18 files changed

+64
-189
lines changed

samples/advanced/src/app/app-check/app-check.component.ts

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/advanced/src/app/storage/storage.component.ts

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/advanced/src/app/upboats/lazyFirestore.ts

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/modular/src/app/app-check/app-check.component.ts

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/modular/src/app/storage/storage.component.ts

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/compat/angularfire2.spec.ts

Lines changed: 2 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import { CompilerFactory, DoBootstrap, NgModule, NgZone, PendingTasks, PlatformRef } from '@angular/core';
1+
import { CompilerFactory, DoBootstrap, NgModule, PlatformRef } from '@angular/core';
22
import { TestBed } from '@angular/core/testing';
3-
import { ɵAngularFireSchedulers, ɵZoneScheduler, ɵkeepUnstableUntilFirstFactory } from '@angular/fire';
3+
import { ɵZoneScheduler } from '@angular/fire';
44
import { AngularFireModule, FirebaseApp } from '@angular/fire/compat';
55
import { BrowserModule } from '@angular/platform-browser';
6-
import { Observable, Subject, of } from 'rxjs';
7-
import { tap } from 'rxjs/operators';
86
import { TestScheduler } from 'rxjs/testing';
97
import { COMMON_CONFIG } from '../../src/test-config';
108
import { rando } from '../../src/utils';
@@ -85,112 +83,6 @@ describe('angularfire', () => {
8583
});
8684
});
8785

88-
describe('keepUnstableUntilFirstFactory', () => {
89-
let schedulers: ɵAngularFireSchedulers;
90-
let outsideZone: Zone;
91-
let insideZone: Zone;
92-
beforeEach(() => {
93-
outsideZone = Zone.current;
94-
insideZone = Zone.current.fork({
95-
name: 'ngZone'
96-
});
97-
const ngZone = {
98-
run: insideZone.run.bind(insideZone),
99-
runGuarded: insideZone.runGuarded.bind(insideZone),
100-
runOutsideAngular: outsideZone.runGuarded.bind(outsideZone),
101-
runTask: insideZone.run.bind(insideZone)
102-
} as NgZone;
103-
schedulers = new ɵAngularFireSchedulers(ngZone, TestBed.inject(PendingTasks));
104-
});
105-
106-
it('should re-schedule emissions asynchronously', done => {
107-
const keepUnstableOp = ɵkeepUnstableUntilFirstFactory(schedulers);
108-
109-
let ran = false;
110-
of(null).pipe(
111-
keepUnstableOp,
112-
tap(() => ran = true)
113-
).subscribe(() => {
114-
expect(ran).toEqual(true);
115-
done();
116-
}, () => fail('Should not error'));
117-
118-
expect(ran).toEqual(false);
119-
});
120-
121-
it(`should subscribe outside angular and observe inside angular`, done => {
122-
123-
const keepUnstableOp = ɵkeepUnstableUntilFirstFactory(schedulers);
124-
125-
insideZone.run(() => {
126-
new Observable(s => {
127-
expect(Zone.current).toEqual(outsideZone);
128-
s.next('test');
129-
}).pipe(
130-
keepUnstableOp,
131-
tap(() => {
132-
expect(Zone.current).toEqual(insideZone);
133-
})
134-
).subscribe(() => {
135-
expect(Zone.current).toEqual(insideZone);
136-
done();
137-
}, err => {
138-
fail(err);
139-
});
140-
});
141-
142-
});
143-
144-
// TODO(davideast): new Zone['TaskTrackingZoneSpec'](); no longer works
145-
xit('should block until first emission', done => {
146-
const testScheduler = new TestScheduler(null);
147-
testScheduler.run(helpers => {
148-
const outsideZone = Zone.current;
149-
// eslint-disable-next-line @typescript-eslint/dot-notation
150-
const taskTrack = new Zone['TaskTrackingZoneSpec']();
151-
const insideZone = Zone.current.fork(taskTrack);
152-
const trackingSchedulers: ɵAngularFireSchedulers = {
153-
ngZone: {
154-
run: insideZone.run.bind(insideZone),
155-
runGuarded: insideZone.runGuarded.bind(insideZone),
156-
runOutsideAngular: outsideZone.runGuarded.bind(outsideZone),
157-
runTask: insideZone.run.bind(insideZone)
158-
} as NgZone,
159-
outsideAngular: new ɵZoneScheduler(outsideZone, testScheduler),
160-
insideAngular: new ɵZoneScheduler(insideZone, testScheduler),
161-
pendingTasks: TestBed.inject(PendingTasks),
162-
};
163-
const keepUnstableOp = ɵkeepUnstableUntilFirstFactory(trackingSchedulers);
164-
165-
const s = new Subject();
166-
s.pipe(
167-
keepUnstableOp
168-
).subscribe(() => undefined, err => {
169-
fail(err);
170-
}, () => undefined);
171-
172-
// Flush to ensure all async scheduled functions are run
173-
helpers.flush();
174-
// Should now be blocked until first item arrives
175-
expect(taskTrack.macroTasks.length).toBe(1);
176-
expect(taskTrack.macroTasks[0].source).toBe('firebaseZoneBlock');
177-
178-
// Emit next item
179-
s.next(123);
180-
helpers.flush();
181-
182-
// TODO drop this, it's to work around my 15ms timeout hack
183-
setTimeout(() => {
184-
// Should not be blocked after first item
185-
expect(taskTrack.macroTasks.length).toBe(0);
186-
done();
187-
}, 150);
188-
189-
});
190-
});
191-
192-
});
193-
19486
describe('FirebaseApp', () => {
19587

19688
it('should provide a FirebaseApp for the FirebaseApp binding', () => {

src/compat/auth/auth.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { isPlatformServer } from '@angular/common';
22
import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core';
3-
import { keepUnstableUntilFirst, ɵAngularFireSchedulers } from '@angular/fire';
3+
import { pendingUntilEvent } from '@angular/core/rxjs-interop';
4+
import { ɵAngularFireSchedulers } from '@angular/fire';
45
import { AppCheckInstances } from '@angular/fire/app-check';
56
import { ɵPromiseProxy, ɵapplyMixins, ɵlazySDKProxy } from '@angular/fire/compat';
67
import { FIREBASE_APP_NAME, FIREBASE_OPTIONS, FirebaseApp, ɵcacheInstance, ɵfirebaseAppFactory } from '@angular/fire/compat';
@@ -121,7 +122,7 @@ export class AngularFireAuth {
121122

122123
const redirectResult = auth.pipe(
123124
switchMap(auth => auth.getRedirectResult().then(it => it, () => null)),
124-
keepUnstableUntilFirst,
125+
pendingUntilEvent(),
125126
shareReplay({ bufferSize: 1, refCount: false }),
126127
);
127128

src/compat/database/database.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NgZone, PendingTasks } from '@angular/core';
1+
import { NgZone } from '@angular/core';
22
import { TestBed } from '@angular/core/testing';
33
import { ɵAngularFireSchedulers } from '@angular/fire';
44
import { AngularFireModule, FIREBASE_APP_NAME, FIREBASE_OPTIONS, FirebaseApp } from '@angular/fire/compat';
@@ -41,7 +41,7 @@ describe('AngularFireDatabase', () => {
4141
});
4242

4343
it('should accept a Firebase App in the constructor', (done) => {
44-
const schedulers = new ɵAngularFireSchedulers(zone, TestBed.inject(PendingTasks));
44+
const schedulers = new ɵAngularFireSchedulers();
4545
const database = new AngularFireDatabase(
4646
app.options, rando(), undefined, {}, zone, schedulers, undefined, undefined,
4747
undefined, undefined, undefined, undefined, undefined, undefined, undefined,

src/compat/database/database.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core';
1+
import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID, inject } from '@angular/core';
22
import { ɵAngularFireSchedulers } from '@angular/fire';
33
import { AppCheckInstances } from '@angular/fire/app-check';
44
import { FIREBASE_APP_NAME, FIREBASE_OPTIONS, ɵcacheInstance, ɵfirebaseAppFactory } from '@angular/fire/compat';
@@ -68,7 +68,7 @@ export class AngularFireDatabase {
6868
}
6969

7070
list<T>(pathOrRef: PathReference, queryFn?: QueryFn): AngularFireList<T> {
71-
const ref = this.schedulers.ngZone.runOutsideAngular(() => getRef(this.database, pathOrRef));
71+
const ref = inject(NgZone).runOutsideAngular(() => getRef(this.database, pathOrRef));
7272
let query: DatabaseQuery = ref;
7373
if (queryFn) {
7474
query = queryFn(ref);
@@ -77,12 +77,12 @@ export class AngularFireDatabase {
7777
}
7878

7979
object<T>(pathOrRef: PathReference): AngularFireObject<T> {
80-
const ref = this.schedulers.ngZone.runOutsideAngular(() => getRef(this.database, pathOrRef));
80+
const ref = inject(NgZone).runOutsideAngular(() => getRef(this.database, pathOrRef));
8181
return createObjectReference<T>(ref, this);
8282
}
8383

8484
createPushId() {
85-
const ref = this.schedulers.ngZone.runOutsideAngular(() => this.database.ref());
85+
const ref = inject(NgZone).runOutsideAngular(() => this.database.ref());
8686
return ref.push().key;
8787
}
8888

src/compat/database/list/create-reference.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { keepUnstableUntilFirst } from '@angular/fire';
1+
import { NgZone, inject } from '@angular/core';
2+
import { pendingUntilEvent } from '@angular/core/rxjs-interop';
23
import type { Observable } from 'rxjs';
34
import { map } from 'rxjs/operators';
45
import { AngularFireDatabase } from '../database';
@@ -11,21 +12,21 @@ import { stateChanges } from './state-changes';
1112

1213
export function createListReference<T= any>(query: DatabaseQuery, afDatabase: AngularFireDatabase): AngularFireList<T> {
1314
const outsideAngularScheduler = afDatabase.schedulers.outsideAngular;
14-
const refInZone = afDatabase.schedulers.ngZone.run(() => query.ref);
15+
const refInZone = inject(NgZone).run(() => query.ref);
1516
return {
1617
query,
1718
update: createDataOperationMethod(refInZone, 'update'),
1819
set: createDataOperationMethod(refInZone, 'set'),
1920
push: (data: T) => refInZone.push(data),
2021
remove: createRemoveMethod(refInZone),
2122
snapshotChanges(events?: ChildEvent[]) {
22-
return snapshotChanges<T>(query, events, outsideAngularScheduler).pipe(keepUnstableUntilFirst);
23+
return snapshotChanges<T>(query, events, outsideAngularScheduler).pipe(pendingUntilEvent());
2324
},
2425
stateChanges(events?: ChildEvent[]) {
25-
return stateChanges<T>(query, events, outsideAngularScheduler).pipe(keepUnstableUntilFirst);
26+
return stateChanges<T>(query, events, outsideAngularScheduler).pipe(pendingUntilEvent());
2627
},
2728
auditTrail(events?: ChildEvent[]) {
28-
return auditTrail<T>(query, events, outsideAngularScheduler).pipe(keepUnstableUntilFirst);
29+
return auditTrail<T>(query, events, outsideAngularScheduler).pipe(pendingUntilEvent());
2930
},
3031
valueChanges<K extends string>(events?: ChildEvent[], options?: {idField?: K}): Observable<(T & Record<string, string>)[]> {
3132
const snapshotChanges$ = snapshotChanges<T>(query, events, outsideAngularScheduler);
@@ -42,7 +43,7 @@ export function createListReference<T= any>(query: DatabaseQuery, afDatabase: An
4243
return a.payload.val() as T & Record<string, string>
4344
}
4445
})),
45-
keepUnstableUntilFirst
46+
pendingUntilEvent()
4647
);
4748
}
4849
};

0 commit comments

Comments
 (0)