From 4595c29c151ae8b0c104f96e70917cd15ff29810 Mon Sep 17 00:00:00 2001 From: Archangel Date: Fri, 31 Jan 2025 01:16:30 +0100 Subject: [PATCH] Add safeguard to prevent a call to save the profile from happening if a save is already underway --- project/src/servers/SaveServer.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/project/src/servers/SaveServer.ts b/project/src/servers/SaveServer.ts index 715568b2..1fa97c5d 100644 --- a/project/src/servers/SaveServer.ts +++ b/project/src/servers/SaveServer.ts @@ -15,6 +15,7 @@ import { inject, injectAll, injectable } from "tsyringe"; export class SaveServer { protected profileFilepath = "user/profiles/"; protected profiles: Map = new Map(); + protected profilesBeingSaved: Set = new Set(); protected onBeforeSaveCallbacks: Map Promise> = new Map(); protected saveSHA1: { [key: string]: string } = {}; @@ -184,6 +185,12 @@ export class SaveServer { throw new Error(`Profile ${sessionID} does not exist! Unable to save this profile!`); } + if (this.profilesBeingSaved.has(sessionID)) { + throw new Error(`Profile ${sessionID} is already being saved!`); + } + + this.profilesBeingSaved.add(sessionID); + const filePath = `${this.profileFilepath}${sessionID}.json`; // Run pre-save callbacks before we save into json @@ -201,12 +208,16 @@ export class SaveServer { this.profiles.get(sessionID), !this.configServer.getConfig(ConfigTypes.CORE).features.compressProfile, ); + const sha1 = await this.hashUtil.generateSha1ForDataAsync(jsonProfile); + if (typeof this.saveSHA1[sessionID] !== "string" || this.saveSHA1[sessionID] !== sha1) { this.saveSHA1[sessionID] = sha1; // save profile to disk await this.fileSystem.write(filePath, jsonProfile); } + + this.profilesBeingSaved.delete(sessionID); } /**