@@ -29,16 +29,19 @@ import {
29
29
deleteField ,
30
30
disableNetwork ,
31
31
doc ,
32
+ DocumentReference as DocumentReferenceExp ,
32
33
enableIndexedDbPersistence ,
33
34
enableMultiTabIndexedDbPersistence ,
34
35
enableNetwork ,
35
- DocumentReference as DocumentReferenceExp ,
36
36
FieldPath as FieldPathExp ,
37
37
getDoc ,
38
+ getDocFromCache ,
39
+ getDocFromServer ,
38
40
getQuery ,
39
41
getQueryFromCache ,
40
42
getQueryFromServer ,
41
43
increment ,
44
+ initializeFirestore ,
42
45
onSnapshot ,
43
46
onSnapshotsInSync ,
44
47
parent ,
@@ -51,10 +54,7 @@ import {
51
54
terminate ,
52
55
updateDoc ,
53
56
waitForPendingWrites ,
54
- writeBatch ,
55
- getDocFromCache ,
56
- getDocFromServer ,
57
- initializeFirestore
57
+ writeBatch
58
58
} from '../../exp/index.node' ;
59
59
import { UntypedFirestoreDataConverter } from '../../src/api/user_data_reader' ;
60
60
import { isPartialObserver , PartialObserver } from '../../src/api/observer' ;
@@ -350,40 +350,12 @@ export class DocumentReference<T = legacy.DocumentData>
350
350
onCompletion ?: ( ) => void
351
351
) : ( ) => void ;
352
352
onSnapshot ( ...args : any ) : ( ) => void {
353
- let options : legacy . SnapshotListenOptions = { } ;
354
- let userObserver : PartialObserver < DocumentSnapshot < T > > ;
355
-
356
- if ( isPartialObserver ( args [ 0 ] ) ) {
357
- userObserver = args [ 0 ] as PartialObserver < DocumentSnapshot < T > > ;
358
- } else if ( isPartialObserver ( args [ 1 ] ) ) {
359
- options = args [ 0 ] ;
360
- userObserver = args [ 1 ] ;
361
- } else if ( typeof args [ 0 ] === 'function' ) {
362
- userObserver = {
363
- next : args [ 0 ] ,
364
- error : args [ 1 ] ,
365
- complete : args [ 2 ]
366
- } ;
367
- } else {
368
- options = args [ 0 ] ;
369
- userObserver = {
370
- next : args [ 1 ] ,
371
- error : args [ 2 ] ,
372
- complete : args [ 3 ]
373
- } ;
374
- }
375
-
376
- const apiObserver : PartialObserver < exp . DocumentSnapshot < T > > = {
377
- next : snapshot => {
378
- if ( userObserver ! . next ) {
379
- userObserver ! . next ( new DocumentSnapshot ( snapshot ) ) ;
380
- }
381
- } ,
382
- error : userObserver . error ?. bind ( userObserver ) ,
383
- complete : userObserver . complete ?. bind ( userObserver )
384
- } ;
385
-
386
- return onSnapshot ( this . _delegate , options , apiObserver ) ;
353
+ const options = extractSnapshotOptions ( args ) ;
354
+ const observer = wrapObserver < DocumentSnapshot < T > , exp . DocumentSnapshot < T > > (
355
+ args ,
356
+ snap => new DocumentSnapshot ( snap )
357
+ ) ;
358
+ return onSnapshot ( this . _delegate , options , observer ) ;
387
359
}
388
360
389
361
withConverter < U > (
@@ -539,40 +511,12 @@ export class Query<T = legacy.DocumentData> implements legacy.Query<T> {
539
511
onCompletion ?: ( ) => void
540
512
) : ( ) => void ;
541
513
onSnapshot ( ...args : any ) : ( ) => void {
542
- let options : legacy . SnapshotListenOptions = { } ;
543
- let userObserver : PartialObserver < QuerySnapshot < T > > ;
544
-
545
- if ( isPartialObserver ( args [ 0 ] ) ) {
546
- userObserver = args [ 0 ] as PartialObserver < QuerySnapshot < T > > ;
547
- } else if ( isPartialObserver ( args [ 1 ] ) ) {
548
- options = args [ 0 ] ;
549
- userObserver = args [ 1 ] ;
550
- } else if ( typeof args [ 0 ] === 'function' ) {
551
- userObserver = {
552
- next : args [ 0 ] ,
553
- error : args [ 1 ] ,
554
- complete : args [ 2 ]
555
- } ;
556
- } else {
557
- options = args [ 0 ] ;
558
- userObserver = {
559
- next : args [ 1 ] ,
560
- error : args [ 2 ] ,
561
- complete : args [ 3 ]
562
- } ;
563
- }
564
-
565
- const apiObserver : PartialObserver < exp . QuerySnapshot < T > > = {
566
- next : snapshot => {
567
- if ( userObserver ! . next ) {
568
- userObserver ! . next ( new QuerySnapshot ( snapshot ) ) ;
569
- }
570
- } ,
571
- error : userObserver . error ?. bind ( userObserver ) ,
572
- complete : userObserver . complete ?. bind ( userObserver )
573
- } ;
574
-
575
- return onSnapshot ( this . _delegate , options , apiObserver ) ;
514
+ const options = extractSnapshotOptions ( args ) ;
515
+ const observer = wrapObserver < QuerySnapshot < T > , exp . QuerySnapshot < T > > (
516
+ args ,
517
+ snap => new QuerySnapshot ( snap )
518
+ ) ;
519
+ return onSnapshot ( this . _delegate , options , observer ) ;
576
520
}
577
521
578
522
withConverter < U > ( converter : legacy . FirestoreDataConverter < U > ) : Query < U > {
@@ -698,7 +642,7 @@ export class FieldValue implements legacy.FieldValue {
698
642
}
699
643
700
644
export class FieldPath implements legacy . FieldPath {
701
- private fieldNames : string [ ] ;
645
+ private readonly fieldNames : string [ ] ;
702
646
703
647
constructor ( ...fieldNames : string [ ] ) {
704
648
this . fieldNames = fieldNames ;
@@ -766,3 +710,59 @@ function unwrap(value: any): any {
766
710
return value ;
767
711
}
768
712
}
713
+
714
+ /**
715
+ * Creates an observer that can be passed to the firestore-exp SDK. The
716
+ * observer converts all observed values into the format expected by the shim.
717
+ *
718
+ * @param args The list of arguments from an `onSnapshot` call.
719
+ * @param wrapper The function that converts the firestore-exp type into the
720
+ * type used by this shim.
721
+ */
722
+ function wrapObserver < ShimType , ExpType > (
723
+ args : any ,
724
+ wrapper : ( val : ExpType ) => ShimType
725
+ ) : PartialObserver < ExpType > {
726
+ let userObserver : PartialObserver < ShimType > ;
727
+ if ( isPartialObserver ( args [ 0 ] ) ) {
728
+ userObserver = args [ 0 ] as PartialObserver < ShimType > ;
729
+ } else if ( isPartialObserver ( args [ 1 ] ) ) {
730
+ userObserver = args [ 1 ] ;
731
+ } else if ( typeof args [ 0 ] === 'function' ) {
732
+ userObserver = {
733
+ next : args [ 0 ] ,
734
+ error : args [ 1 ] ,
735
+ complete : args [ 2 ]
736
+ } ;
737
+ } else {
738
+ userObserver = {
739
+ next : args [ 1 ] ,
740
+ error : args [ 2 ] ,
741
+ complete : args [ 3 ]
742
+ } ;
743
+ }
744
+
745
+ return {
746
+ next : val => {
747
+ if ( userObserver ! . next ) {
748
+ userObserver ! . next ( wrapper ( val ) ) ;
749
+ }
750
+ } ,
751
+ error : userObserver . error ?. bind ( userObserver ) ,
752
+ complete : userObserver . complete ?. bind ( userObserver )
753
+ } ;
754
+ }
755
+
756
+ /**
757
+ * Iterates the list of arguments from an `onSnapshot` call and returns the
758
+ * first argument that may be an `SnapshotListenOptions` object. Returns an
759
+ * empty object if none is found.
760
+ */
761
+ function extractSnapshotOptions ( args : any ) : exp . SnapshotListenOptions {
762
+ for ( const arg of args ) {
763
+ if ( typeof arg === 'object' && ! isPartialObserver ( arg ) ) {
764
+ return arg as exp . SnapshotListenOptions ;
765
+ }
766
+ }
767
+ return { } ;
768
+ }
0 commit comments