diff --git a/packages/loot-core/src/server/cloud-storage.ts b/packages/loot-core/src/server/cloud-storage.ts index 7be08444ff55c129c70ef9ba8d5b3894bd922fdc..010dbd019d0e2e109cd1eb46fa0e31b5bb254570 100644 --- a/packages/loot-core/src/server/cloud-storage.ts +++ b/packages/loot-core/src/server/cloud-storage.ts @@ -377,48 +377,51 @@ export async function listRemoteFiles(): Promise<RemoteFile[] | null> { export async function download(fileId) { const userToken = await asyncStorage.getItem('user-token'); - - let buffer; - try { - buffer = await fetch(getServer().SYNC_SERVER + '/download-user-file', { - headers: { - 'X-ACTUAL-TOKEN': userToken, - 'X-ACTUAL-FILE-ID': fileId, - }, + const syncServer = getServer().SYNC_SERVER; + + const userFileFetch = fetch(`${syncServer}/download-user-file`, { + headers: { + 'X-ACTUAL-TOKEN': userToken, + 'X-ACTUAL-FILE-ID': fileId, + }, + }) + .then(checkHTTPStatus) + .then(res => { + if (res.arrayBuffer) { + return res.arrayBuffer().then(ab => Buffer.from(ab)); + } + return res.buffer(); }) - .then(checkHTTPStatus) - .then(res => { - if (res.arrayBuffer) { - return res.arrayBuffer().then(ab => Buffer.from(ab)); - } - return res.buffer(); - }); - } catch (err) { - console.log('Download failure', err); - throw FileDownloadError('download-failure'); - } - - let res; - try { - res = await fetchJSON(getServer().SYNC_SERVER + '/get-user-file-info', { - headers: { - 'X-ACTUAL-TOKEN': userToken, - 'X-ACTUAL-FILE-ID': fileId, - }, + .catch(err => { + console.log('Download failure', err); + throw FileDownloadError('download-failure'); }); - } catch (err) { + + const userFileInfoFetch = fetchJSON(`${syncServer}/get-user-file-info`, { + headers: { + 'X-ACTUAL-TOKEN': userToken, + 'X-ACTUAL-FILE-ID': fileId, + }, + }).catch(err => { console.log('Error fetching file info', err); throw FileDownloadError('internal', { fileId }); - } + }); - if (res.status !== 'ok') { + const [userFileInfoRes, userFileRes] = await Promise.all([ + userFileInfoFetch, + userFileFetch, + ]); + + if (userFileInfoRes.status !== 'ok') { console.log( 'Could not download file from the server. Are you sure you have the right file ID?', - res, + userFileInfoRes, ); throw FileDownloadError('internal', { fileId }); } - const fileData = res.data; + + const fileData = userFileInfoRes.data; + let buffer = userFileRes; // The download process checks if the server gave us decrypt // information. It is assumed that this key has already been loaded diff --git a/upcoming-release-notes/2700.md b/upcoming-release-notes/2700.md new file mode 100644 index 0000000000000000000000000000000000000000..89891a42c2f9997749a4aa601120b639acacecd4 --- /dev/null +++ b/upcoming-release-notes/2700.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [joel-jeremy] +--- + +Fetch cloud file and file info in parallel to speed downloads up