Я написал синхронизацию pouchdb (в приложении Angular) с удаленной базой данных, которая отправляет удаленные изменения в приложение.
Я понял, согласно документации PouchDb, что данные должны синхронизироваться PouchDb.sync между локальным IndexedDb и удаленным сервером. После этого его получит второй клиент.
Это код, который я использовал для синхронизации:
export const appDataDbSyncArgs: IDbSyncArguments = {
localDbName: "app_data",
remoteDbUrl: "http://localhost:4984/app_data",
syncOptions: {
live: true,
retry: true,
since: 0,
batch_size: 1,
batches_limit: 1
}
};
PouchDB.replicate(remoteDbUrl, localDbName)
.on("active", () => {
console.log("replication is active");
const replicationStartedMessage = applyMessageType({}, replicationStarted);
messenger.postMessage(replicationStartedMessage);
})
.on("complete", info => {
console.log("%cReplication has been completed.", "color: lightgreen; font-size: 20px;");
const replicationCompleteMessage = applyMessageType(info, replicationComplete);
messenger.postMessage(replicationCompleteMessage);
PouchDB.sync(localDbName, remoteDbUrl, syncOptions)
.on("change", changeInfo => {
console.log("%cSync changes", "color: green; font-size: 20px;");
const changesInfoMessage = applyMessageType(changeInfo, syncChanges);
messenger.postMessage(changesInfoMessage);
})
.on("error", err => {
console.log("sync error", err);
const errorMessage = applyMessageType(err, syncError);
messenger.postMessage(errorMessage);
})
.on("paused", err => {
console.log("sync error (paused)", err);
})
.on("active", () => {
console.log("sync active");
})
.on("denied", err => {
console.log("sync error (denied)", err);
})
.on("complete", info => {
console.log("sync complete", info);
});
})
.on("error", err => {
console.log("replication error", err);
const replicationErrorMessage = applyMessageType(err, replicationError);
messenger.postMessage(replicationErrorMessage);
});
И вот код, который я использовал для сохранения данных:
protected _addDocument<T> (id: string, document: PutDocument<{} & T>): Observable<Response> {
document['_id'] = id;
//document._rev = null;
return fromPromise(this._db.put<T>(document))
.pipe(
take(1)
);
}
// Where this._db = new PouchDB(localDbName);
Он сразу сохраняет данные в IndexedDb, но не сохраняет их в удаленной базе данных. Иногда данные поступают в удаленную БД через 5-10 минут и более. Иногда сразу. Но если данные поступают на удаленную базу данных или я меняю данные на удаленном сервере, pouchDb запускает событие «onChange», и второй клиент получает их в приложении.
Но мне нужно, чтобы данные, сохраненные в IndexedDb, были немедленно сохранены в удаленной базе данных.