From c4cc3ed234d7744b0861b00974adb0f4de7e5ed7 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Thu, 13 Apr 2023 16:55:18 +0200 Subject: [PATCH] fix(player): priority and await for message processing --- frontend/app/player/web/MessageManager.ts | 20 +++++++++++--------- frontend/app/player/web/network/loadFiles.ts | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/frontend/app/player/web/MessageManager.ts b/frontend/app/player/web/MessageManager.ts index 9cb4a3edf..7c081bad4 100644 --- a/frontend/app/player/web/MessageManager.ts +++ b/frontend/app/player/web/MessageManager.ts @@ -214,7 +214,7 @@ export default class MessageManager { async loadMessages(isClickmap: boolean = false) { this.setMessagesLoading(true) // TODO: reusable decryptor instance - const createNewParser = (shouldDecrypt = true, file) => { + const createNewParser = (shouldDecrypt = true, file?: string) => { const decrypt = shouldDecrypt && this.session.fileKey ? (b: Uint8Array) => decryptSessionBytes(b, this.session.fileKey) : (b: Uint8Array) => Promise.resolve(b) @@ -266,12 +266,13 @@ export default class MessageManager { * */ loadFiles([loadMethod.url[0]], parser) .then(() => { - if (loadMethod.url.length > 1) { - loadFiles([loadMethod.url[1]], parser, true) - } - if (!isClickmap) { - this.loadDevtools(createNewParser) - } + const domPromise = loadMethod.url.length > 1 + ? loadFiles([loadMethod.url[1]], parser, true) + : Promise.resolve() + const devtoolsPromise = !isClickmap + ? this.loadDevtools(createNewParser) + : Promise.resolve() + return Promise.all([domPromise, devtoolsPromise]) }) /** * EFS fallback for unprocessed sessions (which are live) @@ -291,14 +292,15 @@ export default class MessageManager { loadDevtools(createNewParser: (shouldDecrypt: boolean, file: string) => (b: Uint8Array) => Promise) { this.state.update({ devtoolsLoading: true }) - loadFiles(this.session.devtoolsURL, createNewParser(true, 'devtools')) + return loadFiles(this.session.devtoolsURL, createNewParser(true, 'devtools')) // EFS fallback .catch(() => requestEFSDevtools(this.session.sessionId) .then(createNewParser(false, 'devtoolsEFS')) ) + // TODO: also in case of dynamic update through assist .then(() => { - this.state.update(this.lists.getFullListsState()) // TODO: also in case of dynamic update through assist + this.state.update({ ...this.lists.getFullListsState() }) }) .catch(e => logger.error("Can not download the devtools file", e)) .finally(() => this.state.update({ devtoolsLoading: false })) diff --git a/frontend/app/player/web/network/loadFiles.ts b/frontend/app/player/web/network/loadFiles.ts index 49d47f801..adf5655d8 100644 --- a/frontend/app/player/web/network/loadFiles.ts +++ b/frontend/app/player/web/network/loadFiles.ts @@ -17,7 +17,7 @@ export async function loadFiles( for (let url of urls) { const response = await window.fetch(url) const data = await processAPIStreamResponse(response, urls.length > 1 ? url !== urls[0] : canSkip) - onData(data) + await onData(data) } } catch(e) { if (e === ALLOWED_404) {