Avoid leaking realms when an error occurs within an event handler

This commit is contained in:
Thomas Goyne 2018-03-20 16:52:52 -07:00 committed by Kenneth Geisshirt
parent 1d0b1dcc24
commit bf26c01fd3
2 changed files with 23 additions and 3 deletions

View File

@ -43,7 +43,14 @@ process.on('message', (m) => {
if (impl.onchange) { if (impl.onchange) {
const change = Realm.Sync._deserializeChangeSet(m.change); const change = Realm.Sync._deserializeChangeSet(m.change);
if (!change.isEmpty) { if (!change.isEmpty) {
impl.onchange(change); try {
impl.onchange(change);
}
catch (e) {
change.close();
process.send({change: m.change});
throw e;
}
} }
change.close(); change.close();
} }

View File

@ -65,11 +65,24 @@ class FunctionListener {
changes.release(); changes.release();
return; return;
} }
const promise = Promise.resolve(this.fn(changes));
let promise;
try {
promise = Promise.resolve(this.fn(changes));
}
catch (e) {
changes.release();
throw e;
}
this.pending.push(promise); this.pending.push(promise);
promise.then(() => { const release = () => {
changes.release(); changes.release();
this.pending.splice(this.pending.indexOf(promise), 1); this.pending.splice(this.pending.indexOf(promise), 1);
};
promise.then(release).catch(e => {
release();
throw e;
}); });
} }
}; };