@@ -82,6 +82,8 @@ export class Connection<
8282
8383 private nameToViewQueryInfoMap = new Map < string , ViewQueryInfo > ( ) ;
8484
85+ private nameToContextDependencyRefsMap = new Map < string , SyncableRef [ ] > ( ) ;
86+
8587 private loadedKeySet = new Set < string > ( ) ;
8688 private sanitizedFieldNamesMap = new Map < string , string [ ] > ( ) ;
8789
@@ -275,7 +277,27 @@ export class Connection<
275277 let nameToViewQueryInfoMap = this . nameToViewQueryInfoMap ;
276278
277279 if ( contextObjectChanged ) {
278- relevantViewQueryNames = Array . from ( nameToViewQueryInfoMap . keys ( ) ) ;
280+ let contextDependencyRefsEntries = Object . entries (
281+ await this . server . resolveQueryToContextDependencyRefsDict ( context ) ,
282+ ) ;
283+
284+ relevantViewQueryNames = _ . union (
285+ Array . from ( nameToViewQueryInfoMap . keys ( ) ) ,
286+ _ . compact (
287+ contextDependencyRefsEntries . map ( ( [ viewQueryName , refs ] ) =>
288+ _ . isEqual (
289+ this . nameToContextDependencyRefsMap . get ( viewQueryName ) ,
290+ refs ,
291+ )
292+ ? undefined
293+ : viewQueryName ,
294+ ) ,
295+ ) ,
296+ ) ;
297+
298+ this . nameToContextDependencyRefsMap = new Map (
299+ contextDependencyRefsEntries ,
300+ ) ;
279301 } else {
280302 let keyToViewQueryNameSet = new Map < string , Set < string > > ( ) ;
281303
@@ -285,7 +307,10 @@ export class Connection<
285307 query : { refs : refDict } ,
286308 } ,
287309 ] of nameToViewQueryInfoMap ) {
288- for ( let ref of Object . values ( refDict ) ) {
310+ for ( let ref of _ . union (
311+ Object . values ( refDict ) . flat ( ) ,
312+ this . nameToContextDependencyRefsMap . get ( name ) || [ ] ,
313+ ) ) {
289314 let key = getSyncableKey ( ref ) ;
290315
291316 let nameSet = keyToViewQueryNameSet . get ( key ) ;
@@ -467,10 +492,13 @@ export class Connection<
467492
468493 syncables . push ( ...sanitizedDependentSyncables ) ;
469494
495+ let queryMetadata = context . queryMetadataDict ;
496+
470497 let data : SyncData = {
471498 syncables,
472499 removals,
473500 updates,
501+ queryMetadata,
474502 } ;
475503
476504 if (
@@ -542,8 +570,18 @@ export class Connection<
542570 if ( context . disabled ) {
543571 throw new RPCError ( 'CONTEXT_DISABLED' ) ;
544572 }
573+
574+ let contextDependencyRefsDict = await this . server . resolveQueryToContextDependencyRefsDict (
575+ context ,
576+ ) ;
577+
578+ this . nameToContextDependencyRefsMap = new Map (
579+ Object . entries ( contextDependencyRefsDict ) ,
580+ ) ;
545581 }
546582
583+ let previousQueryMetadataDict = _ . cloneDeep ( context . queryMetadataDict ) ;
584+
547585 let {
548586 syncables,
549587 nameToViewQueryMapToAdd,
@@ -575,10 +613,13 @@ export class Connection<
575613 loadedKeySet . add ( getSyncableKey ( syncable ) ) ;
576614 }
577615
616+ let queryMetadataDict = context . queryMetadataDict ;
617+
578618 let data : SyncData = {
579619 syncables,
580620 removals : [ ] ,
581621 updates : [ ] ,
622+ queryMetadata : queryMetadataDict ,
582623 } ;
583624
584625 if ( toInitialize ) {
@@ -588,26 +629,31 @@ export class Connection<
588629 contextRef ,
589630 this . connectionAdapter . viewQueryDict as ViewQueryUpdateObject ,
590631 ) ;
591- } else if ( syncables . length || source ) {
632+ } else if (
633+ syncables . length ||
634+ source ||
635+ ! _ . isEqual ( previousQueryMetadataDict , queryMetadataDict )
636+ ) {
592637 await ( this as RPCPeer < ClientRPCDefinition > ) . call ( 'sync' , data , source ) ;
593638 }
594639 }
595640
596641 private async request ( refs : SyncableRef [ ] ) : Promise < void > {
597642 let loadedKeySet = this . loadedKeySet ;
598643 let sanitizedFieldNamesMap = this . sanitizedFieldNamesMap ;
644+ let context = this . context ;
599645
600646 let syncables = await this . server . loadSyncablesByRefs (
601647 this . group ,
602- this . context ,
648+ context ,
603649 refs ,
604650 {
605651 loadedKeySet,
606652 } ,
607653 ) ;
608654
609655 syncables = filterReadableSyncables (
610- this . context ,
656+ context ,
611657 this . syncableAdapter ,
612658 syncables ,
613659 true ,
@@ -627,6 +673,7 @@ export class Connection<
627673 syncables,
628674 removals : [ ] ,
629675 updates : [ ] ,
676+ queryMetadata : context . queryMetadataDict ,
630677 } ) ;
631678 }
632679}
0 commit comments