@@ -7,7 +7,7 @@ import readline from 'node:readline'
7
7
8
8
import abortSignal from '@socketsecurity/registry/lib/constants/abort-signal'
9
9
10
- // @ts -ignore
10
+ // @ts -ignore: Avoid TS import attributes error.
11
11
import rootPkgJson from '../package.json' with { type : 'json' }
12
12
13
13
import type { operations } from '../types/api'
@@ -192,7 +192,10 @@ async function createUploadRequest(
192
192
part . pipe ( req , { end : false } )
193
193
// Wait for file streaming to complete.
194
194
// eslint-disable-next-line no-await-in-loop
195
- await events . once ( part , 'end' )
195
+ await new Promise < void > ( ( resolve , reject ) => {
196
+ part . once ( 'end' , resolve )
197
+ part . once ( 'error' , reject )
198
+ } )
196
199
if ( ! aborted ) {
197
200
// Ensure a new line after file content.
198
201
req . write ( '\r\n' )
@@ -221,7 +224,10 @@ async function getErrorResponseBody(
221
224
const chunks : Buffer [ ] = [ ]
222
225
response . on ( 'data' , ( chunk : Buffer ) => chunks . push ( chunk ) )
223
226
try {
224
- await events . once ( response , 'end' )
227
+ await new Promise < void > ( ( resolve , reject ) => {
228
+ response . once ( 'end' , resolve )
229
+ response . once ( 'error' , reject )
230
+ } )
225
231
return Buffer . concat ( chunks ) . toString ( 'utf8' )
226
232
} catch {
227
233
return '(there was an error reading the body content)'
@@ -235,9 +241,29 @@ function getHttpModule(baseUrl: string): typeof http | typeof https {
235
241
236
242
async function getResponse ( req : ClientRequest ) : Promise < IncomingMessage > {
237
243
try {
238
- const { 0 : res } = ( await events . once ( req , 'response' , {
239
- signal : abortSignal
240
- } ) ) as [ IncomingMessage ]
244
+ const res = await new Promise < IncomingMessage > ( ( resolve , reject ) => {
245
+ const cleanup = ( ) => {
246
+ req . off ( 'response' , onResponse )
247
+ req . off ( 'error' , onError )
248
+ abortSignal ?. removeEventListener ( 'abort' , onAbort )
249
+ }
250
+ const onAbort = ( ) => {
251
+ cleanup ( )
252
+ req . destroy ( )
253
+ reject ( new Error ( 'Request aborted by signal' ) )
254
+ }
255
+ const onError = ( e : Error ) => {
256
+ cleanup ( )
257
+ reject ( e )
258
+ }
259
+ const onResponse = ( res : IncomingMessage ) => {
260
+ cleanup ( )
261
+ resolve ( res )
262
+ }
263
+ req . on ( 'response' , onResponse )
264
+ req . on ( 'error' , onError )
265
+ abortSignal ?. addEventListener ( 'abort' , onAbort )
266
+ } )
241
267
if ( ! isResponseOk ( res ) ) {
242
268
throw new ResponseError ( res , `${ req . method } request failed` )
243
269
}
0 commit comments