events-backend: proper cleanup of signal abort listeners

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2024-09-18 20:36:50 +02:00
parent 74ebf8bcae
commit 483c8dc243
2 changed files with 36 additions and 6 deletions
@@ -109,14 +109,31 @@ class DatabaseEventBusListener {
await this.#ensureConnection();
const updatePromise = new Promise<{ topic: string }>((resolve, reject) => {
const listener = { topics, resolve, reject };
const listener = {
topics,
resolve(result: { topic: string }) {
resolve(result);
cleanup();
},
reject(err: Error) {
reject(err);
cleanup();
},
};
this.#listeners.add(listener);
signal.addEventListener('abort', () => {
const onAbort = () => {
this.#listeners.delete(listener);
this.#maybeTimeoutConnection();
reject(signal.reason);
});
cleanup();
};
function cleanup() {
signal.removeEventListener('abort', onAbort);
}
signal.addEventListener('abort', onAbort);
});
// Ignore unhandled rejections
@@ -115,13 +115,26 @@ export class MemoryEventBusStore implements EventBusStore {
}
return new Promise<{ topic: string }>((resolve, reject) => {
const listener = { topics: sub.topics, resolve };
const listener = {
topics: sub.topics,
resolve(result: { topic: string }) {
resolve(result);
cleanup();
},
};
this.#listeners.add(listener);
options.signal.addEventListener('abort', () => {
const onAbort = () => {
this.#listeners.delete(listener);
reject(options.signal.reason);
});
cleanup();
};
function cleanup() {
options.signal.removeEventListener('abort', onAbort);
}
options.signal.addEventListener('abort', onAbort);
});
},
};