Skip to content

Commit

Permalink
fix: call Promise.race without a long pending promise to prevent memo…
Browse files Browse the repository at this point in the history
…ry leak (#1657)

Fixes #1655 🦕
  • Loading branch information
AAAhs authored Jul 6, 2022
1 parent 1039f68 commit 768acb6
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions src/session-pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -997,13 +997,20 @@ export class SessionPool extends EventEmitter implements SessionPoolInterface {
throw new SessionPoolExhaustedError(this._getLeaks());
}

let removeOnceCloseListener: Function;
let removeListener: Function;

// Wait for the requested type of session to become available.
const availableEvent = type + '-available';
const promises = [
this._onClose.then(() => {
throw new GoogleError(errors.Closed);
new Promise((_, reject) => {
const onceCloseListener = () => reject(new GoogleError(errors.Closed));
this.once('close', onceCloseListener);
removeOnceCloseListener = this.removeListener.bind(
this,
'close',
onceCloseListener
);
}),
new Promise(resolve => {
this.once(availableEvent, resolve);
Expand Down Expand Up @@ -1077,6 +1084,7 @@ export class SessionPool extends EventEmitter implements SessionPoolInterface {
await Promise.race(promises);
} finally {
this._waiters[type]--;
removeOnceCloseListener!();
removeListener!();
removeErrorListener!();
removeTimeoutListener();
Expand Down

0 comments on commit 768acb6

Please sign in to comment.