]>
Commit | Line | Data |
---|---|---|
1772b383 C |
1 | import { createWriteStream, remove } from 'fs-extra' |
2 | import { request as requestHTTP } from 'http' | |
3 | import { request as requestHTTPS, RequestOptions } from 'https' | |
4 | import { logger } from './logger' | |
5 | ||
6 | export function downloadFile (options: { | |
7 | url: string | |
8 | destination: string | |
9 | runnerToken: string | |
10 | jobToken: string | |
11 | }) { | |
12 | const { url, destination, runnerToken, jobToken } = options | |
13 | ||
14 | logger.debug(`Downloading file ${url}`) | |
15 | ||
16 | return new Promise<void>((res, rej) => { | |
17 | const parsed = new URL(url) | |
18 | ||
19 | const body = JSON.stringify({ | |
20 | runnerToken, | |
21 | jobToken | |
22 | }) | |
23 | ||
24 | const getOptions: RequestOptions = { | |
25 | method: 'POST', | |
26 | hostname: parsed.hostname, | |
27 | port: parsed.port, | |
28 | path: parsed.pathname, | |
29 | headers: { | |
30 | 'Content-Type': 'application/json', | |
31 | 'Content-Length': Buffer.byteLength(body, 'utf-8') | |
32 | } | |
33 | } | |
34 | ||
35 | const request = getRequest(url)(getOptions, response => { | |
36 | const code = response.statusCode ?? 0 | |
37 | ||
38 | if (code >= 400) { | |
39 | return rej(new Error(response.statusMessage)) | |
40 | } | |
41 | ||
42 | const file = createWriteStream(destination) | |
43 | file.on('finish', () => res()) | |
44 | ||
45 | response.pipe(file) | |
46 | }) | |
47 | ||
48 | request.on('error', err => { | |
49 | remove(destination) | |
3a0c2a77 | 50 | .catch(err => logger.error(err)) |
1772b383 C |
51 | |
52 | return rej(err) | |
53 | }) | |
54 | ||
55 | request.write(body) | |
56 | request.end() | |
57 | }) | |
58 | } | |
59 | ||
60 | // --------------------------------------------------------------------------- | |
61 | ||
62 | function getRequest (url: string) { | |
63 | if (url.startsWith('https://')) return requestHTTPS | |
64 | ||
65 | return requestHTTP | |
66 | } |