diff --git a/src/appConfigurationImpl.ts b/src/appConfigurationImpl.ts index 7f8fbdf0..af9c82ba 100644 --- a/src/appConfigurationImpl.ts +++ b/src/appConfigurationImpl.ts @@ -482,7 +482,9 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { async #loadConfigurationSettings(loadFeatureFlag: boolean = false): Promise { const selectors = loadFeatureFlag ? this.#ffSelectors : this.#kvSelectors; const funcToExecute = async (client) => { - const loadedSettings: ConfigurationSetting[] = []; + // Use a Map to deduplicate configuration settings by key. When multiple selectors return settings with the same key, + // the configuration setting loaded by the later selector in the iteration order will override the one from the earlier selector. + const loadedSettings: Map = new Map(); // deep copy selectors to avoid modification if current client fails const selectorsToUpdate = JSON.parse( JSON.stringify(selectors) @@ -506,7 +508,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { pageEtags.push(page.etag ?? ""); for (const setting of page.items) { if (loadFeatureFlag === isFeatureFlag(setting)) { - loadedSettings.push(setting); + loadedSettings.set(setting.key, setting); } } } @@ -528,7 +530,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { for await (const page of pageIterator) { for (const setting of page.items) { if (loadFeatureFlag === isFeatureFlag(setting)) { - loadedSettings.push(setting); + loadedSettings.set(setting.key, setting); } } } @@ -540,7 +542,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { } else { this.#kvSelectors = selectorsToUpdate; } - return loadedSettings; + return Array.from(loadedSettings.values()); }; return await this.#executeWithFailoverPolicy(funcToExecute) as ConfigurationSetting[];