perf(obsidian): add caching to vault file scanning

The recursive directory scan was running every time the user opened
the note browser, rescanning 13k+ files repeatedly. This was slow
and wasteful.

Changes:
- Add vaultFilesCache object with files, timestamp, and TTL (5 min)
- Check cache before scanning in getVaultFiles()
- Cache results after successful scan
- Add clearVaultCache() function for manual refresh
- Add forceRefresh parameter to bypass cache
- Log cache hits vs misses for debugging

Performance:
- First load: Scans vault (slow, but only once)
- Subsequent loads: Instant (uses cache)
- Cache expires after 5 minutes (auto-refresh)
- User can manually clear cache if needed

This makes opening the note browser instant on subsequent uses.
This commit is contained in:
Claude 2025-11-14 05:23:45 +00:00
parent 91bd678535
commit a22b40e7ca
No known key found for this signature in database

View file

@ -13,6 +13,13 @@ const ObsidianBridge = (() => {
vaultName: ""
};
// Cache for vault file list
let vaultFilesCache = {
files: null,
timestamp: null,
ttl: 5 * 60 * 1000 // 5 minutes cache
};
// Initialize from localStorage
function init() {
const stored = localStorage.getItem("obsidianConfig");
@ -94,19 +101,42 @@ const ObsidianBridge = (() => {
return mdFiles;
}
// Get all markdown files from vault (recursively)
async function getVaultFiles() {
// Clear the vault files cache
function clearVaultCache() {
vaultFilesCache.files = null;
vaultFilesCache.timestamp = null;
INFO && console.log("Vault file cache cleared");
}
// Get all markdown files from vault (recursively, with caching)
async function getVaultFiles(forceRefresh = false) {
if (!config.enabled) {
throw new Error("Obsidian not connected");
}
// Check cache
const now = Date.now();
const cacheValid = vaultFilesCache.files !== null &&
vaultFilesCache.timestamp !== null &&
(now - vaultFilesCache.timestamp) < vaultFilesCache.ttl;
if (cacheValid && !forceRefresh) {
INFO && console.log(`getVaultFiles: Using cached list (${vaultFilesCache.files.length} files)`);
return vaultFilesCache.files;
}
try {
TIME && console.time("getVaultFiles");
INFO && console.log("getVaultFiles: Scanning vault (cache miss or expired)...");
// Recursively scan all directories
const mdFiles = await scanDirectory("");
INFO && console.log(`getVaultFiles: Found ${mdFiles.length} markdown files (recursive scan)`);
// Update cache
vaultFilesCache.files = mdFiles;
vaultFilesCache.timestamp = now;
INFO && console.log(`getVaultFiles: Found ${mdFiles.length} markdown files (recursive scan, cached)`);
DEBUG && console.log("Sample files:", mdFiles.slice(0, 10));
TIME && console.timeEnd("getVaultFiles");
@ -520,6 +550,7 @@ Add your lore here...
saveConfig,
testConnection,
getVaultFiles,
clearVaultCache,
getNote,
updateNote,
createNote,