diff --git a/tools/file_packager.py b/tools/file_packager.py index aab65512802cf..f016ef2011459 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -635,7 +635,12 @@ def generate_js(data_target, data_files, metadata): if options.support_node: ret += " var isNode = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string';\n" - ret += ' function loadPackage(metadata) {\n' + ret += ''' + function throwPackageError(error) { + throw error; + }; + + function loadPackage(metadata) {\n''' code = ''' function assert(check, msg) { @@ -972,10 +977,15 @@ def generate_js(data_target, data_files, metadata): %(node_support_code)s Module['dataFileDownloads'] ??= {}; fetch(packageName) - .catch((cause) => Promise.reject(new Error(`Network Error: ${packageName}`, {cause}))) // If fetch fails, rewrite the error to include the failing URL & the cause. + .catch((cause) => { + errback(new Error(`Network Error: ${packageName}`, {cause})); + // We want to be sure to cancel promise chain because we sometimes call this function with method + // which doesn't throw error hance promise chain is not broken + return Promise.reject(new Error(`Network Error: ${packageName}`, {cause})); + }) // If fetch fails, rewrite the error to include the failing URL & the cause. .then((response) => { if (!response.ok) { - return Promise.reject(new Error(`${response.status}: ${response.url}`)); + return errback(new Error(`${response.status}: ${response.url}`)); } if (!response.body && response.arrayBuffer) { // If we're using the polyfill, readers won't be available... @@ -983,9 +993,9 @@ def generate_js(data_target, data_files, metadata): } const reader = response.body.getReader(); - const iterate = () => reader.read().then(handleChunk).catch((cause) => { - return Promise.reject(new Error(`Unexpected error while handling : ${response.url} ${cause}`, {cause})); - }); + const iterate = () => reader.read().then(handleChunk).catch((cause) => + errback(new Error(`Unexpected error while handling : ${response.url} ${cause}`, {cause})) + ); const chunks = []; const headers = response.headers; @@ -1022,10 +1032,6 @@ def generate_js(data_target, data_files, metadata): Module['setStatus']?.('Downloading data...'); return iterate(); }); - }; - - function handleError(error) { - console.error('package error:', error); };\n''' % {'node_support_code': node_support_code} code += ''' @@ -1048,7 +1054,7 @@ def generate_js(data_target, data_files, metadata): function preloadFallback(error) { console.error(error); console.error('falling back to default preload behavior'); - fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, processPackageData, handleError); + fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, processPackageData, throwPackageError); }; openDatabase( @@ -1088,7 +1094,7 @@ def generate_js(data_target, data_files, metadata): } else { fetched = data; } - }, handleError);\n''' + }, throwPackageError);\n''' code += ''' Module['preloadResults'][PACKAGE_NAME] = {fromCache: false}; @@ -1117,7 +1123,7 @@ def generate_js(data_target, data_files, metadata): if (isNode) { require('fs').readFile(metadataUrl, 'utf8', (err, contents) => { if (err) { - return Promise.reject(err); + throwPackageError(err); } else { loadPackage(JSON.parse(contents)); } @@ -1134,11 +1140,14 @@ def generate_js(data_target, data_files, metadata): var metadataUrl = Module['locateFile'] ? Module['locateFile']('%(metadata_file)s', '') : '%(metadata_file)s'; %(node_support_code)s fetch(metadataUrl) + .catch((cause) => + throwPackageError(new Error(`Network Error: ${packageName}`, {cause})) + ) // If fetch fails, rewrite the error to include the failing URL & the cause. .then((response) => { if (response.ok) { return response.json(); } - return Promise.reject(new Error(`${response.status}: ${response.url}`)); + throwPackageError(new Error(`Response error: ${response}`)); }) .then(loadPackage); }