| import EE from 'events'; |
| |
| // We create a basic promise so the caller can cancel the replication possibly |
| // before we have actually started listening to changes etc |
| class Replication extends EE { |
| constructor() { |
| super(); |
| this.cancelled = false; |
| this.state = 'pending'; |
| const promise = new Promise((fulfill, reject) => { |
| this.once('complete', fulfill); |
| this.once('error', reject); |
| }); |
| this.then = function (resolve, reject) { |
| return promise.then(resolve, reject); |
| }; |
| this.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. |
| this.catch(function () {}); |
| } |
| |
| cancel() { |
| this.cancelled = true; |
| this.state = 'cancelled'; |
| this.emit('cancel'); |
| } |
| |
| ready(src, target) { |
| if (this._readyCalled) { |
| return; |
| } |
| this._readyCalled = true; |
| |
| const onDestroy = () => { |
| this.cancel(); |
| }; |
| src.once('destroyed', onDestroy); |
| target.once('destroyed', onDestroy); |
| function cleanup() { |
| src.removeListener('destroyed', onDestroy); |
| target.removeListener('destroyed', onDestroy); |
| } |
| this.once('complete', cleanup); |
| this.once('error', cleanup); |
| } |
| } |
| |
| export default Replication; |