@@ -15,6 +15,13 @@ import { RefreshTimer } from "./refresh/RefreshTimer";
15
15
import { getConfigurationSettingWithTrace , listConfigurationSettingsWithTrace , requestTracingEnabled } from "./requestTracing/utils" ;
16
16
import { KeyFilter , LabelFilter , SettingSelector } from "./types" ;
17
17
18
+ type PagedSettingSelector = SettingSelector & {
19
+ /**
20
+ * Key: page eTag, Value: feature flag configurations
21
+ */
22
+ pages ?: Map < string , ConfigurationSetting [ ] >
23
+ } ;
24
+
18
25
export class AzureAppConfigurationImpl implements AzureAppConfiguration {
19
26
/**
20
27
* Hosting key-value pairs in the configuration store.
@@ -45,6 +52,9 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
45
52
#featureFlagRefreshInterval: number = DEFAULT_REFRESH_INTERVAL_IN_MS ;
46
53
#featureFlagRefreshTimer: RefreshTimer ;
47
54
55
+ // selectors
56
+ #featureFlagSelectors: PagedSettingSelector [ ] = [ ] ;
57
+
48
58
constructor (
49
59
client : AppConfigurationClient ,
50
60
options : AzureAppConfigurationOptions | undefined
@@ -103,6 +113,9 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
103
113
}
104
114
105
115
this . #featureFlagRefreshTimer = new RefreshTimer ( this . #featureFlagRefreshInterval) ;
116
+
117
+ // validate feature flag selectors
118
+ this . #featureFlagSelectors = getValidFeatureFlagSelectors ( options . featureFlagOptions . selectors ) ;
106
119
}
107
120
108
121
this . #adapters. push ( new AzureKeyVaultKeyValueAdapter ( options ?. keyVaultOptions ) ) ;
@@ -233,7 +246,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
233
246
}
234
247
235
248
async #clearLoadedKeyValues( ) {
236
- for ( const key of this . #configMap. keys ( ) ) {
249
+ for ( const key of this . #configMap. keys ( ) ) {
237
250
if ( key !== FEATURE_MANAGEMENT_KEY_NAME ) {
238
251
this . #configMap. delete ( key ) ;
239
252
}
@@ -243,20 +256,44 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
243
256
async #loadFeatureFlags( ) {
244
257
// Temporary map to store feature flags, key is the key of the setting, value is the raw value of the setting
245
258
const featureFlagsMap = new Map < string , any > ( ) ;
246
- const featureFlagSelectors = getValidFeatureFlagSelectors ( this . #options ?. featureFlagOptions ?. selectors ) ;
247
- for ( const selector of featureFlagSelectors ) {
259
+ for ( const selector of this . #featureFlagSelectors ) {
260
+ const pageEtags = selector . pages ? Array . from ( selector . pages . keys ( ) ) : undefined ;
248
261
const listOptions : ListConfigurationSettingsOptions = {
249
262
keyFilter : `${ featureFlagPrefix } ${ selector . keyFilter } ` ,
250
- labelFilter : selector . labelFilter
263
+ labelFilter : selector . labelFilter ,
264
+ pageEtags : pageEtags
251
265
} ;
252
- const settings = listConfigurationSettingsWithTrace (
266
+
267
+ const pageIterator = listConfigurationSettingsWithTrace (
253
268
this . #requestTraceOptions,
254
269
this . #client,
255
270
listOptions
256
- ) ;
257
- for await ( const setting of settings ) {
258
- if ( isFeatureFlag ( setting ) ) {
259
- featureFlagsMap . set ( setting . key , setting . value ) ;
271
+ ) . byPage ( ) ;
272
+ const newPages = new Map < string , any [ ] > ( ) ;
273
+ for await ( const page of pageIterator ) {
274
+ if ( page . _response . status === 200 ) {
275
+ if ( page . etag ) {
276
+ newPages . set ( page . etag , page . items ) ;
277
+ }
278
+ } else if ( page . _response . status === 304 ) {
279
+ if ( page . etag ) {
280
+ // No change, keep the existing page
281
+ const existingPage = selector . pages ?. get ( page . etag ) ;
282
+ if ( existingPage ) {
283
+ newPages . set ( page . etag , existingPage ) ;
284
+ }
285
+ }
286
+ } else {
287
+ // TODO: any other cases? deletion?
288
+ }
289
+ }
290
+ selector . pages = newPages ;
291
+
292
+ for ( const page of selector . pages . values ( ) ) {
293
+ for ( const setting of page ) {
294
+ if ( isFeatureFlag ( setting ) ) {
295
+ featureFlagsMap . set ( setting . key , setting . value ) ;
296
+ }
260
297
}
261
298
}
262
299
}
0 commit comments