import type { ServerSettings, ServerSettingsPatch } from "@t3tools/contracts"; export interface ServerSettingsWriteQueue { readonly enqueue: (patch: ServerSettingsPatch) => void; readonly reset: () => void; readonly drain: () => Promise; } export function createServerSettingsWriteQueue(input: { readonly updateSettings: (patch: ServerSettingsPatch) => Promise; readonly applySettings: (settings: ServerSettings) => void; readonly onError: (error: unknown) => void; }): ServerSettingsWriteQueue { let queue: Promise = Promise.resolve(); return { enqueue: (patch) => { queue = queue .catch(() => undefined) .then(async () => { const settings = await input.updateSettings(patch); input.applySettings(settings); }) .catch(input.onError); }, reset: () => { queue = Promise.resolve(); }, drain: () => queue, }; }