fix(data): 串行化 AppData 同 key 保存

This commit is contained in:
Script Generator
2026-07-07 18:22:06 +08:00
parent 0054854158
commit f1e2fb0b99
2 changed files with 96 additions and 1 deletions

View File

@@ -36,6 +36,7 @@ const serverDataCache = new Map<ServerDataKey, {
loadedAt: number;
}>();
const serverDataLoadPromises = new Map<ServerDataKey, Promise<unknown | null>>();
const serverDataSaveQueues = new Map<ServerDataKey, Promise<void>>();
export const SERVER_DATA_CACHE_MS = 30_000;
export const SERVER_DATA_SAVE_ERROR_EVENT = 'ftb:server-data-save-error';
@@ -110,7 +111,20 @@ export async function loadServerData<T>(
return promise;
}
export async function saveServerData<T>(key: ServerDataKey, value: T): Promise<void> {
export function saveServerData<T>(key: ServerDataKey, value: T): Promise<void> {
const previousSave = serverDataSaveQueues.get(key) ?? Promise.resolve();
const save = previousSave.then(() => putServerData(key, value));
const queueTail = save.catch(() => undefined);
serverDataSaveQueues.set(key, queueTail);
void queueTail.then(() => {
if (serverDataSaveQueues.get(key) === queueTail) {
serverDataSaveQueues.delete(key);
}
});
return save;
}
async function putServerData<T>(key: ServerDataKey, value: T): Promise<void> {
const payload: { value: T; version?: string | null } = { value };
if (serverDataVersions.has(key)) {
payload.version = serverDataVersions.get(key) ?? null;