Emscripten: Enable modularity

This allows multiple instances of the game to be loaded in a single page.

Also stop emitting htmls as a build artifact and require presence of #PowderSessionInfo.
This commit is contained in:
Tamás Bálint Misius 2023-08-21 20:32:16 +02:00
parent 25b15208cf
commit 7cb0ac96c9
No known key found for this signature in database
GPG Key ID: 5B472A12F6ECA9F2
4 changed files with 15 additions and 16 deletions

2
.github/build.sh vendored
View File

@ -449,7 +449,7 @@ if [[ $PACKAGE_MODE == dmg ]]; then
cp ../README.md dmgroot/README.md cp ../README.md dmgroot/README.md
hdiutil create -format UDZO -volname $APP_NAME -fs HFS+ -srcfolder dmgroot -o $ASSET_PATH hdiutil create -format UDZO -volname $APP_NAME -fs HFS+ -srcfolder dmgroot -o $ASSET_PATH
elif [[ $PACKAGE_MODE == emscripten ]]; then elif [[ $PACKAGE_MODE == emscripten ]]; then
tar cvf $ASSET_PATH $APP_EXE.html $APP_EXE.js $APP_EXE.worker.js $APP_EXE.wasm tar cvf $ASSET_PATH $APP_EXE.js $APP_EXE.worker.js $APP_EXE.wasm
elif [[ $PACKAGE_MODE == appimage ]]; then elif [[ $PACKAGE_MODE == appimage ]]; then
# so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == linux-gnu, but this may change later # so far this can only happen with $BSH_HOST_PLATFORM-$BSH_HOST_LIBC == linux-gnu, but this may change later
case $BSH_HOST_ARCH in case $BSH_HOST_ARCH in

View File

@ -212,6 +212,8 @@ if host_platform == 'emscripten'
'-s', 'EXIT_RUNTIME=0', '-s', 'EXIT_RUNTIME=0',
'-s', 'EXPORTED_RUNTIME_METHODS=ccall,cwrap', '-s', 'EXPORTED_RUNTIME_METHODS=ccall,cwrap',
'-s', 'FS_DEBUG', '-s', 'FS_DEBUG',
'-s', 'MODULARIZE',
'-s', 'EXPORT_NAME=create_' + app_exe,
'-lidbfs.js', '-lidbfs.js',
] ]
emcc_args = [ emcc_args = [
@ -371,7 +373,7 @@ font_files += data_files
if host_platform == 'emscripten' if host_platform == 'emscripten'
project_link_args += [ project_link_args += [
'-o', app_exe + '.html', # so we get a .wasm, a .js, and a .html '-o', app_exe + '.js', # so we get a .wasm, and a .js
] ]
endif endif

View File

@ -1,33 +1,33 @@
#include "Client.h" #include "Client.h"
#include "prefs/GlobalPrefs.h" #include "prefs/GlobalPrefs.h"
#include <emscripten.h> #include <emscripten.h>
#include <iostream>
void Client::LoadAuthUser() void Client::LoadAuthUser()
{ {
std::optional<ByteString> newUsername; ByteString newUsername, newSessionKey;
if (EM_ASM_INT({ if (EM_ASM_INT({
return document.querySelector("#PowderSessionInfo [name='Username']") ? 1 : 0; return (document.querySelector("#PowderSessionInfo [name='Username']") &&
document.querySelector("#PowderSessionInfo [name='SessionKey']")) ? 1 : 0;
})) }))
{ {
newUsername = ByteString(std::unique_ptr<char, decltype(&free)>((char *)EM_ASM_PTR({ newUsername = ByteString(std::unique_ptr<char, decltype(&free)>((char *)EM_ASM_PTR({
return stringToNewUTF8(document.querySelector("#PowderSessionInfo [name='Username']").value); return stringToNewUTF8(document.querySelector("#PowderSessionInfo [name='Username']").value);
}), free).get()); }), free).get());
}
std::optional<ByteString> newSessionKey;
if (EM_ASM_INT({
return document.querySelector("#PowderSessionInfo [name='SessionKey']") ? 1 : 0;
}))
{
newSessionKey = ByteString(std::unique_ptr<char, decltype(&free)>((char *)EM_ASM_PTR({ newSessionKey = ByteString(std::unique_ptr<char, decltype(&free)>((char *)EM_ASM_PTR({
return stringToNewUTF8(document.querySelector("#PowderSessionInfo [name='SessionKey']").value); return stringToNewUTF8(document.querySelector("#PowderSessionInfo [name='SessionKey']").value);
}), free).get()); }), free).get());
} }
if (newUsername && newSessionKey) else
{
std::cerr << "required #PowderSessionInfo elements not found, can't authenticate" << std::endl;
}
if (newUsername.size() && newSessionKey.size())
{ {
authUser.UserID = -1; // Not quite valid but evaluates to true and that's all that matters for this codebase. authUser.UserID = -1; // Not quite valid but evaluates to true and that's all that matters for this codebase.
authUser.Username = *newUsername; authUser.Username = newUsername;
authUser.SessionID = "(invalid)"; authUser.SessionID = "(invalid)";
authUser.SessionKey = *newSessionKey; authUser.SessionKey = newSessionKey;
authUser.UserElevation = User::ElevationNone; // We don't deal with this in the browser. authUser.UserElevation = User::ElevationNone; // We don't deal with this in the browser.
} }
else else

View File

@ -232,9 +232,6 @@ namespace http
Module.emscriptenRequestManager.requests[$0].fetchMethod = UTF8ToString($1); Module.emscriptenRequestManager.requests[$0].fetchMethod = UTF8ToString($1);
}, handle->id, requestHandle->verb->c_str()); }, handle->id, requestHandle->verb->c_str());
} }
// TODO: set max redirects
// TODO: set max concurrent streams
// TODO: set connect timeout
EM_ASM({ EM_ASM({
let request = Module.emscriptenRequestManager.requests[$0]; let request = Module.emscriptenRequestManager.requests[$0];
let token = $1; let token = $1;