80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
const { getDB } = require(".")
|
|
|
|
class Replication {
|
|
/**
|
|
*
|
|
* @param {String} source - the DB you want to replicate or rollback to
|
|
* @param {String} target - the DB you want to replicate to, or rollback from
|
|
*/
|
|
constructor({ source, target }) {
|
|
this.source = getDB(source)
|
|
this.target = getDB(target)
|
|
}
|
|
|
|
promisify(operation, opts = {}) {
|
|
return new Promise(resolve => {
|
|
operation(this.target, opts)
|
|
.on("denied", function (err) {
|
|
// a document failed to replicate (e.g. due to permissions)
|
|
throw new Error(`Denied: Document failed to replicate ${err}`)
|
|
})
|
|
.on("complete", function (info) {
|
|
return resolve(info)
|
|
})
|
|
.on("error", function (err) {
|
|
throw new Error(`Replication Error: ${err}`)
|
|
})
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Two way replication operation, intended to be promise based.
|
|
* @param {Object} opts - PouchDB replication options
|
|
*/
|
|
sync(opts = {}) {
|
|
this.replication = this.promisify(this.source.sync, opts)
|
|
return this.replication
|
|
}
|
|
|
|
/**
|
|
* One way replication operation, intended to be promise based.
|
|
* @param {Object} opts - PouchDB replication options
|
|
*/
|
|
replicate(opts = {}) {
|
|
this.replication = this.promisify(this.source.replicate.to, opts)
|
|
return this.replication
|
|
}
|
|
|
|
/**
|
|
* Set up an ongoing live sync between 2 CouchDB databases.
|
|
* @param {Object} opts - PouchDB replication options
|
|
*/
|
|
subscribe(opts = {}) {
|
|
this.replication = this.source.replicate
|
|
.to(this.target, {
|
|
live: true,
|
|
retry: true,
|
|
...opts,
|
|
})
|
|
.on("error", function (err) {
|
|
throw new Error(`Replication Error: ${err}`)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Rollback the target DB back to the state of the source DB
|
|
*/
|
|
async rollback() {
|
|
await this.target.destroy()
|
|
// Recreate the DB again
|
|
this.target = getDB(this.target.name)
|
|
await this.replicate()
|
|
}
|
|
|
|
cancel() {
|
|
this.replication.cancel()
|
|
}
|
|
}
|
|
|
|
module.exports = Replication
|