Skip to content

Commit bf3d971

Browse files
refresh secrets in parallel
1 parent 2a8df74 commit bf3d971

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

src/AzureAppConfigurationImpl.ts

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -517,29 +517,22 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
517517
this.#aiConfigurationTracing.reset();
518518
}
519519

520-
const secretResolutionPromises: Promise<void>[] = [];
521520
for (const setting of loadedSettings) {
522521
if (isSecretReference(setting)) {
523-
if (this.#secretRefreshEnabled) {
524-
this.#secretReferences.push(setting);
525-
}
522+
this.#secretReferences.push(setting); // cache secret references for resolve/refresh secret separately
526523
if (this.#resolveSecretInParallel) {
527-
// secret references are resolved asynchronously to improve performance
528-
const secretResolutionPromise = this.#processKeyValue(setting)
529-
.then(([key, value]) => {
530-
keyValues.push([key, value]);
531-
});
532-
secretResolutionPromises.push(secretResolutionPromise);
533524
continue;
534525
}
535526
}
536527
// adapt configuration settings to key-values
537528
const [key, value] = await this.#processKeyValue(setting);
538529
keyValues.push([key, value]);
539530
}
540-
if (secretResolutionPromises.length > 0) {
541-
// wait for all secret resolution promises to be resolved
542-
await Promise.all(secretResolutionPromises);
531+
532+
if (this.#resolveSecretInParallel) {
533+
await this.#resolveSecretsInParallel(this.#secretReferences, (key, value) => {
534+
keyValues.push([key, value]);
535+
});
543536
}
544537

545538
this.#clearLoadedKeyValues(); // clear existing key-values in case of configuration setting deletion
@@ -666,9 +659,20 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
666659
return Promise.resolve(false);
667660
}
668661

669-
for (const setting of this.#secretReferences) {
670-
const [key, value] = await this.#processKeyValue(setting);
671-
this.#configMap.set(key, value);
662+
// if no cached key vault references, return
663+
if (this.#secretReferences.length === 0) {
664+
return Promise.resolve(false);
665+
}
666+
667+
if (this.#resolveSecretInParallel) {
668+
await this.#resolveSecretsInParallel(this.#secretReferences, (key, value) => {
669+
this.#configMap.set(key, value);
670+
});
671+
} else {
672+
for (const setting of this.#secretReferences) {
673+
const [key, value] = await this.#processKeyValue(setting);
674+
this.#configMap.set(key, value);
675+
}
672676
}
673677

674678
this.#secretRefreshTimer.reset();
@@ -777,6 +781,24 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
777781
throw new Error("All fallback clients failed to get configuration settings.");
778782
}
779783

784+
async #resolveSecretsInParallel(secretReferences: ConfigurationSetting[], resultHandler: (key: string, value: unknown) => void): Promise<void> {
785+
if (secretReferences.length === 0) {
786+
return;
787+
}
788+
789+
const secretResolutionPromises: Promise<void>[] = [];
790+
for (const setting of secretReferences) {
791+
const secretResolutionPromise = this.#processKeyValue(setting)
792+
.then(([key, value]) => {
793+
resultHandler(key, value);
794+
});
795+
secretResolutionPromises.push(secretResolutionPromise);
796+
}
797+
798+
// Wait for all secret resolution promises to be resolved
799+
await Promise.all(secretResolutionPromises);
800+
}
801+
780802
async #processKeyValue(setting: ConfigurationSetting<string>): Promise<[string, unknown]> {
781803
this.#setAIConfigurationTracing(setting);
782804

0 commit comments

Comments
 (0)