Await settings event handlers

This commit is contained in:
Andras Schmelczer 2025-11-29 14:48:42 +00:00
commit b595a060a7

View file

@ -1,4 +1,5 @@
import type { Logger } from "../tracing/logger"; import type { Logger } from "../tracing/logger";
import { awaitAll } from "../utils/await-all";
export interface SyncSettings { export interface SyncSettings {
remoteUri: string; remoteUri: string;
@ -36,7 +37,7 @@ export class Settings {
private readonly onSettingsChangeHandlers: (( private readonly onSettingsChangeHandlers: ((
newSettings: SyncSettings, newSettings: SyncSettings,
oldSettings: SyncSettings oldSettings: SyncSettings
) => unknown)[] = []; ) => Promise<unknown> | unknown)[] = [];
public constructor( public constructor(
private readonly logger: Logger, private readonly logger: Logger,
@ -76,22 +77,29 @@ export class Settings {
key: T, key: T,
value: SyncSettings[T] value: SyncSettings[T]
): Promise<void> { ): Promise<void> {
this.logger.debug(`Setting '${key}' to '${value}'`);
await this.setSettings({ await this.setSettings({
[key]: value [key]: value
}); });
} }
public async setSettings(value: Partial<SyncSettings>): Promise<void> { public async setSettings(value: Partial<SyncSettings>): Promise<void> {
this.logger.debug(`Updating settings with: ${JSON.stringify(value)}`);
const oldSettings = this.settings; const oldSettings = this.settings;
this.settings = { this.settings = {
...this.settings, ...this.settings,
...value ...value
}; };
this.onSettingsChangeHandlers.forEach((handler) => { await awaitAll(
handler(this.settings, oldSettings); this.onSettingsChangeHandlers
}); .map((handler) => {
return handler(this.settings, oldSettings);
})
.filter((result): result is Promise<unknown> => {
return result instanceof Promise;
})
);
await this.save(); await this.save();
} }