From 18af4e7d4746d257a8712a364349c5c469243d98 Mon Sep 17 00:00:00 2001 From: dimitrievgs Date: Wed, 8 Jul 2026 23:21:25 +0300 Subject: [PATCH] Update VaultQueryHandler.ts with 3 attempts-write --- src/utils/VaultQueryHandler.ts | 89 +++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/src/utils/VaultQueryHandler.ts b/src/utils/VaultQueryHandler.ts index ea300d3..5e62911 100644 --- a/src/utils/VaultQueryHandler.ts +++ b/src/utils/VaultQueryHandler.ts @@ -273,16 +273,10 @@ export class VaultQueryHandler { frontmatter: Record, body: string ): Promise { - const file = this.app.vault.getAbstractFileByPath(path); - if (!(file instanceof TFile)) { - throw new Error(`Файл не найден для записи: ${path}`); - } - const yamlStr = this._serializeYaml(frontmatter); const newContent = `---\n${yamlStr}---\n\n${body.trim()}\n`; - await this.app.vault.modify(file, newContent); - return { success: true, path }; + return this._writeFileWithRetry(path, newContent); } // ------------------------------------------------------------------------- @@ -297,26 +291,75 @@ export class VaultQueryHandler { path: string, content: string ): Promise { - // Создаём папки если нужно - const folderPath = path.includes('/') - ? path.substring(0, path.lastIndexOf('/')) - : null; + return this._writeFileWithRetry(path, content); + } - if (folderPath) { - const folderExists = this.app.vault.getAbstractFileByPath(folderPath); - if (!folderExists) { - await this.app.vault.createFolder(folderPath); + // ------------------------------------------------------------------------- + // Общий метод записи с повторными попытками + // ------------------------------------------------------------------------- + + private async _writeFileWithRetry( + path: string, + content: string, + maxAttempts = 3 + ): Promise { + let lastError: Error | null = null; + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + try { + // --- Шаг 1: Запись --- + const existing = this.app.vault.getAbstractFileByPath(path); + + if (existing instanceof TFile) { + await this.app.vault.modify(existing, content); + } else { + // Создать папки при необходимости + const folderPath = path.includes('/') + ? path.substring(0, path.lastIndexOf('/')) + : null; + if (folderPath) { + const folderExists = this.app.vault.getAbstractFileByPath(folderPath); + if (!folderExists) { + await this.app.vault.createFolder(folderPath); + } + } + await this.app.vault.create(path, content); + } + + // --- Шаг 2: Проверка (перечитываем и сравниваем) --- + const writtenFile = this.app.vault.getAbstractFileByPath(path); + if (!(writtenFile instanceof TFile)) { + throw new Error(`Файл не найден сразу после записи: ${path}`); + } + const writtenContent = await this.app.vault.read(writtenFile); + + // Сравниваем, игнорируя возможные конечные переводы строк + if (writtenContent.trim() === content.trim()) { + // Успех + return { success: true, path }; + } else { + // Содержимое не совпало — ошибка + throw new Error( + `Содержимое файла не совпадает с записанным (попытка ${attempt})` + ); + } + } catch (err) { + lastError = err instanceof Error ? err : new Error(String(err)); + console.warn( + `VaultQueryHandler: попытка ${attempt} записи ${path} не удалась:`, + lastError.message + ); + if (attempt < maxAttempts) { + // Экспоненциальная задержка: 100, 200, 300 мс + const delay = 100 * attempt; + await new Promise(resolve => setTimeout(resolve, delay)); + } } } - const existing = this.app.vault.getAbstractFileByPath(path); - if (existing instanceof TFile) { - await this.app.vault.modify(existing, content); - } else { - await this.app.vault.create(path, content); - } - - return { success: true, path }; + throw new Error( + `Не удалось записать файл ${path} после ${maxAttempts} попыток: ${lastError?.message || 'неизвестная ошибка'}` + ); } // -------------------------------------------------------------------------