@@ -7,8 +7,12 @@ type FlagsCacheRefreshResult = {
77 flagStateVersion ?: number ;
88} ;
99
10- type FlagsCacheScheduledRefresh = {
11- cancel : ( ) => void ;
10+ type CancelScheduledRefresh = ( ) => void ;
11+
12+ type ScheduledRefresh = {
13+ cancel : CancelScheduledRefresh ;
14+ promise : Promise < void > ;
15+ resolve : ( ) => void ;
1216} ;
1317
1418type FlagsCacheOptions = {
@@ -17,7 +21,7 @@ type FlagsCacheOptions = {
1721 scheduleTrailingRefresh ?: (
1822 delayMs : number ,
1923 callback : ( ) => void ,
20- ) => FlagsCacheScheduledRefresh ;
24+ ) => CancelScheduledRefresh ;
2125} ;
2226
2327/**
@@ -35,9 +39,7 @@ export class FlagsCache {
3539 private value : CachedFlagDefinition [ ] | undefined ;
3640 private flagStateVersion : number | undefined ;
3741 private refreshPromise : Promise < void > | undefined ;
38- private scheduledRefresh : FlagsCacheScheduledRefresh | undefined ;
39- private scheduledRefreshPromise : Promise < void > | undefined ;
40- private resolveScheduledRefreshPromise : ( ( ) => void ) | undefined ;
42+ private scheduledRefresh : ScheduledRefresh | undefined ;
4143 private lastRefreshAt : number | undefined ;
4244 private lastRefreshStartedAt : number | undefined ;
4345 private destroyed = false ;
@@ -183,30 +185,38 @@ export class FlagsCache {
183185 }
184186
185187 private settleScheduledRefresh ( ) {
188+ const scheduledRefresh = this . scheduledRefresh ;
186189 this . scheduledRefresh = undefined ;
187- this . scheduledRefreshPromise = undefined ;
188- this . resolveScheduledRefreshPromise ?.( ) ;
189- this . resolveScheduledRefreshPromise = undefined ;
190+ scheduledRefresh ?. resolve ( ) ;
190191 }
191192
192193 private cancelScheduledRefresh ( ) {
193- this . scheduledRefresh ?. cancel ( ) ;
194- this . settleScheduledRefresh ( ) ;
194+ const scheduledRefresh = this . scheduledRefresh ;
195+ this . scheduledRefresh = undefined ;
196+ scheduledRefresh ?. cancel ( ) ;
197+ scheduledRefresh ?. resolve ( ) ;
195198 }
196199
197200 private ensureScheduledRefresh ( delayMs : number ) {
198201 if ( ! this . scheduleTrailingRefresh || this . scheduledRefresh ) {
199202 return ;
200203 }
201204
202- this . scheduledRefreshPromise = new Promise < void > ( ( resolve ) => {
203- this . resolveScheduledRefreshPromise = resolve ;
205+ let resolve ! : ( ) => void ;
206+ const promise = new Promise < void > ( ( innerResolve ) => {
207+ resolve = innerResolve ;
204208 } ) ;
205209
206- this . scheduledRefresh = this . scheduleTrailingRefresh ( delayMs , ( ) => {
210+ const cancel = this . scheduleTrailingRefresh ( delayMs , ( ) => {
207211 this . settleScheduledRefresh ( ) ;
208212 this . ensureRefreshStartedOrScheduled ( ) ;
209213 } ) ;
214+
215+ this . scheduledRefresh = {
216+ cancel,
217+ promise,
218+ resolve,
219+ } ;
210220 }
211221
212222 private ensureRefreshStartedOrScheduled ( ) {
@@ -259,7 +269,7 @@ export class FlagsCache {
259269
260270 private async waitForQueuedWork ( ) {
261271 while ( ! this . destroyed ) {
262- const workPromise = this . refreshPromise ?? this . scheduledRefreshPromise ;
272+ const workPromise = this . refreshPromise ?? this . scheduledRefresh ?. promise ;
263273 if ( ! workPromise ) {
264274 return ;
265275 }
0 commit comments