diff --git a/package.json b/package.json index 109fc16bb..929fc09e3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ente", "productName": "ente", - "version": "1.6.15-beta.1", + "version": "1.6.16", "private": true, "description": "Desktop client for ente.io", "main": "app/main.js", diff --git a/src/services/fs.ts b/src/services/fs.ts index d7bc1ea5e..fa3abd56d 100644 --- a/src/services/fs.ts +++ b/src/services/fs.ts @@ -4,6 +4,7 @@ import * as fs from 'promise-fs'; import { ElectronFile } from '../types'; import StreamZip from 'node-stream-zip'; import { Readable } from 'stream'; +import { logError } from './logging'; // https://stackoverflow.com/a/63111390 export const getDirFilePaths = async (dirPath: string) => { @@ -97,31 +98,50 @@ export const getZipFileStream = async ( const done = { current: false, }; + const inProgress = { + current: false, + }; let resolveObj: (value?: any) => void = null; let rejectObj: (reason?: any) => void = null; stream.on('readable', () => { - if (resolveObj) { - const chunk = stream.read(FILE_STREAM_CHUNK_SIZE) as Buffer; - - if (chunk) { - resolveObj(new Uint8Array(chunk)); - resolveObj = null; + try { + if (resolveObj) { + inProgress.current = true; + const chunk = stream.read(FILE_STREAM_CHUNK_SIZE) as Buffer; + if (chunk) { + resolveObj(new Uint8Array(chunk)); + resolveObj = null; + } + inProgress.current = false; } + } catch (e) { + rejectObj(e); } }); stream.on('end', () => { - done.current = true; + try { + done.current = true; + if (resolveObj && !inProgress.current) { + resolveObj(null); + resolveObj = null; + } + } catch (e) { + rejectObj(e); + } }); stream.on('error', (e) => { - done.current = true; - - if (rejectObj) { + try { + done.current = true; + if (rejectObj) { + rejectObj(e); + rejectObj = null; + } + } catch (e) { rejectObj(e); - rejectObj = null; } }); - const readStreamData = () => { + const readStreamData = async () => { return new Promise((resolve, reject) => { const chunk = stream.read(FILE_STREAM_CHUNK_SIZE) as Buffer; @@ -145,6 +165,7 @@ export const getZipFileStream = async ( controller.close(); } } catch (e) { + logError(e, 'readableStream pull failed'); controller.close(); } }, diff --git a/src/services/upload.ts b/src/services/upload.ts index 8379df09d..7d5144121 100644 --- a/src/services/upload.ts +++ b/src/services/upload.ts @@ -15,11 +15,15 @@ export const getSavedFilePaths = (type: FILE_PATH_TYPE) => { }; export async function getZipEntryAsElectronFile( + zipName: string, zip: StreamZip.StreamZipAsync, entry: StreamZip.ZipEntry ): Promise { return { - path: entry.name, + path: path + .join(zipName, entry.name) + .split(path.sep) + .join(path.posix.sep), name: path.basename(entry.name), size: entry.size, lastModified: entry.time, @@ -58,6 +62,7 @@ export const getElectronFilesFromGoogleZip = async (filePath: string) => { const zip = new StreamZip.async({ file: filePath, }); + const zipName = path.basename(filePath, '.zip'); const entries = await zip.entries(); const files: ElectronFile[] = []; @@ -65,7 +70,7 @@ export const getElectronFilesFromGoogleZip = async (filePath: string) => { for (const entry of Object.values(entries)) { const basename = path.basename(entry.name); if (entry.isFile && basename.length > 0 && basename[0] !== '.') { - files.push(await getZipEntryAsElectronFile(zip, entry)); + files.push(await getZipEntryAsElectronFile(zipName, zip, entry)); } } diff --git a/src/utils/main.ts b/src/utils/main.ts index 383f61c39..a863f7998 100644 --- a/src/utils/main.ts +++ b/src/utils/main.ts @@ -22,7 +22,7 @@ export function handleUpdates(mainWindow: BrowserWindow) { } } export function setupTrayItem(mainWindow: BrowserWindow) { - const iconName = isPlatformMac + const iconName = isPlatform('mac') ? 'taskbar-icon-Template.png' : 'taskbar-icon.png'; const trayImgPath = path.join( diff --git a/ui b/ui index 5e486434a..a8c520a4b 160000 --- a/ui +++ b/ui @@ -1 +1 @@ -Subproject commit 5e486434ade454de49f8fd98874e9181afc4d99b +Subproject commit a8c520a4b0ff90279cffedf41b9e8f8564d9a753