@@ -34,7 +34,8 @@ import {
3434  firestoreClientListen , 
3535  firestoreClientWrite 
3636}  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' ; 
3839import  {  ViewSnapshot  }  from  '../core/view_snapshot' ; 
3940import  {  FieldPath  }  from  '../lite-api/field_path' ; 
4041import  {  validateHasExplicitOrderByForLimitToLast  }  from  '../lite-api/query' ; 
@@ -63,7 +64,13 @@ import { FirestoreError } from '../util/error';
6364import  {  cast  }  from  '../util/input_validation' ; 
6465
6566import  {  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' ; 
6774import  {  ExpUserDataWriter  }  from  './user_data_writer' ; 
6875
6976/** 
@@ -190,6 +197,10 @@ export function getDocFromServer<
190197 * 
191198 * @returns  A `Promise` that will be resolved with the results of the query. 
192199 */ 
200+ export  function  getDocs < AppModelType ,  DbModelType  extends  DocumentData > ( 
201+   query : Query < AppModelType ,  DbModelType > 
202+ ) : Promise < QuerySnapshot < AppModelType ,  DbModelType > > ; 
203+ 
193204export  function  getDocs < AppModelType ,  DbModelType  extends  DocumentData > ( 
194205  query : Query < AppModelType ,  DbModelType > 
195206) : Promise < QuerySnapshot < AppModelType ,  DbModelType > >  { 
@@ -207,7 +218,7 @@ export function getDocs<AppModelType, DbModelType extends DocumentData>(
207218      new  QuerySnapshot < AppModelType ,  DbModelType > ( 
208219        firestore , 
209220        userDataWriter , 
210-         query , 
221+         query   as   Query < AppModelType ,   DbModelType > , 
211222        snapshot 
212223      ) 
213224  ) ; 
@@ -657,6 +668,7 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
657668  onError ?: ( error : FirestoreError )  =>  void , 
658669  onCompletion ?: ( )  =>  void 
659670) : Unsubscribe ; 
671+ 
660672export  function  onSnapshot < AppModelType ,  DbModelType  extends  DocumentData > ( 
661673  reference :
662674    |  Query < AppModelType ,  DbModelType > 
@@ -691,7 +703,7 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
691703
692704  let  observer : PartialObserver < ViewSnapshot > ; 
693705  let  firestore : Firestore ; 
694-   let  internalQuery : InternalQuery ; 
706+   let  internalQuery : QueryOrPipeline ; 
695707
696708  if  ( reference  instanceof  DocumentReference )  { 
697709    firestore  =  cast ( reference . firestore ,  Firestore ) ; 
@@ -744,6 +756,106 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
744756  ) ; 
745757} 
746758
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+ 
747859// TODO(firestorexp): Make sure these overloads are tested via the Firestore 
748860// integration tests 
749861
0 commit comments