@@ -1314,36 +1314,29 @@ export function isHostMatch(match: RegExp, host?: string): boolean {
1314
1314
*/
1315
1315
export async function abortable < T > (
1316
1316
promise : Promise < T > ,
1317
- { signal } : { signal ? : AbortSignal } = { }
1317
+ { signal } : { signal : AbortSignal }
1318
1318
) : Promise < T > {
1319
- const { abort, done } = aborted ( signal ) ;
1319
+ const { promise : aborted , reject } = promiseWithResolvers < never > ( ) ;
1320
+
1321
+ function rejectOnAbort ( ) {
1322
+ reject ( signal . reason ) ;
1323
+ }
1324
+ signal . addEventListener ( 'abort' , rejectOnAbort , { once : true } ) ;
1325
+
1320
1326
try {
1321
- return await Promise . race ( [ promise , abort ] ) ;
1327
+ return await Promise . race ( [ promise , aborted ] ) ;
1322
1328
} finally {
1323
- done . abort ( ) ;
1329
+ signal . removeEventListener ( 'abort' , rejectOnAbort ) ;
1324
1330
}
1325
1331
}
1326
1332
1327
- /**
1328
- * Takes an AbortSignal and creates a promise that will reject when the signal aborts
1329
- * If the argument provided is nullish the returned promise will **never** resolve.
1330
- * Also returns a done controller - abort the done controller when your task is done to remove the abort listeners
1331
- * @param signal - an optional abort signal to link to a promise rejection
1332
- */
1333
- function aborted ( signal ?: AbortSignal ) : {
1334
- abort : Promise < any > ;
1335
- done : AbortController ;
1336
- } {
1337
- const done = new AbortController ( ) ;
1338
- if ( signal ?. aborted ) {
1339
- return { abort : Promise . reject ( signal . reason ) , done } ;
1340
- }
1341
- const abort = new Promise < void > ( ( _ , reject ) =>
1342
- signal ?. addEventListener ( 'abort' , ( ) => reject ( signal . reason ) , {
1343
- once : true ,
1344
- // @ts -expect-error: @types/node erroneously claim this does not exist
1345
- signal : done . signal
1346
- } )
1347
- ) ;
1348
- return { abort, done } ;
1333
+ function promiseWithResolvers < T > ( ) {
1334
+ let resolve : Parameters < ConstructorParameters < typeof Promise < T > > [ 0 ] > [ 0 ] ;
1335
+ let reject : Parameters < ConstructorParameters < typeof Promise < T > > [ 0 ] > [ 1 ] ;
1336
+ const promise = new Promise < T > ( function withResolversExecutor ( promiseResolve , promiseReject ) {
1337
+ resolve = promiseResolve ;
1338
+ reject = promiseReject ;
1339
+ } ) ;
1340
+ // @ts -expect-error: TS does not know what I know
1341
+ return { promise, resolve, reject } as const ;
1349
1342
}
0 commit comments