@@ -619,23 +619,22 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
619619
620620 // try refresh if any of watched settings is changed.
621621 let needRefresh = false ;
622- let changedSentinel ;
623- let changedSentinelWatcher ;
622+ let changedSentinel : WatchedSetting | undefined ;
623+ let changedSentinelWatcher : SettingWatcher | undefined ;
624624 if ( this . #watchAll) {
625625 needRefresh = await this . #checkConfigurationSettingsChange( this . #kvSelectors) ;
626626 } else {
627627 for ( const watchedSetting of this . #sentinels. keys ( ) ) {
628628 const configurationSettingId : ConfigurationSettingId = { key : watchedSetting . key , label : watchedSetting . label , etag : this . #sentinels. get ( watchedSetting ) ?. etag } ;
629- const response = await this . #getConfigurationSetting( configurationSettingId , {
630- onlyIfChanged : true
631- } ) ;
632-
633- const watcher = this . #sentinels. get ( watchedSetting ) ;
634- if ( response ?. statusCode === 200 // created or changed
635- || ( response === undefined && watcher ?. etag !== undefined ) // deleted
636- ) {
629+ const response : GetConfigurationSettingResponse | undefined
630+ = await this . #getConfigurationSetting( configurationSettingId , { onlyIfChanged : true } ) ;
631+
632+ const watcher : SettingWatcher = this . #sentinels. get ( watchedSetting ) ! ; // watcher should always exist for sentinels
633+ const isDeleted = response === undefined && watcher . etag !== undefined ; // previously existed, now deleted
634+ const isChanged = response && response . statusCode === 200 && watcher . etag !== response . etag ; // etag changed
635+ if ( isDeleted || isChanged ) {
637636 changedSentinel = watchedSetting ;
638- changedSentinelWatcher = watcher ;
637+ changedSentinelWatcher = { etag : isChanged ? response . etag : undefined } ;
639638 needRefresh = true ;
640639 break ;
641640 }
@@ -647,7 +646,11 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
647646 await adapter . onChangeDetected ( ) ;
648647 }
649648 await this . #loadSelectedKeyValues( ) ;
650- this . #sentinels. set ( changedSentinel , changedSentinelWatcher ) ; // update the changed sentinel's watcher
649+
650+ if ( changedSentinel && changedSentinelWatcher ) {
651+ // update the changed sentinel's watcher after loading new values, this can ensure a failed refresh will retry on next refresh
652+ this . #sentinels. set ( changedSentinel , changedSentinelWatcher ) ;
653+ }
651654 }
652655
653656 this . #kvRefreshTimer. reset ( ) ;
0 commit comments