From f264208bd391d0ae36d8616cd39c03547ecf32ce Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Sat, 7 Aug 2021 02:00:14 -0500 Subject: [PATCH] Improve error handling - Handle errors in scaffolding setup - Interface will only show message of first error (likely the most important) --- src/packager/packager.js | 260 ++++++++++++++++++++------------------- 1 file changed, 132 insertions(+), 128 deletions(-) diff --git a/src/packager/packager.js b/src/packager/packager.js index d184648..81fe4b9 100644 --- a/src/packager/packager.js +++ b/src/packager/packager.js @@ -572,135 +572,146 @@ cd "$(dirname "$0")" const errorScreen = document.getElementById('error'); const errorScreenInfo = document.getElementById('error-info'); - const scaffolding = new Scaffolding.Scaffolding(); - scaffolding.width = ${this.options.stageWidth}; - scaffolding.height = ${this.options.stageHeight}; - scaffolding.setup(); - scaffolding.appendTo(appElement); - - if (typeof ScaffoldingAddons !== "undefined") ScaffoldingAddons.run(scaffolding); - - // Expose values expected by third-party plugins - window.scaffolding = scaffolding; - window.vm = scaffolding.vm; - - const {storage, vm} = scaffolding; - storage.addWebStore( - [storage.AssetType.ImageVector, storage.AssetType.ImageBitmap, storage.AssetType.Sound], - (asset) => new URL("./assets/" + asset.assetId + "." + asset.dataFormat, location).href - ); + const handleError = (error) => { + console.error(error); + if (!errorScreen.hidden) return; + errorScreen.hidden = false; + errorScreenInfo.textContent = '' + error; + }; const setProgress = (progress) => { loadingInner.style.width = progress * 100 + "%"; - } - storage.onprogress = (total, loaded) => { - setProgress(${PROGRESS_LOADED_JSON_BUT_NEED_ASSETS} + (loaded / total) * ${1 - PROGRESS_LOADED_JSON_BUT_NEED_ASSETS}); - }; - setProgress(${PROGRESS_LOADED_SCRIPTS}); - - scaffolding.setUsername(${JSON.stringify(this.options.username)}.replace(/#/g, () => Math.floor(Math.random() * 10))); - scaffolding.setAccentColor(${JSON.stringify(this.options.appearance.accent)}); - - ${this.options.cloudVariables.mode === 'ws' ? - `scaffolding.addCloudProvider(${this.makeWebSocketProvider()})` : - this.options.cloudVariables.mode === 'local' ? - `scaffolding.addCloudProvider(${this.makeLocalStorageProvider()})` : - this.options.cloudVariables.mode === 'custom' ? - this.makeCustomProvider() : - '/* no-op */' }; - if (${this.options.controls.greenFlag.enabled}) { - const greenFlagButton = document.createElement("img"); - greenFlagButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); - greenFlagButton.className = 'control-button'; - greenFlagButton.addEventListener('click', () => { - scaffolding.greenFlag(); - }); - scaffolding.addEventListener('PROJECT_RUN_START', () => { - greenFlagButton.classList.add('active'); - }); - scaffolding.addEventListener('PROJECT_RUN_STOP', () => { - greenFlagButton.classList.remove('active'); - }); - scaffolding.addControlButton({ - element: greenFlagButton, - where: 'top-left' - }); - } - - if (${this.options.controls.stopAll.enabled}) { - const stopAllButton = document.createElement("img"); - stopAllButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); - stopAllButton.className = 'control-button'; - stopAllButton.addEventListener('click', () => { - scaffolding.stopAll(); - }); - scaffolding.addControlButton({ - element: stopAllButton, - where: 'top-left' - }); - } - - if (${this.options.controls.fullscreen.enabled} && (document.fullscreenEnabled || document.webkitFullscreenEnabled)) { - let isFullScreen = !!(document.fullscreenElement || document.webkitFullscreenElement); - const fullscreenButton = document.createElement('img'); - fullscreenButton.className = 'control-button fullscreen-button'; - fullscreenButton.addEventListener('click', () => { - if (isFullScreen) { - if (document.exitFullscreen) { - document.exitFullscreen(); - } else if (document.webkitExitFullscreen) { - document.webkitExitFullscreen(); - } - } else { - if (document.body.requestFullscreen) { - document.body.requestFullscreen() - } else if (document.body.webkitRequestFullscreen) { - document.body.webkitRequestFullscreen(); - } - } - }); - const otherControlsExist = ${this.options.controls.greenFlag.enabled || this.options.controls.stopAll.enabled}; - const fillColor = otherControlsExist ? '#575E75' : '${this.options.appearance.foreground}'; - const updateFullScreen = () => { - isFullScreen = !!(document.fullscreenElement || document.webkitFullscreenElement); - if (isFullScreen) { - fullscreenButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); - } else { - fullscreenButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); - } + try { + const scaffolding = new Scaffolding.Scaffolding(); + scaffolding.width = ${this.options.stageWidth}; + scaffolding.height = ${this.options.stageHeight}; + scaffolding.setup(); + scaffolding.appendTo(appElement); + + if (typeof ScaffoldingAddons !== "undefined") ScaffoldingAddons.run(scaffolding); + + // Expose values expected by third-party plugins + window.scaffolding = scaffolding; + window.vm = scaffolding.vm; + + const {storage, vm} = scaffolding; + storage.addWebStore( + [storage.AssetType.ImageVector, storage.AssetType.ImageBitmap, storage.AssetType.Sound], + (asset) => new URL("./assets/" + asset.assetId + "." + asset.dataFormat, location).href + ); + storage.onprogress = (total, loaded) => { + setProgress(${PROGRESS_LOADED_JSON_BUT_NEED_ASSETS} + (loaded / total) * ${1 - PROGRESS_LOADED_JSON_BUT_NEED_ASSETS}); }; - updateFullScreen(); - document.addEventListener('fullscreenchange', updateFullScreen); - document.addEventListener('webkitfullscreenchange', updateFullScreen); - if (otherControlsExist) { - fullscreenButton.className = 'control-button fullscreen-button'; + setProgress(${PROGRESS_LOADED_SCRIPTS}); + + scaffolding.setUsername(${JSON.stringify(this.options.username)}.replace(/#/g, () => Math.floor(Math.random() * 10))); + scaffolding.setAccentColor(${JSON.stringify(this.options.appearance.accent)}); + + ${this.options.cloudVariables.mode === 'ws' ? + `scaffolding.addCloudProvider(${this.makeWebSocketProvider()})` : + this.options.cloudVariables.mode === 'local' ? + `scaffolding.addCloudProvider(${this.makeLocalStorageProvider()})` : + this.options.cloudVariables.mode === 'custom' ? + this.makeCustomProvider() : + '/* no-op */' + }; + + if (${this.options.controls.greenFlag.enabled}) { + const greenFlagButton = document.createElement("img"); + greenFlagButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); + greenFlagButton.className = 'control-button'; + greenFlagButton.addEventListener('click', () => { + scaffolding.greenFlag(); + }); + scaffolding.addEventListener('PROJECT_RUN_START', () => { + greenFlagButton.classList.add('active'); + }); + scaffolding.addEventListener('PROJECT_RUN_STOP', () => { + greenFlagButton.classList.remove('active'); + }); scaffolding.addControlButton({ - element: fullscreenButton, - where: 'top-right' + element: greenFlagButton, + where: 'top-left' }); - } else { - fullscreenButton.className = 'standalone-fullscreen-button'; - document.body.appendChild(fullscreenButton); } - } - - vm.setTurboMode(${this.options.turbo}); - vm.setInterpolation(${this.options.interpolation}); - vm.setFramerate(${this.options.framerate}); - vm.renderer.setUseHighQualityRender(${this.options.highQualityPen}); - vm.setRuntimeOptions({ - fencing: ${this.options.fencing}, - miscLimits: ${this.options.miscLimits}, - maxClones: ${this.options.maxClones}, - }); - vm.setCompilerOptions({ - enabled: ${this.options.compiler.enabled}, - warpTimer: ${this.options.compiler.warpTimer} - }); - - for (const extension of ${JSON.stringify(this.options.extensions.map(i => i.url))}) { - vm.extensionManager.loadExtensionURL(extension); + + if (${this.options.controls.stopAll.enabled}) { + const stopAllButton = document.createElement("img"); + stopAllButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); + stopAllButton.className = 'control-button'; + stopAllButton.addEventListener('click', () => { + scaffolding.stopAll(); + }); + scaffolding.addControlButton({ + element: stopAllButton, + where: 'top-left' + }); + } + + if (${this.options.controls.fullscreen.enabled} && (document.fullscreenEnabled || document.webkitFullscreenEnabled)) { + let isFullScreen = !!(document.fullscreenElement || document.webkitFullscreenElement); + const fullscreenButton = document.createElement('img'); + fullscreenButton.className = 'control-button fullscreen-button'; + fullscreenButton.addEventListener('click', () => { + if (isFullScreen) { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } + } else { + if (document.body.requestFullscreen) { + document.body.requestFullscreen() + } else if (document.body.webkitRequestFullscreen) { + document.body.webkitRequestFullscreen(); + } + } + }); + const otherControlsExist = ${this.options.controls.greenFlag.enabled || this.options.controls.stopAll.enabled}; + const fillColor = otherControlsExist ? '#575E75' : '${this.options.appearance.foreground}'; + const updateFullScreen = () => { + isFullScreen = !!(document.fullscreenElement || document.webkitFullscreenElement); + if (isFullScreen) { + fullscreenButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); + } else { + fullscreenButton.src = 'data:image/svg+xml,' + encodeURIComponent(''); + } + }; + updateFullScreen(); + document.addEventListener('fullscreenchange', updateFullScreen); + document.addEventListener('webkitfullscreenchange', updateFullScreen); + if (otherControlsExist) { + fullscreenButton.className = 'control-button fullscreen-button'; + scaffolding.addControlButton({ + element: fullscreenButton, + where: 'top-right' + }); + } else { + fullscreenButton.className = 'standalone-fullscreen-button'; + document.body.appendChild(fullscreenButton); + } + } + + vm.setTurboMode(${this.options.turbo}); + vm.setInterpolation(${this.options.interpolation}); + vm.setFramerate(${this.options.framerate}); + vm.renderer.setUseHighQualityRender(${this.options.highQualityPen}); + vm.setRuntimeOptions({ + fencing: ${this.options.fencing}, + miscLimits: ${this.options.miscLimits}, + maxClones: ${this.options.maxClones}, + }); + vm.setCompilerOptions({ + enabled: ${this.options.compiler.enabled}, + warpTimer: ${this.options.compiler.warpTimer} + }); + + for (const extension of ${JSON.stringify(this.options.extensions.map(i => i.url))}) { + vm.extensionManager.loadExtensionURL(extension); + } + } catch (e) { + handleError(e); } // NW.js hook @@ -740,13 +751,6 @@ cd "$(dirname "$0")" launchScreen.focus(); } }; - - const handleError = (error) => { - console.error(error); - errorScreen.hidden = false; - errorScreenInfo.textContent = '' + error; - }; - run().catch(handleError);