diff --git a/backend/src/sync-assets.ts b/backend/src/sync-assets.ts index 302196458..d7644e24b 100644 --- a/backend/src/sync-assets.ts +++ b/backend/src/sync-assets.ts @@ -1,8 +1,8 @@ -import axios from 'axios'; +import axios, { AxiosResponse } from 'axios'; import * as fs from 'fs'; -const fsPromises = fs.promises; import config from './config'; import logger from './logger'; +import { SocksProxyAgent } from 'socks-proxy-agent'; const PATH = './'; @@ -17,12 +17,44 @@ class SyncAssets { private async downloadFile(url: string) { const fileName = url.split('/').slice(-1)[0]; - logger.info(`Downloading external asset: ${fileName}...`); + try { - const response = await axios.get(url, { - responseType: 'stream', timeout: 30000 - }); - await fsPromises.writeFile(PATH + fileName, response.data); + if (config.SOCKS5PROXY.ENABLED) { + let socksOptions: any = { + agentOptions: { + keepAlive: true, + }, + host: config.SOCKS5PROXY.HOST, + port: config.SOCKS5PROXY.PORT + }; + + if (config.SOCKS5PROXY.USERNAME && config.SOCKS5PROXY.PASSWORD) { + socksOptions.username = config.SOCKS5PROXY.USERNAME; + socksOptions.password = config.SOCKS5PROXY.PASSWORD; + } + + const agent = new SocksProxyAgent(socksOptions); + + logger.info(`Downloading external asset ${fileName} over the Tor network...`); + await axios.get(url, { + httpAgent: agent, + httpsAgent: agent, + responseType: 'stream', + timeout: 30000 + }).then(function (response) { + response.data.pipe(fs.createWriteStream(PATH + fileName)); + logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); + }); + } else { + logger.info(`Downloading external asset ${fileName} over clearnet...`); + await axios.get(url, { + responseType: 'stream', + timeout: 30000 + }).then(function (response) { + response.data.pipe(fs.createWriteStream(PATH + fileName)); + logger.info(`External asset ${fileName} saved to ${PATH + fileName}`); + }); + } } catch (e: any) { throw new Error(`Failed to download external asset. ` + e); }