@@ -34,7 +34,8 @@ import {
34
34
firestoreClientListen ,
35
35
firestoreClientWrite
36
36
} from '../core/firestore_client' ;
37
- import { newQueryForPath , Query as InternalQuery } from '../core/query' ;
37
+ import { QueryOrPipeline , toCorePipeline } from '../core/pipeline-util' ;
38
+ import { newQueryForPath } from '../core/query' ;
38
39
import { ViewSnapshot } from '../core/view_snapshot' ;
39
40
import { FieldPath } from '../lite-api/field_path' ;
40
41
import { validateHasExplicitOrderByForLimitToLast } from '../lite-api/query' ;
@@ -63,7 +64,13 @@ import { FirestoreError } from '../util/error';
63
64
import { cast } from '../util/input_validation' ;
64
65
65
66
import { ensureFirestoreConfigured , Firestore } from './database' ;
66
- import { DocumentSnapshot , QuerySnapshot , SnapshotMetadata } from './snapshot' ;
67
+ import { RealtimePipeline } from './realtime_pipeline' ;
68
+ import {
69
+ DocumentSnapshot ,
70
+ QuerySnapshot ,
71
+ RealtimePipelineSnapshot ,
72
+ SnapshotMetadata
73
+ } from './snapshot' ;
67
74
import { ExpUserDataWriter } from './user_data_writer' ;
68
75
69
76
/**
@@ -190,6 +197,10 @@ export function getDocFromServer<
190
197
*
191
198
* @returns A `Promise` that will be resolved with the results of the query.
192
199
*/
200
+ export function getDocs < AppModelType , DbModelType extends DocumentData > (
201
+ query : Query < AppModelType , DbModelType >
202
+ ) : Promise < QuerySnapshot < AppModelType , DbModelType > > ;
203
+
193
204
export function getDocs < AppModelType , DbModelType extends DocumentData > (
194
205
query : Query < AppModelType , DbModelType >
195
206
) : Promise < QuerySnapshot < AppModelType , DbModelType > > {
@@ -207,7 +218,7 @@ export function getDocs<AppModelType, DbModelType extends DocumentData>(
207
218
new QuerySnapshot < AppModelType , DbModelType > (
208
219
firestore ,
209
220
userDataWriter ,
210
- query ,
221
+ query as Query < AppModelType , DbModelType > ,
211
222
snapshot
212
223
)
213
224
) ;
@@ -657,6 +668,7 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
657
668
onError ?: ( error : FirestoreError ) => void ,
658
669
onCompletion ?: ( ) => void
659
670
) : Unsubscribe ;
671
+
660
672
export function onSnapshot < AppModelType , DbModelType extends DocumentData > (
661
673
reference :
662
674
| Query < AppModelType , DbModelType >
@@ -691,7 +703,7 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
691
703
692
704
let observer : PartialObserver < ViewSnapshot > ;
693
705
let firestore : Firestore ;
694
- let internalQuery : InternalQuery ;
706
+ let internalQuery : Query ;
695
707
696
708
if ( reference instanceof DocumentReference ) {
697
709
firestore = cast ( reference . firestore , Firestore ) ;
@@ -744,6 +756,94 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
744
756
) ;
745
757
}
746
758
759
+ export function onPipelineSnapshot (
760
+ query : RealtimePipeline ,
761
+ observer : {
762
+ next ?: ( snapshot : RealtimePipelineSnapshot ) => void ;
763
+ error ?: ( error : FirestoreError ) => void ;
764
+ complete ?: ( ) => void ;
765
+ }
766
+ ) : Unsubscribe ;
767
+ export function onPipelineSnapshot (
768
+ query : RealtimePipeline ,
769
+ options : SnapshotListenOptions ,
770
+ observer : {
771
+ next ?: ( snapshot : RealtimePipelineSnapshot ) => void ;
772
+ error ?: ( error : FirestoreError ) => void ;
773
+ complete ?: ( ) => void ;
774
+ }
775
+ ) : Unsubscribe ;
776
+ export function onPipelineSnapshot (
777
+ query : RealtimePipeline ,
778
+ onNext : ( snapshot : RealtimePipelineSnapshot ) => void ,
779
+ onError ?: ( error : FirestoreError ) => void ,
780
+ onCompletion ?: ( ) => void
781
+ ) : Unsubscribe ;
782
+ export function onPipelineSnapshot (
783
+ query : RealtimePipeline ,
784
+ options : SnapshotListenOptions ,
785
+ onNext : ( snapshot : RealtimePipelineSnapshot ) => void ,
786
+ onError ?: ( error : FirestoreError ) => void ,
787
+ onCompletion ?: ( ) => void
788
+ ) : Unsubscribe ;
789
+ export function onPipelineSnapshot (
790
+ reference : RealtimePipeline ,
791
+ ...args : unknown [ ]
792
+ ) : Unsubscribe {
793
+ reference = getModularInstance ( reference ) ;
794
+
795
+ let options : SnapshotListenOptions = {
796
+ includeMetadataChanges : false ,
797
+ source : 'default'
798
+ } ;
799
+ let currArg = 0 ;
800
+ if ( typeof args [ currArg ] === 'object' && ! isPartialObserver ( args [ currArg ] ) ) {
801
+ options = args [ currArg ] as SnapshotListenOptions ;
802
+ currArg ++ ;
803
+ }
804
+
805
+ const internalOptions = {
806
+ includeMetadataChanges : options . includeMetadataChanges ,
807
+ source : options . source as ListenerDataSource
808
+ } ;
809
+
810
+ if ( isPartialObserver ( args [ currArg ] ) ) {
811
+ const userObserver = args [ currArg ] as PartialObserver <
812
+ QuerySnapshot < AppModelType , DbModelType >
813
+ > ;
814
+ args [ currArg ] = userObserver . next ?. bind ( userObserver ) ;
815
+ args [ currArg + 1 ] = userObserver . error ?. bind ( userObserver ) ;
816
+ args [ currArg + 2 ] = userObserver . complete ?. bind ( userObserver ) ;
817
+ }
818
+
819
+ let observer : PartialObserver < ViewSnapshot > ;
820
+ let firestore : Firestore ;
821
+ let internalQuery : RealtimePipeline ;
822
+
823
+ // RealtimePipeline
824
+ firestore = cast ( reference . _db , Firestore ) ;
825
+ internalQuery = toCorePipeline ( reference ) ;
826
+ observer = {
827
+ next : snapshot => {
828
+ if ( args [ currArg ] ) {
829
+ ( args [ currArg ] as NextFn < RealtimePipelineSnapshot > ) (
830
+ new RealtimePipelineSnapshot ( reference as RealtimePipeline , snapshot )
831
+ ) ;
832
+ }
833
+ } ,
834
+ error : args [ currArg + 1 ] as ErrorFn ,
835
+ complete : args [ currArg + 2 ] as CompleteFn
836
+ } ;
837
+
838
+ const client = ensureFirestoreConfigured ( firestore ) ;
839
+ return firestoreClientListen (
840
+ client ,
841
+ internalQuery ,
842
+ internalOptions ,
843
+ observer
844
+ ) ;
845
+ }
846
+
747
847
// TODO(firestorexp): Make sure these overloads are tested via the Firestore
748
848
// integration tests
749
849
0 commit comments