diff --git a/frontend/obsidian-plugin/src/utils/register-console-for-logging.ts b/frontend/obsidian-plugin/src/utils/register-console-for-logging.ts new file mode 100644 index 00000000..e898f380 --- /dev/null +++ b/frontend/obsidian-plugin/src/utils/register-console-for-logging.ts @@ -0,0 +1,23 @@ +import type { LogLine, SyncClient } from "sync-client"; +import { LogLevel } from "sync-client"; + +export function registerConsoleForLogging(client: SyncClient): void { + client.logger.addOnMessageListener((logLine: LogLine) => { + const formatted = `${logLine.timestamp.toISOString()} ${logLine.level} ${logLine.message}`; + + switch (logLine.level) { + case LogLevel.ERROR: + console.error(formatted); + break; + case LogLevel.WARNING: + console.warn(formatted); + break; + case LogLevel.INFO: + console.info(formatted); + break; + case LogLevel.DEBUG: + console.debug(formatted); + break; + } + }); +} diff --git a/frontend/obsidian-plugin/src/vault-link-plugin.ts b/frontend/obsidian-plugin/src/vault-link-plugin.ts index aab9bad8..4995d03c 100644 --- a/frontend/obsidian-plugin/src/vault-link-plugin.ts +++ b/frontend/obsidian-plugin/src/vault-link-plugin.ts @@ -11,35 +11,18 @@ import { HistoryView } from "./views/history/history-view"; import { StatusBar } from "./views/status-bar/status-bar"; import { LogsView } from "./views/logs/logs-view"; import { StatusDescription } from "./views/status-description/status-description"; -import type { LogLine } from "sync-client"; -import { SyncClient, LogLevel } from "sync-client"; +import { SyncClient, rateLimit } from "sync-client"; import { ObsidianFileSystemOperations } from "./obsidian-file-system"; import { SyncSettingsTab } from "./views/settings/settings-tab"; +import { registerConsoleForLogging } from "./utils/register-console-for-logging"; export default class VaultLinkPlugin extends Plugin { private settingsTab: SyncSettingsTab | undefined; private client!: SyncClient; - - private static registerConsoleForLogging(client: SyncClient): void { - client.logger.addOnMessageListener((logLine: LogLine) => { - const formatted = `${logLine.timestamp.toISOString()} ${logLine.level} ${logLine.message}`; - - switch (logLine.level) { - case LogLevel.ERROR: - console.error(formatted); - break; - case LogLevel.WARNING: - console.warn(formatted); - break; - case LogLevel.INFO: - console.info(formatted); - break; - case LogLevel.DEBUG: - console.debug(formatted); - break; - } - }); - } + private readonly rateLimitedUpdatesPerFile = new Map< + string, + () => Promise + >(); public async onload(): Promise { this.client = await SyncClient.create({ @@ -54,7 +37,7 @@ export default class VaultLinkPlugin extends Plugin { nativeLineEndings: Platform.isWin ? "\r\n" : "\n" }); - VaultLinkPlugin.registerConsoleForLogging(this.client); + registerConsoleForLogging(this.client); const statusDescription = new StatusDescription(this.client); @@ -138,9 +121,7 @@ export default class VaultLinkPlugin extends Plugin { ) => { const { file } = info; if (file) { - await this.client.syncLocallyUpdatedFile({ - relativePath: file.path - }); + await this.rateLimitedUpdate(file.path); } } ), @@ -151,9 +132,7 @@ export default class VaultLinkPlugin extends Plugin { }), this.app.vault.on("modify", async (file: TAbstractFile) => { if (file instanceof TFile) { - await this.client.syncLocallyUpdatedFile({ - relativePath: file.path - }); + await this.rateLimitedUpdate(file.path); } }), this.app.vault.on("delete", async (file: TAbstractFile) => { @@ -174,4 +153,20 @@ export default class VaultLinkPlugin extends Plugin { this.registerEvent(event); }); } + + private async rateLimitedUpdate(path: string): Promise { + if (!this.rateLimitedUpdatesPerFile.has(path)) { + this.rateLimitedUpdatesPerFile.set( + path, + rateLimit( + async () => + this.client.syncLocallyUpdatedFile({ + relativePath: path + }), + 250 + ) + ); + } + await this.rateLimitedUpdatesPerFile.get(path)(); + } } diff --git a/frontend/sync-client/src/index.ts b/frontend/sync-client/src/index.ts index 6c36965f..0a03d0ae 100644 --- a/frontend/sync-client/src/index.ts +++ b/frontend/sync-client/src/index.ts @@ -6,6 +6,7 @@ export { } from "./tracing/sync-history"; export { Logger, LogLevel, LogLine } from "./tracing/logger"; export { type SyncSettings } from "./persistence/settings"; +export { rateLimit } from "./utils/rate-limit"; export type { RelativePath, StoredDatabase } from "./persistence/database"; export type { FileSystemOperations } from "./file-operations/filesystem-operations"; export type { PersistenceProvider } from "./persistence/persistence";