Skip to content

Commit

Permalink
fix: don't add listeners to the same signal more than once
Browse files Browse the repository at this point in the history
  • Loading branch information
tsctx committed Apr 28, 2024
1 parent 24f7ee6 commit 948d332
Showing 1 changed file with 36 additions and 11 deletions.
47 changes: 36 additions & 11 deletions lib/api/abort-signal.js
@@ -1,8 +1,9 @@
const { addAbortListener } = require('../core/util')
const { RequestAbortedError } = require('../core/errors')

const kListener = Symbol('kListener')
const kSignal = Symbol('kSignal')
const kListenerList = Symbol('kListenersList')
const kHandler = Symbol('kHandler')

function abort (self) {
if (self.abort) {
Expand All @@ -13,11 +14,26 @@ function abort (self) {
removeSignal(self)
}

function clearListeners (signal) {
const listenerList = signal[kListenerList]
if (!listenerList) {
return
}
if ('removeEventListener' in signal) {
signal.removeEventListener('abort', signal[kHandler])
} else {
signal.removeListener('abort', signal[kHandler])
}
if (listenerList.size !== 0) {
listenerList.clear()
}
signal[kListenerList] = null
}

function addSignal (self, signal) {
self.reason = null

self[kSignal] = null
self[kListener] = null

if (!signal) {
return
Expand All @@ -29,26 +45,35 @@ function addSignal (self, signal) {
}

self[kSignal] = signal
self[kListener] = () => {
abort(self)

if (!signal[kListenerList]) {
signal[kListenerList] = new Set()
signal[kHandler] = () => {
for (const listener of signal[kListenerList]) {
abort(listener)
}
clearListeners(signal)
}
addAbortListener(signal, signal[kHandler])
}

addAbortListener(self[kSignal], self[kListener])
signal[kListenerList].add(self)
}

function removeSignal (self) {
if (!self[kSignal]) {
const signal = self[kSignal]

if (!signal) {
return
}

if ('removeEventListener' in self[kSignal]) {
self[kSignal].removeEventListener('abort', self[kListener])
} else {
self[kSignal].removeListener('abort', self[kListener])
signal[kListenerList].delete(self)

if (signal[kListenerList].size === 0) {
clearListeners(signal)
}

self[kSignal] = null
self[kListener] = null
}

module.exports = {
Expand Down

0 comments on commit 948d332

Please sign in to comment.