| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 4f68c7c commit 40ef2da
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1167,14 +1167,8 @@ function on(emitter, event, options = kEmptyObject) { | |||
| 1167 | 1167 | addEventListener(emitter, closeEvents[i], closeHandler); | |
| 1168 | 1168 | } | |
| 1169 | 1169 | } | |
| 1170 | - if (signal) { | ||
| 1171 | - kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation; | ||
| 1172 | - eventTargetAgnosticAddListener( | ||
| 1173 | - signal, | ||
| 1174 | - 'abort', | ||
| 1175 | - abortListener, | ||
| 1176 | - { __proto__: null, once: true, [kResistStopPropagation]: true }); | ||
| 1177 | - } | ||
| 1170 | + | ||
| 1171 | + const abortListenerDisposable = signal ? addAbortListener(signal, abortListener) : null; | ||
| 1178 | 1172 | ||
| 1179 | 1173 | return iterator; | |
| 1180 | 1174 | ||
@@ -1201,6 +1195,7 @@ function on(emitter, event, options = kEmptyObject) { | |||
| 1201 | 1195 | } | |
| 1202 | 1196 | ||
| 1203 | 1197 | function closeHandler() { | |
| 1198 | + abortListenerDisposable?.[SymbolDispose](); | ||
| 1204 | 1199 | removeAll(); | |
| 1205 | 1200 | finished = true; | |
| 1206 | 1201 | const doneResult = createIterResult(undefined, true); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,6 +6,7 @@ const assert = require('assert'); | |||
| 6 | 6 | const { on, EventEmitter } = require('events'); | |
| 7 | 7 | const { | |
| 8 | 8 | NodeEventTarget, | |
| 9 | + kEvents | ||
| 9 | 10 | } = require('internal/event_target'); | |
| 10 | 11 | ||
| 11 | 12 | async function basic() { | |
@@ -372,6 +373,36 @@ async function abortableOnAfterDone() { | |||
| 372 | 373 | }); | |
| 373 | 374 | } | |
| 374 | 375 | ||
| 376 | + async function abortListenerRemovedAfterComplete() { | ||
| 377 | + const ee = new EventEmitter(); | ||
| 378 | + const ac = new AbortController(); | ||
| 379 | + | ||
| 380 | + const i = setInterval(() => ee.emit('foo', 'foo'), 1); | ||
| 381 | + try { | ||
| 382 | + // Below: either the kEvents map is empty or the 'abort' listener list is empty | ||
| 383 | + | ||
| 384 | + // Return case | ||
| 385 | + const endedIterator = on(ee, 'foo', { signal: ac.signal }); | ||
| 386 | + assert.ok(ac.signal[kEvents].get('abort').size > 0); | ||
| 387 | + endedIterator.return(); | ||
| 388 | + assert.strictEqual(ac.signal[kEvents].get('abort')?.size ?? ac.signal[kEvents].size, 0); | ||
| 389 | + | ||
| 390 | + // Throw case | ||
| 391 | + const throwIterator = on(ee, 'foo', { signal: ac.signal }); | ||
| 392 | + assert.ok(ac.signal[kEvents].get('abort').size > 0); | ||
| 393 | + throwIterator.throw(new Error()); | ||
| 394 | + assert.strictEqual(ac.signal[kEvents].get('abort')?.size ?? ac.signal[kEvents].size, 0); | ||
| 395 | + | ||
| 396 | + // Abort case | ||
| 397 | + on(ee, 'foo', { signal: ac.signal }); | ||
| 398 | + assert.ok(ac.signal[kEvents].get('abort').size > 0); | ||
| 399 | + ac.abort(new Error()); | ||
| 400 | + assert.strictEqual(ac.signal[kEvents].get('abort')?.size ?? ac.signal[kEvents].size, 0); | ||
| 401 | + } finally { | ||
| 402 | + clearInterval(i); | ||
| 403 | + } | ||
| 404 | + } | ||
| 405 | + | ||
| 375 | 406 | async function run() { | |
| 376 | 407 | const funcs = [ | |
| 377 | 408 | basic, | |
@@ -391,6 +422,7 @@ async function run() { | |||
| 391 | 422 | eventTargetAbortableOnAfter, | |
| 392 | 423 | eventTargetAbortableOnAfter2, | |
| 393 | 424 | abortableOnAfterDone, | |
| 425 | + abortListenerRemovedAfterComplete, | ||
| 394 | 426 | ]; | |
| 395 | 427 | ||
| 396 | 428 | for (const fn of funcs) { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments