diff options
-rw-r--r-- | editors/code/src/installation/download_file.ts | 33 | ||||
-rw-r--r-- | editors/code/src/installation/language_server.ts | 2 |
2 files changed, 22 insertions, 13 deletions
diff --git a/editors/code/src/installation/download_file.ts b/editors/code/src/installation/download_file.ts index f1f9f4a25..d154f4816 100644 --- a/editors/code/src/installation/download_file.ts +++ b/editors/code/src/installation/download_file.ts | |||
@@ -1,7 +1,11 @@ | |||
1 | import fetch from "node-fetch"; | 1 | import fetch from "node-fetch"; |
2 | import * as fs from "fs"; | 2 | import * as fs from "fs"; |
3 | import * as stream from "stream"; | ||
4 | import * as util from "util"; | ||
3 | import { strict as assert } from "assert"; | 5 | import { strict as assert } from "assert"; |
4 | 6 | ||
7 | const pipeline = util.promisify(stream.pipeline); | ||
8 | |||
5 | /** | 9 | /** |
6 | * Downloads file from `url` and stores it at `destFilePath` with `destFilePermissions`. | 10 | * Downloads file from `url` and stores it at `destFilePath` with `destFilePermissions`. |
7 | * `onProgress` callback is called on recieveing each chunk of bytes | 11 | * `onProgress` callback is called on recieveing each chunk of bytes |
@@ -20,25 +24,28 @@ export async function downloadFile( | |||
20 | console.log("Error", res.status, "while downloading file from", url); | 24 | console.log("Error", res.status, "while downloading file from", url); |
21 | console.dir({ body: await res.text(), headers: res.headers }, { depth: 3 }); | 25 | console.dir({ body: await res.text(), headers: res.headers }, { depth: 3 }); |
22 | 26 | ||
23 | throw new Error(`Got response ${res.status} when trying to download a file`); | 27 | throw new Error(`Got response ${res.status} when trying to download a file.`); |
24 | } | 28 | } |
25 | 29 | ||
26 | const totalBytes = Number(res.headers.get('content-length')); | 30 | const totalBytes = Number(res.headers.get('content-length')); |
27 | assert(!Number.isNaN(totalBytes), "Sanity check of content-length protocol"); | 31 | assert(!Number.isNaN(totalBytes), "Sanity check of content-length protocol"); |
28 | 32 | ||
33 | console.log("Downloading file of", totalBytes, "bytes size from", url, "to", destFilePath); | ||
34 | |||
29 | let readBytes = 0; | 35 | let readBytes = 0; |
36 | res.body.on("data", (chunk: Buffer) => { | ||
37 | readBytes += chunk.length; | ||
38 | onProgress(readBytes, totalBytes); | ||
39 | }); | ||
30 | 40 | ||
31 | console.log("Downloading file of", totalBytes, "bytes size from", url, "to", destFilePath); | 41 | const destFileStream = fs.createWriteStream(destFilePath, { mode: destFilePermissions }); |
42 | |||
43 | await pipeline(res.body, destFileStream); | ||
44 | return new Promise<void>(resolve => { | ||
45 | destFileStream.on("close", resolve); | ||
46 | destFileStream.destroy(); | ||
32 | 47 | ||
33 | return new Promise<void>((resolve, reject) => res.body | 48 | // Details on workaround: https://github.com/rust-analyzer/rust-analyzer/pull/3092#discussion_r378191131 |
34 | .on("data", (chunk: Buffer) => { | 49 | // Issue at nodejs repo: https://github.com/nodejs/node/issues/31776 |
35 | readBytes += chunk.length; | 50 | }); |
36 | onProgress(readBytes, totalBytes); | ||
37 | }) | ||
38 | .on("error", reject) | ||
39 | .pipe(fs | ||
40 | .createWriteStream(destFilePath, { mode: destFilePermissions }) | ||
41 | .on("close", resolve) | ||
42 | ) | ||
43 | ); | ||
44 | } | 51 | } |
diff --git a/editors/code/src/installation/language_server.ts b/editors/code/src/installation/language_server.ts index 52c5cbe7d..4797c3f01 100644 --- a/editors/code/src/installation/language_server.ts +++ b/editors/code/src/installation/language_server.ts | |||
@@ -104,6 +104,8 @@ export async function ensureLanguageServerBinary( | |||
104 | `GitHub repository: ${err.message}` | 104 | `GitHub repository: ${err.message}` |
105 | ); | 105 | ); |
106 | 106 | ||
107 | console.error(err); | ||
108 | |||
107 | dns.resolve('example.com').then( | 109 | dns.resolve('example.com').then( |
108 | addrs => console.log("DNS resolution for example.com was successful", addrs), | 110 | addrs => console.log("DNS resolution for example.com was successful", addrs), |
109 | err => { | 111 | err => { |