@@ -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 : QueryOrPipeline ;
695
707
696
708
if ( reference instanceof DocumentReference ) {
697
709
firestore = cast ( reference . firestore , Firestore ) ;
@@ -744,6 +756,106 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
744
756
) ;
745
757
}
746
758
759
+ export function onPipelineSnapshot <
760
+ AppModelType ,
761
+ DbModelType extends DocumentData
762
+ > (
763
+ query : RealtimePipeline ,
764
+ observer : {
765
+ next ?: ( snapshot : RealtimePipelineSnapshot ) => void ;
766
+ error ?: ( error : FirestoreError ) => void ;
767
+ complete ?: ( ) => void ;
768
+ }
769
+ ) : Unsubscribe ;
770
+ export function onPipelineSnapshot <
771
+ AppModelType ,
772
+ DbModelType extends DocumentData
773
+ > (
774
+ query : RealtimePipeline ,
775
+ options : SnapshotListenOptions ,
776
+ observer : {
777
+ next ?: ( snapshot : RealtimePipelineSnapshot ) => void ;
778
+ error ?: ( error : FirestoreError ) => void ;
779
+ complete ?: ( ) => void ;
780
+ }
781
+ ) : Unsubscribe ;
782
+ export function onPipelineSnapshot <
783
+ AppModelType ,
784
+ DbModelType extends DocumentData
785
+ > (
786
+ query : RealtimePipeline ,
787
+ onNext : ( snapshot : RealtimePipelineSnapshot ) => void ,
788
+ onError ?: ( error : FirestoreError ) => void ,
789
+ onCompletion ?: ( ) => void
790
+ ) : Unsubscribe ;
791
+ export function onPipelineSnapshot <
792
+ AppModelType ,
793
+ DbModelType extends DocumentData
794
+ > (
795
+ query : RealtimePipeline ,
796
+ options : SnapshotListenOptions ,
797
+ onNext : ( snapshot : RealtimePipelineSnapshot ) => void ,
798
+ onError ?: ( error : FirestoreError ) => void ,
799
+ onCompletion ?: ( ) => void
800
+ ) : Unsubscribe ;
801
+ export function onPipelineSnapshot <
802
+ AppModelType ,
803
+ DbModelType extends DocumentData
804
+ > ( reference : RealtimePipeline , ...args : unknown [ ] ) : Unsubscribe {
805
+ reference = getModularInstance ( reference ) ;
806
+
807
+ let options : SnapshotListenOptions = {
808
+ includeMetadataChanges : false ,
809
+ source : 'default'
810
+ } ;
811
+ let currArg = 0 ;
812
+ if ( typeof args [ currArg ] === 'object' && ! isPartialObserver ( args [ currArg ] ) ) {
813
+ options = args [ currArg ] as SnapshotListenOptions ;
814
+ currArg ++ ;
815
+ }
816
+
817
+ const internalOptions = {
818
+ includeMetadataChanges : options . includeMetadataChanges ,
819
+ source : options . source as ListenerDataSource
820
+ } ;
821
+
822
+ if ( isPartialObserver ( args [ currArg ] ) ) {
823
+ const userObserver = args [ currArg ] as PartialObserver <
824
+ QuerySnapshot < AppModelType , DbModelType >
825
+ > ;
826
+ args [ currArg ] = userObserver . next ?. bind ( userObserver ) ;
827
+ args [ currArg + 1 ] = userObserver . error ?. bind ( userObserver ) ;
828
+ args [ currArg + 2 ] = userObserver . complete ?. bind ( userObserver ) ;
829
+ }
830
+
831
+ let observer : PartialObserver < ViewSnapshot > ;
832
+ let firestore : Firestore ;
833
+ let internalQuery : QueryOrPipeline ;
834
+
835
+ // RealtimePipeline
836
+ firestore = cast ( reference . _db , Firestore ) ;
837
+ internalQuery = toCorePipeline ( reference ) ;
838
+ observer = {
839
+ next : snapshot => {
840
+ if ( args [ currArg ] ) {
841
+ ( args [ currArg ] as NextFn < RealtimePipelineSnapshot > ) (
842
+ new RealtimePipelineSnapshot ( reference as RealtimePipeline , snapshot )
843
+ ) ;
844
+ }
845
+ } ,
846
+ error : args [ currArg + 1 ] as ErrorFn ,
847
+ complete : args [ currArg + 2 ] as CompleteFn
848
+ } ;
849
+
850
+ const client = ensureFirestoreConfigured ( firestore ) ;
851
+ return firestoreClientListen (
852
+ client ,
853
+ internalQuery ,
854
+ internalOptions ,
855
+ observer
856
+ ) ;
857
+ }
858
+
747
859
// TODO(firestorexp): Make sure these overloads are tested via the Firestore
748
860
// integration tests
749
861
0 commit comments