diff --git a/package-lock.json b/package-lock.json index 0a2d958c..fb02de33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,7 @@ "vue-router": "^4.6.4", "vue-showdown": "^4.2.0", "vue-sonner": "^2.0.9", - "worker-timers": "^8.0.30", + "worker-timers": "^8.0.31", "yargs": "^18.0.0", "zod": "^3.25.76" }, @@ -530,9 +530,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "dev": true, "license": "MIT", "engines": { @@ -5267,16 +5267,16 @@ } }, "node_modules/broker-factory": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz", - "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==", + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.14.tgz", + "integrity": "sha512-L45k5HMbPIrMid0nTOZ/UPXG/c0aRuQKVrSDFIb1zOkvfiyHgYmIjc3cSiN1KwQIvRDOtKE0tfb3I9EZ3CmpQQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", - "fast-unique-numbers": "^9.0.26", + "@babel/runtime": "^7.29.2", + "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1", - "worker-factory": "^7.0.48" + "worker-factory": "^7.0.49" } }, "node_modules/broker-factory/node_modules/tslib": { @@ -7343,13 +7343,13 @@ "license": "MIT" }, "node_modules/fast-unique-numbers": { - "version": "9.0.26", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz", - "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==", + "version": "9.0.27", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.27.tgz", + "integrity": "sha512-nDA9ADeINN8SA2u2wCtU+siWFTTDqQR37XvgPIDDmboWQeExz7X0mImxuaN+kJddliIqy2FpVRmnvRZ+j8i1/A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", + "@babel/runtime": "^7.29.2", "tslib": "^2.8.1" }, "engines": { @@ -12364,14 +12364,14 @@ } }, "node_modules/worker-factory": { - "version": "7.0.48", - "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz", - "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==", + "version": "7.0.49", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.49.tgz", + "integrity": "sha512-lW7tpgy6aUv2dFsQhv1yv+XFzdkCf/leoKRTGMPVK5/die6RrUjqgJHJf556qO+ZfytNG6wPXc17E8zzsOLUDw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", - "fast-unique-numbers": "^9.0.26", + "@babel/runtime": "^7.29.2", + "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1" } }, @@ -12383,30 +12383,30 @@ "license": "0BSD" }, "node_modules/worker-timers": { - "version": "8.0.30", - "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.30.tgz", - "integrity": "sha512-8P7YoMHWN0Tz7mg+9oEhuZdjBIn2z6gfjlJqFcHiDd9no/oLnMGCARCDkV1LR3ccQus62ZdtIp7t3aTKrMLHOg==", + "version": "8.0.31", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.31.tgz", + "integrity": "sha512-ngkq5S6JuZyztom8tDgBzorLo9byhBMko/sXfgiUD945AuzKGg1GCgDMCC3NaYkicLpGKXutONM36wEX8UbBCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", + "@babel/runtime": "^7.29.2", "tslib": "^2.8.1", - "worker-timers-broker": "^8.0.15", - "worker-timers-worker": "^9.0.13" + "worker-timers-broker": "^8.0.16", + "worker-timers-worker": "^9.0.14" } }, "node_modules/worker-timers-broker": { - "version": "8.0.15", - "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz", - "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==", + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.16.tgz", + "integrity": "sha512-JyP3AvUGyPGbBGW7XiUewm2+0pN/aYo1QpVf5kdXAfkDZcN3p7NbWrG6XnyDEpDIvfHk/+LCnOW/NsuiU9riYA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", - "broker-factory": "^3.1.13", - "fast-unique-numbers": "^9.0.26", + "@babel/runtime": "^7.29.2", + "broker-factory": "^3.1.14", + "fast-unique-numbers": "^9.0.27", "tslib": "^2.8.1", - "worker-timers-worker": "^9.0.13" + "worker-timers-worker": "^9.0.14" } }, "node_modules/worker-timers-broker/node_modules/tslib": { @@ -12417,15 +12417,15 @@ "license": "0BSD" }, "node_modules/worker-timers-worker": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz", - "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.14.tgz", + "integrity": "sha512-/qF06C60sXmSLfUl7WglvrDIbspmPOM8UrG63Dnn4bi2x4/DfqHS/+dxF5B+MdHnYO5tVuZYLHdAodrKdabTIg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.6", + "@babel/runtime": "^7.29.2", "tslib": "^2.8.1", - "worker-factory": "^7.0.48" + "worker-factory": "^7.0.49" } }, "node_modules/worker-timers-worker/node_modules/tslib": { diff --git a/package.json b/package.json index b05f4d0a..84498142 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "vue-router": "^4.6.4", "vue-showdown": "^4.2.0", "vue-sonner": "^2.0.9", - "worker-timers": "^8.0.30", + "worker-timers": "^8.0.31", "yargs": "^18.0.0", "zod": "^3.25.76" }, diff --git a/src/stores/auth.js b/src/stores/auth.js index e8099880..9c0e07b5 100644 --- a/src/stores/auth.js +++ b/src/stores/auth.js @@ -839,7 +839,8 @@ export const useAuthStore = defineStore('Auth', () => { */ async function loginComplete() { await database.initUserTables(userStore.currentUser.id); - advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id); + // [Disabled] Avatar DB log auto-cleanup on login + // advancedSettingsStore.runAvatarAutoCleanup(userStore.currentUser.id); watchState.isLoggedIn = true; AppApi.CheckGameRunning(); // restore state from hot-reload } diff --git a/src/stores/settings/advanced.js b/src/stores/settings/advanced.js index 73e36282..54510223 100644 --- a/src/stores/settings/advanced.js +++ b/src/stores/settings/advanced.js @@ -529,100 +529,103 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => { ); } - async function setAvatarAutoCleanup(value) { - avatarAutoCleanup.value = value; - await configRepository.setString('VRCX_avatarAutoCleanup', value); - } + // [Disabled] Avatar DB log cleanup - setAvatarAutoCleanup + // async function setAvatarAutoCleanup(value) { + // avatarAutoCleanup.value = value; + // await configRepository.setString('VRCX_avatarAutoCleanup', value); + // } - /** - * @param {number|null} days - Number of days to keep. Null means delete all. - */ - async function purgeAvatarFeedData(days) { - let cutoffDate = null; - if (days !== null) { - const cutoff = new Date(); - cutoff.setDate(cutoff.getDate() - days); - cutoffDate = cutoff.toJSON(); - } + // /** + // * @param {number|null} days - Number of days to keep. Null means delete all. + // */ + // [Disabled] Avatar DB log cleanup - purgeAvatarFeedData + // async function purgeAvatarFeedData(days) { + // let cutoffDate = null; + // if (days !== null) { + // const cutoff = new Date(); + // cutoff.setDate(cutoff.getDate() - days); + // cutoffDate = cutoff.toJSON(); + // } + // + // purgeInProgress.value = true; + // const msgBox = toast.warning( + // t( + // 'view.settings.advanced.advanced.database_cleanup.purge_in_progress' + // ), + // { duration: Infinity } + // ); + // + // try { + // await database.purgeAvatarFeedData(cutoffDate); + // await database.vacuum(); + // toast.dismiss(msgBox); + // toast.success( + // t( + // 'view.settings.advanced.advanced.database_cleanup.purge_complete' + // ) + // ); + // // Brief delay before restart to show success message + // await new Promise((resolve) => + // setTimeout(resolve, 1500) + // ); + // VRCXUpdaterStore.restartVRCX(false); + // } catch (err) { + // console.error(err); + // toast.dismiss(msgBox); + // toast.error(t('view.settings.advanced.advanced.database_cleanup.purge_failed', { error: err })); + // } finally { + // purgeInProgress.value = false; + // } + // } - purgeInProgress.value = true; - const msgBox = toast.warning( - t( - 'view.settings.advanced.advanced.database_cleanup.purge_in_progress' - ), - { duration: Infinity } - ); - - try { - await database.purgeAvatarFeedData(cutoffDate); - await database.vacuum(); - toast.dismiss(msgBox); - toast.success( - t( - 'view.settings.advanced.advanced.database_cleanup.purge_complete' - ) - ); - // Brief delay before restart to show success message - await new Promise((resolve) => - setTimeout(resolve, 1500) - ); - VRCXUpdaterStore.restartVRCX(false); - } catch (err) { - console.error(err); - toast.dismiss(msgBox); - toast.error(t('view.settings.advanced.advanced.database_cleanup.purge_failed', { error: err })); - } finally { - purgeInProgress.value = false; - } - } - - /** - * Run auto-cleanup on startup if configured and enough time has passed. - * Reads config directly from configRepository to avoid race condition - * with initAdvancedSettings not having completed yet. - * @param {string} userId - Current user ID for per-user cleanup tracking. - */ - async function runAvatarAutoCleanup(userId) { - const cleanupSetting = await configRepository.getString( - 'VRCX_avatarAutoCleanup', - 'Off' - ); - if (cleanupSetting === 'Off') return; - - const configKey = `VRCX_lastAvatarCleanupDate_${userId}`; - const lastCleanupStr = await configRepository.getString( - configKey, - '' - ); - const now = new Date(); - - if (lastCleanupStr) { - const lastCleanup = new Date(lastCleanupStr); - const daysSinceLastCleanup = - (now - lastCleanup) / (1000 * 60 * 60 * 24); - if (daysSinceLastCleanup < 7) return; - } - - const days = parseInt(cleanupSetting, 10); - if (isNaN(days) || days <= 0) return; - - const cutoff = new Date(); - cutoff.setDate(cutoff.getDate() - days); - const cutoffDate = cutoff.toJSON(); - - try { - await database.purgeAvatarFeedData(cutoffDate); - await configRepository.setString( - configKey, - now.toJSON() - ); - console.log( - `Auto-cleaned avatar feed data older than ${days} days` - ); - } catch (err) { - console.error('Avatar auto-cleanup failed:', err); - } - } + // /** + // * Run auto-cleanup on startup if configured and enough time has passed. + // * Reads config directly from configRepository to avoid race condition + // * with initAdvancedSettings not having completed yet. + // * @param {string} userId - Current user ID for per-user cleanup tracking. + // */ + // [Disabled] Avatar DB log cleanup - runAvatarAutoCleanup + // async function runAvatarAutoCleanup(userId) { + // const cleanupSetting = await configRepository.getString( + // 'VRCX_avatarAutoCleanup', + // 'Off' + // ); + // if (cleanupSetting === 'Off') return; + // + // const configKey = `VRCX_lastAvatarCleanupDate_${userId}`; + // const lastCleanupStr = await configRepository.getString( + // configKey, + // '' + // ); + // const now = new Date(); + // + // if (lastCleanupStr) { + // const lastCleanup = new Date(lastCleanupStr); + // const daysSinceLastCleanup = + // (now - lastCleanup) / (1000 * 60 * 60 * 24); + // if (daysSinceLastCleanup < 7) return; + // } + // + // const days = parseInt(cleanupSetting, 10); + // if (isNaN(days) || days <= 0) return; + // + // const cutoff = new Date(); + // cutoff.setDate(cutoff.getDate() - days); + // const cutoffDate = cutoff.toJSON(); + // + // try { + // await database.purgeAvatarFeedData(cutoffDate); + // await configRepository.setString( + // configKey, + // now.toJSON() + // ); + // console.log( + // `Auto-cleaned avatar feed data older than ${days} days` + // ); + // } catch (err) { + // console.error('Avatar auto-cleanup failed:', err); + // } + // } async function setSaveInstanceEmoji() { saveInstanceEmoji.value = !saveInstanceEmoji.value; @@ -1171,9 +1174,10 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => { setProgressPieFilter, setShowConfirmationOnSwitchAvatar, setGameLogDisabled, - setAvatarAutoCleanup, - purgeAvatarFeedData, - runAvatarAutoCleanup, + // [Disabled] Avatar DB log cleanup exports + // setAvatarAutoCleanup, + // purgeAvatarFeedData, + // runAvatarAutoCleanup, setUGCFolderPath, cropPrintsChanged, setAutoDeleteOldPrints, diff --git a/src/views/Settings/components/Tabs/AdvancedTab.vue b/src/views/Settings/components/Tabs/AdvancedTab.vue index 645707c0..48e94888 100644 --- a/src/views/Settings/components/Tabs/AdvancedTab.vue +++ b/src/views/Settings/components/Tabs/AdvancedTab.vue @@ -165,6 +165,7 @@ {{ t('view.settings.advanced.advanced.sqlite_table_size.event') }} + + @@ -294,13 +298,16 @@