mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-05-17 13:01:17 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9503474d06 | ||
|
|
ddf7b243e4 | ||
|
|
f37561c3c1 | ||
|
|
f01429decc | ||
|
|
1f1a39e5a0 |
@@ -49,6 +49,23 @@ Once CouchDB run, these directories will be owned by uid:`5984`. Please chown it
|
|||||||
```
|
```
|
||||||
$ docker run --name couchdb-for-ols -d --restart always -e COUCHDB_USER=${username} -e COUCHDB_PASSWORD=${password} -v ${PWD}/couchdb-data:/opt/couchdb/data -v ${PWD}/couchdb-etc:/opt/couchdb/etc/local.d -p 5984:5984 couchdb
|
$ docker run --name couchdb-for-ols -d --restart always -e COUCHDB_USER=${username} -e COUCHDB_PASSWORD=${password} -v ${PWD}/couchdb-data:/opt/couchdb/data -v ${PWD}/couchdb-etc:/opt/couchdb/etc/local.d -p 5984:5984 couchdb
|
||||||
```
|
```
|
||||||
|
If you prefer a compose file instead of docker run, here is the equivalent below:
|
||||||
|
```
|
||||||
|
services:
|
||||||
|
couchdb:
|
||||||
|
image: couchdb:latest
|
||||||
|
container_name: couchdb-for-ols
|
||||||
|
user: 1000:1000
|
||||||
|
environment:
|
||||||
|
- COUCHDB_USER=${username}
|
||||||
|
- COUCHDB_PASSWORD=${password}
|
||||||
|
volumes:
|
||||||
|
- ./couchdb-data:/opt/couchdb/data
|
||||||
|
- ./couchdb-etc:/opt/couchdb/etc/local.d
|
||||||
|
ports:
|
||||||
|
- 5984:5984
|
||||||
|
restart: unless-stopped
|
||||||
|
```
|
||||||
### B. Install CouchDB directly
|
### B. Install CouchDB directly
|
||||||
Please refer to the [official document](https://docs.couchdb.org/en/stable/install/index.html). However, we do not have to configure it fully. Just the administrator needs to be configured.
|
Please refer to the [official document](https://docs.couchdb.org/en/stable/install/index.html). However, we do not have to configure it fully. Just the administrator needs to be configured.
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "obsidian-livesync",
|
"id": "obsidian-livesync",
|
||||||
"name": "Self-hosted LiveSync",
|
"name": "Self-hosted LiveSync",
|
||||||
"version": "0.24.27",
|
"version": "0.24.28",
|
||||||
"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.24.26",
|
"version": "0.24.28",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "0.24.26",
|
"version": "0.24.28",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.808.0",
|
"@aws-sdk/client-s3": "^3.808.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "0.24.27",
|
"version": "0.24.28",
|
||||||
"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",
|
||||||
|
|||||||
2
src/lib
2
src/lib
Submodule src/lib updated: 68434acfdd...3f3cf7d61d
@@ -244,34 +244,49 @@ Even if you choose to clean up, you will see this option again if you exit Obsid
|
|||||||
async loadQueuedFiles() {
|
async loadQueuedFiles() {
|
||||||
if (this.settings.suspendParseReplicationResult) return;
|
if (this.settings.suspendParseReplicationResult) return;
|
||||||
if (!this.settings.isConfigured) return;
|
if (!this.settings.isConfigured) return;
|
||||||
const kvDBKey = "queued-files";
|
try {
|
||||||
// const ids = [...new Set(JSON.parse(localStorage.getItem(lsKey) || "[]"))] as string[];
|
const kvDBKey = "queued-files";
|
||||||
const ids = [...new Set((await this.core.kvDB.get<string[]>(kvDBKey)) ?? [])];
|
// const ids = [...new Set(JSON.parse(localStorage.getItem(lsKey) || "[]"))] as string[];
|
||||||
const batchSize = 100;
|
const ids = [...new Set((await this.core.kvDB.get<string[]>(kvDBKey)) ?? [])];
|
||||||
const chunkedIds = arrayToChunkedArray(ids, batchSize);
|
const batchSize = 100;
|
||||||
|
const chunkedIds = arrayToChunkedArray(ids, batchSize);
|
||||||
|
|
||||||
// suspendParseReplicationResult is true, so we have to resume it if it is suspended.
|
// suspendParseReplicationResult is true, so we have to resume it if it is suspended.
|
||||||
if (this.replicationResultProcessor.isSuspended) {
|
if (this.replicationResultProcessor.isSuspended) {
|
||||||
this.replicationResultProcessor.resume();
|
this.replicationResultProcessor.resume();
|
||||||
}
|
}
|
||||||
for await (const idsBatch of chunkedIds) {
|
for await (const idsBatch of chunkedIds) {
|
||||||
const ret = await this.localDatabase.allDocsRaw<EntryDoc>({
|
const ret = await this.localDatabase.allDocsRaw<EntryDoc>({
|
||||||
keys: idsBatch,
|
keys: idsBatch,
|
||||||
include_docs: true,
|
include_docs: true,
|
||||||
limit: 100,
|
limit: 100,
|
||||||
});
|
});
|
||||||
const docs = ret.rows.filter((e) => e.doc).map((e) => e.doc) as PouchDB.Core.ExistingDocument<EntryDoc>[];
|
const docs = ret.rows
|
||||||
const errors = ret.rows.filter((e) => !e.doc && !e.value.deleted);
|
.filter((e) => e.doc)
|
||||||
if (errors.length > 0) {
|
.map((e) => e.doc) as PouchDB.Core.ExistingDocument<EntryDoc>[];
|
||||||
Logger("Some queued processes were not resurrected");
|
const errors = ret.rows.filter((e) => !e.doc && !e.value.deleted);
|
||||||
Logger(JSON.stringify(errors), LOG_LEVEL_VERBOSE);
|
if (errors.length > 0) {
|
||||||
|
Logger("Some queued processes were not resurrected");
|
||||||
|
Logger(JSON.stringify(errors), LOG_LEVEL_VERBOSE);
|
||||||
|
}
|
||||||
|
this.replicationResultProcessor.enqueueAll(docs);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
Logger(`Failed to load queued files.`, LOG_LEVEL_NOTICE);
|
||||||
|
Logger(e, LOG_LEVEL_VERBOSE);
|
||||||
|
} finally {
|
||||||
|
// Check again before awaiting,
|
||||||
|
if (this.replicationResultProcessor.isSuspended) {
|
||||||
|
this.replicationResultProcessor.resume();
|
||||||
}
|
}
|
||||||
this.replicationResultProcessor.enqueueAll(docs);
|
|
||||||
}
|
}
|
||||||
if (this.replicationResultProcessor.isSuspended) {
|
// Wait for all queued files to be processed.
|
||||||
this.replicationResultProcessor.resume();
|
try {
|
||||||
|
await this.replicationResultProcessor.waitForAllProcessed();
|
||||||
|
} catch (e) {
|
||||||
|
Logger(`Failed to wait for all queued files to be processed.`, LOG_LEVEL_NOTICE);
|
||||||
|
Logger(e, LOG_LEVEL_VERBOSE);
|
||||||
}
|
}
|
||||||
await this.replicationResultProcessor.waitForAllProcessed();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
replicationResultProcessor = new QueueProcessor(
|
replicationResultProcessor = new QueueProcessor(
|
||||||
|
|||||||
@@ -2090,7 +2090,12 @@ The pane also can be launched by \`P2P Replicator\` command from the Command Pal
|
|||||||
.autoWireToggle("syncAfterMerge", { onUpdate: onlyOnNonLiveSync });
|
.autoWireToggle("syncAfterMerge", { onUpdate: onlyOnNonLiveSync });
|
||||||
});
|
});
|
||||||
|
|
||||||
void addPanel(paneEl, $msg("obsidianLiveSyncSettingTab.titleUpdateThinning")).then((paneEl) => {
|
void addPanel(
|
||||||
|
paneEl,
|
||||||
|
$msg("obsidianLiveSyncSettingTab.titleUpdateThinning"),
|
||||||
|
undefined,
|
||||||
|
visibleOnly(() => !this.isConfiguredAs("syncMode", "LIVESYNC"))
|
||||||
|
).then((paneEl) => {
|
||||||
paneEl.addClass("wizardHidden");
|
paneEl.addClass("wizardHidden");
|
||||||
new Setting(paneEl).setClass("wizardHidden").autoWireToggle("batchSave");
|
new Setting(paneEl).setClass("wizardHidden").autoWireToggle("batchSave");
|
||||||
new Setting(paneEl).setClass("wizardHidden").autoWireNumeric("batchSaveMinimumDelay", {
|
new Setting(paneEl).setClass("wizardHidden").autoWireNumeric("batchSaveMinimumDelay", {
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
## 0.24.28
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Batch Update is no longer available in LiveSync mode to avoid unexpected behaviour. (#653)
|
||||||
|
- Now compatible with Cloudflare R2 again for bucket synchronisation.
|
||||||
|
- @edo-bari-ikutsu, thank you for [your contribution](https://github.com/vrtmrz/livesync-commonlib/pull/12)!
|
||||||
|
- Prevention of broken behaviour due to database connection failures added (#649).
|
||||||
|
|
||||||
## 0.24.27
|
## 0.24.27
|
||||||
|
|
||||||
### Improved
|
### Improved
|
||||||
|
|||||||
Reference in New Issue
Block a user