@@ -35,7 +35,8 @@ import {
3535 firestoreClientListen ,
3636 firestoreClientWrite
3737} from '../core/firestore_client' ;
38- import { newQueryForPath , Query as InternalQuery } from '../core/query' ;
38+ import { QueryOrPipeline , toCorePipeline } from '../core/pipeline-util' ;
39+ import { Query as InternalQuery , newQueryForPath } from '../core/query' ;
3940import { ViewSnapshot } from '../core/view_snapshot' ;
4041import { FieldPath } from '../lite-api/field_path' ;
4142import { validateHasExplicitOrderByForLimitToLast } from '../lite-api/query' ;
@@ -69,9 +70,12 @@ import {
6970 DocumentSnapshot ,
7071 FirestoreDataConverter ,
7172 QuerySnapshot ,
73+ RealtimePipelineSnapshot ,
7274 SnapshotMetadata
7375} from './snapshot' ;
7476import { ExpUserDataWriter } from './user_data_writer' ;
77+ import { RealtimePipeline } from './realtime_pipeline' ;
78+ import { CorePipeline } from '../core/pipeline' ;
7579
7680/**
7781 * An options object that can be passed to {@link (onSnapshot:1)} and {@link
@@ -197,6 +201,10 @@ export function getDocFromServer<
197201 *
198202 * @returns A `Promise` that will be resolved with the results of the query.
199203 */
204+ export function getDocs < AppModelType , DbModelType extends DocumentData > (
205+ query : Query < AppModelType , DbModelType >
206+ ) : Promise < QuerySnapshot < AppModelType , DbModelType > > ;
207+
200208export function getDocs < AppModelType , DbModelType extends DocumentData > (
201209 query : Query < AppModelType , DbModelType >
202210) : Promise < QuerySnapshot < AppModelType , DbModelType > > {
@@ -214,7 +222,7 @@ export function getDocs<AppModelType, DbModelType extends DocumentData>(
214222 new QuerySnapshot < AppModelType , DbModelType > (
215223 firestore ,
216224 userDataWriter ,
217- query ,
225+ query as Query < AppModelType , DbModelType > ,
218226 snapshot
219227 )
220228 ) ;
@@ -642,6 +650,7 @@ export function onSnapshot<AppModelType, DbModelType extends DocumentData>(
642650 onError ?: ( error : FirestoreError ) => void ,
643651 onCompletion ?: ( ) => void
644652) : Unsubscribe ;
653+
645654export function onSnapshot < AppModelType , DbModelType extends DocumentData > (
646655 reference :
647656 | Query < AppModelType , DbModelType >
@@ -1061,6 +1070,94 @@ export function onSnapshotResume<
10611070 }
10621071}
10631072
1073+ export function onPipelineSnapshot (
1074+ query : RealtimePipeline ,
1075+ observer : {
1076+ next ?: ( snapshot : RealtimePipelineSnapshot ) => void ;
1077+ error ?: ( error : FirestoreError ) => void ;
1078+ complete ?: ( ) => void ;
1079+ }
1080+ ) : Unsubscribe ;
1081+ export function onPipelineSnapshot (
1082+ query : RealtimePipeline ,
1083+ options : SnapshotListenOptions ,
1084+ observer : {
1085+ next ?: ( snapshot : RealtimePipelineSnapshot ) => void ;
1086+ error ?: ( error : FirestoreError ) => void ;
1087+ complete ?: ( ) => void ;
1088+ }
1089+ ) : Unsubscribe ;
1090+ export function onPipelineSnapshot (
1091+ query : RealtimePipeline ,
1092+ onNext : ( snapshot : RealtimePipelineSnapshot ) => void ,
1093+ onError ?: ( error : FirestoreError ) => void ,
1094+ onCompletion ?: ( ) => void
1095+ ) : Unsubscribe ;
1096+ export function onPipelineSnapshot (
1097+ query : RealtimePipeline ,
1098+ options : SnapshotListenOptions ,
1099+ onNext : ( snapshot : RealtimePipelineSnapshot ) => void ,
1100+ onError ?: ( error : FirestoreError ) => void ,
1101+ onCompletion ?: ( ) => void
1102+ ) : Unsubscribe ;
1103+ export function onPipelineSnapshot (
1104+ reference : RealtimePipeline ,
1105+ ...args : unknown [ ]
1106+ ) : Unsubscribe {
1107+ reference = getModularInstance ( reference ) ;
1108+
1109+ let options : SnapshotListenOptions = {
1110+ includeMetadataChanges : false ,
1111+ source : 'default'
1112+ } ;
1113+ let currArg = 0 ;
1114+ if ( typeof args [ currArg ] === 'object' && ! isPartialObserver ( args [ currArg ] ) ) {
1115+ options = args [ currArg ] as SnapshotListenOptions ;
1116+ currArg ++ ;
1117+ }
1118+
1119+ const internalOptions = {
1120+ includeMetadataChanges : options . includeMetadataChanges ,
1121+ source : options . source as ListenerDataSource
1122+ } ;
1123+
1124+ if ( isPartialObserver ( args [ currArg ] ) ) {
1125+ const userObserver = args [
1126+ currArg
1127+ ] as PartialObserver < RealtimePipelineSnapshot > ;
1128+ args [ currArg ] = userObserver . next ?. bind ( userObserver ) ;
1129+ args [ currArg + 1 ] = userObserver . error ?. bind ( userObserver ) ;
1130+ args [ currArg + 2 ] = userObserver . complete ?. bind ( userObserver ) ;
1131+ }
1132+
1133+ let observer : PartialObserver < ViewSnapshot > ;
1134+ let firestore : Firestore ;
1135+ let internalQuery : CorePipeline ;
1136+
1137+ // RealtimePipeline
1138+ firestore = cast ( reference . _db , Firestore ) ;
1139+ internalQuery = toCorePipeline ( reference ) ;
1140+ observer = {
1141+ next : snapshot => {
1142+ if ( args [ currArg ] ) {
1143+ ( args [ currArg ] as NextFn < RealtimePipelineSnapshot > ) (
1144+ new RealtimePipelineSnapshot ( reference as RealtimePipeline , snapshot )
1145+ ) ;
1146+ }
1147+ } ,
1148+ error : args [ currArg + 1 ] as ErrorFn ,
1149+ complete : args [ currArg + 2 ] as CompleteFn
1150+ } ;
1151+
1152+ const client = ensureFirestoreConfigured ( firestore ) ;
1153+ return firestoreClientListen (
1154+ client ,
1155+ internalQuery ,
1156+ internalOptions ,
1157+ observer
1158+ ) ;
1159+ }
1160+
10641161// TODO(firestorexp): Make sure these overloads are tested via the Firestore
10651162// integration tests
10661163
0 commit comments