Merge pull request #2123 from bartslinger/fix_disconnect_listeners

bugfix: handle disconnectListeners in reverse to allow listener removal in loop
This commit is contained in:
Michael Lumish 2022-05-20 14:15:00 -07:00 committed by GitHub
commit 6c17d19834
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 4 additions and 7 deletions

View File

@ -108,7 +108,7 @@ export class Subchannel {
* socket disconnects. Used for ending active calls with an UNAVAILABLE * socket disconnects. Used for ending active calls with an UNAVAILABLE
* status. * status.
*/ */
private disconnectListeners: Array<() => void> = []; private disconnectListeners: Set<() => void> = new Set();
private backoffTimeout: BackoffTimeout; private backoffTimeout: BackoffTimeout;
@ -646,7 +646,7 @@ export class Subchannel {
this.transitionToState( this.transitionToState(
[ConnectivityState.READY], [ConnectivityState.READY],
ConnectivityState.TRANSIENT_FAILURE); ConnectivityState.TRANSIENT_FAILURE);
for (const listener of this.disconnectListeners) { for (const listener of this.disconnectListeners.values()) {
listener(); listener();
} }
} }
@ -971,14 +971,11 @@ export class Subchannel {
} }
addDisconnectListener(listener: () => void) { addDisconnectListener(listener: () => void) {
this.disconnectListeners.push(listener); this.disconnectListeners.add(listener);
} }
removeDisconnectListener(listener: () => void) { removeDisconnectListener(listener: () => void) {
const listenerIndex = this.disconnectListeners.indexOf(listener); this.disconnectListeners.delete(listener);
if (listenerIndex > -1) {
this.disconnectListeners.splice(listenerIndex, 1);
}
} }
/** /**