aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/installation/download_file.ts
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/installation/download_file.ts')
-rw-r--r--editors/code/src/installation/download_file.ts10
1 files changed, 9 insertions, 1 deletions
diff --git a/editors/code/src/installation/download_file.ts b/editors/code/src/installation/download_file.ts
index 7b537e114..0cc5fc0cb 100644
--- a/editors/code/src/installation/download_file.ts
+++ b/editors/code/src/installation/download_file.ts
@@ -1,17 +1,25 @@
1import fetch from "node-fetch"; 1import fetch from "node-fetch";
2import { throttle } from "throttle-debounce"; 2import { throttle } from "throttle-debounce";
3import * as fs from "fs"; 3import * as fs from "fs";
4import { strict as assert } from "assert";
4 5
6/**
7 * Downloads file from `url` and stores it at `destFilePath`.
8 * `onProgress` callback is periodically called to track the progress of downloading,
9 * it gets the already read and total amount of bytes to read as its parameters.
10 */
5export async function downloadFile( 11export async function downloadFile(
6 url: string, 12 url: string,
7 destFilePath: fs.PathLike, 13 destFilePath: fs.PathLike,
8 onProgress: (readBytes: number, totalBytes: number) => void 14 onProgress: (readBytes: number, totalBytes: number) => void
9): Promise<void> { 15): Promise<void> {
10 onProgress = throttle(1000, /* noTrailing: */ true, onProgress); 16 onProgress = throttle(500, /* noTrailing: */ true, onProgress);
11 17
12 const response = await fetch(url); 18 const response = await fetch(url);
13 19
14 const totalBytes = Number(response.headers.get('content-length')); 20 const totalBytes = Number(response.headers.get('content-length'));
21 assert(!Number.isNaN(totalBytes), "Sanity check of content-length protocol");
22
15 let readBytes = 0; 23 let readBytes = 0;
16 24
17 return new Promise<void>((resolve, reject) => response.body 25 return new Promise<void>((resolve, reject) => response.body