@@ -4,6 +4,7 @@ import { spawn } from "node:child_process";
44import { createHash } from "node:crypto" ;
55import { lookup as dnsLookupCb } from "node:dns" ;
66import { lookup as dnsLookup } from "node:dns/promises" ;
7+ import { once } from "node:events" ;
78import { createWriteStream } from "node:fs" ;
89import fs from "node:fs/promises" ;
910import { request as httpsRequest } from "node:https" ;
@@ -1165,6 +1166,7 @@ async function* limitWebResponseBody(body, maxBytes, timeoutPromise) {
11651166 const size = typeof value === "string" ? Buffer . byteLength ( value ) : value . byteLength ;
11661167 downloaded += size ;
11671168 if ( downloaded > maxBytes ) {
1169+ await reader . cancel ( ) . catch ( ( ) => { } ) ;
11681170 throw new Error ( `package_url exceeds maximum download size of ${ maxBytes } bytes` ) ;
11691171 }
11701172 yield value ;
@@ -1199,6 +1201,7 @@ export async function downloadUrl(url, target, options = {}) {
11991201 options ,
12001202 ) ;
12011203 const tempTarget = `${ target } .tmp` ;
1204+ let output ;
12021205 try {
12031206 if ( ! responseOk ( response ) || ! response . body ) {
12041207 throw new Error ( `failed to download package_url: HTTP ${ responseStatus ( response ) } ` ) ;
@@ -1210,10 +1213,8 @@ export async function downloadUrl(url, target, options = {}) {
12101213 throw new Error ( `package_url exceeds maximum download size of ${ maxBytes } bytes` ) ;
12111214 }
12121215 await fs . rm ( tempTarget , { force : true } ) ;
1213- await pipeline (
1214- limitResponseBody ( response . body , maxBytes , timeoutPromise ) ,
1215- createWriteStream ( tempTarget ) ,
1216- ) ;
1216+ output = createWriteStream ( tempTarget ) ;
1217+ await pipeline ( limitResponseBody ( response . body , maxBytes , timeoutPromise ) , output ) ;
12171218 await fs . rename ( tempTarget , target ) ;
12181219 } catch ( error ) {
12191220 if ( error ?. code === "ETIMEDOUT" ) {
@@ -1228,6 +1229,9 @@ export async function downloadUrl(url, target, options = {}) {
12281229 } finally {
12291230 clearTimeout ( timeout ) ;
12301231 await close ( ) ;
1232+ if ( output && ! output . closed ) {
1233+ await once ( output , "close" ) . catch ( ( ) => { } ) ;
1234+ }
12311235 await fs . rm ( tempTarget , { force : true } ) ;
12321236 }
12331237}
0 commit comments