11'use strict' ;
2- // Flags: --expose-internals
2+ // Flags: --expose-internals --no-warnings --experimental-abortcontroller
33
44const common = require ( '../common' ) ;
55const { once, EventEmitter } = require ( 'events' ) ;
6- const { strictEqual, deepStrictEqual, fail } = require ( 'assert' ) ;
6+ const {
7+ strictEqual,
8+ deepStrictEqual,
9+ fail,
10+ rejects,
11+ } = require ( 'assert' ) ;
712const { EventTarget, Event } = require ( 'internal/event_target' ) ;
813
914async function onceAnEvent ( ) {
@@ -114,6 +119,81 @@ async function prioritizesEventEmitter() {
114119 process . nextTick ( ( ) => ee . emit ( 'foo' ) ) ;
115120 await once ( ee , 'foo' ) ;
116121}
122+
123+ async function abortSignalBefore ( ) {
124+ const ee = new EventEmitter ( ) ;
125+ const ac = new AbortController ( ) ;
126+ ee . on ( 'error' , common . mustNotCall ( ) ) ;
127+ ac . abort ( ) ;
128+
129+ await Promise . all ( [ 1 , { } , 'hi' , null , false ] . map ( ( signal ) => {
130+ return rejects ( once ( ee , 'foo' , { signal } ) , {
131+ code : 'ERR_INVALID_ARG_TYPE'
132+ } ) ;
133+ } ) ) ;
134+
135+ return rejects ( once ( ee , 'foo' , { signal : ac . signal } ) , {
136+ name : 'AbortError'
137+ } ) ;
138+ }
139+
140+ async function abortSignalAfter ( ) {
141+ const ee = new EventEmitter ( ) ;
142+ const ac = new AbortController ( ) ;
143+ ee . on ( 'error' , common . mustNotCall ( ) ) ;
144+ const r = rejects ( once ( ee , 'foo' , { signal : ac . signal } ) , {
145+ name : 'AbortError'
146+ } ) ;
147+ process . nextTick ( ( ) => ac . abort ( ) ) ;
148+ return r ;
149+ }
150+
151+ async function abortSignalAfterEvent ( ) {
152+ const ee = new EventEmitter ( ) ;
153+ const ac = new AbortController ( ) ;
154+ process . nextTick ( ( ) => {
155+ ee . emit ( 'foo' ) ;
156+ ac . abort ( ) ;
157+ } ) ;
158+ await once ( ee , 'foo' , { signal : ac . signal } ) ;
159+ }
160+
161+ async function eventTargetAbortSignalBefore ( ) {
162+ const et = new EventTarget ( ) ;
163+ const ac = new AbortController ( ) ;
164+ ac . abort ( ) ;
165+
166+ await Promise . all ( [ 1 , { } , 'hi' , null , false ] . map ( ( signal ) => {
167+ return rejects ( once ( et , 'foo' , { signal } ) , {
168+ code : 'ERR_INVALID_ARG_TYPE'
169+ } ) ;
170+ } ) ) ;
171+
172+ return rejects ( once ( et , 'foo' , { signal : ac . signal } ) , {
173+ name : 'AbortError'
174+ } ) ;
175+ }
176+
177+ async function eventTargetAbortSignalAfter ( ) {
178+ const et = new EventTarget ( ) ;
179+ const ac = new AbortController ( ) ;
180+ const r = rejects ( once ( et , 'foo' , { signal : ac . signal } ) , {
181+ name : 'AbortError'
182+ } ) ;
183+ process . nextTick ( ( ) => ac . abort ( ) ) ;
184+ return r ;
185+ }
186+
187+ async function eventTargetAbortSignalAfterEvent ( ) {
188+ const et = new EventTarget ( ) ;
189+ const ac = new AbortController ( ) ;
190+ process . nextTick ( ( ) => {
191+ et . dispatchEvent ( new Event ( 'foo' ) ) ;
192+ ac . abort ( ) ;
193+ } ) ;
194+ await once ( et , 'foo' , { signal : ac . signal } ) ;
195+ }
196+
117197Promise . all ( [
118198 onceAnEvent ( ) ,
119199 onceAnEventWithTwoArgs ( ) ,
@@ -123,4 +203,10 @@ Promise.all([
123203 onceWithEventTarget ( ) ,
124204 onceWithEventTargetError ( ) ,
125205 prioritizesEventEmitter ( ) ,
206+ abortSignalBefore ( ) ,
207+ abortSignalAfter ( ) ,
208+ abortSignalAfterEvent ( ) ,
209+ eventTargetAbortSignalBefore ( ) ,
210+ eventTargetAbortSignalAfter ( ) ,
211+ eventTargetAbortSignalAfterEvent ( ) ,
126212] ) . then ( common . mustCall ( ) ) ;
0 commit comments