Merge pull request #130 from ente-io/use-stream-for-temp-file-creation
Use stream for temp file creation
This commit is contained in:
commit
7d5d92b94d
|
@ -22,11 +22,11 @@ export const checkExistsAndRename = async (
|
|||
}
|
||||
};
|
||||
|
||||
export const saveStreamToDisk = (
|
||||
export const saveStreamToDisk = async (
|
||||
filePath: string,
|
||||
fileStream: ReadableStream<any>
|
||||
fileStream: ReadableStream<Uint8Array>
|
||||
) => {
|
||||
writeStream(filePath, fileStream);
|
||||
await writeStream(filePath, fileStream);
|
||||
};
|
||||
|
||||
export const saveFileToDisk = async (path: string, fileData: any) => {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -192,7 +192,9 @@ export async function isFolder(dirPath: string) {
|
|||
.catch(() => false);
|
||||
}
|
||||
|
||||
export const convertBrowserStreamToNode = (fileStream: any) => {
|
||||
export const convertBrowserStreamToNode = (
|
||||
fileStream: ReadableStream<Uint8Array>
|
||||
) => {
|
||||
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<Uint8Array>
|
||||
) {
|
||||
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) {
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
|
|
@ -28,11 +28,11 @@ function generateTempName(length: number) {
|
|||
}
|
||||
|
||||
export async function generateTempFilePath(formatSuffix: string) {
|
||||
let tempFilePath: string;
|
||||
do {
|
||||
const tempDirPath = await getTempDirPath();
|
||||
const namePrefix = generateTempName(10);
|
||||
const tempFilePath = path.join(
|
||||
tempDirPath,
|
||||
namePrefix + '-' + formatSuffix
|
||||
);
|
||||
tempFilePath = path.join(tempDirPath, namePrefix + '-' + formatSuffix);
|
||||
} while (existsSync(tempFilePath));
|
||||
return tempFilePath;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue