| 'use strict'; |
| |
| var utils = require('./utils'); |
| |
| function updateCheckpoint(db, id, checkpoint, returnValue) { |
| return db.get(id).catch(function (err) { |
| if (err.status === 404) { |
| if (db.type() === 'http') { |
| utils.explain404( |
| 'PouchDB is just checking if a remote checkpoint exists.'); |
| } |
| return {_id: id}; |
| } |
| throw err; |
| }).then(function (doc) { |
| if (returnValue.cancelled) { |
| return; |
| } |
| doc.last_seq = checkpoint; |
| return db.put(doc); |
| }); |
| } |
| |
| function Checkpointer(src, target, id, returnValue) { |
| this.src = src; |
| this.target = target; |
| this.id = id; |
| this.returnValue = returnValue; |
| } |
| |
| Checkpointer.prototype.writeCheckpoint = function (checkpoint) { |
| var self = this; |
| return this.updateTarget(checkpoint).then(function () { |
| return self.updateSource(checkpoint); |
| }); |
| }; |
| |
| Checkpointer.prototype.updateTarget = function (checkpoint) { |
| return updateCheckpoint(this.target, this.id, checkpoint, this.returnValue); |
| }; |
| |
| Checkpointer.prototype.updateSource = function (checkpoint) { |
| var self = this; |
| if (this.readOnlySource) { |
| return utils.Promise.resolve(true); |
| } |
| return updateCheckpoint(this.src, this.id, checkpoint, this.returnValue) |
| .catch(function (err) { |
| var isForbidden = typeof err.status === 'number' && |
| Math.floor(err.status / 100) === 4; |
| if (isForbidden) { |
| self.readOnlySource = true; |
| return true; |
| } |
| throw err; |
| }); |
| }; |
| |
| Checkpointer.prototype.getCheckpoint = function () { |
| var self = this; |
| return self.target.get(self.id).then(function (targetDoc) { |
| return self.src.get(self.id).then(function (sourceDoc) { |
| if (targetDoc.last_seq === sourceDoc.last_seq) { |
| return sourceDoc.last_seq; |
| } |
| return 0; |
| }, function (err) { |
| if (err.status === 404 && targetDoc.last_seq) { |
| return self.src.put({ |
| _id: self.id, |
| last_seq: 0 |
| }).then(function () { |
| return 0; |
| }, function (err) { |
| if (err.status === 401) { |
| self.readOnlySource = true; |
| return targetDoc.last_seq; |
| } |
| return 0; |
| }); |
| } |
| throw err; |
| }); |
| }).catch(function (err) { |
| if (err.status !== 404) { |
| throw err; |
| } |
| return 0; |
| }); |
| }; |
| |
| module.exports = Checkpointer; |