@@ -49,12 +49,10 @@ export abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync
4949 * For client-side synchronizer: it resets or updates the cache.
5050 */
5151 resetSegments ( segmentsData : MySegmentsData | IMySegmentsResponse ) : boolean {
52- this . setChangeNumber ( segmentsData . cn ) ;
53-
5452 const { added, removed } = segmentsData as MySegmentsData ;
53+ let isDiff = false ;
5554
5655 if ( added && removed ) {
57- let isDiff = false ;
5856
5957 added . forEach ( segment => {
6058 isDiff = this . addSegment ( segment ) || isDiff ;
@@ -63,32 +61,40 @@ export abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync
6361 removed . forEach ( segment => {
6462 isDiff = this . removeSegment ( segment ) || isDiff ;
6563 } ) ;
64+ } else {
6665
67- return isDiff ;
68- }
66+ const names = ( ( segmentsData as IMySegmentsResponse ) . k || [ ] ) . map ( s => s . n ) . sort ( ) ;
67+ const storedSegmentKeys = this . getRegisteredSegments ( ) . sort ( ) ;
6968
70- const names = ( ( segmentsData as IMySegmentsResponse ) . k || [ ] ) . map ( s => s . n ) . sort ( ) ;
71- const storedSegmentKeys = this . getRegisteredSegments ( ) . sort ( ) ;
69+ // Extreme fast => everything is empty
70+ if ( ! names . length && ! storedSegmentKeys . length ) {
71+ isDiff = false ;
72+ } else {
7273
73- // Extreme fast => everything is empty
74- if ( ! names . length && ! storedSegmentKeys . length ) return false ;
74+ let index = 0 ;
7575
76- let index = 0 ;
76+ while ( index < names . length && index < storedSegmentKeys . length && names [ index ] === storedSegmentKeys [ index ] ) index ++ ;
7777
78- while ( index < names . length && index < storedSegmentKeys . length && names [ index ] === storedSegmentKeys [ index ] ) index ++ ;
78+ // Quick path => no changes
79+ if ( index === names . length && index === storedSegmentKeys . length ) {
80+ isDiff = false ;
81+ } else {
7982
80- // Quick path => no changes
81- if ( index === names . length && index === storedSegmentKeys . length ) return false ;
83+ // Slowest path => add and/or remove segments
84+ for ( let removeIndex = index ; removeIndex < storedSegmentKeys . length ; removeIndex ++ ) {
85+ this . removeSegment ( storedSegmentKeys [ removeIndex ] ) ;
86+ }
8287
83- // Slowest path => add and/or remove segments
84- for ( let removeIndex = index ; removeIndex < storedSegmentKeys . length ; removeIndex ++ ) {
85- this . removeSegment ( storedSegmentKeys [ removeIndex ] ) ;
86- }
88+ for ( let addIndex = index ; addIndex < names . length ; addIndex ++ ) {
89+ this . addSegment ( names [ addIndex ] ) ;
90+ }
8791
88- for ( let addIndex = index ; addIndex < names . length ; addIndex ++ ) {
89- this . addSegment ( names [ addIndex ] ) ;
92+ isDiff = true ;
93+ }
94+ }
9095 }
9196
92- return true ;
97+ this . setChangeNumber ( segmentsData . cn ) ;
98+ return isDiff ;
9399 }
94100}
0 commit comments