Skip to content

Commit 4d1712d

Browse files
Add terminate() and snapshotEqual() to firestore-exp (#3313)
1 parent 32d91c0 commit 4d1712d

File tree

4 files changed

+57
-8
lines changed

4 files changed

+57
-8
lines changed

.changeset/many-lamps-bake.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

packages/firestore/exp/index.node.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,15 @@ export { FieldPath, documentId } from '../lite/src/api/field_path';
2525
export {
2626
Firestore,
2727
initializeFirestore,
28-
getFirestore
28+
getFirestore,
29+
terminate
2930
} from './src/api/database';
3031

31-
export { DocumentSnapshot, QueryDocumentSnapshot } from './src/api/snapshot';
32+
export {
33+
DocumentSnapshot,
34+
QueryDocumentSnapshot,
35+
snapshotEqual
36+
} from './src/api/snapshot';
3237

3338
export { SnapshotMetadata } from '../src/api/database';
3439

packages/firestore/exp/src/api/database.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import * as firestore from '../../index';
1919

20-
import { _getProvider } from '@firebase/app-exp';
20+
import { _getProvider, _removeServiceInstance } from '@firebase/app-exp';
2121
import { FirebaseApp, _FirebaseService } from '@firebase/app-types-exp';
2222
import { Provider } from '@firebase/component';
2323

@@ -30,6 +30,7 @@ import {
3030
} from '../../../src/core/component_provider';
3131

3232
import { Firestore as LiteFirestore } from '../../../lite/src/api/database';
33+
import { cast } from '../../../lite/src/api/util';
3334

3435
/**
3536
* The root reference to the Firestore database and the entry point for the
@@ -86,8 +87,8 @@ export class Firestore extends LiteFirestore
8687
return this._firestoreClientPromise;
8788
}
8889

89-
async delete(): Promise<void> {
90-
// TODO(firestoreexp): Call terminate() once implemented
90+
delete(): Promise<void> {
91+
return terminate(this);
9192
}
9293
}
9394

@@ -106,3 +107,13 @@ export function initializeFirestore(
106107
export function getFirestore(app: FirebaseApp): Firestore {
107108
return _getProvider(app, 'firestore-exp').getImmediate() as Firestore;
108109
}
110+
111+
export function terminate(
112+
firestore: firestore.FirebaseFirestore
113+
): Promise<void> {
114+
_removeServiceInstance(firestore.app, 'firestore/lite');
115+
const firestoreImpl = cast(firestore, Firestore);
116+
return firestoreImpl
117+
._getFirestoreClient()
118+
.then(firestoreClient => firestoreClient.terminate());
119+
}

packages/firestore/exp/src/api/snapshot.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ import {
2929
} from '../../../lite/src/api/snapshot';
3030
import { Firestore } from './database';
3131
import { cast } from '../../../lite/src/api/util';
32-
import { DocumentReference, Query } from '../../../lite/src/api/reference';
32+
import {
33+
DocumentReference,
34+
Query,
35+
queryEqual
36+
} from '../../../lite/src/api/reference';
3337
import {
3438
changesFromSnapshot,
3539
SnapshotMetadata
@@ -121,9 +125,9 @@ export class QuerySnapshot<T = firestore.DocumentData>
121125
private _cachedChangesIncludeMetadataChanges?: boolean;
122126

123127
constructor(
124-
private readonly _firestore: Firestore,
128+
readonly _firestore: Firestore,
125129
readonly query: Query<T>,
126-
private readonly _snapshot: ViewSnapshot,
130+
readonly _snapshot: ViewSnapshot,
127131
readonly metadata: SnapshotMetadata
128132
) {}
129133

@@ -199,3 +203,30 @@ export class QuerySnapshot<T = firestore.DocumentData>
199203
);
200204
}
201205
}
206+
207+
// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot
208+
// metadata
209+
export function snapshotEqual<T>(
210+
left: firestore.DocumentSnapshot<T> | firestore.QuerySnapshot<T>,
211+
right: firestore.DocumentSnapshot<T> | firestore.QuerySnapshot<T>
212+
): boolean {
213+
if (left instanceof DocumentSnapshot && right instanceof DocumentSnapshot) {
214+
return (
215+
left._firestore === right._firestore &&
216+
left._key.isEqual(right._key) &&
217+
(left._document === null
218+
? right._document === null
219+
: left._document.isEqual(right._document)) &&
220+
left._converter === right._converter
221+
);
222+
} else if (left instanceof QuerySnapshot && right instanceof QuerySnapshot) {
223+
return (
224+
left._firestore === right._firestore &&
225+
queryEqual(left.query, right.query) &&
226+
left.metadata.isEqual(right.metadata) &&
227+
left._snapshot.isEqual(right._snapshot)
228+
);
229+
}
230+
231+
return false;
232+
}

0 commit comments

Comments
 (0)