Files
GDevelop/newIDE/electron-app/app/LocalFileDownloader.js

79 lines
2.1 KiB
JavaScript

const fs = require('fs');
const axios = require('axios');
const log = require('electron-log');
const { session } = require('electron');
const findGDevelopCloudCookieValue = async () => {
/** @type {import("electron").Cookie[]} */
let cookies = [];
try {
cookies = await session.defaultSession.cookies.get({
domain: 'gdevelop.io',
name: 'gd_resource',
});
} catch (error) {
log.error('Error while reading cookies:', error);
}
const gdevelopCloudCookieValue = cookies[0] ? cookies[0].value : null;
return gdevelopCloudCookieValue;
};
module.exports = {
/**
* @param {string} url
* @param {string} outputPath
*/
downloadLocalFile: async (url, outputPath) => {
const gdevelopCloudCookieValue = await findGDevelopCloudCookieValue();
log.verbose(`Downloading ${url} to ${outputPath}...`);
const response = await axios.get(url, {
responseType: 'stream',
headers: gdevelopCloudCookieValue
? {
Cookie: `gd_resource=${gdevelopCloudCookieValue}`,
}
: {},
});
// Create the writer only after the request is successful.
const writer = fs.createWriteStream(outputPath);
return new Promise((resolve, reject) => {
let isRejectedOrResolvedAlready = false;
const cleanUpAndReject = err => {
if (isRejectedOrResolvedAlready) return;
isRejectedOrResolvedAlready = true;
try {
writer.destroy();
} catch (e) {}
// Best effort to remove the incomplete file
try {
fs.unlinkSync(outputPath);
} catch (e) {}
reject(err);
};
response.data.on('error', cleanUpAndReject);
writer.on('error', cleanUpAndReject);
writer.on('finish', () => {
if (isRejectedOrResolvedAlready) return;
isRejectedOrResolvedAlready = true;
resolve(true);
});
response.data.pipe(writer);
});
},
/**
* @param {ArrayBuffer} arrayBuffer
* @param {string} outputPath
*/
saveLocalFileFromArrayBuffer: async (arrayBuffer, outputPath) => {
await fs.promises.writeFile(outputPath, Buffer.from(arrayBuffer));
},
};