]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - packages/peertube-runner/shared/http.ts
Enable external plugins to test the PR
[github/Chocobozzz/PeerTube.git] / packages / peertube-runner / shared / http.ts
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)
50 .catch(err => logger.error(err))
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 }