diff --git a/CMakeLists.txt b/CMakeLists.txt index fbb244c..b25ff7e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -339,7 +339,11 @@ if(${PLATFORM} MATCHES "Web") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EM_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EM_FLAGS}") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_FLAGS} --preload-file ${CMAKE_SOURCE_DIR}/data@/data") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EM_FLAGS} --preload-file \"${CMAKE_SOURCE_DIR}/data@/data\"") + set_target_properties(${PROJECT_NAME} PROPERTIES RULE_LAUNCH_LINK "set EMCC_WASM_OPT=0 &&") + # Remove -g (DWARF) to prevent wasm-opt post-link optimizations from running + string(REPLACE "-g" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") + string(REPLACE "-g" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") target_compile_options(${PROJECT_NAME} PUBLIC "-Os" @@ -355,7 +359,7 @@ if(${PLATFORM} MATCHES "Web") "-sFORCE_FILESYSTEM=1" "-sLEGACY_GL_EMULATION=1" "-sGL_UNSAFE_OPTS=0" - "-sEMULATE_FUNCTION_POINTER_CASTS=1" + "-sEMULATE_FUNCTION_POINTER_CASTS=0" "-sALLOW_TABLE_GROWTH=1" "-sEXPORTED_RUNTIME_METHODS=['FS','stringToUTF8','UTF8ToString','cwrap','ccall','HEAP8','HEAPU8','HEAP32','HEAPU32']" "-sEXPORTED_FUNCTIONS=['_main']" @@ -404,6 +408,7 @@ else() TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/index.html" $ + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/misc/web/coi-serviceworker.js" $ ) endif() diff --git a/README.md b/README.md index ebdc8cb..db746cf 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ cmake --build . 2. Configure and build project: ``` mkdir build && cd build - cmake .. -B . -G Ninja "-DCMAKE_TOOLCHAIN_FILE=$EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" + cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE="$env:EMSDK/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" cmake --build . --target MinecraftPE ``` > [!Note] diff --git a/misc/web/coi-serviceworker.js b/misc/web/coi-serviceworker.js new file mode 100644 index 0000000..8c518e9 --- /dev/null +++ b/misc/web/coi-serviceworker.js @@ -0,0 +1,57 @@ +/* coi-serviceworker.js */ + +if (typeof window === "undefined") { + // Código del Worker: Intercepta peticiones + self.addEventListener("install", () => self.skipWaiting()); + + self.addEventListener("activate", (event) => + event.waitUntil(self.clients.claim()) + ); + + self.addEventListener("fetch", (event) => { + if (event.request.method !== "GET") return; + + event.respondWith( + fetch(event.request) + .then((response) => { + if (response.status === 0) return response; + + const newHeaders = new Headers(response.headers); + newHeaders.set("Cross-Origin-Embedder-Policy", "require-corp"); + newHeaders.set("Cross-Origin-Opener-Policy", "same-origin"); + newHeaders.set("Cross-Origin-Resource-Policy", "cross-origin"); + + return new Response(response.body, { + status: response.status, + statusText: response.statusText, + headers: newHeaders, + }); + }) + .catch(() => fetch(event.request)) + ); + }); +} else { + // Código de la Ventana: Registra el worker y recarga + (function () { + if ("serviceWorker" in navigator) { + navigator.serviceWorker + .register(window.document.currentScript.src) + .then((registration) => { + registration.addEventListener("updatefound", () => { + // Si hay una actualización, recargamos + location.reload(); + }); + + if (registration.active && !navigator.serviceWorker.controller) { + // Si el worker está activo pero no controla la página aún, recargamos + location.reload(); + } + }); + } + + // Si ya estamos aislados, perfecto + if (window.crossOriginIsolated) { + console.log("Aislamiento de origen ACTIVADO"); + } + })(); +} \ No newline at end of file diff --git a/misc/web/index.html b/misc/web/index.html index 6eb328d..1a598e4 100644 --- a/misc/web/index.html +++ b/misc/web/index.html @@ -23,6 +23,8 @@ + +