From fdcf3be0f9247aff02577dd62f5dad3fc2452572 Mon Sep 17 00:00:00 2001 From: A-wry Date: Mon, 23 Feb 2026 22:10:25 -0500 Subject: [PATCH] Tagged downstream network errors to respect networkWarningStyle setting --- src/lib | 2 +- src/modules/core/ModuleReplicator.ts | 9 ++++-- .../essentialObsidian/ModuleObsidianAPI.ts | 2 +- src/modules/features/ModuleLog.ts | 30 ++++++++++++------- .../features/SettingDialogue/PaneGeneral.ts | 11 +++---- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/lib b/src/lib index 4ff3cad..c228285 160000 --- a/src/lib +++ b/src/lib @@ -1 +1 @@ -Subproject commit 4ff3cad80b7b42ec6940f765b113bf11d5ba555a +Subproject commit c228285c53148bfdf9886c98d32eabe418e99c61 diff --git a/src/modules/core/ModuleReplicator.ts b/src/modules/core/ModuleReplicator.ts index 08af7fa..b7bff1d 100644 --- a/src/modules/core/ModuleReplicator.ts +++ b/src/modules/core/ModuleReplicator.ts @@ -116,7 +116,8 @@ export class ModuleReplicator extends AbstractModule { } // Showing message is false: that because be shown here. (And it is a fatal error, no way to hide it). if (!(await this.ensureReplicatorPBKDF2Salt(false))) { - this.showError("Failed to initialise the encryption key, preventing replication."); + //tagged as network error at beginning for error filtering with NetworkWarningStyles + this.showError("\u{200b}Failed to initialise the encryption key, preventing replication."); return false; } await this.processor.restoreFromSnapshotOnce(); @@ -218,7 +219,11 @@ Even if you choose to clean up, you will see this option again if you exit Obsid return false; } if (!(await this.services.replication.onBeforeReplicate(showMessage))) { - this.showError($msg("Replicator.Message.SomeModuleFailed"), LOG_LEVEL_NOTICE); + // check for tagged network errors for filtering by NetworkWarningStyles + const hasNetworkError = [...this._previousErrors].some(e => e.startsWith("\u{200b}")); + if (!hasNetworkError) { + this.showError($msg("Replicator.Message.SomeModuleFailed"), LOG_LEVEL_NOTICE); + } return false; } this.clearErrors(); diff --git a/src/modules/essentialObsidian/ModuleObsidianAPI.ts b/src/modules/essentialObsidian/ModuleObsidianAPI.ts index cdd085b..f3ca47a 100644 --- a/src/modules/essentialObsidian/ModuleObsidianAPI.ts +++ b/src/modules/essentialObsidian/ModuleObsidianAPI.ts @@ -237,7 +237,7 @@ export class ModuleObsidianAPI extends AbstractObsidianModule { } catch (ex: any) { this._log(`HTTP:${method}${size} to:${localURL} -> failed`, LOG_LEVEL_VERBOSE); const msg = ex instanceof Error ? `${ex?.name}:${ex?.message}` : ex?.toString(); - this.showError(`Failed to fetch: ${msg}`); // Do not show notice, due to throwing below + this.showError(`\u{200b}Network Error: Failed to fetch: ${msg}`); // Do not show notice, due to throwing below this._log(ex, LOG_LEVEL_VERBOSE); // limit only in bulk_docs. if (url.toString().indexOf("_bulk_docs") !== -1) { diff --git a/src/modules/features/ModuleLog.ts b/src/modules/features/ModuleLog.ts index b2689e2..79f24d1 100644 --- a/src/modules/features/ModuleLog.ts +++ b/src/modules/features/ModuleLog.ts @@ -39,6 +39,7 @@ import { isValidFilenameInDarwin, isValidFilenameInWidows, } from "@/lib/src/string_and_binary/path.ts"; +import { NetworkWarningStyles } from "@lib/common/models/setting.const.ts" // This module cannot be a core module because it depends on the Obsidian UI. @@ -155,14 +156,14 @@ export class ModuleLog extends AbstractObsidianModule { lastSyncPushSeq == 0 ? "" : lastSyncPushSeq >= maxPushSeq - ? " (LIVE)" - : ` (${maxPushSeq - lastSyncPushSeq})`; + ? " (LIVE)" + : ` (${maxPushSeq - lastSyncPushSeq})`; pullLast = lastSyncPullSeq == 0 ? "" : lastSyncPullSeq >= maxPullSeq - ? " (LIVE)" - : ` (${maxPullSeq - lastSyncPullSeq})`; + ? " (LIVE)" + : ` (${maxPullSeq - lastSyncPullSeq})`; break; case "ERRORED": w = "⚠"; @@ -281,10 +282,19 @@ export class ModuleLog extends AbstractObsidianModule { const fileStatus = this.activeFileStatus.value; if (fileStatus && !this.settings.hideFileWarningNotice) messageLines.push(fileStatus); const messages = (await this.services.appLifecycle.getUnresolvedMessages()).flat().filter((e) => e); - if (this.settings.connectionWarningStyle === "banner") { - messageLines.push(...messages); - } else if (this.settings.connectionWarningStyle === "icon") { - if (messages.length > 0) messageLines.push("🔗❌"); + const stringMessages = messages.filter((m): m is string => typeof m === "string"); // for 'startsWith' + const networkMessages = stringMessages.filter(m => m.startsWith("\u{200b}")); + const otherMessages = stringMessages.filter(m => !m.startsWith("\u{200b}")); + + messageLines.push(...otherMessages); + + if ( + this.settings.networkWarningStyle !== NetworkWarningStyles.ICON && + this.settings.networkWarningStyle !== NetworkWarningStyles.HIDDEN + ) { + messageLines.push(...networkMessages); + } else if (this.settings.networkWarningStyle === NetworkWarningStyles.ICON) { + if (networkMessages.length > 0) messageLines.push("🔗❌"); } this.messageArea.innerText = messageLines.map((e) => `⚠️ ${e}`).join("\n"); } @@ -443,8 +453,8 @@ export class ModuleLog extends AbstractObsidianModule { typeof message == "string" ? message : message instanceof Error - ? `${errorInfo}` - : JSON.stringify(message, null, 2); + ? `${errorInfo}` + : JSON.stringify(message, null, 2); const newMessage = timestamp + "->" + messageContent; if (message instanceof Error) { console.error(vaultName + ":" + newMessage); diff --git a/src/modules/features/SettingDialogue/PaneGeneral.ts b/src/modules/features/SettingDialogue/PaneGeneral.ts index 4568392..213d27a 100644 --- a/src/modules/features/SettingDialogue/PaneGeneral.ts +++ b/src/modules/features/SettingDialogue/PaneGeneral.ts @@ -5,6 +5,7 @@ import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts import type { PageFunctions } from "./SettingPane.ts"; import { visibleOnly } from "./SettingPane.ts"; import { EVENT_ON_UNRESOLVED_ERROR, eventHub } from "@/common/events.ts"; +import { NetworkWarningStyles } from "@lib/common/models/setting.const.ts"; export function paneGeneral( this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, @@ -25,14 +26,14 @@ export function paneGeneral( }); new Setting(paneEl).autoWireToggle("showStatusOnStatusbar"); new Setting(paneEl).autoWireToggle("hideFileWarningNotice"); - new Setting(paneEl).autoWireDropDown("connectionWarningStyle", { + new Setting(paneEl).autoWireDropDown("networkWarningStyle", { options: { - banner: "Show full banner", - icon: "Show icon only", - hidden: "Hide completely", + [NetworkWarningStyles.BANNER]: "Show full banner", + [NetworkWarningStyles.ICON]: "Show icon only", + [NetworkWarningStyles.HIDDEN]: "Hide completely", }, }); - this.addOnSaved("connectionWarningStyle", () => { + this.addOnSaved("networkWarningStyle", () => { eventHub.emitEvent(EVENT_ON_UNRESOLVED_ERROR); }); });