| import { EventEmitter as EE } from 'events'; |
| import inherits from 'inherits'; |
| |
| // We create a basic promise so the caller can cancel the replication possibly |
| // before we have actually started listening to changes etc |
| inherits(Replication, EE); |
| function Replication() { |
| EE.call(this); |
| this.cancelled = false; |
| this.state = 'pending'; |
| var self = this; |
| var promise = new Promise(function (fulfill, reject) { |
| self.once('complete', fulfill); |
| self.once('error', reject); |
| }); |
| self.then = function (resolve, reject) { |
| return promise.then(resolve, reject); |
| }; |
| self.catch = function (reject) { |
| return promise.catch(reject); |
| }; |
| // As we allow error handling via "error" event as well, |
| // put a stub in here so that rejecting never throws UnhandledError. |
| self.catch(function () {}); |
| } |
| |
| Replication.prototype.cancel = function () { |
| this.cancelled = true; |
| this.state = 'cancelled'; |
| this.emit('cancel'); |
| }; |
| |
| Replication.prototype.ready = function (src, target) { |
| var self = this; |
| if (self._readyCalled) { |
| return; |
| } |
| self._readyCalled = true; |
| |
| function onDestroy() { |
| self.cancel(); |
| } |
| src.once('destroyed', onDestroy); |
| target.once('destroyed', onDestroy); |
| function cleanup() { |
| src.removeListener('destroyed', onDestroy); |
| target.removeListener('destroyed', onDestroy); |
| } |
| self.once('complete', cleanup); |
| }; |
| |
| export default Replication; |