* @param {string} url * @param {string} dest * @returns {Promise }
(url, dest)
| 167 | * @returns {Promise<void>} |
| 168 | */ |
| 169 | function downloadFile(url, dest) { |
| 170 | return new Promise((resolve, reject) => { |
| 171 | /** |
| 172 | * @param {string} currentUrl |
| 173 | */ |
| 174 | function follow(currentUrl) { |
| 175 | https |
| 176 | .get(currentUrl, { headers: { "User-Agent": "csskit-vscode" } }, (res) => { |
| 177 | if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { |
| 178 | follow(res.headers.location); |
| 179 | res.resume(); |
| 180 | return; |
| 181 | } |
| 182 | if (res.statusCode !== 200) { |
| 183 | reject(new Error(`Download failed with status ${res.statusCode}`)); |
| 184 | res.resume(); |
| 185 | return; |
| 186 | } |
| 187 | const file = fs.createWriteStream(dest); |
| 188 | res.pipe(file); |
| 189 | file.on("finish", () => file.close(() => resolve())); |
| 190 | file.on("error", (e) => { |
| 191 | fs.unlink(dest, () => {}); |
| 192 | reject(e); |
| 193 | }); |
| 194 | }) |
| 195 | .on("error", reject); |
| 196 | } |
| 197 | follow(url); |
| 198 | }); |
| 199 | } |
no test coverage detected