mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-05-07 16:21:51 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
983d9248ed | ||
|
|
7240e84328 | ||
|
|
0d55ae2532 | ||
|
|
dbd284f5dd |
@@ -66,7 +66,7 @@ Synchronization status is shown in statusbar.
|
|||||||
- ↓ Downloaded chunks and metadata
|
- ↓ Downloaded chunks and metadata
|
||||||
- ⏳ Number of pending processes
|
- ⏳ Number of pending processes
|
||||||
- 🧩 Number of files waiting for their chunks.
|
- 🧩 Number of files waiting for their chunks.
|
||||||
If you have deleted or renamed files, please wait until ⏳ icon disappeared.
|
If you have deleted or renamed files, please wait until ⏳ icon disappears.
|
||||||
|
|
||||||
|
|
||||||
## Hints
|
## Hints
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "obsidian-livesync",
|
"id": "obsidian-livesync",
|
||||||
"name": "Self-hosted LiveSync",
|
"name": "Self-hosted LiveSync",
|
||||||
"version": "0.20.2",
|
"version": "0.20.3",
|
||||||
"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",
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "0.20.2",
|
"version": "0.20.3",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "0.20.2",
|
"version": "0.20.3",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"diff-match-patch": "^1.0.5",
|
"diff-match-patch": "^1.0.5",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "0.20.2",
|
"version": "0.20.3",
|
||||||
"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",
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export class SetupLiveSync extends LiveSyncCommands {
|
|||||||
delete setting[k];
|
delete setting[k];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const encryptedSetting = encodeURIComponent(await encrypt(JSON.stringify(setting), encryptingPassphrase, false, false));
|
const encryptedSetting = encodeURIComponent(await encrypt(JSON.stringify(setting), encryptingPassphrase, false, true));
|
||||||
const uri = `${configURIBase}${encryptedSetting}`;
|
const uri = `${configURIBase}${encryptedSetting}`;
|
||||||
await navigator.clipboard.writeText(uri);
|
await navigator.clipboard.writeText(uri);
|
||||||
Logger("Setup URI copied to clipboard", LOG_LEVEL_NOTICE);
|
Logger("Setup URI copied to clipboard", LOG_LEVEL_NOTICE);
|
||||||
@@ -70,7 +70,7 @@ export class SetupLiveSync extends LiveSyncCommands {
|
|||||||
if (encryptingPassphrase === false)
|
if (encryptingPassphrase === false)
|
||||||
return;
|
return;
|
||||||
const setting = { ...this.settings, configPassphraseStore: "", encryptedCouchDBConnection: "", encryptedPassphrase: "" };
|
const setting = { ...this.settings, configPassphraseStore: "", encryptedCouchDBConnection: "", encryptedPassphrase: "" };
|
||||||
const encryptedSetting = encodeURIComponent(await encrypt(JSON.stringify(setting), encryptingPassphrase, false, false));
|
const encryptedSetting = encodeURIComponent(await encrypt(JSON.stringify(setting), encryptingPassphrase, false, true));
|
||||||
const uri = `${configURIBase}${encryptedSetting}`;
|
const uri = `${configURIBase}${encryptedSetting}`;
|
||||||
await navigator.clipboard.writeText(uri);
|
await navigator.clipboard.writeText(uri);
|
||||||
Logger("Setup URI copied to clipboard", LOG_LEVEL_NOTICE);
|
Logger("Setup URI copied to clipboard", LOG_LEVEL_NOTICE);
|
||||||
|
|||||||
2
src/lib
2
src/lib
Submodule src/lib updated: 609c7aecf3...b2788a8d98
149
src/main.ts
149
src/main.ts
@@ -515,58 +515,7 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
return ret == CHOICE_V1;
|
return ret == CHOICE_V1;
|
||||||
}
|
}
|
||||||
|
|
||||||
async onload() {
|
addUIs() {
|
||||||
logStore.subscribe(e => this.addLog(e.message, e.level, e.key));
|
|
||||||
Logger("loading plugin");
|
|
||||||
//@ts-ignore
|
|
||||||
const manifestVersion: string = MANIFEST_VERSION || "0.0.0";
|
|
||||||
//@ts-ignore
|
|
||||||
const packageVersion: string = PACKAGE_VERSION || "0.0.0";
|
|
||||||
|
|
||||||
this.manifestVersion = manifestVersion;
|
|
||||||
this.packageVersion = packageVersion;
|
|
||||||
|
|
||||||
Logger(`Self-hosted LiveSync v${manifestVersion} ${packageVersion} `);
|
|
||||||
const lsKey = "obsidian-live-sync-ver" + this.getVaultName();
|
|
||||||
const last_version = localStorage.getItem(lsKey);
|
|
||||||
await this.loadSettings();
|
|
||||||
|
|
||||||
const lastVersion = ~~(versionNumberString2Number(manifestVersion) / 1000);
|
|
||||||
if (lastVersion > this.settings.lastReadUpdates) {
|
|
||||||
Logger("Self-hosted LiveSync has undergone a major upgrade. Please open the setting dialog, and check the information pane.", LOG_LEVEL_NOTICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
//@ts-ignore
|
|
||||||
if (this.app.isMobile) {
|
|
||||||
this.isMobile = true;
|
|
||||||
this.settings.disableRequestURI = true;
|
|
||||||
}
|
|
||||||
if (last_version && Number(last_version) < VER) {
|
|
||||||
this.settings.liveSync = false;
|
|
||||||
this.settings.syncOnSave = false;
|
|
||||||
this.settings.syncOnEditorSave = false;
|
|
||||||
this.settings.syncOnStart = false;
|
|
||||||
this.settings.syncOnFileOpen = false;
|
|
||||||
this.settings.syncAfterMerge = false;
|
|
||||||
this.settings.periodicReplication = false;
|
|
||||||
this.settings.versionUpFlash = "Self-hosted LiveSync has been upgraded and some behaviors have changed incompatibly. All automatic synchronization is now disabled temporary. Ensure that other devices are also upgraded, and enable synchronization again.";
|
|
||||||
this.saveSettings();
|
|
||||||
}
|
|
||||||
localStorage.setItem(lsKey, `${VER}`);
|
|
||||||
await this.openDatabase();
|
|
||||||
this.watchWorkspaceOpen = debounce(this.watchWorkspaceOpen.bind(this), 1000, false);
|
|
||||||
this.watchWindowVisibility = debounce(this.watchWindowVisibility.bind(this), 1000, false);
|
|
||||||
this.watchOnline = debounce(this.watchOnline.bind(this), 500, false);
|
|
||||||
|
|
||||||
this.parseReplicationResult = this.parseReplicationResult.bind(this);
|
|
||||||
|
|
||||||
this.loadQueuedFiles = this.loadQueuedFiles.bind(this);
|
|
||||||
|
|
||||||
this.triggerRealizeSettingSyncMode = debounce(this.triggerRealizeSettingSyncMode.bind(this), 1000);
|
|
||||||
|
|
||||||
this.statusBar = this.addStatusBarItem();
|
|
||||||
this.statusBar.addClass("syncstatusbar");
|
|
||||||
|
|
||||||
addIcon(
|
addIcon(
|
||||||
"replicate",
|
"replicate",
|
||||||
`<g transform="matrix(1.15 0 0 1.15 -8.31 -9.52)" fill="currentColor" fill-rule="evenodd">
|
`<g transform="matrix(1.15 0 0 1.15 -8.31 -9.52)" fill="currentColor" fill-rule="evenodd">
|
||||||
@@ -583,14 +532,23 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
<path d="m106 346v44h70v-44zm45 16h-20v-8h20z"/>
|
<path d="m106 346v44h70v-44zm45 16h-20v-8h20z"/>
|
||||||
</g>`
|
</g>`
|
||||||
);
|
);
|
||||||
await Promise.all(this.addOns.map(e => e.onload()));
|
addIcon(
|
||||||
|
"custom-sync",
|
||||||
|
`<g transform="rotate(-90 75 218)" fill="currentColor" fill-rule="evenodd">
|
||||||
|
<path d="m272 166-9.38 9.38 9.38 9.38 9.38-9.38c1.96-1.93 5.11-1.9 7.03 0.058 1.91 1.94 1.91 5.04 0 6.98l-9.38 9.38 5.86 5.86-11.7 11.7c-8.34 8.35-21.4 9.68-31.3 3.19l-3.84 3.98c-8.45 8.7-20.1 13.6-32.2 13.6h-5.55v-9.95h5.55c9.43-0.0182 18.5-3.84 25-10.6l3.95-4.09c-6.54-9.86-5.23-23 3.14-31.3l11.7-11.7 5.86 5.86 9.38-9.38c1.96-1.93 5.11-1.9 7.03 0.0564 1.91 1.93 1.91 5.04 2e-3 6.98z"/>
|
||||||
|
</g>`
|
||||||
|
);
|
||||||
this.addRibbonIcon("replicate", "Replicate", async () => {
|
this.addRibbonIcon("replicate", "Replicate", async () => {
|
||||||
await this.replicate(true);
|
await this.replicate(true);
|
||||||
});
|
}).addClass("livesync-ribbon-replicate");
|
||||||
|
|
||||||
this.addRibbonIcon("view-log", "Show log", () => {
|
this.addRibbonIcon("view-log", "Show log", () => {
|
||||||
this.showView(VIEW_TYPE_LOG);
|
this.showView(VIEW_TYPE_LOG);
|
||||||
});
|
}).addClass("livesync-ribbon-showlog");
|
||||||
|
this.addRibbonIcon("custom-sync", "Show Customization sync", () => {
|
||||||
|
this.addOnConfigSync.showPluginSyncModal();
|
||||||
|
}).addClass("livesync-ribbon-showcustom");
|
||||||
|
|
||||||
this.addCommand({
|
this.addCommand({
|
||||||
id: "view-log",
|
id: "view-log",
|
||||||
name: "Show log",
|
name: "Show log",
|
||||||
@@ -598,8 +556,6 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
this.showView(VIEW_TYPE_LOG);
|
this.showView(VIEW_TYPE_LOG);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.addSettingTab(new ObsidianLiveSyncSettingTab(this.app, this));
|
|
||||||
this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this));
|
|
||||||
|
|
||||||
this.addCommand({
|
this.addCommand({
|
||||||
id: "livesync-replicate",
|
id: "livesync-replicate",
|
||||||
@@ -672,8 +628,6 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.triggerRealizeSettingSyncMode = debounce(this.triggerRealizeSettingSyncMode.bind(this), 1000);
|
|
||||||
|
|
||||||
this.addCommand({
|
this.addCommand({
|
||||||
id: "livesync-filehistory",
|
id: "livesync-filehistory",
|
||||||
name: "Pick a file to show history",
|
name: "Pick a file to show history",
|
||||||
@@ -709,6 +663,13 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
this.replicator.terminateSync();
|
this.replicator.terminateSync();
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
this.addCommand({
|
||||||
|
id: "livesync-global-history",
|
||||||
|
name: "Show vault history",
|
||||||
|
callback: () => {
|
||||||
|
this.showGlobalHistory()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
this.registerView(
|
this.registerView(
|
||||||
VIEW_TYPE_GLOBAL_HISTORY,
|
VIEW_TYPE_GLOBAL_HISTORY,
|
||||||
@@ -718,13 +679,66 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
VIEW_TYPE_LOG,
|
VIEW_TYPE_LOG,
|
||||||
(leaf) => new LogPaneView(leaf, this)
|
(leaf) => new LogPaneView(leaf, this)
|
||||||
);
|
);
|
||||||
this.addCommand({
|
}
|
||||||
id: "livesync-global-history",
|
|
||||||
name: "Show vault history",
|
async onload() {
|
||||||
callback: () => {
|
logStore.subscribe(e => this.addLog(e.message, e.level, e.key));
|
||||||
this.showGlobalHistory()
|
Logger("loading plugin");
|
||||||
}
|
this.addSettingTab(new ObsidianLiveSyncSettingTab(this.app, this));
|
||||||
})
|
this.addUIs();
|
||||||
|
//@ts-ignore
|
||||||
|
const manifestVersion: string = MANIFEST_VERSION || "0.0.0";
|
||||||
|
//@ts-ignore
|
||||||
|
const packageVersion: string = PACKAGE_VERSION || "0.0.0";
|
||||||
|
|
||||||
|
this.manifestVersion = manifestVersion;
|
||||||
|
this.packageVersion = packageVersion;
|
||||||
|
|
||||||
|
Logger(`Self-hosted LiveSync v${manifestVersion} ${packageVersion} `);
|
||||||
|
const lsKey = "obsidian-live-sync-ver" + this.getVaultName();
|
||||||
|
const last_version = localStorage.getItem(lsKey);
|
||||||
|
await this.loadSettings();
|
||||||
|
this.statusBar = this.addStatusBarItem();
|
||||||
|
this.statusBar.addClass("syncstatusbar");
|
||||||
|
const lastVersion = ~~(versionNumberString2Number(manifestVersion) / 1000);
|
||||||
|
if (lastVersion > this.settings.lastReadUpdates) {
|
||||||
|
Logger("Self-hosted LiveSync has undergone a major upgrade. Please open the setting dialog, and check the information pane.", LOG_LEVEL_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//@ts-ignore
|
||||||
|
if (this.app.isMobile) {
|
||||||
|
this.isMobile = true;
|
||||||
|
this.settings.disableRequestURI = true;
|
||||||
|
}
|
||||||
|
if (last_version && Number(last_version) < VER) {
|
||||||
|
this.settings.liveSync = false;
|
||||||
|
this.settings.syncOnSave = false;
|
||||||
|
this.settings.syncOnEditorSave = false;
|
||||||
|
this.settings.syncOnStart = false;
|
||||||
|
this.settings.syncOnFileOpen = false;
|
||||||
|
this.settings.syncAfterMerge = false;
|
||||||
|
this.settings.periodicReplication = false;
|
||||||
|
this.settings.versionUpFlash = "Self-hosted LiveSync has been upgraded and some behaviors have changed incompatibly. All automatic synchronization is now disabled temporary. Ensure that other devices are also upgraded, and enable synchronization again.";
|
||||||
|
this.saveSettings();
|
||||||
|
}
|
||||||
|
localStorage.setItem(lsKey, `${VER}`);
|
||||||
|
await this.openDatabase();
|
||||||
|
this.watchWorkspaceOpen = debounce(this.watchWorkspaceOpen.bind(this), 1000, false);
|
||||||
|
this.watchWindowVisibility = debounce(this.watchWindowVisibility.bind(this), 1000, false);
|
||||||
|
this.watchOnline = debounce(this.watchOnline.bind(this), 500, false);
|
||||||
|
|
||||||
|
this.parseReplicationResult = this.parseReplicationResult.bind(this);
|
||||||
|
|
||||||
|
this.loadQueuedFiles = this.loadQueuedFiles.bind(this);
|
||||||
|
|
||||||
|
this.triggerRealizeSettingSyncMode = debounce(this.triggerRealizeSettingSyncMode.bind(this), 1000);
|
||||||
|
|
||||||
|
await Promise.all(this.addOns.map(e => e.onload()));
|
||||||
|
|
||||||
|
this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this));
|
||||||
|
|
||||||
|
this.triggerRealizeSettingSyncMode = debounce(this.triggerRealizeSettingSyncMode.bind(this), 1000);
|
||||||
|
|
||||||
}
|
}
|
||||||
async showView(viewType: string) {
|
async showView(viewType: string) {
|
||||||
const leaves = this.app.workspace.getLeavesOfType(viewType);
|
const leaves = this.app.workspace.getLeavesOfType(viewType);
|
||||||
@@ -1609,6 +1623,9 @@ Note: We can always able to read V1 format. It will be progressively converted.
|
|||||||
this.replicator.openReplication(this.settings, true, false);
|
this.replicator.openReplication(this.settings, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const q = activeDocument.querySelector(`.livesync-ribbon-showcustom`);
|
||||||
|
q?.toggleClass("sls-hidden", !this.settings.usePluginSync);
|
||||||
|
|
||||||
this.periodicSyncProcessor.enable(this.settings.periodicReplication ? this.settings.periodicReplicationInterval * 1000 : 0);
|
this.periodicSyncProcessor.enable(this.settings.periodicReplication ? this.settings.periodicReplicationInterval * 1000 : 0);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
10
updates.md
10
updates.md
@@ -15,6 +15,16 @@ This format change gives us the ability to detect some `marks` in the binary fil
|
|||||||
Now only a few chunks are transferred, even if we add a comment to the PDF or put new files into the ZIP archives.
|
Now only a few chunks are transferred, even if we add a comment to the PDF or put new files into the ZIP archives.
|
||||||
|
|
||||||
#### Version history
|
#### Version history
|
||||||
|
- 0.20.3
|
||||||
|
- New feature:
|
||||||
|
- We can launch Customization sync from the Ribbon if we enabled it.
|
||||||
|
- Fixed:
|
||||||
|
- Setup URI is now back to the previous spec; be encrypted by V1.
|
||||||
|
- It may avoid the trouble with iOS 17.
|
||||||
|
- The Settings dialogue is now registered at the beginning of the start-up process.
|
||||||
|
- We can change the configuration even though LiveSync could not be launched in normal.
|
||||||
|
- Improved:
|
||||||
|
- Enumerating documents has been faster.
|
||||||
- 0.20.2
|
- 0.20.2
|
||||||
- New feature:
|
- New feature:
|
||||||
- We can delete all data of customization sync from the `Delete all customization sync data` on the `Hatch` pane.
|
- We can delete all data of customization sync from the `Delete all customization sync data` on the `Hatch` pane.
|
||||||
|
|||||||
Reference in New Issue
Block a user