prevent parallel execution of initVoiceMap

26d506874f5e6ce8c74809b2478c9ee2b69cdce7

Risenafis <reverse.hierarchy@gmail.com>

Signed
1 files changed, +25 -0Showing whitespace changes
public/scripts/extensions/tts/index.js+25 -0
@@ -35,6 +35,7 @@ let lastMessage = null;
3535let lastMessageHash = null;
3636let periodicMessageGenerationTimer = null;
3737let lastPositionOfParagraphEnd = -1;
38+let currentInitVoiceMapPromise = null;
3839
3940const DEFAULT_VOICE_MARKER = '[Default Voice]';
4041const DISABLED_VOICE_MARKER = 'disabled';
@@ -1010,9 +1011,33 @@ class VoiceMapEntry {
10101011
10111012/**
10121013 * Init voiceMapEntries for character select list.
1014+ * If an initialization is already in progress, it returns the existing Promise instead of starting a new one.
10131015 * @param {boolean} unrestricted - If true, will include all characters in voiceMapEntries, even if they are not in the current chat.
1016+ * @returns {Promise} A promise that resolves when the initialization is complete.
10141017 */
10151018export async function initVoiceMap(unrestricted = false) {
1019+ // Preventing parallel execution
1020+ if (currentInitVoiceMapPromise) {
1021+ return currentInitVoiceMapPromise;
1022+ }
1023+
1024+ currentInitVoiceMapPromise = (async () => {
1025+ try {
1026+ await initVoiceMapInternal(unrestricted);
1027+ } finally {
1028+ currentInitVoiceMapPromise = null;
1029+ }
1030+ })();
1031+
1032+ return currentInitVoiceMapPromise;
1033+}
1034+
1035+/**
1036+ * Init voiceMapEntries for character select list.
1037+ * @param {boolean} unrestricted - If true, will include all characters in voiceMapEntries, even if they are not in the current chat.
1038+ */
1039+async function initVoiceMapInternal(unrestricted) {
1040+
10161041 // Gate initialization if not enabled or TTS Provider not ready. Prevents error popups.
10171042 const enabled = $('#tts_enabled').is(':checked');
10181043 if (!enabled) {