Merge pull request #2445 from Risenafis/fix-initvoicemap Prevent concurrent execution of initVoiceMap

cee304fe29e8b599230970c8001719802b19c555

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
1 files changed, +32 -1Ignore whitespace
public/scripts/extensions/tts/index.js+32 -1
@@ -1,4 +1,4 @@
1import { cancelTtsPlay, eventSource, event_types, isStreamingEnabled, name2, saveSettingsDebounced, substituteParams } from '../../../script.js';1import { cancelTtsPlay, eventSource, event_types, getCurrentChatId, isStreamingEnabled, name2, saveSettingsDebounced, substituteParams } from '../../../script.js';
2import { ModuleWorkerWrapper, doExtrasFetch, extension_settings, getApiUrl, getContext, modules, renderExtensionTemplateAsync } from '../../extensions.js';2import { ModuleWorkerWrapper, doExtrasFetch, extension_settings, getApiUrl, getContext, modules, renderExtensionTemplateAsync } from '../../extensions.js';
3import { delay, escapeRegex, getBase64Async, getStringHash, onlyUnique } from '../../utils.js';3import { delay, escapeRegex, getBase64Async, getStringHash, onlyUnique } from '../../utils.js';
4import { EdgeTtsProvider } from './edge.js';4import { EdgeTtsProvider } from './edge.js';
@@ -35,6 +35,7 @@ let lastMessage = null;
35let lastMessageHash = null;35let lastMessageHash = null;
36let periodicMessageGenerationTimer = null;36let periodicMessageGenerationTimer = null;
37let lastPositionOfParagraphEnd = -1;37let lastPositionOfParagraphEnd = -1;
38let currentInitVoiceMapPromise = null;
3839
39const DEFAULT_VOICE_MARKER = '[Default Voice]';40const DEFAULT_VOICE_MARKER = '[Default Voice]';
40const DISABLED_VOICE_MARKER = 'disabled';41const DISABLED_VOICE_MARKER = 'disabled';
@@ -1010,9 +1011,39 @@ class VoiceMapEntry {
10101011
1011/**1012/**
1012 * Init voiceMapEntries for character select list.1013 * 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.
1013 * @param {boolean} unrestricted - If true, will include all characters in voiceMapEntries, even if they are not in the current chat.1015 * @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.
1014 */1017 */
1015export async function initVoiceMap(unrestricted = false) {1018export async function initVoiceMap(unrestricted = false) {
1019 // Preventing parallel execution
1020 if (currentInitVoiceMapPromise) {
1021 return currentInitVoiceMapPromise;
1022 }
1023
1024 currentInitVoiceMapPromise = (async () => {
1025 const initialChatId = getCurrentChatId();
1026 try {
1027 await initVoiceMapInternal(unrestricted);
1028 } finally {
1029 currentInitVoiceMapPromise = null;
1030 }
1031 const currentChatId = getCurrentChatId();
1032
1033 if (initialChatId !== currentChatId) {
1034 // Chat changed during initialization, reinitialize
1035 await initVoiceMap(unrestricted);
1036 }
1037 })();
1038
1039 return currentInitVoiceMapPromise;
1040}
1041
1042/**
1043 * Init voiceMapEntries for character select list.
1044 * @param {boolean} unrestricted - If true, will include all characters in voiceMapEntries, even if they are not in the current chat.
1045 */
1046async function initVoiceMapInternal(unrestricted) {
1016 // Gate initialization if not enabled or TTS Provider not ready. Prevents error popups.1047 // Gate initialization if not enabled or TTS Provider not ready. Prevents error popups.
1017 const enabled = $('#tts_enabled').is(':checked');1048 const enabled = $('#tts_enabled').is(':checked');
1018 if (!enabled) {1049 if (!enabled) {