Add lock on settings

This commit is contained in:
Andras Schmelczer 2025-11-30 14:42:50 +00:00
parent 3517af1461
commit 39860f7f04

View file

@ -1,5 +1,6 @@
import type { Logger } from "../tracing/logger"; import type { Logger } from "../tracing/logger";
import { awaitAll } from "../utils/await-all"; import { awaitAll } from "../utils/await-all";
import { Lock } from "../utils/data-structures/locks";
export interface SyncSettings { export interface SyncSettings {
remoteUri: string; remoteUri: string;
@ -33,6 +34,7 @@ export const DEFAULT_SETTINGS: SyncSettings = {
export class Settings { export class Settings {
private settings: SyncSettings; private settings: SyncSettings;
private readonly lock: Lock = new Lock();
private readonly onSettingsChangeHandlers: (( private readonly onSettingsChangeHandlers: ((
newSettings: SyncSettings, newSettings: SyncSettings,
@ -83,24 +85,26 @@ export class Settings {
} }
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)}`); await this.lock.withLock(async () => {
const oldSettings = this.settings; this.logger.debug(`Updating settings with: ${JSON.stringify(value)}`);
this.settings = { const oldSettings = this.settings;
...this.settings, this.settings = {
...value ...this.settings,
}; ...value
};
await awaitAll( await awaitAll(
this.onSettingsChangeHandlers this.onSettingsChangeHandlers
.map((handler) => { .map((handler) => {
return handler(this.settings, oldSettings); return handler(this.settings, oldSettings);
}) })
.filter((result): result is Promise<unknown> => { .filter((result): result is Promise<unknown> => {
return result instanceof Promise; return result instanceof Promise;
}) })
); );
await this.save(); await this.save();
});
} }
private async save(): Promise<void> { private async save(): Promise<void> {