@@ -5,7 +5,7 @@ import { ConfigurationSetting, isSecretReference, parseSecretReference } from "@
55import { IKeyValueAdapter } from "../IKeyValueAdapter.js" ;
66import { KeyVaultOptions } from "./KeyVaultOptions.js" ;
77import { getUrlHost } from "../common/utils.js" ;
8- import { ArgumentError } from "../error.js" ;
8+ import { ArgumentError , KeyVaultReferenceError } from "../error.js" ;
99import { SecretClient , parseKeyVaultSecretIdentifier } from "@azure/keyvault-secrets" ;
1010
1111export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
@@ -29,21 +29,24 @@ export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
2929 throw new ArgumentError ( "Failed to process the key vault reference. The keyVaultOptions is not configured." ) ;
3030 }
3131
32- // precedence: secret clients > credential > secret resolver
3332 const { name : secretName , vaultUrl, sourceId, version } = parseKeyVaultSecretIdentifier (
3433 parseSecretReference ( setting ) . value . secretId
3534 ) ;
36-
37- const client = this . #getSecretClient( new URL ( vaultUrl ) ) ;
38- if ( client ) {
39- const secret = await client . getSecret ( secretName , { version } ) ;
40- return [ setting . key , secret . value ] ;
41- }
42-
43- if ( this . #keyVaultOptions. secretResolver ) {
44- return [ setting . key , await this . #keyVaultOptions. secretResolver ( new URL ( sourceId ) ) ] ;
35+ try {
36+ // precedence: secret clients > credential > secret resolver
37+ const client = this . #getSecretClient( new URL ( vaultUrl ) ) ;
38+ if ( client ) {
39+ const secret = await client . getSecret ( secretName , { version } ) ;
40+ return [ setting . key , secret . value ] ;
41+ }
42+ if ( this . #keyVaultOptions. secretResolver ) {
43+ return [ setting . key , await this . #keyVaultOptions. secretResolver ( new URL ( sourceId ) ) ] ;
44+ }
45+ } catch ( error ) {
46+ throw new KeyVaultReferenceError ( buildKeyVaultReferenceErrorMessage ( error . message , setting , sourceId ) ) ;
4547 }
4648
49+ // When code reaches here, it means that the key vault reference cannot be resolved in all possible ways.
4750 throw new ArgumentError ( "Failed to process the key vault reference. No key vault secret client, credential or secret resolver callback is configured." ) ;
4851 }
4952
@@ -75,3 +78,7 @@ export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter {
7578 return undefined ;
7679 }
7780}
81+
82+ function buildKeyVaultReferenceErrorMessage ( message : string , setting : ConfigurationSetting , secretIdentifier ?: string ) : string {
83+ return `${ message } Key: ${ setting . key } Label: ${ setting . label ?? "" } ETag: ${ setting . etag ?? "" } SecretIdentifier: ${ secretIdentifier ?? "" } ` ;
84+ }
0 commit comments