Compare commits

..

4 Commits

Author SHA1 Message Date
vorotamoroz
4634ab73b1 - Automatic garbage collection disabled
- Fixed database unloading problem
2022-06-19 14:09:11 +09:00
vorotamoroz
359c10f1d7 Correction of wording 2022-06-15 17:59:10 +09:00
vorotamoroz
59ebac3efc Correction of wording 2022-06-15 17:54:35 +09:00
vorotamoroz
b4edca3a99 Fixed format. 2022-06-15 17:51:07 +09:00
7 changed files with 45 additions and 36 deletions

View File

@@ -42,15 +42,15 @@ Especially, in some companies, people have to store all data to their fully cont
### Get your database ready.
First, get your database ready. IBM Cloudant is preferred for testing. Or you can use your own server with CouchDB. For more information, refer below:
    1. [Setup IBM Cloudant](docs/setup_cloudant.md)
    2. [Setup your CouchDB](docs/setup_own_server.md)
1. [Setup IBM Cloudant](docs/setup_cloudant.md)
2. [Setup your CouchDB](docs/setup_own_server.md)
### First device
1. Install the plugin on your device.
2. Configure with the remote database.
1. Fill your server's information into the `Remote Database configuration pane`.
2. Enabling `End to End Encryption is recommended. After inputting the passphrase, you have to press `Just apply`.
2. Enabling `End to End Encryption` is recommended. After inputting the passphrase, you have to press `Just apply`.
3. Hit `Test Database Connection` and make sure that the plugin says `Connected`.
4. Hit `Check database configuration` and make sure all tests have been passed.
3. Configure how to synchronize on `Sync setting`. (You can leave these configures later)
@@ -64,7 +64,7 @@ First, get your database ready. IBM Cloudant is preferred for testing. Or you ca
6. When status became stabilized (All ⏳ and 🧩 disappeared), you are ready to synchronize with the server.
7. Press the replicate icon on the Ribbon or run `Replicate now` from the Command pallet. You'll send all your data to the server.
8. Open the command palette and run `Copy setup uri`. And share copied URI to your other devices.
**IMPORTANT NOTICE: DO NOT SHARE THIS URI. THIS CONTAINS YOUR CREDENTIALS.**
**IMPORTANT NOTICE: DO NOT EXPOSE THIS URI. THIS CONTAINS YOUR CREDENTIALS.**
### Subsequent Devices
@@ -85,10 +85,10 @@ Strongly recommend using the vault in which all files are completely synchronize
Please open the link again and Answer as below:
- If your local database looks corrupted
(in the other words, your Obsidian getting werid even off the line)
(in other words, when your Obsidian getting weird even standalone.)
- Answer `No` to `Keep local DB?`
- If your remote database looks corrupted
(in the other words, something happens while replicating)
(in other words, when something happens while replicating)
- Answer `No` to `Keep remote DB?`
If you answered `No` to both, your databases will be rebuilt by the content on your device. And the remote database will lock out other devices. You have to synchronize all your devices again. (When this time, almost all your files should be synchronized including a timestamp. So you can use the existed vault).

View File

@@ -1,10 +1,10 @@
{
"id": "obsidian-livesync",
"name": "Self-hosted LiveSync",
"version": "0.11.4",
"version": "0.11.5",
"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.",
"author": "vorotamoroz",
"authorUrl": "https://github.com/vrtmrz",
"isDesktopOnly": false
}
}

4
package-lock.json generated
View File

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

View File

@@ -1,6 +1,6 @@
{
"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.",
"main": "main.js",
"type": "module",
@@ -41,4 +41,4 @@
"svelte-preprocess": "^4.10.2",
"xxhash-wasm": "^0.4.2"
}
}
}

View File

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

View File

@@ -188,7 +188,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab {
);
new Setting(containerRemoteDatabaseEl)
.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) =>
toggle.setValue(this.plugin.settings.workingEncrypt).onChange(async (value) => {
this.plugin.settings.workingEncrypt = value;

View File

@@ -61,7 +61,7 @@ class PluginDialogModal extends Modal {
}
class PopoverYesNo extends FuzzySuggestModal<string> {
app: App;
callback: (e: string) => void = () => {};
callback: (e: string) => void = () => { };
constructor(app: App, note: string, callback: (e: string) => void) {
super(app);
@@ -415,15 +415,19 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
onunload() {
this.hidePluginSyncModal();
this.localDatabase.onunload();
if (this.localDatabase != null) {
this.localDatabase.onunload();
}
if (this.gcTimerHandler != null) {
clearTimeout(this.gcTimerHandler);
this.gcTimerHandler = null;
}
this.clearPeriodicSync();
this.clearPluginSweep();
this.localDatabase.closeReplication();
this.localDatabase.close();
if (this.localDatabase != null) {
this.localDatabase.closeReplication();
this.localDatabase.close();
}
window.removeEventListener("visibilitychange", this.watchWindowVisiblity);
Logger("unloading plugin");
}
@@ -453,6 +457,10 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
this.settings.workingPassphrase = this.settings.passphrase;
// Delete this feature to avoid problems on mobile.
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();
if (this.settings.deviceAndVaultName != "") {
if (!localStorage.getItem(lsname)) {
@@ -618,7 +626,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
// When save is delayed, it should be cancelled.
this.batchFileChange = this.batchFileChange.filter((e) => e == file.path);
if (this.settings.suspendFileWatching) return;
this.watchVaultDeleteAsync(file).then(() => {});
this.watchVaultDeleteAsync(file).then(() => { });
}
async watchVaultDeleteAsync(file: TAbstractFile) {
@@ -647,7 +655,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
watchVaultRename(file: TAbstractFile, oldFile: any) {
if (this.settings.suspendFileWatching) return;
this.watchVaultRenameAsync(file, oldFile).then(() => {});
this.watchVaultRenameAsync(file, oldFile).then(() => { });
}
getFilePath(file: TAbstractFile): string {
@@ -1209,16 +1217,16 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
const locks = getLocks();
const pendingTask = locks.pending.length
? "\nPending: " +
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]})`}`)
.join(", ")
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]})`}`)
.join(", ")
: "";
const runningTask = locks.running.length
? "\nRunning: " +
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]})`}`)
.join(", ")
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]})`}`)
.join(", ")
: "";
this.setStatusBarText(message + pendingTask + runningTask);
}
@@ -1246,7 +1254,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
this.lastLog = newLog;
}
}
updateStatusBarText() {}
updateStatusBarText() { }
async replicate(showMessage?: boolean) {
if (this.settings.versionUpFlash != "") {
@@ -1757,10 +1765,6 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
if (!this.localDatabase.isReady) return;
await runWithLock("sweepplugin", true, async () => {
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) {
Logger("You have to set your device and vault name.", LOG_LEVEL.NOTICE);
return;