forked from tsai/budibase
13 changed files with 157 additions and 1318 deletions
@ -0,0 +1,78 @@ |
|||||
|
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) |
||||
|
} |
||||
|
|
||||
|
sync(opts) { |
||||
|
return new Promise((resolve, reject) => { |
||||
|
this.source |
||||
|
.sync(this.target, opts) |
||||
|
.on("change", function (info) { |
||||
|
// handle change
|
||||
|
}) |
||||
|
.on("paused", function (err) { |
||||
|
// replication paused (e.g. replication up to date, user went offline)
|
||||
|
}) |
||||
|
.on("active", function () { |
||||
|
// replicate resumed (e.g. new changes replicating, user went back online)
|
||||
|
}) |
||||
|
.on("denied", function (err) { |
||||
|
// a document failed to replicate (e.g. due to permissions)
|
||||
|
return reject( |
||||
|
new Error(`Denied: Document failed to replicate ${err}`) |
||||
|
) |
||||
|
}) |
||||
|
.on("complete", function (info) { |
||||
|
return resolve(info) |
||||
|
}) |
||||
|
.on("error", function (err) { |
||||
|
return reject(new Error(`Replication Error: ${err}`)) |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
replicate() { |
||||
|
return new Promise((resolve, reject) => { |
||||
|
this.replication = this.source.replicate |
||||
|
.to(this.target) |
||||
|
// .on("change", function (info) {
|
||||
|
// // handle change
|
||||
|
// })
|
||||
|
// .on("paused", function (err) {
|
||||
|
// // replication paused (e.g. replication up to date, user went offline)
|
||||
|
// })
|
||||
|
// .on("active", function () {
|
||||
|
// // replicate resumed (e.g. new changes replicating, user went back online)
|
||||
|
// })
|
||||
|
.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}`) |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
async rollback() { |
||||
|
await this.target.destroy() |
||||
|
await this.replicate() |
||||
|
} |
||||
|
|
||||
|
cancel() { |
||||
|
this.replication.cancel() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = Replication |
||||
File diff suppressed because it is too large
Loading…
Reference in new issue