|
1 | 1 | 'use strict';
|
2 |
| -// Flags: --no-warnings |
| 2 | +// Flags: --expose-internals --no-warnings |
3 | 3 |
|
4 | 4 | const common = require('../common');
|
5 | 5 | const { once, EventEmitter } = require('events');
|
|
9 | 9 | fail,
|
10 | 10 | rejects,
|
11 | 11 | } = require('assert');
|
| 12 | +const { kEvents } = require('internal/event_target'); |
12 | 13 |
|
13 | 14 | async function onceAnEvent() {
|
14 | 15 | const ee = new EventEmitter();
|
@@ -65,6 +66,32 @@ async function catchesErrors() {
|
65 | 66 | strictEqual(ee.listenerCount('myevent'), 0);
|
66 | 67 | }
|
67 | 68 |
|
| 69 | +async function catchesErrorsWithAbortSignal() { |
| 70 | + const ee = new EventEmitter(); |
| 71 | + const ac = new AbortController(); |
| 72 | + const signal = ac.signal; |
| 73 | + |
| 74 | + const expected = new Error('boom'); |
| 75 | + let err; |
| 76 | + process.nextTick(() => { |
| 77 | + ee.emit('error', expected); |
| 78 | + }); |
| 79 | + |
| 80 | + try { |
| 81 | + const promise = once(ee, 'myevent', { signal }); |
| 82 | + strictEqual(ee.listenerCount('error'), 1); |
| 83 | + strictEqual(signal[kEvents].size, 1); |
| 84 | + |
| 85 | + await promise; |
| 86 | + } catch (e) { |
| 87 | + err = e; |
| 88 | + } |
| 89 | + strictEqual(err, expected); |
| 90 | + strictEqual(ee.listenerCount('error'), 0); |
| 91 | + strictEqual(ee.listenerCount('myevent'), 0); |
| 92 | + strictEqual(signal[kEvents].size, 0); |
| 93 | +} |
| 94 | + |
68 | 95 | async function stopListeningAfterCatchingError() {
|
69 | 96 | const ee = new EventEmitter();
|
70 | 97 |
|
@@ -165,7 +192,10 @@ async function abortSignalAfterEvent() {
|
165 | 192 | ee.emit('foo');
|
166 | 193 | ac.abort();
|
167 | 194 | });
|
168 |
| - await once(ee, 'foo', { signal: ac.signal }); |
| 195 | + const promise = once(ee, 'foo', { signal: ac.signal }); |
| 196 | + strictEqual(ac.signal[kEvents].size, 1); |
| 197 | + await promise; |
| 198 | + strictEqual(ac.signal[kEvents].size, 0); |
169 | 199 | }
|
170 | 200 |
|
171 | 201 | async function abortSignalRemoveListener() {
|
@@ -221,6 +251,7 @@ Promise.all([
|
221 | 251 | onceAnEventWithNullOptions(),
|
222 | 252 | onceAnEventWithTwoArgs(),
|
223 | 253 | catchesErrors(),
|
| 254 | + catchesErrorsWithAbortSignal(), |
224 | 255 | stopListeningAfterCatchingError(),
|
225 | 256 | onceError(),
|
226 | 257 | onceWithEventTarget(),
|
|
0 commit comments