diff --git a/src/api/export.ts b/src/api/export.ts index 93e6b4f4d..84239bea3 100644 --- a/src/api/export.ts +++ b/src/api/export.ts @@ -22,11 +22,11 @@ export const checkExistsAndRename = async ( } }; -export const saveStreamToDisk = ( +export const saveStreamToDisk = async ( filePath: string, - fileStream: ReadableStream + fileStream: ReadableStream ) => { - writeStream(filePath, fileStream); + await writeStream(filePath, fileStream); }; export const saveFileToDisk = async (path: string, fileData: any) => { diff --git a/src/api/ffmpeg.ts b/src/api/ffmpeg.ts index 1b0f57068..462a63385 100644 --- a/src/api/ffmpeg.ts +++ b/src/api/ffmpeg.ts @@ -1,5 +1,6 @@ import { ipcRenderer } from 'electron'; import { existsSync } from 'fs'; +import { writeStream } from '../services/fs'; import { logError } from '../services/logging'; import { ElectronFile } from '../types'; @@ -12,12 +13,12 @@ export async function runFFmpegCmd( let createdTempInputFile = null; try { if (!existsSync(inputFile.path)) { - const inputFileData = new Uint8Array(await inputFile.arrayBuffer()); - inputFilePath = await ipcRenderer.invoke( - 'write-temp-file', - inputFileData, + const tempFilePath = await ipcRenderer.invoke( + 'get-temp-file-path', inputFile.name ); + await writeStream(tempFilePath, await inputFile.stream()); + inputFilePath = tempFilePath; createdTempInputFile = true; } else { inputFilePath = inputFile.path; diff --git a/src/api/imageProcessor.ts b/src/api/imageProcessor.ts index 07389bd71..61b0ae529 100644 --- a/src/api/imageProcessor.ts +++ b/src/api/imageProcessor.ts @@ -1,5 +1,6 @@ import { ipcRenderer } from 'electron/renderer'; import { existsSync } from 'fs'; +import { writeStream } from '../services/fs'; import { logError } from '../services/logging'; import { ElectronFile } from '../types'; @@ -20,12 +21,12 @@ export async function generateImageThumbnail( let createdTempInputFile = null; try { if (!existsSync(inputFile.path)) { - const inputFileData = new Uint8Array(await inputFile.arrayBuffer()); - inputFilePath = await ipcRenderer.invoke( - 'write-temp-file', - inputFileData, + const tempFilePath = await ipcRenderer.invoke( + 'get-temp-file-path', inputFile.name ); + await writeStream(tempFilePath, await inputFile.stream()); + inputFilePath = tempFilePath; createdTempInputFile = true; } else { inputFilePath = inputFile.path; diff --git a/src/services/fs.ts b/src/services/fs.ts index ba22e39ff..9565cb086 100644 --- a/src/services/fs.ts +++ b/src/services/fs.ts @@ -192,7 +192,9 @@ export async function isFolder(dirPath: string) { .catch(() => false); } -export const convertBrowserStreamToNode = (fileStream: any) => { +export const convertBrowserStreamToNode = ( + fileStream: ReadableStream +) => { const reader = fileStream.getReader(); const rs = new Readable(); @@ -210,10 +212,17 @@ export const convertBrowserStreamToNode = (fileStream: any) => { return rs; }; -export function writeStream(filePath: string, fileStream: any) { +export async function writeStream( + filePath: string, + fileStream: ReadableStream +) { const writeable = fs.createWriteStream(filePath); const readable = convertBrowserStreamToNode(fileStream); readable.pipe(writeable); + await new Promise((resolve, reject) => { + writeable.on('finish', resolve); + writeable.on('error', reject); + }); } export async function readTextFile(filePath: string) { diff --git a/src/utils/ipcComms.ts b/src/utils/ipcComms.ts index 2bbe39452..3acc87141 100644 --- a/src/utils/ipcComms.ts +++ b/src/utils/ipcComms.ts @@ -23,11 +23,8 @@ import { skipAppVersion, updateAndRestart, } from '../services/appUpdater'; -import { - deleteTempFile, - runFFmpegCmd, - writeTempFile, -} from '../services/ffmpeg'; +import { deleteTempFile, runFFmpegCmd } from '../services/ffmpeg'; +import { generateTempFilePath } from './temp'; export default function setupIpcComs( tray: Tray, @@ -140,12 +137,9 @@ export default function setupIpcComs( return runFFmpegCmd(cmd, inputFilePath, outputFileName); } ); - ipcMain.handle( - 'write-temp-file', - (_, fileStream: Uint8Array, fileName: string) => { - return writeTempFile(fileStream, fileName); - } - ); + ipcMain.handle('get-temp-file-path', (_, formatSuffix) => { + return generateTempFilePath(formatSuffix); + }); ipcMain.handle('remove-temp-file', (_, tempFilePath: string) => { return deleteTempFile(tempFilePath); }); diff --git a/src/utils/temp.ts b/src/utils/temp.ts index 838d3692f..35a261e63 100644 --- a/src/utils/temp.ts +++ b/src/utils/temp.ts @@ -28,11 +28,11 @@ function generateTempName(length: number) { } export async function generateTempFilePath(formatSuffix: string) { - const tempDirPath = await getTempDirPath(); - const namePrefix = generateTempName(10); - const tempFilePath = path.join( - tempDirPath, - namePrefix + '-' + formatSuffix - ); + let tempFilePath: string; + do { + const tempDirPath = await getTempDirPath(); + const namePrefix = generateTempName(10); + tempFilePath = path.join(tempDirPath, namePrefix + '-' + formatSuffix); + } while (existsSync(tempFilePath)); return tempFilePath; }