blob: 2ca732b70f2430c727db8b15f400ba1add33009f [file] [log] [blame]
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;