mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-05-10 17:51:52 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ee32a2147 | ||
|
|
ac3c78e198 | ||
|
|
0da1e3d9c8 | ||
|
|
8f021a3c93 | ||
|
|
6db0743096 |
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
- name: Get Version
|
- name: Get Version
|
||||||
id: version
|
id: version
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=tag::$(git describe --abbrev=0)"
|
echo "::set-output name=tag::$(git describe --abbrev=0 --tags)"
|
||||||
# Build the plugin
|
# Build the plugin
|
||||||
- name: Build
|
- name: Build
|
||||||
id: build
|
id: build
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "obsidian-livesync",
|
"id": "obsidian-livesync",
|
||||||
"name": "Self-hosted LiveSync",
|
"name": "Self-hosted LiveSync",
|
||||||
"version": "0.14.0",
|
"version": "0.14.2",
|
||||||
"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.14.0",
|
"version": "0.14.2",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "0.14.0",
|
"version": "0.14.2",
|
||||||
"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.14.0",
|
"version": "0.14.2",
|
||||||
"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",
|
||||||
|
|||||||
@@ -411,11 +411,11 @@ export class LocalPouchDB {
|
|||||||
let children: string[] = [];
|
let children: string[] = [];
|
||||||
|
|
||||||
if (this.settings.readChunksOnline) {
|
if (this.settings.readChunksOnline) {
|
||||||
const items = await this.fetchLeafFromRemote(obj.children);
|
const items = await this.CollectChunks(obj.children);
|
||||||
if (items) {
|
if (items) {
|
||||||
for (const v of items) {
|
for (const v of items) {
|
||||||
if (v.doc && v.doc.type == "leaf") {
|
if (v && v.type == "leaf") {
|
||||||
children.push(v.doc.data);
|
children.push(v.data);
|
||||||
} else {
|
} else {
|
||||||
if (!opt) {
|
if (!opt) {
|
||||||
Logger(`Chunks of ${obj._id} are not valid.`, LOG_LEVEL.NOTICE);
|
Logger(`Chunks of ${obj._id} are not valid.`, LOG_LEVEL.NOTICE);
|
||||||
@@ -1357,16 +1357,31 @@ export class LocalPouchDB {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
async fetchLeafFromRemote(ids: string[], showResult = false) {
|
|
||||||
|
// Collect chunks from both local and remote.
|
||||||
|
async CollectChunks(ids: string[], showResult = false) {
|
||||||
|
// Fetch local chunks.
|
||||||
|
const localChunks = await this.localDatabase.allDocs({ keys: ids, include_docs: true });
|
||||||
|
const missingChunks = localChunks.rows.filter(e => "error" in e).map(e => e.key);
|
||||||
|
// If we have enough chunks, return them.
|
||||||
|
if (missingChunks.length == 0) {
|
||||||
|
return localChunks.rows.map(e => e.doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetching remote chunks.
|
||||||
const ret = await connectRemoteCouchDBWithSetting(this.settings, this.isMobile);
|
const ret = await connectRemoteCouchDBWithSetting(this.settings, this.isMobile);
|
||||||
if (typeof (ret) === "string") {
|
if (typeof (ret) === "string") {
|
||||||
|
|
||||||
Logger(`Could not connect to server.${ret} `, showResult ? LOG_LEVEL.NOTICE : LOG_LEVEL.INFO, "fetch");
|
Logger(`Could not connect to server.${ret} `, showResult ? LOG_LEVEL.NOTICE : LOG_LEVEL.INFO, "fetch");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const leafs = await ret.db.allDocs({ keys: ids, include_docs: true });
|
const remoteChunks = await ret.db.allDocs({ keys: missingChunks, include_docs: true });
|
||||||
return leafs.rows;
|
if (remoteChunks.rows.some(e => "error" in e)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Merge them
|
||||||
|
const chunkMap: { [key: string]: EntryDoc } = remoteChunks.rows.reduce((p, c) => ({ ...p, [c.key]: c.doc }), {})
|
||||||
|
return localChunks.rows.map(e => ("error" in e) ? (chunkMap[e.key]) : e.doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1928,7 +1928,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin {
|
|||||||
|
|
||||||
async pullFile(filename: string, fileList?: TFile[], force?: boolean, rev?: string, waitForReady = true) {
|
async pullFile(filename: string, fileList?: TFile[], force?: boolean, rev?: string, waitForReady = true) {
|
||||||
const targetFile = this.app.vault.getAbstractFileByPath(id2path(filename));
|
const targetFile = this.app.vault.getAbstractFileByPath(id2path(filename));
|
||||||
if (!this.isTargetFile(targetFile)) return;
|
if (!this.isTargetFile(id2path(filename))) return;
|
||||||
if (targetFile == null) {
|
if (targetFile == null) {
|
||||||
//have to create;
|
//have to create;
|
||||||
const doc = await this.localDatabase.getDBEntry(filename, rev ? { rev: rev } : null, false, waitForReady);
|
const doc = await this.localDatabase.getDBEntry(filename, rev ? { rev: rev } : null, false, waitForReady);
|
||||||
|
|||||||
18
updates.md
18
updates.md
@@ -1,3 +1,19 @@
|
|||||||
|
### 0.14.1
|
||||||
|
- The target selecting filter was implemented.
|
||||||
|
Now we can set what files are synchronised by regular expression.
|
||||||
|
- We can configure the size of chunks.
|
||||||
|
We can use larger chunks to improve performance.
|
||||||
|
(This feature can not be used with IBM Cloudant)
|
||||||
|
- Read chunks online.
|
||||||
|
Now we can synchronise only metadata and retrieve chunks on demand. It reduces local database size and time for replication.
|
||||||
|
- Added this note.
|
||||||
|
- Use local chunks in preference to remote them if present,
|
||||||
|
|
||||||
|
#### Recommended configuration for Self-hosted CouchDB
|
||||||
|
- Set chunk size to around 100 to 250 (10MB - 25MB per chunk)
|
||||||
|
- Be sure to `Read chunks online` checked.
|
||||||
|
|
||||||
|
|
||||||
### 0.13.0
|
### 0.13.0
|
||||||
|
|
||||||
- The metadata of the deleted files will be kept on the database by default. If you want to delete this as the previous version, please turn on `Delete metadata of deleted files.`. And, if you have upgraded from the older version, please ensure every device has been upgraded.
|
- The metadata of the deleted files will be kept on the database by default. If you want to delete this as the previous version, please turn on `Delete metadata of deleted files.`. And, if you have upgraded from the older version, please ensure every device has been upgraded.
|
||||||
@@ -14,4 +30,4 @@
|
|||||||
- Now, we can synchronise hidden files that conflicted on each devices.
|
- Now, we can synchronise hidden files that conflicted on each devices.
|
||||||
- We can search for conflicting docs.
|
- We can search for conflicting docs.
|
||||||
- Pending processes can now be run at any time.
|
- Pending processes can now be run at any time.
|
||||||
- Performance improved on synchronising large numbers of files at once.
|
- Performance improved on synchronising large numbers of files at once.
|
||||||
|
|||||||
Reference in New Issue
Block a user