ente/main/preload.ts

181 lines
5 KiB
TypeScript
Raw Normal View History

import { Readable } from 'stream';
import * as fs from 'promise-fs';
import * as electron from 'electron';
import {
2022-03-20 10:23:53 +00:00
getElectronFile,
2022-03-28 07:56:03 +00:00
getPendingUploads,
setToUploadFiles,
getElectronFilesFromGoogleZip,
setToUploadCollection,
} from './utils/upload';
import { logError } from './utils/logging';
2022-04-19 09:35:59 +00:00
import { ElectronFile } from './types';
2022-07-10 21:12:31 +00:00
import { getEncryptionKey, setEncryptionKey } from './utils/safeStorage';
2022-07-11 08:58:20 +00:00
import { clearElectronStore } from './utils/electronStore';
const { ipcRenderer } = electron;
const responseToReadable = (fileStream: any) => {
const reader = fileStream.getReader();
const rs = new Readable();
rs._read = async () => {
const result = await reader.read();
if (!result.done) {
rs.push(Buffer.from(result.value));
} else {
rs.push(null);
return;
}
};
return rs;
};
2021-12-07 06:24:18 +00:00
const exists = (path: string) => {
return fs.existsSync(path);
};
const checkExistsAndCreateCollectionDir = async (dirPath: string) => {
if (!fs.existsSync(dirPath)) {
await fs.mkdir(dirPath);
}
};
2021-11-16 07:16:24 +00:00
const checkExistsAndRename = async (oldDirPath: string, newDirPath: string) => {
if (fs.existsSync(oldDirPath)) {
await fs.rename(oldDirPath, newDirPath);
}
};
const saveStreamToDisk = (path: string, fileStream: ReadableStream<any>) => {
const writeable = fs.createWriteStream(path);
const readable = responseToReadable(fileStream);
readable.pipe(writeable);
};
const saveFileToDisk = async (path: string, file: any) => {
await fs.writeFile(path, file);
};
const selectRootDirectory = async () => {
try {
2022-04-08 05:52:31 +00:00
return await ipcRenderer.invoke('select-dir');
} catch (e) {
logError(e, 'error while selecting root directory');
}
};
const sendNotification = (content: string) => {
ipcRenderer.send('send-notification', content);
};
2021-03-31 08:33:17 +00:00
const showOnTray = (content: string) => {
ipcRenderer.send('update-tray', content);
};
2021-07-14 05:55:20 +00:00
const registerResumeExportListener = (resumeExport: () => void) => {
2021-11-16 07:16:24 +00:00
ipcRenderer.removeAllListeners('resume-export');
2021-07-14 05:55:20 +00:00
ipcRenderer.on('resume-export', () => resumeExport());
2021-07-09 05:16:33 +00:00
};
const registerStopExportListener = (abortExport: () => void) => {
2021-11-16 07:16:24 +00:00
ipcRenderer.removeAllListeners('stop-export');
2021-03-31 08:33:17 +00:00
ipcRenderer.on('stop-export', () => abortExport());
};
2021-07-09 05:16:33 +00:00
const registerPauseExportListener = (pauseExport: () => void) => {
2021-11-16 07:16:24 +00:00
ipcRenderer.removeAllListeners('pause-export');
2021-07-09 05:16:33 +00:00
ipcRenderer.on('pause-export', () => pauseExport());
};
const registerRetryFailedExportListener = (retryFailedExport: () => void) => {
2021-11-16 07:16:24 +00:00
ipcRenderer.removeAllListeners('retry-export');
2021-07-09 05:16:33 +00:00
ipcRenderer.on('retry-export', () => retryFailedExport());
};
const reloadWindow = () => {
ipcRenderer.send('reload-window');
};
const getExportRecord = async (filePath: string) => {
2021-07-13 13:50:38 +00:00
try {
const filepath = `${filePath}`;
2021-07-13 13:50:38 +00:00
const recordFile = await fs.readFile(filepath, 'utf-8');
return recordFile;
} catch (e) {
// ignore exportFile missing
2022-04-20 07:37:18 +00:00
logError(e, 'error while selecting files');
2021-07-13 13:50:38 +00:00
}
};
const setExportRecord = async (filePath: string, data: string) => {
const filepath = `${filePath}`;
2021-07-13 13:50:38 +00:00
await fs.writeFile(filepath, data);
};
2022-03-22 09:17:03 +00:00
const showUploadFilesDialog = async () => {
try {
2022-04-04 12:04:20 +00:00
const filePaths: string[] = await ipcRenderer.invoke(
'show-upload-files-dialog'
);
const files = await Promise.all(filePaths.map(getElectronFile));
return files;
2022-03-22 09:17:03 +00:00
} catch (e) {
logError(e, 'error while selecting files');
2022-03-22 09:17:03 +00:00
}
};
const showUploadDirsDialog = async () => {
try {
2022-04-04 12:04:20 +00:00
const filePaths: string[] = await ipcRenderer.invoke(
'show-upload-dirs-dialog'
);
const files = await Promise.all(filePaths.map(getElectronFile));
return files;
2022-03-22 09:17:03 +00:00
} catch (e) {
logError(e, 'error while selecting folders');
2022-03-22 09:17:03 +00:00
}
};
const showUploadZipDialog = async () => {
try {
2022-04-04 13:45:08 +00:00
const filePaths: string[] = await ipcRenderer.invoke(
'show-upload-zip-dialog'
);
2022-04-19 09:35:59 +00:00
const files: ElectronFile[] = [];
for (const filePath of filePaths) {
files.push(...(await getElectronFilesFromGoogleZip(filePath)));
}
2022-04-20 10:59:26 +00:00
return { zipPaths: filePaths, files };
} catch (e) {
logError(e, 'error while selecting zips');
}
};
2021-07-09 05:16:33 +00:00
const windowObject: any = window;
windowObject['ElectronAPIs'] = {
2021-12-07 06:24:18 +00:00
exists,
checkExistsAndCreateCollectionDir,
2021-11-16 07:16:24 +00:00
checkExistsAndRename,
saveStreamToDisk,
saveFileToDisk,
selectRootDirectory,
sendNotification,
showOnTray,
reloadWindow,
2021-07-14 05:55:20 +00:00
registerResumeExportListener,
2021-07-09 05:16:33 +00:00
registerStopExportListener,
registerPauseExportListener,
registerRetryFailedExportListener,
2021-07-13 13:50:38 +00:00
getExportRecord,
2021-11-16 07:16:24 +00:00
setExportRecord,
2022-03-20 10:23:53 +00:00
getElectronFile,
showUploadFilesDialog,
showUploadDirsDialog,
2022-03-28 07:56:03 +00:00
getPendingUploads,
2022-03-20 10:23:53 +00:00
setToUploadFiles,
showUploadZipDialog,
getElectronFilesFromGoogleZip,
setToUploadCollection,
2022-07-10 21:12:31 +00:00
getEncryptionKey,
setEncryptionKey,
2022-07-11 08:58:20 +00:00
clearElectronStore,
};