diff --git a/src/appConfigurationImpl.ts b/src/appConfigurationImpl.ts index a2ab128..42cebc5 100644 --- a/src/appConfigurationImpl.ts +++ b/src/appConfigurationImpl.ts @@ -98,18 +98,18 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { #sentinels: Map = new Map(); #watchAll: boolean = false; #kvRefreshInterval: number = DEFAULT_REFRESH_INTERVAL_IN_MS; - #kvRefreshTimer: RefreshTimer; + #kvRefreshTimer: RefreshTimer | undefined = undefined; // Feature flags #featureFlagEnabled: boolean = false; #featureFlagRefreshEnabled: boolean = false; #ffRefreshInterval: number = DEFAULT_REFRESH_INTERVAL_IN_MS; - #ffRefreshTimer: RefreshTimer; + #ffRefreshTimer: RefreshTimer | undefined = undefined; // Key Vault references #secretRefreshEnabled: boolean = false; #secretReferences: ConfigurationSetting[] = []; // cached key vault references - #secretRefreshTimer: RefreshTimer; + #secretRefreshTimer: RefreshTimer | undefined = undefined; #resolveSecretsInParallel: boolean = false; /** @@ -126,7 +126,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { constructor( clientManager: ConfigurationClientManager, - options: AzureAppConfigurationOptions | undefined, + options?: AzureAppConfigurationOptions, ) { this.#options = options; this.#clientManager = clientManager; @@ -415,7 +415,8 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { postAttempts += 1; backoffDuration = getExponentialBackoffDuration(postAttempts); } - console.warn(`Failed to load. Error message: ${error.message}. Retrying in ${backoffDuration} ms.`); + const errorMessage = error instanceof Error ? error.message : String(error); + console.warn(`Failed to load. Error message: ${errorMessage}. Retrying in ${backoffDuration} ms.`); await new Promise(resolve => setTimeout(resolve, backoffDuration)); } } while (!abortSignal.aborted); @@ -690,7 +691,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { */ async #refreshFeatureFlags(): Promise { // if still within refresh interval/backoff, return - if (this.#ffRefreshInterval === undefined || !this.#ffRefreshTimer.canRefresh()) { + if (this.#ffRefreshInterval === undefined || !this.#ffRefreshTimer!.canRefresh()) { return Promise.resolve(false); } @@ -699,7 +700,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { await this.#loadFeatureFlags(); } - this.#ffRefreshTimer.reset(); + this.#ffRefreshTimer!.reset(); return Promise.resolve(needRefresh); } @@ -728,7 +729,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { * @returns true if key-value collection has changed, false otherwise. */ async #checkConfigurationSettingsChange(selectors: PagedSettingsWatcher[]): Promise { - const funcToExecute = async (client) => { + const funcToExecute = async (client: AppConfigurationClient) => { for (const selector of selectors) { if (selector.snapshotName) { // skip snapshot selector continue; @@ -765,7 +766,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { * Gets a configuration setting by key and label.If the setting is not found, return undefine instead of throwing an error. */ async #getConfigurationSetting(configurationSettingId: ConfigurationSettingId, getOptions?: GetConfigurationSettingOptions): Promise { - const funcToExecute = async (client) => { + const funcToExecute = async (client: AppConfigurationClient) => { return getConfigurationSettingWithTrace( this.#requestTraceOptions, client, @@ -788,7 +789,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { } async #listConfigurationSettings(listOptions: ListConfigurationSettingsOptions): Promise<{ items: ConfigurationSetting[]; pageWatchers: SettingWatcher[] }> { - const funcToExecute = async (client) => { + const funcToExecute = async (client: AppConfigurationClient) => { const pageWatchers: SettingWatcher[] = []; const pageIterator = listConfigurationSettingsWithTrace( this.#requestTraceOptions, @@ -808,7 +809,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { } async #getSnapshot(snapshotName: string, getOptions?: GetSnapshotOptions): Promise { - const funcToExecute = async (client) => { + const funcToExecute = async (client: AppConfigurationClient) => { return getSnapshotWithTrace( this.#requestTraceOptions, client, @@ -831,7 +832,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { } async #listConfigurationSettingsForSnapshot(snapshotName: string, listOptions?: ListConfigurationSettingsForSnapshotOptions): Promise { - const funcToExecute = async (client) => { + const funcToExecute = async (client: AppConfigurationClient) => { const pageIterator = listConfigurationSettingsForSnapshotWithTrace( this.#requestTraceOptions, client, diff --git a/src/common/contentType.ts b/src/common/contentType.ts index 4891f42..829cc45 100644 --- a/src/common/contentType.ts +++ b/src/common/contentType.ts @@ -8,7 +8,7 @@ export type ContentType = { parameters: Record; } -export function parseContentType(contentTypeValue: string | undefined): ContentType | undefined { +export function parseContentType(contentTypeValue?: string): ContentType | undefined { if (!contentTypeValue) { return undefined; } @@ -27,7 +27,7 @@ export function parseContentType(contentTypeValue: string | undefined): ContentT // Determine whether a content type string is a valid JSON content type. // https://docs.microsoft.com/en-us/azure/azure-app-configuration/howto-leverage-json-content-type -export function isJsonContentType(contentType: ContentType | undefined): boolean { +export function isJsonContentType(contentType?: ContentType): boolean { const mediaType = contentType?.mediaType; if (!mediaType) { return false; @@ -45,7 +45,7 @@ export function isJsonContentType(contentType: ContentType | undefined): boolean return typeParts[1].split("+").includes("json"); } -export function isFeatureFlagContentType(contentType: ContentType | undefined): boolean { +export function isFeatureFlagContentType(contentType?: ContentType): boolean { const mediaType = contentType?.mediaType; if (!mediaType) { return false; @@ -53,7 +53,7 @@ export function isFeatureFlagContentType(contentType: ContentType | undefined): return mediaType === featureFlagContentType; } -export function isSecretReferenceContentType(contentType: ContentType | undefined): boolean { +export function isSecretReferenceContentType(contentType?: ContentType): boolean { const mediaType = contentType?.mediaType; if (!mediaType) { return false; diff --git a/src/keyvault/keyVaultKeyValueAdapter.ts b/src/keyvault/keyVaultKeyValueAdapter.ts index e16fbd2..2e8eb4d 100644 --- a/src/keyvault/keyVaultKeyValueAdapter.ts +++ b/src/keyvault/keyVaultKeyValueAdapter.ts @@ -16,7 +16,7 @@ export class AzureKeyVaultKeyValueAdapter implements IKeyValueAdapter { #keyVaultOptions: KeyVaultOptions | undefined; #keyVaultSecretProvider: AzureKeyVaultSecretProvider; - constructor(keyVaultOptions: KeyVaultOptions | undefined, refreshTimer?: RefreshTimer) { + constructor(keyVaultOptions?: KeyVaultOptions, refreshTimer?: RefreshTimer) { this.#keyVaultOptions = keyVaultOptions; this.#keyVaultSecretProvider = new AzureKeyVaultSecretProvider(keyVaultOptions, refreshTimer); } diff --git a/src/keyvault/keyVaultSecretProvider.ts b/src/keyvault/keyVaultSecretProvider.ts index 2d5e113..fa3d825 100644 --- a/src/keyvault/keyVaultSecretProvider.ts +++ b/src/keyvault/keyVaultSecretProvider.ts @@ -14,7 +14,7 @@ export class AzureKeyVaultSecretProvider { #secretClients: Map; // map key vault hostname to corresponding secret client #cachedSecretValues: Map = new Map(); // map secret identifier to secret value - constructor(keyVaultOptions: KeyVaultOptions | undefined, refreshTimer?: RefreshTimer) { + constructor(keyVaultOptions?: KeyVaultOptions, refreshTimer?: RefreshTimer) { if (keyVaultOptions?.secretRefreshIntervalInMs !== undefined) { if (refreshTimer === undefined) { throw new ArgumentError("Refresh timer must be specified when Key Vault secret refresh is enabled.");