- Automatic garbage collection disabled

- Fixed database unloading problem
This commit is contained in:
vorotamoroz
2022-06-19 14:09:11 +09:00
parent 359c10f1d7
commit 4634ab73b1
6 changed files with 39 additions and 30 deletions

View File

@@ -1,10 +1,10 @@
{ {
"id": "obsidian-livesync", "id": "obsidian-livesync",
"name": "Self-hosted LiveSync", "name": "Self-hosted LiveSync",
"version": "0.11.4", "version": "0.11.5",
"minAppVersion": "0.9.12", "minAppVersion": "0.9.12",
"description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.", "description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
"author": "vorotamoroz", "author": "vorotamoroz",
"authorUrl": "https://github.com/vrtmrz", "authorUrl": "https://github.com/vrtmrz",
"isDesktopOnly": false "isDesktopOnly": false
} }

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "obsidian-livesync", "name": "obsidian-livesync",
"version": "0.11.4", "version": "0.11.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "obsidian-livesync", "name": "obsidian-livesync",
"version": "0.11.4", "version": "0.11.5",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"diff-match-patch": "^1.0.5", "diff-match-patch": "^1.0.5",

View File

@@ -1,6 +1,6 @@
{ {
"name": "obsidian-livesync", "name": "obsidian-livesync",
"version": "0.11.4", "version": "0.11.5",
"description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.", "description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
"main": "main.js", "main": "main.js",
"type": "module", "type": "module",
@@ -41,4 +41,4 @@
"svelte-preprocess": "^4.10.2", "svelte-preprocess": "^4.10.2",
"xxhash-wasm": "^0.4.2" "xxhash-wasm": "^0.4.2"
} }
} }

View File

@@ -19,6 +19,7 @@ import {
VER, VER,
MILSTONE_DOCID, MILSTONE_DOCID,
DatabaseConnectingStatus, DatabaseConnectingStatus,
ObsidianLiveSyncSettings,
} from "./lib/src/types"; } from "./lib/src/types";
import { RemoteDBSettings } from "./lib/src/types"; import { RemoteDBSettings } from "./lib/src/types";
import { resolveWithIgnoreKnownError, delay, runWithLock, NewNotice, WrappedNotice, shouldSplitAsPlainText, splitPieces2, enableEncryption } from "./lib/src/utils"; import { resolveWithIgnoreKnownError, delay, runWithLock, NewNotice, WrappedNotice, shouldSplitAsPlainText, splitPieces2, enableEncryption } from "./lib/src/utils";
@@ -33,7 +34,7 @@ class LRUCache {
cache = new Map<string, string>([]); cache = new Map<string, string>([]);
revCache = new Map<string, string>([]); revCache = new Map<string, string>([]);
maxCache = 100; maxCache = 100;
constructor() {} constructor() { }
get(key: string) { get(key: string) {
// debugger // debugger
const v = this.cache.get(key); const v = this.cache.get(key);
@@ -770,7 +771,7 @@ export class LocalPouchDB {
this.openOneshotReplication( this.openOneshotReplication(
setting, setting,
showingNotice, showingNotice,
async (e) => {}, async (e) => { },
false, false,
(e) => { (e) => {
if (e === true) res(e); if (e === true) res(e);
@@ -1222,10 +1223,14 @@ export class LocalPouchDB {
} }
async garbageCollect() { async garbageCollect() {
// if (this.settings.useHistory) { if (this.settings.useHistory) {
// Logger("GC skipped for using history", LOG_LEVEL.VERBOSE); Logger("GC skipped for using history", LOG_LEVEL.VERBOSE);
// return; return;
// } }
if ((this.settings as ObsidianLiveSyncSettings).liveSync) {
Logger("GC skipped while live sync.", LOG_LEVEL.VERBOSE);
return;
}
// NOTE:Garbage collection could break old revisions. // NOTE:Garbage collection could break old revisions.
await runWithLock("replicate", true, async () => { await runWithLock("replicate", true, async () => {
if (this.gcRunning) return; if (this.gcRunning) return;

View File

@@ -188,7 +188,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
); );
new Setting(containerRemoteDatabaseEl) new Setting(containerRemoteDatabaseEl)
.setName("End to End Encryption") .setName("End to End Encryption")
.setDesc("Encrypting contents on the database.") .setDesc("Encrypting contents on the remote database. If you use the plugins synchronizing feature, enabling this is recommend.")
.addToggle((toggle) => .addToggle((toggle) =>
toggle.setValue(this.plugin.settings.workingEncrypt).onChange(async (value) => { toggle.setValue(this.plugin.settings.workingEncrypt).onChange(async (value) => {
this.plugin.settings.workingEncrypt = value; this.plugin.settings.workingEncrypt = value;

View File

@@ -61,7 +61,7 @@ class PluginDialogModal extends Modal {
} }
class PopoverYesNo extends FuzzySuggestModal<string> { class PopoverYesNo extends FuzzySuggestModal<string> {
app: App; app: App;
callback: (e: string) => void = () => {}; callback: (e: string) => void = () => { };
constructor(app: App, note: string, callback: (e: string) => void) { constructor(app: App, note: string, callback: (e: string) => void) {
super(app); super(app);
@@ -415,15 +415,19 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
onunload() { onunload() {
this.hidePluginSyncModal(); this.hidePluginSyncModal();
this.localDatabase.onunload(); if (this.localDatabase != null) {
this.localDatabase.onunload();
}
if (this.gcTimerHandler != null) { if (this.gcTimerHandler != null) {
clearTimeout(this.gcTimerHandler); clearTimeout(this.gcTimerHandler);
this.gcTimerHandler = null; this.gcTimerHandler = null;
} }
this.clearPeriodicSync(); this.clearPeriodicSync();
this.clearPluginSweep(); this.clearPluginSweep();
this.localDatabase.closeReplication(); if (this.localDatabase != null) {
this.localDatabase.close(); this.localDatabase.closeReplication();
this.localDatabase.close();
}
window.removeEventListener("visibilitychange", this.watchWindowVisiblity); window.removeEventListener("visibilitychange", this.watchWindowVisiblity);
Logger("unloading plugin"); Logger("unloading plugin");
} }
@@ -453,6 +457,10 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
this.settings.workingPassphrase = this.settings.passphrase; this.settings.workingPassphrase = this.settings.passphrase;
// Delete this feature to avoid problems on mobile. // Delete this feature to avoid problems on mobile.
this.settings.disableRequestURI = true; this.settings.disableRequestURI = true;
// Temporary disabled
// TODO: If a new GC is created, a new default value must be created.
this.settings.gcDelay = 0;
const lsname = "obsidian-live-sync-vaultanddevicename-" + this.app.vault.getName(); const lsname = "obsidian-live-sync-vaultanddevicename-" + this.app.vault.getName();
if (this.settings.deviceAndVaultName != "") { if (this.settings.deviceAndVaultName != "") {
if (!localStorage.getItem(lsname)) { if (!localStorage.getItem(lsname)) {
@@ -618,7 +626,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
// When save is delayed, it should be cancelled. // When save is delayed, it should be cancelled.
this.batchFileChange = this.batchFileChange.filter((e) => e == file.path); this.batchFileChange = this.batchFileChange.filter((e) => e == file.path);
if (this.settings.suspendFileWatching) return; if (this.settings.suspendFileWatching) return;
this.watchVaultDeleteAsync(file).then(() => {}); this.watchVaultDeleteAsync(file).then(() => { });
} }
async watchVaultDeleteAsync(file: TAbstractFile) { async watchVaultDeleteAsync(file: TAbstractFile) {
@@ -647,7 +655,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
watchVaultRename(file: TAbstractFile, oldFile: any) { watchVaultRename(file: TAbstractFile, oldFile: any) {
if (this.settings.suspendFileWatching) return; if (this.settings.suspendFileWatching) return;
this.watchVaultRenameAsync(file, oldFile).then(() => {}); this.watchVaultRenameAsync(file, oldFile).then(() => { });
} }
getFilePath(file: TAbstractFile): string { getFilePath(file: TAbstractFile): string {
@@ -1209,16 +1217,16 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
const locks = getLocks(); const locks = getLocks();
const pendingTask = locks.pending.length const pendingTask = locks.pending.length
? "\nPending: " + ? "\nPending: " +
Object.entries([...new Set([...locks.pending])].reduce((p, c) => ({ ...p, [c]: p[c] ?? 0 + 1 }), {} as { [key: string]: number })) Object.entries([...new Set([...locks.pending])].reduce((p, c) => ({ ...p, [c]: p[c] ?? 0 + 1 }), {} as { [key: string]: number }))
.map((e) => `${e[0]}${e[1] == 1 ? "" : `(${e[1]})`}`) .map((e) => `${e[0]}${e[1] == 1 ? "" : `(${e[1]})`}`)
.join(", ") .join(", ")
: ""; : "";
const runningTask = locks.running.length const runningTask = locks.running.length
? "\nRunning: " + ? "\nRunning: " +
Object.entries([...new Set([...locks.running])].reduce((p, c) => ({ ...p, [c]: p[c] ?? 0 + 1 }), {} as { [key: string]: number })) Object.entries([...new Set([...locks.running])].reduce((p, c) => ({ ...p, [c]: p[c] ?? 0 + 1 }), {} as { [key: string]: number }))
.map((e) => `${e[0]}${e[1] == 1 ? "" : `(${e[1]})`}`) .map((e) => `${e[0]}${e[1] == 1 ? "" : `(${e[1]})`}`)
.join(", ") .join(", ")
: ""; : "";
this.setStatusBarText(message + pendingTask + runningTask); this.setStatusBarText(message + pendingTask + runningTask);
} }
@@ -1246,7 +1254,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
this.lastLog = newLog; this.lastLog = newLog;
} }
} }
updateStatusBarText() {} updateStatusBarText() { }
async replicate(showMessage?: boolean) { async replicate(showMessage?: boolean) {
if (this.settings.versionUpFlash != "") { if (this.settings.versionUpFlash != "") {
@@ -1757,10 +1765,6 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
if (!this.localDatabase.isReady) return; if (!this.localDatabase.isReady) return;
await runWithLock("sweepplugin", true, async () => { await runWithLock("sweepplugin", true, async () => {
const logLevel = showMessage ? LOG_LEVEL.NOTICE : LOG_LEVEL.INFO; const logLevel = showMessage ? LOG_LEVEL.NOTICE : LOG_LEVEL.INFO;
if (!this.settings.encrypt) {
Logger("You have to encrypt the database to use plugin setting sync.", LOG_LEVEL.NOTICE);
return;
}
if (!this.deviceAndVaultName) { if (!this.deviceAndVaultName) {
Logger("You have to set your device and vault name.", LOG_LEVEL.NOTICE); Logger("You have to set your device and vault name.", LOG_LEVEL.NOTICE);
return; return;