Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restructed async load function #21665

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
110 changes: 69 additions & 41 deletions src/library_browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -766,55 +766,83 @@ var LibraryBrowser = {
safeSetTimeout(() => _emscripten_run_script(script), millis);
},

// TODO: currently not callable from a pthread, but immediately calls onerror() if not on main thread.
emscripten_async_load_script__deps: ['$UTF8ToString'],
emscripten_async_load_script: (url, onload, onerror) => {
url = UTF8ToString(url);
function promiseToCallbacks(promise, onload, onerror) {

onload = {{{ makeDynCall('v', 'onload') }}};
onerror = {{{ makeDynCall('v', 'onerror') }}};
promise.then(onload).catch(onerror);

}

#if PTHREADS
if (ENVIRONMENT_IS_PTHREAD) {
err(`emscripten_async_load_script("${url}") failed, emscripten_async_load_script is currently not available in pthreads!`);
return onerror ? onerror() : undefined;
}
#endif
#if ASSERTIONS
assert(runDependencies === 0, 'async_load_script must be run when no other dependencies are active');
#endif
{{{ runtimeKeepalivePush() }}}
function callbacksToPromise(func, onload, onerror) {
return new Promise((resolve, reject) => {
func((result) => {
var onload = {{{ makeDynCall('v', 'onload') }}};
onload();
resolve(result);
}, (error) => {
var onerror = {{{ makeDynCall('v', 'onerror') }}};
onerror();
reject(error);
});
});
}


emscripten_async_load_script_promise__deps: ['$UTF8ToString'],
emscripten_async_load_script_promise: (url) => {
url = UTF8ToString(url);

var loadDone = () => {
{{{ runtimeKeepalivePop() }}}
if (onload) {
if (runDependencies > 0) {
dependenciesFulfilled = onload;
} else {
onload();
}
// Creating a promise for script loading functionality
return new Promise((resolve, reject) => {
#if PTHREADS
if (ENVIRONMENT_IS_PTHREAD) {
err(`emscripten_async_load_script("${url}") failed, emscripten_async_load_script is currently not available in pthreads!`);
return reject('emscripten_async_load_script is not available for pthreads');
}
}
#endif

#if ASSERTIONS
assert(runDependencies === 0, 'async_load_script must be run when no other dependencies are active');
#endif

{{{ runtimeKeepalivePush() }}}

var loadError = () => {
{{{ runtimeKeepalivePop() }}}
onerror?.();
};
var loadDone = () => {
{{{ runtimeKeepalivePop() }}}
resolve();
}

var loadError = () => {
{{{ runtimeKeepalivePop() }}}
reject();
};

#if ENVIRONMENT_MAY_BE_NODE && DYNAMIC_EXECUTION
if (ENVIRONMENT_IS_NODE) {
readAsync(url, (data) => {
eval(data);
loadDone();
}, loadError, false);
return;
}
#endif

var script = document.createElement('script');
script.onload = loadDone;
script.onerror = loadError;
script.src = url;
document.body.appendChild(script);

});
},

#if ENVIRONMENT_MAY_BE_NODE && DYNAMIC_EXECUTION
if (ENVIRONMENT_IS_NODE) {
readAsync(url, (data) => {
eval(data);
loadDone();
}, loadError, false);
return;
}
#endif

var script = document.createElement('script');
script.onload = loadDone;
script.onerror = loadError;
script.src = url;
document.body.appendChild(script);
// Refactored the function to implement the promise based functionality and backward compatibility with callbacks
emscripten_async_load_script__deps: ['$emscripten_async_load_script_promise', '$UTF8ToString', '$promiseToCallbacks'],
emscripten_async_load_script: function(url, onload, onerror) {
var promise = emscripten_async_load_script_promise(url);
promiseToCallbacks(promise, onload, onerror);
},

// Runs natively in pthread, no __proxy needed.
Expand Down